[jboss-svn-commits] JBL Code SVN: r30097 - in labs/jbossrules/trunk: drools-guvnor/src/main/java/org/drools/guvnor/client/explorer and 7 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Nov 11 02:14:46 EST 2009


Author: jervisliu
Date: 2009-11-11 02:14:46 -0500 (Wed, 11 Nov 2009)
New Revision: 30097

Added:
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/GlobalAreaAssetSelector.java
   labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/ShareableAssetItemTest.java
Removed:
   labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/LinkedAssetItem.java
   labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/LinkedAssetItemTest.java
Modified:
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/PackagesPanel.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/messages/Constants.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/messages/Constants.properties
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/RepositoryService.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/RepositoryServiceAsync.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/NewAssetWizard.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/RepositoryServiceServlet.java
   labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/ServiceImplementation.java
   labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/ServiceImplementationTest.java
   labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/AssetItemIterator.java
   labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/PackageItem.java
   labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/PackageIterator.java
   labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RepositorySessionUtil.java
   labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RulesRepository.java
   labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/PackageItemTest.java
   labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/RulesRepositoryTest.java
Log:
GUVNOR-91: Create a global area that can be referred to from all packages

Added: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/GlobalAreaAssetSelector.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/GlobalAreaAssetSelector.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/GlobalAreaAssetSelector.java	2009-11-11 07:14:46 UTC (rev 30097)
@@ -0,0 +1,84 @@
+package org.drools.guvnor.client.common;
+/*
+ * 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.client.rpc.RepositoryServiceFactory;
+
+import com.google.gwt.user.client.Command;
+import com.google.gwt.user.client.DeferredCommand;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.ListBox;
+import com.google.gwt.user.client.ui.ChangeListener;
+import com.google.gwt.user.client.ui.Widget;
+
+/**
+ * A rule package selector widget.
+ */
+public class GlobalAreaAssetSelector extends Composite {
+
+    /** Used to remember what the "current asset" we are working in is...
+     * Should be the one the user has most recently dealt with... */
+    public static String currentlySelectedAsset;
+
+    private ListBox assetList;
+
+
+    public GlobalAreaAssetSelector() {
+        assetList = new ListBox();
+
+        DeferredCommand.addCommand(new Command() {
+			public void execute() {
+		        loadAssetList();
+			}
+        });
+
+
+        initWidget( assetList );
+    }
+
+	private void loadAssetList() {
+		RepositoryServiceFactory.getService().listRulesInPackage("globalArea", new GenericCallback<String[]>() {
+
+            public void onSuccess(String[] list) {
+                for ( int i = 0; i < list.length; i++ ) {
+                    assetList.addItem( list[i] );
+                    if (currentlySelectedAsset != null &&
+                            list[i].equals( currentlySelectedAsset )) {
+                        assetList.setSelectedIndex( i );
+                    }
+                }
+                assetList.addChangeListener(new ChangeListener() {
+                    public void onChange(Widget sender) {
+                         currentlySelectedAsset = getSelectedAsset();                       
+                    }
+                });
+
+            }
+
+        });
+	}
+
+    /**
+     * Returns the selected package.
+     */
+    public String getSelectedAsset() {
+        return assetList.getItemText( assetList.getSelectedIndex() );
+    }
+
+
+}
\ No newline at end of file


Property changes on: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/common/GlobalAreaAssetSelector.java
___________________________________________________________________
Name: svn:keywords
   + Rev Date
Name: svn:eol-style
   + native

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/PackagesPanel.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/PackagesPanel.java	2009-11-11 06:29:14 UTC (rev 30096)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/explorer/PackagesPanel.java	2009-11-11 07:14:46 UTC (rev 30097)
@@ -190,17 +190,28 @@
     }
 
     private Widget packageExplorer(final ExplorerViewCenterPanel tabPanel) {
-        TreeNode root = new TreeNode(constants.Packages());
-        root.setAttribute("icon", "images/silk/chart_organisation.gif"); //NON-NLS
+		TreeNode rootNode = new TreeNode(constants.Admin());
 
-        final TreePanel panel = genericExplorerWidget(root);
+		
+        TreeNode packageRootNode = new TreeNode(constants.Packages());
+        packageRootNode.setAttribute("icon", "images/silk/chart_organisation.gif"); //NON-NLS
+        loadPackages(packageRootNode);
+        
+/*		TreeNode globalRootNode = new TreeNode("Global area");
+		globalRootNode.setAttribute("icon", "images/silk/chart_organisation.gif");   //NON-NLS
+		globalRootNode.setAttribute("id", "globalarea");*/
+		loadGlobal(rootNode);
+		
+		rootNode.appendChild(packageRootNode);
+		//rootNode.appendChild(globalRootNode);
+		
+        final TreePanel panel = genericExplorerWidget(rootNode);
+        panel.setRootVisible(false);
 
-
-        loadPackages(root);
-
+        
         TreePanelListener treePanelListener = new TreePanelListenerAdapter() {
             public void onClick(TreeNode node, EventObject e) {
-                if (node.getUserObject() instanceof PackageConfigData) {
+                if (node.getUserObject() instanceof PackageConfigData && !"global".equals(((PackageConfigData)node.getUserObject()).name)) {
                     PackageConfigData pc = (PackageConfigData) node.getUserObject();
                     RulePackageSelector.currentlySelectedPackage = pc.name;
 
@@ -300,11 +311,28 @@
                             buildPkgTree(root, hf);
                         }
 
-                        root.expand();
+                        //root.expand();
                     }
                 });
     }
 
+    private void loadGlobal(final TreeNode root) {
+        RepositoryServiceFactory.getService().loadGlobalPackage(
+                new GenericCallback<PackageConfigData>() {
+                    public void onSuccess(PackageConfigData value) {
+
+                                TreeNode globalRootNode = ExplorerNodeConfig.getPackageItemStructure("Global Area", value.uuid);
+                                globalRootNode.setUserObject(value);
+                                
+                                globalRootNode.setAttribute("icon", "images/silk/chart_organisation.gif");   //NON-NLS
+                                globalRootNode.setAttribute("id", "globalarea");
+                        		
+                                root.appendChild(globalRootNode);
+
+                    }
+                });
+    }
+    
     private void buildPkgTree(TreeNode root, PackageHierarchy.Folder fldr) {
         if (fldr.conf != null) {
             root.appendChild(loadPackage(fldr.name, fldr.conf));

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/messages/Constants.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/messages/Constants.java	2009-11-11 06:29:14 UTC (rev 30096)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/messages/Constants.java	2009-11-11 07:14:46 UTC (rev 30097)
@@ -1976,4 +1976,11 @@
     String BuiltInSelector();    
     
     String BuildPackageUsingCustomSelectorSelector();    
+    
+    String CreateInPackage();
+   
+    String CreateInGlobalArea();
+    
+    String AssetToImport();
+    
 }

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/messages/Constants.properties
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/messages/Constants.properties	2009-11-11 06:29:14 UTC (rev 30096)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/messages/Constants.properties	2009-11-11 07:14:46 UTC (rev 30097)
@@ -925,10 +925,10 @@
 PleaseSelectARow=Please select a row
 AddRowBeforeSelectedRow=Add row before selected row...
 CreateNewAsset=Create new: 
-CreateLinkedAsset=Create linked asset: 
+CreateLinkedAsset=Import asset from global area: 
 CreateLinkedAssetFromUUID=UUID of the existing asset: 
 NoteNewLinkedAsset=NOTE: 
-NewLinkedAssetDesc1=This will create a new asset that links to an existing one. To create a linked asset,
+NewLinkedAssetDesc1=This will import a shared asset from global area. 
 NewLinkedAssetDesc2=you need to open the existing asset that you want to link to, copy and paste its 
 NewLinkedAssetDesc3=UUID to the text box above.
 BuildWholePackageTip=This will build the whole package.  
@@ -940,4 +940,7 @@
 BuildPackageUsingBuiltInSelectorStatus=When status :
 BuildPackageUsingBuiltInSelectorCat=When category :
 BuiltInSelector=Built-in selector
-BuildPackageUsingCustomSelectorSelector=Custom Selector :
\ No newline at end of file
+BuildPackageUsingCustomSelectorSelector=Custom Selector :
+CreateInPackage=Create in Package: 
+CreateInGlobalArea=Create in Global area
+AssetToImport=Asset to import: 

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/RepositoryService.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/RepositoryService.java	2009-11-11 06:29:14 UTC (rev 30096)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/RepositoryService.java	2009-11-11 07:14:46 UTC (rev 30097)
@@ -24,6 +24,7 @@
 import org.drools.guvnor.client.modeldriven.SuggestionCompletionEngine;
 import org.drools.guvnor.client.modeldriven.testing.Scenario;
 
+import com.google.gwt.user.client.rpc.AsyncCallback;
 import com.google.gwt.user.client.rpc.RemoteService;
 import com.google.gwt.user.client.rpc.SerializableException;
 import com.google.gwt.user.client.rpc.IsSerializable;
@@ -72,11 +73,11 @@
     public String createNewRule(String ruleName, String description, String initialCategory, String initialPackage, String format) throws SerializableException;
 
     /**
-     * Creates a new rule which refers to an existing rule.
+     * Creates a new rule which is imported from global area.
      * Return the UUID of the item created.
      * This will not check in the rule, but just leave it as saved in the repo.
      */
-    public String createNewLinkedRule(String ruleName, String linkedRuleUUID, String initialCategory, String initialPackage) throws SerializableException;
+    public String createNewImportedRule(String sharedAssetName, String initialPackage) throws SerializableException;
 
     /**
      * Delete un checked in Asset
@@ -96,6 +97,12 @@
     public PackageConfigData[] listPackages();
 
     /**
+     * This returns the global packages. 
+     */
+    public PackageConfigData loadGlobalPackage();
+
+    
+    /**
      * This returns a list of archived packages.
      */
     public PackageConfigData[] listArchivedPackages();

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/RepositoryServiceAsync.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/RepositoryServiceAsync.java	2009-11-11 06:29:14 UTC (rev 30096)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/rpc/RepositoryServiceAsync.java	2009-11-11 07:14:46 UTC (rev 30097)
@@ -43,10 +43,11 @@
 	public void loadTableConfig(java.lang.String p0, AsyncCallback<org.drools.guvnor.client.rpc.TableConfig> cb);
 	public void createCategory(java.lang.String p0, java.lang.String p1, java.lang.String p2, AsyncCallback<java.lang.Boolean> cb);
 	public void createNewRule(java.lang.String p0, java.lang.String p1, java.lang.String p2, java.lang.String p3, java.lang.String p4, AsyncCallback<java.lang.String> cb);
-	public void createNewLinkedRule(java.lang.String p0, java.lang.String p1, java.lang.String p2, java.lang.String p3, AsyncCallback<java.lang.String> cb);
+	public void createNewImportedRule(java.lang.String p0, java.lang.String p1, AsyncCallback<java.lang.String> cb);
 	public void deleteUncheckedRule(java.lang.String p0, java.lang.String p1, AsyncCallback cb);
 	public void clearRulesRepository(AsyncCallback cb);
 	public void listPackages(AsyncCallback<org.drools.guvnor.client.rpc.PackageConfigData[]> cb);
+	public void loadGlobalPackage(AsyncCallback<org.drools.guvnor.client.rpc.PackageConfigData> cb);
 	public void listArchivedPackages(AsyncCallback<org.drools.guvnor.client.rpc.PackageConfigData[]> cb);
 	public void loadRuleAsset(java.lang.String p0, AsyncCallback<org.drools.guvnor.client.rpc.RuleAsset> cb);
 	public void loadAssetHistory(java.lang.String p0, AsyncCallback<org.drools.guvnor.client.rpc.TableDataResult> cb);

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/NewAssetWizard.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/NewAssetWizard.java	2009-11-11 06:29:14 UTC (rev 30096)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/client/ruleeditor/NewAssetWizard.java	2009-11-11 07:14:46 UTC (rev 30097)
@@ -23,6 +23,7 @@
 import org.drools.guvnor.client.common.FormStyleLayout;
 import org.drools.guvnor.client.common.FormStylePopup;
 import org.drools.guvnor.client.common.GenericCallback;
+import org.drools.guvnor.client.common.GlobalAreaAssetSelector;
 import org.drools.guvnor.client.common.LoadingPopup;
 import org.drools.guvnor.client.common.RulePackageSelector;
 import org.drools.guvnor.client.rpc.RepositoryServiceFactory;
@@ -56,21 +57,23 @@
     private Constants constants = GWT.create(Constants.class);
     
     private TextBox                name        = new TextBox();
-    private TextBox                linkedName        = new TextBox();
-    private TextBox                linkedFromUUID        = new TextBox();
+    private TextBox                importedAssetName        = new TextBox();
     private TextArea               description = new TextArea();
     private String                 initialCategory;
     
     private ListBox                 formatChooser = getFormatChooser();
+	RadioButton createInPackageButton = new RadioButton("creatinpackagegroup", constants.CreateInPackage()); 
+	RadioButton createInGlobalButton = new RadioButton("creatinpackagegroup", constants.CreateInGlobalArea()); 
 
     private RulePackageSelector packageSelector = new RulePackageSelector();
-    private RulePackageSelector linkedPackageSelector = new RulePackageSelector();
+    private RulePackageSelector importedPackageSelector = new RulePackageSelector();   
+    private GlobalAreaAssetSelector globalAreaAssetSelector = new GlobalAreaAssetSelector();
     private EditItemEvent afterCreate;
     private boolean showCats;
     private String format;
     
     private final FormStyleLayout newAssetLayout     = new FormStyleLayout();
-    private final FormStyleLayout linkedAssetLayout = new FormStyleLayout();
+    private final FormStyleLayout importAssetLayout = new FormStyleLayout();
 
 
     /** This is used when creating a new rule. */
@@ -81,22 +84,22 @@
 
         this.afterCreate = afterCreate;
         
-		RadioButton newPackage = new RadioButton("action", constants.CreateNewAsset()); // NON-NLS
-		RadioButton importPackage = new RadioButton("action", constants.CreateLinkedAsset()); // NON-NLS
+		RadioButton newPackage = new RadioButton("layoutgroup", constants.CreateNewAsset()); // NON-NLS
+		RadioButton importPackage = new RadioButton("layoutgroup", constants.CreateLinkedAsset()); // NON-NLS
 		newPackage.setChecked(true);
 		newAssetLayout.setVisible(true);
 
 		newPackage.addClickListener(new ClickListener() {
 			public void onClick(Widget w) {
 				newAssetLayout.setVisible(true);
-				linkedAssetLayout.setVisible(false);
+				importAssetLayout.setVisible(false);
 			}
 		});
-		linkedAssetLayout.setVisible(false);
+		importAssetLayout.setVisible(false);
 		importPackage.addClickListener(new ClickListener() {
 			public void onClick(Widget arg0) {
 				newAssetLayout.setVisible(false);
-				linkedAssetLayout.setVisible(true);
+				importAssetLayout.setVisible(true);
 			}
 		});
 		VerticalPanel ab = new VerticalPanel();
@@ -105,7 +108,7 @@
 		addAttribute("", ab);
 
 		addRow(newAssetLayout);
-		addRow(linkedAssetLayout); 
+		addRow(importAssetLayout); 
 			
         
 		//layout for new asset.
@@ -116,9 +119,7 @@
 				name.setFocus(true);			}
         });
 
-
         if (showCats) {
-
         	newAssetLayout.addAttribute(constants.InitialCategory(), getCatChooser());
         }
 
@@ -133,8 +134,16 @@
 				}
         	});
         }
+        
+		createInPackageButton.setChecked(true);
+		HorizontalPanel hp = new HorizontalPanel();
+		hp.add(createInPackageButton);
+		hp.add(packageSelector);
+		newAssetLayout.addAttribute("", hp);
+		newAssetLayout.addAttribute("", createInGlobalButton);
 
-        newAssetLayout.addAttribute(constants.Package() + ":", packageSelector);
+		
+        //newAssetLayout.addAttribute(constants.Package() + ":", packageSelector);
 
         description.setVisibleLines( 4 );
         description.setWidth( "100%" );
@@ -152,24 +161,14 @@
             public void onClick(Widget arg0) {
                 ok();
             }
-
         } );
 
         newAssetLayout.addAttribute( "", ok );
         
-        //layout for create linked asset.
-        linkedAssetLayout.addAttribute( constants.NameColon(), linkedName );        	
+        //layout for importing share asset from global area.
+        importAssetLayout.addAttribute(constants.AssetToImport(), globalAreaAssetSelector);
+        importAssetLayout.addAttribute(constants.Package() + ":", importedPackageSelector);
 
-        this.setAfterShow(new Command() {
-			public void execute() {
-				name.setFocus(true);			}
-        });
-        if (showCats) {
-        	linkedAssetLayout.addAttribute(constants.InitialCategory(), getCatChooser());
-        }
-        linkedAssetLayout.addAttribute(constants.Package() + ":", linkedPackageSelector);
-
-        linkedAssetLayout.addAttribute(constants.CreateLinkedAssetFromUUID(), linkedFromUUID );  
         Button linkedAssetOKButton = new Button( constants.OK() );
         linkedAssetOKButton.addClickListener( new ClickListener() {
             public void onClick(Widget arg0) {
@@ -177,18 +176,11 @@
             }
 
         } );
-        linkedAssetLayout.addAttribute( "", linkedAssetOKButton );
-        linkedAssetLayout.addRow( new HTML( "<br/><b>" + constants.NoteNewLinkedAsset() + "</b>" ) );
-        linkedAssetLayout.addRow( new HTML( constants.NewLinkedAssetDesc1() ) );
-        linkedAssetLayout.addRow( new HTML( constants.NewLinkedAssetDesc2() ) );
-        linkedAssetLayout.addRow( new HTML( constants.NewLinkedAssetDesc3() ) );
-    }
+        importAssetLayout.addAttribute( "", linkedAssetOKButton );
+        importAssetLayout.addRow( new HTML( "<br/><b>" + constants.NoteNewLinkedAsset() + "</b>" ) );
+        importAssetLayout.addRow( new HTML( constants.NewLinkedAssetDesc1() ) );
+     }
 
-    public static Widget newImportWidget(final Command afterCreatedEvent,
-			final FormStylePopup parent) {
-		return null;
-	}
-
     private Widget getCatChooser() {
 
        Widget w = new CategoryExplorerWidget( new CategorySelectHandler() {
@@ -236,6 +228,7 @@
         	return;
         }
 
+        
         GenericCallback cb = new GenericCallback() {
             public void onSuccess(Object result) {
             		String uuid = (String) result;
@@ -248,30 +241,28 @@
             		}
             }
         };
+        
+        String selectedPackage;
+        if (createInGlobalButton.isChecked()) {
+        	selectedPackage = "globalArea";
+        } else {
+        	selectedPackage = packageSelector.getSelectedPackage();
+        }
 
 
         LoadingPopup.showMessage( constants.PleaseWaitDotDotDot() );
         RepositoryServiceFactory.getService().createNewRule( name.getText(),
                                                           description.getText(),
                                                           initialCategory,
-                                                          packageSelector.getSelectedPackage(),
+                                                          selectedPackage,
                                                           getFormat(),
                                                           cb );
-
     }
 
     /**
-     * When Import OK is pressed, it will update the repository with the imported rule.
+     * When Import OK is pressed, it will update the repository with the imported asset.
      */
     void importOK() {
-
-        if (this.showCats && this.initialCategory == null) {
-			Window.alert(constants.YouHaveToPickAnInitialCategory());
-			return;
-		} else {
-			if (!validatePathPerJSR170(this.name.getText())) return;
-		}
-
         GenericCallback cb = new GenericCallback() {
             public void onSuccess(Object result) {
             		String uuid = (String) result;
@@ -285,14 +276,10 @@
             }
         };
 
-
         LoadingPopup.showMessage( constants.PleaseWaitDotDotDot() );
-        RepositoryServiceFactory.getService().createNewLinkedRule( linkedName.getText(),
-        		                                                   linkedFromUUID.getText(),
-                                                          initialCategory,
-                                                          linkedPackageSelector.getSelectedPackage(),
+        RepositoryServiceFactory.getService().createNewImportedRule(globalAreaAssetSelector.getSelectedAsset(),
+                                                          importedPackageSelector.getSelectedPackage(),
                                                           cb );
-
     }
 
     private String getFormat() {

Modified: labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/RepositoryServiceServlet.java
===================================================================
--- labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/RepositoryServiceServlet.java	2009-11-11 06:29:14 UTC (rev 30096)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/RepositoryServiceServlet.java	2009-11-11 07:14:46 UTC (rev 30097)
@@ -121,8 +121,8 @@
 	public java.lang.String createNewRule(java.lang.String p0, java.lang.String p1, java.lang.String p2, java.lang.String p3, java.lang.String p4) throws com.google.gwt.user.client.rpc.SerializableException {
 		 return getService().createNewRule( p0,  p1,  p2,  p3,  p4);
 	}
-	public java.lang.String createNewLinkedRule(java.lang.String p0, java.lang.String p1, java.lang.String p2, java.lang.String p3) throws com.google.gwt.user.client.rpc.SerializableException {
-		 return getService().createNewLinkedRule( p0,  p1,  p2,  p3);
+	public java.lang.String createNewImportedRule(java.lang.String p0, java.lang.String p1) throws com.google.gwt.user.client.rpc.SerializableException {
+		 return getService().createNewImportedRule( p0, p1);
 	}	
 	public void deleteUncheckedRule(java.lang.String p0, java.lang.String p1)  {
 		getService().deleteUncheckedRule( p0,  p1);
@@ -133,6 +133,9 @@
 	public org.drools.guvnor.client.rpc.PackageConfigData[] listPackages()  {
 		 return getService().listPackages();
 	}
+	public org.drools.guvnor.client.rpc.PackageConfigData loadGlobalPackage()  {
+		 return getService().loadGlobalPackage();
+	}
 	public org.drools.guvnor.client.rpc.PackageConfigData[] listArchivedPackages()  {
 		 return getService().listArchivedPackages();
 	}

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	2009-11-11 06:29:14 UTC (rev 30096)
+++ labs/jbossrules/trunk/drools-guvnor/src/main/java/org/drools/guvnor/server/ServiceImplementation.java	2009-11-11 07:14:46 UTC (rev 30097)
@@ -259,21 +259,18 @@
      */
     @WebRemote
     @Restrict("#{identity.loggedIn}")
-    public String createNewLinkedRule(String name,
-                                String linkedRuleUUID,
-                                String initialCategory,
-                                String initialPackage) throws SerializableException {
+    public String createNewImportedRule(String sharedAssetName,
+                                 String initialPackage) throws SerializableException {
         if ( Contexts.isSessionContextActive() ) {
             Identity.instance().checkPermission( new PackageNameType( initialPackage ),
                                                  RoleTypes.PACKAGE_DEVELOPER );
         }
 
-        log.info( "USER:" + repository.getSession().getUserID() + " REFER to an existing asset name [" + linkedRuleUUID + "] in package [" + initialPackage + "]" );
+        log.info( "USER:" + repository.getSession().getUserID() + " Create a shared asset imported from global area named [" + sharedAssetName + "] in package [" + initialPackage + "]" );
 
         try {
-
-            PackageItem pkg = repository.loadPackage( initialPackage );
-            AssetItem asset = pkg.addLinkedAsset( name, linkedRuleUUID, initialCategory);
+            PackageItem pkg = repository.loadPackage(initialPackage);
+            AssetItem asset = pkg.addAssetImportedFromGlobalArea(sharedAssetName);
             repository.save();
 
             return asset.getUUID();
@@ -345,7 +342,31 @@
         return listPackages( true,
                              pf );
     }
+    
+    public PackageConfigData loadGlobalPackage() {
+        PackageConfigData data = new PackageConfigData();
+        PackageItem item = repository.loadPackage(RulesRepository.RULE_GLOBAL_AREA);
+        
+        data.uuid = item.getUUID();
+        data.header = getDroolsHeader( item );
+        data.externalURI = item.getExternalURI();
+        data.catRules = item.getCategoryRules();
+        data.description = item.getDescription();
+        data.archived = item.isArchived();
+        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;
+    }
+
     private PackageConfigData[] listPackages(boolean archive,
                                              RepositoryFilter filter) {
         List<PackageConfigData> result = new ArrayList<PackageConfigData>();
@@ -1846,6 +1867,13 @@
 
     @WebRemote
     @Restrict("#{identity.loggedIn}")
+    public String[] listRulesInGlobalArea() throws SerializableException {
+    	return listRulesInPackage(RulesRepository.RULE_GLOBAL_AREA);
+    }
+
+    
+    @WebRemote
+    @Restrict("#{identity.loggedIn}")
     public SingleScenarioResult runScenario(String packageName,
                                             Scenario scenario) throws SerializableException {
         if ( Contexts.isSessionContextActive() ) {

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	2009-11-11 06:29:14 UTC (rev 30096)
+++ labs/jbossrules/trunk/drools-guvnor/src/test/java/org/drools/guvnor/server/ServiceImplementationTest.java	2009-11-11 07:14:46 UTC (rev 30097)
@@ -337,12 +337,11 @@
 		ServiceImplementation impl = getService();
 		PackageItem testCreateNewRuleAsLinkPackage1 = impl.repository.createPackage("testCreateNewRuleAsLinkPackage1", "desc");
 		impl.createCategory("", "testCreateNewRuleAsLinkCat1", "this is a cat");
-		impl.repository.createPackage("testCreateNewRuleAsLinkPackage2", "desc");
 		impl.createCategory("", "testCreateNewRuleAsLinkCat2", "this is a cat");
 
-		//Create the original asset.
+		//Create the shared asset.
 		String uuid = impl.createNewRule("testCreateLinkedAssetItemRule",
-				"an initial desc", "testCreateNewRuleAsLinkCat1", "testCreateNewRuleAsLinkPackage1",
+				"an initial desc", "testCreateNewRuleAsLinkCat1", "globalArea",
 				AssetFormats.DSL_TEMPLATE_RULE);
 		assertNotNull(uuid);
 		assertFalse("".equals(uuid));
@@ -350,21 +349,20 @@
 		AssetItem dtItem = impl.repository.loadAssetByUUID(uuid);
 		assertEquals(dtItem.getDescription(), "an initial desc");
 		
-		//create an asset which is linked to an existing asset. Different package, same category.
-		String uuidLink = impl.createNewLinkedRule("testCreateLinkedAssetItemRuleLinked",
-				uuid, "testCreateNewRuleAsLinkCat1", "testCreateNewRuleAsLinkPackage2");
+		//create an asset which is imported from global area. 
+		String uuidLink = impl.createNewImportedRule("testCreateLinkedAssetItemRule", "testCreateNewRuleAsLinkPackage1");
 		assertNotNull(uuidLink);
 		assertFalse("".equals(uuidLink));
-		assertFalse(uuidLink.equals(uuid));
+		assertTrue(uuidLink.equals(uuid));
 
 		//now verify the linked asset.
 		AssetItem itemLink = impl.repository.loadAssetByUUID(uuidLink);
-		assertEquals(itemLink.getName(), "testCreateLinkedAssetItemRuleLinked");
+		assertEquals(itemLink.getName(), "testCreateLinkedAssetItemRule");
 		assertEquals(itemLink.getDescription(), "an initial desc");
 		assertEquals(itemLink.getFormat(), AssetFormats.DSL_TEMPLATE_RULE);
-		assertEquals(itemLink.getPackage().getName(), "testCreateNewRuleAsLinkPackage2");
+		assertEquals(itemLink.getPackage().getName(), "globalArea");
 
-		assertEquals(itemLink.getPackageName(), "testCreateNewRuleAsLinkPackage2");
+		assertEquals(itemLink.getPackageName(), "globalArea");
 		
 		assertTrue(itemLink.getCategories().size() == 1);
 		assertTrue(itemLink.getCategorySummary().contains("testCreateNewRuleAsLinkCat1"));
@@ -374,67 +372,20 @@
 		assertEquals(referredItem.getName(), "testCreateLinkedAssetItemRule");
 		assertEquals(referredItem.getDescription(), "an initial desc");
 		assertEquals(referredItem.getFormat(), AssetFormats.DSL_TEMPLATE_RULE);
-		assertEquals(referredItem.getPackage().getName(), "testCreateNewRuleAsLinkPackage1");
+		assertEquals(referredItem.getPackage().getName(), "globalArea");
 
 		assertTrue(referredItem.getCategories().size() == 1);
 		assertTrue(referredItem.getCategorySummary().contains("testCreateNewRuleAsLinkCat1"));		
-
 		
-		//create an asset which refers to an existing asset. same package, different category.
-		String uuidLink1 = impl.createNewLinkedRule("testCreateLinkedAssetItemRuleLinked1",
-				uuid, "testCreateNewRuleAsLinkCat2", "testCreateNewRuleAsLinkPackage1");
-		assertNotNull(uuidLink1);
-		assertFalse("".equals(uuidLink1));
-		assertFalse(uuidLink1.equals(uuid));
-
-		
-		//now verify the linked asset.
-		AssetItem itemLink1 = impl.repository.loadAssetByUUID(uuidLink1);
-		assertEquals(itemLink1.getDescription(), "an initial desc");
-		assertEquals(itemLink1.getFormat(), AssetFormats.DSL_TEMPLATE_RULE);
-		assertEquals(itemLink1.getPackage().getName(), "testCreateNewRuleAsLinkPackage1");
-		assertEquals(itemLink1.getPackageName(), "testCreateNewRuleAsLinkPackage1");
-		
-		assertTrue(itemLink1.getCategories().size() == 2);
-		assertTrue(itemLink1.getCategorySummary().contains("testCreateNewRuleAsLinkCat1"));
-		assertTrue(itemLink1.getCategorySummary().contains("testCreateNewRuleAsLinkCat2"));
-		
-		//now verify the linked asset by calling PackageItem.loadAsset()
-		AssetItem itemLinkFromPackage1 = testCreateNewRuleAsLinkPackage1.loadAsset("testCreateLinkedAssetItemRuleLinked1");
-		assertEquals(itemLinkFromPackage1.getDescription(), "an initial desc");
-		assertEquals(itemLinkFromPackage1.getFormat(), AssetFormats.DSL_TEMPLATE_RULE);
-		assertEquals(itemLinkFromPackage1.getPackage().getName(), "testCreateNewRuleAsLinkPackage1");
-		assertEquals(itemLinkFromPackage1.getPackageName(), "testCreateNewRuleAsLinkPackage1");
-		
-		assertTrue(itemLinkFromPackage1.getCategories().size() == 2);
-		assertTrue(itemLinkFromPackage1.getCategorySummary().contains("testCreateNewRuleAsLinkCat1"));
-		assertTrue(itemLinkFromPackage1.getCategorySummary().contains("testCreateNewRuleAsLinkCat2"));
-		
-		//now verify the original asset.
-		AssetItem referredItem1 = impl.repository.loadAssetByUUID(uuid);
-		assertEquals(referredItem1.getDescription(), "an initial desc");
-		assertEquals(referredItem1.getFormat(), AssetFormats.DSL_TEMPLATE_RULE);
-		assertEquals(referredItem1.getPackage().getName(), "testCreateNewRuleAsLinkPackage1");
-		
-		assertTrue(referredItem1.getCategories().size() == 2);
-		assertTrue(referredItem1.getCategorySummary().contains("testCreateNewRuleAsLinkCat1"));		
-		assertTrue(referredItem1.getCategorySummary().contains("testCreateNewRuleAsLinkCat2"));
-		
 		//now verify AssetItemIterator works by calling search
         AssetItemIterator it = impl.repository.findAssetsByName("testCreateLinkedAssetItemRule%",
                 true); 
-		assertEquals(3, it.getSize());
+		assertEquals(1, it.getSize());
 		while(it.hasNext()) {
 			AssetItem ai = it.next();
 			if(ai.getUUID().equals(uuid)) {
-				assertEquals(ai.getPackage().getName(), "testCreateNewRuleAsLinkPackage1");
+				assertEquals(ai.getPackage().getName(), "globalArea");
 				assertEquals(ai.getDescription(), "an initial desc");
-			} else if (ai.getUUID().equals(uuidLink)) {
-				assertEquals(ai.getPackage().getName(), "testCreateNewRuleAsLinkPackage2");
-				assertEquals(ai.getDescription(), "an initial desc");
-			} else if (ai.getUUID().equals(uuidLink1)) {
-				assertEquals(ai.getPackage().getName(), "testCreateNewRuleAsLinkPackage1");
-				assertEquals(ai.getDescription(), "an initial desc");
 			} else {
 				fail("unexptected asset found: " + ai.getPackage().getName());
 			}
@@ -446,15 +397,14 @@
 		PackageItem testCreateNewRuleAsLinkPackage1 = impl.repository.createPackage("testLinkedAssetItemHistoryRelatedPack", "desc");
 		impl.createCategory("", "testLinkedAssetItemHistoryRelatedCat", "this is a cat");
 
-		//Create the original asset.
+		//Create the shared asset in global area.
 		String uuid = impl.createNewRule("testLinkedAssetItemHistoryRelatedRule",
-				"an initial desc", "testLinkedAssetItemHistoryRelatedCat", "testLinkedAssetItemHistoryRelatedPack",
+				"an initial desc", "testLinkedAssetItemHistoryRelatedCat", "globalArea",
 				AssetFormats.DSL_TEMPLATE_RULE);
 		
-		//create an asset which refers to an existing asset.
-		String uuidLink = impl.createNewLinkedRule("testLinkedAssetItemHistoryRelatedRuleLinked",
-				uuid, "testLinkedAssetItemHistoryRelatedCat", "testLinkedAssetItemHistoryRelatedPack");
-		assertFalse(uuidLink.equals(uuid));
+		//create an asset which refers to the shared assets.
+		String uuidLink = impl.createNewImportedRule("testLinkedAssetItemHistoryRelatedRule", "testLinkedAssetItemHistoryRelatedPack");
+		assertTrue(uuidLink.equals(uuid));
 
 		//create version 1.
 		RuleAsset assetWrapper = impl.loadRuleAsset(uuidLink);
@@ -479,24 +429,27 @@
 		TableDataResult result = impl.loadAssetHistory(uuidLink);
 		assertNotNull(result);
 		TableDataRow[] rows = result.data;
-		assertEquals(2, rows.length);
+		assertEquals(3, rows.length);
 		assertFalse(rows[0].id.equals(uuidLink));
 		assertFalse(rows[1].id.equals(uuidLink));
+		assertFalse(rows[2].id.equals(uuidLink));
 
 		RuleAsset version1 = impl.loadRuleAsset(rows[0].id);
 		RuleAsset version2 = impl.loadRuleAsset(rows[1].id);
+		RuleAsset version3 = impl.loadRuleAsset(rows[2].id);
 		RuleAsset versionHead = impl.loadRuleAsset(uuidLink);
 		assertFalse(version1.metaData.versionNumber == version2.metaData.versionNumber);
 		assertFalse(version1.metaData.versionNumber == versionHead.metaData.versionNumber);
-		assertTrue(version1.metaData.description.equals("version 1"));
-		assertTrue(version2.metaData.description.equals("version 2"));
-		assertTrue(versionHead.metaData.description.equals("version head"));
+		assertEquals(version1.metaData.description, "an initial desc");
+		assertEquals(version2.metaData.description, "version 1");
+		assertEquals(version3.metaData.description, "version 2");
+		assertEquals(versionHead.metaData.description, "version head");
 
 		//verify the history info of the original AssetItem
 		result = impl.loadAssetHistory(uuid);
 		assertNotNull(result);
 		rows = result.data;
-		assertEquals(2, rows.length);
+		assertEquals(3, rows.length);
 		assertFalse(rows[0].id.equals(uuid));
 		assertFalse(rows[1].id.equals(uuid));
 
@@ -505,8 +458,8 @@
 		versionHead = impl.loadRuleAsset(uuid);
 		assertFalse(version1.metaData.versionNumber == version2.metaData.versionNumber);
 		assertFalse(version1.metaData.versionNumber == versionHead.metaData.versionNumber);
-		assertTrue(version1.metaData.description.equals("version 1"));
-		assertTrue(version2.metaData.description.equals("version 2"));
+		assertTrue(version1.metaData.description.equals("an initial desc"));
+		assertTrue(version2.metaData.description.equals("version 1"));
 		assertTrue(versionHead.metaData.description.equals("version head"));
 
 		//test restore

Modified: labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/AssetItemIterator.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/AssetItemIterator.java	2009-11-11 06:29:14 UTC (rev 30096)
+++ labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/AssetItemIterator.java	2009-11-11 07:14:46 UTC (rev 30097)
@@ -33,7 +33,7 @@
     }
 
     public AssetItem next() {
-        return new LinkedAssetItem( rulesRepository,
+        return new AssetItem( rulesRepository,
                              (Node) it.next() );
     }
 

Deleted: labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/LinkedAssetItem.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/LinkedAssetItem.java	2009-11-11 06:29:14 UTC (rev 30096)
+++ labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/LinkedAssetItem.java	2009-11-11 07:14:46 UTC (rev 30097)
@@ -1,209 +0,0 @@
-package org.drools.repository;
-
-import java.io.*;
-import java.util.Calendar;
-import java.util.Iterator;
-
-import javax.jcr.InvalidItemStateException;
-import javax.jcr.Node;
-import javax.jcr.PathNotFoundException;
-import javax.jcr.Property;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.UnsupportedRepositoryOperationException;
-
-import org.apache.log4j.Logger;
-import org.drools.repository.events.StorageEventManager;
-import org.drools.repository.utils.IOUtils;
-
-/**
- * LinkedAssetItem does not represent a real Asset, instead it is a wrapper node that  
- * wraps over an existing asset. LinkedAssetItem only has three properties that belongs to itself:
- * NAME: LinkedAssetItem has its own name which is the node name
- * LINKED_NODE_UUID: the node UUID that LinkedAssetItem links to.
- * PACKAGE_NAME_PROPERTY: our current design only allows one AssetItem belongs to one package. 
- * LinkedAssetItem and the linked(wrapped) asset have to have their own package name respectively. 
- * NOTE: those three properties are read only. Thus there is no need for LinkedAssetItem to have its own
- * check in/out method once it is created and saved.
- * Requests to all other properties are delegated to the linked(wrapped) asset. 
- */
-public class LinkedAssetItem extends AssetItem {
-    private Logger log = Logger.getLogger( LinkedAssetItem.class );
- 
-    protected Node wrapperNode;
-    public static final String LINKED_NODE_UUID                = "drools:linkedNodeUUID";
-    
-    /**
-     * Constructs a LinkedAssetItem object, setting its node attribute to the specified node.
-     *
-     * @param rulesRepository the rulesRepository that instantiated this object
-     * @param node the node in the repository that this RuleItem corresponds to
-     * @throws RulesRepositoryException
-     */
-    public LinkedAssetItem(RulesRepository rulesRepository,
-                     Node wrapperNode) throws RulesRepositoryException {        
-        super( rulesRepository,	wrapperNode );
-        
-        try {
-			// If this node is a node that is linked to another node.
-			if (wrapperNode.hasProperty(LINKED_NODE_UUID)) {
-				Property linkedNodeUUIDProperty = wrapperNode
-						.getProperty(LINKED_NODE_UUID);
-				String linkedNodeUUID = linkedNodeUUIDProperty.getValue()
-						.getString();
-
-				Node linkedNode = rulesRepository.getSession().getNodeByUUID(
-						linkedNodeUUID);
-
-	        	this.wrapperNode = wrapperNode;  
-				this.node = linkedNode;
-				
-				//When a node is created, it is in checked out status. So we do similar to the linked node. 
-				if(!this.node.isCheckedOut()) {
-					this.node.checkout();
-				}
-			} else {
-				this.wrapperNode = null; 
-			}
-		} catch (RepositoryException e) {
-			this.wrapperNode = null; 
-		}      
-    }
-
-    public LinkedAssetItem() {
-        super( null,
-               null );
-    }
-    
-    public boolean isLinkedAssetItem() {
-		if (wrapperNode == null) {
-			return false;
-		} 
-		return true;    	
-    }
-    
-    /**
-     * @return A unique identifier for this items content node.
-     * return the UUID of the wrapper node. 
-     */
-    public String getUUID() {
-		if (wrapperNode == null) {
-			return super.getUUID();
-		} else {
-	        try {
-	            return this.getVersionContentNode1().getUUID();
-	        } catch (  RepositoryException e ) {
-	            throw new RulesRepositoryException(e);
-	        }
-		}
-    }
-    
-    /**
-     * Need to get the name from the content node, not the version node
-     * if it is in fact a version !
-     */
-    public String getName() {
-		if (wrapperNode == null) {
-			return super.getName();
-		} else {
-	        try {
-	            return this.getVersionContentNode1().getName();
-	        } catch (  RepositoryException e ) {
-	            throw new RulesRepositoryException(e);
-	        }
-		}
-    }
-
-    /**
-     * This will get the package that the wrapper asset belongs to.
-     */
-    public PackageItem getPackage() {
-		if (wrapperNode == null) {
-			return super.getPackage();
-		} else {
-	        try {
-	            if ( this.isHistoricalVersion() ) {
-	            	return this.rulesRepository.loadPackage(this.getPackageName());
-	            }
-	            return new PackageItem( this.rulesRepository,
-	                                    this.wrapperNode.getParent().getParent() );
-	        } catch ( RepositoryException e ) {
-	            throw new RulesRepositoryException( e );
-	        }
-		}
-
-    }
-    
-    /**
-     * Get the wrapper asset's package name.
-     */
-    public String getPackageName() {
-		if (wrapperNode == null) {
-			return super.getPackageName();
-		} else {
-			return getStringProperty1(PACKAGE_NAME_PROPERTY);
-		}
-	}      
-  
-     /**
-     * This will save the content (if it hasn't been already) and
-     * then check it in to create a new version.
-     * It will also set the last modified property.
-     */
-    public void checkin(String comment) {
-    	super.checkin(comment);
-    	
-    	//LinkedAssetItem only has read-only properties. So actually save and checkin is only needed once
-    	//when LinkedAssetItem is created. 
-		if (wrapperNode != null) {
-            checkIsUpdateable1();
-			try {
-				this.wrapperNode.getSession().save();
-				this.wrapperNode.checkin();
-
-				if (StorageEventManager.hasSaveEvent()) {
-					if (this instanceof AssetItem) {
-						StorageEventManager.getSaveEvent().onAssetCheckin(
-								(AssetItem) this);
-					}
-				}
-				StorageEventManager.doCheckinEvents(this);
-
-			} catch (RepositoryException e) {
-				throw new RulesRepositoryException("Unable to checkin.", e);
-			}
-		}
-    }
-    
-    public String getStringProperty1(String property) {
-        try {
-            Node theNode = getVersionContentNode1();
-            if ( theNode.hasProperty( property ) ) {
-                Property data = theNode.getProperty( property );
-                return data.getValue().getString();
-            } else {
-                return "";
-            }
-        } catch ( RepositoryException e ) {
-            throw new RulesRepositoryException( e );
-        }
-    }
-    
-    public Node getVersionContentNode1() throws RepositoryException,
-                                       PathNotFoundException {
-        return getRealContentFromVersion(this.wrapperNode);
-    }
-    
-    protected void checkIsUpdateable1() {
-        try {
-            if ( this.wrapperNode.getPrimaryNodeType().getName().equals( "nt:version" ) ) {
-                String message = "Error. Tags can only be added to the head version of a rule node";
-                log.error( message );
-                throw new RulesRepositoryException( message );
-            }
-        } catch ( RepositoryException e ) {
-            throw new RulesRepositoryException( e );
-        }
-    }
-
- }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/PackageItem.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/PackageItem.java	2009-11-11 06:29:14 UTC (rev 30096)
+++ labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/PackageItem.java	2009-11-11 07:14:46 UTC (rev 30097)
@@ -11,6 +11,7 @@
 import java.util.StringTokenizer;
 
 import javax.jcr.*;
+import javax.jcr.nodetype.NodeType;
 import javax.jcr.query.Query;
 import javax.jcr.query.QueryResult;
 import javax.jcr.query.RowIterator;
@@ -224,72 +225,37 @@
         }
 
     }
-
+   
     /**
-     * This adds a rule which is linked to an existing rule. 
+     * This adds a rule which is imported from global area. 
      *
      * This will NOT check the asset in, just create the basic record.
-     * @param assetName The name of the asset (the file name minus the extension)
-     * @param linkedAssetUUID the UUID of the existing rule that this asset is linked to.
+     * @param sharedAssetName The name of the imported asset
      */
-    public AssetItem addLinkedAsset(String assetName, String linkedAssetUUID) {
-    	return addLinkedAsset(assetName, linkedAssetUUID, null);    	
-    }
-    /**
-     * This adds a rule which is linked to an existing rule. 
-     *
-     * This will NOT check the asset in, just create the basic record.
-     * @param assetName The name of the asset (the file name minus the extension)
-     * @param linkedAssetUUID the UUID of the existing rule that this asset is linked to.
-     * @param initialCategory The initial category the asset is placed in (can belong to multiple ones later).
-     */
-    public AssetItem addLinkedAsset(String assetName, String linkedAssetUUID,
-                            String initialCategory) {
-        Node wrapperNode;
+    public AssetItem addAssetImportedFromGlobalArea(String sharedAssetName) {
         try {
-        	assetName = assetName.trim();
+        	//assetName = assetName.trim();
             Node rulesFolder = this.node.getNode( ASSET_FOLDER_NAME );
-            wrapperNode = rulesFolder.addNode( assetName,
-                                            AssetItem.RULE_NODE_TYPE_NAME );
-            wrapperNode.setProperty( AssetItem.TITLE_PROPERTY_NAME,
-                                  assetName );
+            
+    		Session session = rulesRepository.getSession();
+    		Workspace workspace = session.getWorkspace();
+            PackageItem globalArea = rulesRepository.loadPackage( RulesRepository.RULE_GLOBAL_AREA );
+            AssetItem globalAssetItem = globalArea.loadAsset(sharedAssetName);
+ 			if (!hasMixin(globalAssetItem.getNode())) {
+				globalAssetItem.checkout();
+				globalAssetItem.getNode().addMixin("mix:shareable");
+				globalAssetItem.checkin("add mix:shareable");
+			}
+    		
+       		String path = rulesFolder.getPath() + "/" + globalAssetItem.getName();
+       		//System.out.println("---" + path);			
+       	 	workspace.clone(workspace.getName(), globalAssetItem.getNode().getPath(), path, false);	
+    		
+       	    Node ruleNode = rulesFolder.getNode(globalAssetItem.getName());
+            AssetItem rule = new AssetItem( this.rulesRepository, ruleNode );         
 
-            wrapperNode.setProperty( AssetItem.DESCRIPTION_PROPERTY_NAME,
-                                  "description_IGNORED" );
-            /*
-            if (format != null) {
-                ruleNode.setProperty( AssetItem.FORMAT_PROPERTY_NAME,
-                                      format );
-            } else {
-                ruleNode.setProperty( AssetItem.FORMAT_PROPERTY_NAME,
-                                      AssetItem.DEFAULT_CONTENT_FORMAT );
-            }
-
-
-            ruleNode.setProperty( VersionableItem.CHECKIN_COMMENT,
-                                  "Initial" );
-*/
-            Calendar lastModified = Calendar.getInstance();
-            wrapperNode.setProperty( AssetItem.LAST_MODIFIED_PROPERTY_NAME, lastModified );
-            wrapperNode.setProperty( AssetItem.PACKAGE_NAME_PROPERTY, this.getName() );
-            wrapperNode.setProperty( AssetItem.FORMAT_PROPERTY_NAME,
-                    AssetItem.DEFAULT_CONTENT_FORMAT );
-
-            //ruleNode.setProperty( CREATOR_PROPERTY_NAME, this.node.getSession().getUserID() );
-
-            wrapperNode.setProperty( LinkedAssetItem.LINKED_NODE_UUID, linkedAssetUUID );
-
-            AssetItem rule = new LinkedAssetItem( this.rulesRepository, wrapperNode );
-
-            //rule.updateState( StateItem.DRAFT_STATE_NAME );
-
-            if (initialCategory != null) {
-                rule.addCategory( initialCategory );
-            }
-
             return rule;
-
-        } catch ( RepositoryException e ) {
+         } catch ( RepositoryException e ) {
             if ( e instanceof ItemExistsException ) {
                 throw new RulesRepositoryException( "A rule of that name already exists in that package.",
                                                     e );
@@ -299,7 +265,22 @@
         }
 
     }
+    
+    private boolean hasMixin(Node node) {
+    	try {
+			NodeType[] nodeTypes = node.getMixinNodeTypes();
+			for (NodeType nodeType : nodeTypes) {
+				if (nodeType.isNodeType("mix:shareable")) {
+					return true;
+				}
+			}
+		} catch (RepositoryException e) {
 
+		}
+		
+		return false;
+    }
+
     /**
      * This will permanently delete this package.
      */
@@ -572,7 +553,7 @@
 
         try {
             Node content = getVersionContentNode();
-            return new LinkedAssetItem(
+            return new AssetItem(
                         this.rulesRepository,
                         content.getNode( ASSET_FOLDER_NAME ).getNode( name ));
         } catch ( RepositoryException e ) {

Modified: labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/PackageIterator.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/PackageIterator.java	2009-11-11 06:29:14 UTC (rev 30096)
+++ labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/PackageIterator.java	2009-11-11 07:14:46 UTC (rev 30097)
@@ -32,7 +32,8 @@
 			while (this.packageNodeIterator.hasNext()) {
 				Node element = (Node) this.packageNodeIterator.next();
 				try {
-					if (searchArchived || !element.getProperty("drools:archive").getBoolean()) {
+					//Do not return Global Area
+					if ((searchArchived || !element.getProperty("drools:archive").getBoolean()) && !RulesRepository.RULE_GLOBAL_AREA.equals(element.getName())) {
 						hasnext = true;
 						this.next = element;
 						break;

Modified: labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RepositorySessionUtil.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RepositorySessionUtil.java	2009-11-11 06:29:14 UTC (rev 30096)
+++ labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RepositorySessionUtil.java	2009-11-11 07:14:46 UTC (rev 30097)
@@ -41,7 +41,10 @@
 
     public static RulesRepository getRepository() throws RulesRepositoryException {
         Object repoInstance = repo.get();
+    	System.out.println("----------getRepository");
         if ( repoInstance == null ) {
+        	
+        	System.out.println("----------repoInstance == null");
 
             File dir = new File( "repository" );
             System.out.println( "DELETING test repo: " + dir.getAbsolutePath() );

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	2009-11-11 06:29:14 UTC (rev 30096)
+++ labs/jbossrules/trunk/drools-repository/src/main/java/org/drools/repository/RulesRepository.java	2009-11-11 07:14:46 UTC (rev 30097)
@@ -62,6 +62,7 @@
      * The name of the rulepackage area of the repository
      */
     public final static String  RULE_PACKAGE_AREA     = "drools:package_area";
+    public final static String  RULE_GLOBAL_AREA     = "globalArea";
 
     /**
      * The name of the rulepackage area of the repository
@@ -93,6 +94,9 @@
     public RulesRepository(Session session) {
         this.session = session;
         checkForDataMigration( this );
+        if(!containsPackage(RULE_GLOBAL_AREA)) {
+        	createPackage(RULE_GLOBAL_AREA, "the global area that holds sharable assets");
+        }
     }
 
     private synchronized static void checkForDataMigration(RulesRepository self) {
@@ -565,6 +569,13 @@
         }
 
     }
+    
+    /**
+     * This will return the global area for rules that can be shared.
+     */
+    public PackageItem loadGlobalArea() throws RulesRepositoryException {
+        return loadPackage( RULE_GLOBAL_AREA );
+    }
 
     /**
      * Similar to above. Loads a RulePackage for the specified uuid.
@@ -619,7 +630,7 @@
     public AssetItem loadAssetByUUID(String uuid) {
         try {
             Node rulePackageNode = this.session.getNodeByUUID( uuid );
-            return new LinkedAssetItem( this,
+            return new AssetItem( this,
                                   rulePackageNode );
         } catch (ItemNotFoundException e) {
           log.warn(e);

Deleted: labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/LinkedAssetItemTest.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/LinkedAssetItemTest.java	2009-11-11 06:29:14 UTC (rev 30096)
+++ labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/LinkedAssetItemTest.java	2009-11-11 07:14:46 UTC (rev 30097)
@@ -1,985 +0,0 @@
-package org.drools.repository;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Iterator;
-import java.util.List;
-
-import javax.jcr.version.Version;
-import javax.jcr.version.VersionIterator;
-
-import junit.framework.TestCase;
-import org.drools.repository.events.StorageEventManager;
-
-public class LinkedAssetItemTest extends TestCase {
-
-	private RulesRepository getRepo() {
-		return RepositorySessionUtil.getRepository();
-	}
-
-	private PackageItem getDefaultPackage() {
-		return getRepo().loadDefaultPackage();
-	}
-
-	public void testAssetItemCreation() throws Exception {
-
-		Calendar now = Calendar.getInstance();
-
-		Thread.sleep(500); // MN: need this sleep to get the correct date
-
-		AssetItem ruleItem1 = getDefaultPackage().addAsset("LinkedAssetItemtestRuleItem",
-				"test content");
-		AssetItem linkedRuleItem1 = getDefaultPackage().addLinkedAsset(
-				"LinkedAssetItemlinkedTestRuleItem", ruleItem1.getUUID(), null);
-
-		assertNotNull(linkedRuleItem1);
-		assertNotNull(linkedRuleItem1.getNode());
-		assertEquals("LinkedAssetItemlinkedTestRuleItem", linkedRuleItem1.getName());
-		assertEquals("LinkedAssetItemtestRuleItem", ruleItem1.getName());
-
-		assertNotNull(ruleItem1.getCreatedDate());
-		assertNotNull(linkedRuleItem1.getCreatedDate());
-
-		assertTrue(now.before(ruleItem1.getCreatedDate()));
-		assertTrue(now.before(linkedRuleItem1.getCreatedDate()));
-
-		String packName = getDefaultPackage().getName();
-
-		assertEquals(packName, ruleItem1.getPackageName());
-		assertEquals(packName, linkedRuleItem1.getPackageName());
-
-		assertNotNull(ruleItem1.getUUID());
-		assertNotNull(linkedRuleItem1.getUUID());
-		assertTrue(linkedRuleItem1.getUUID() != linkedRuleItem1.getUUID());
-
-		// try constructing with node of wrong type
-		try {
-
-			PackageItem pitem = getRepo().loadDefaultPackage();
-			new AssetItem(getRepo(), pitem.getNode());
-			fail("Exception not thrown for node of wrong type");
-		} catch (RulesRepositoryException e) {
-			assertNotNull(e.getMessage());
-		} catch (Exception e) {
-			fail("Caught unexpected exception: " + e);
-		}
-
-		// try constructing with node of wrong type
-		try {
-
-			PackageItem pitem = getRepo().loadDefaultPackage();
-			new LinkedAssetItem(getRepo(), pitem.getNode());
-			fail("Exception not thrown for node of wrong type");
-		} catch (RulesRepositoryException e) {
-			assertNotNull(e.getMessage());
-		} catch (Exception e) {
-			fail("Caught unexpected exception: " + e);
-		}
-	}
-
-	public void testGetContentLength() throws Exception {
-		RulesRepository repo = getRepo();
-		PackageItem pkg = repo.loadDefaultPackage();
-		AssetItem asset = pkg.addAsset("LinkedAssetItemtestGetContentLength", "");
-		AssetItem linkedAsset = pkg.addLinkedAsset("LinkedAssetItemlinkedTestGetContentLength", asset.getUUID(), null);
-		
-		assertEquals(0, asset.getContentLength());
-		assertEquals(0, linkedAsset.getContentLength());
-		asset.updateContent("boo");
-		asset.checkin("");
-		assertEquals("boo".getBytes().length, asset.getContentLength());
-		assertEquals("boo".getBytes().length, linkedAsset.getContentLength());
-		
-		asset = pkg.addAsset("LinkedAssetItemtestGetContentLength2", "");
-		linkedAsset = pkg.addLinkedAsset("LinkedAssetItemlinkedTestGetContentLength2", asset.getUUID(), null);
-
-		assertEquals(0, asset.getContentLength());
-		linkedAsset.updateBinaryContentAttachment(new ByteArrayInputStream("foobar"
-				.getBytes()));
-		linkedAsset.checkin("");
-		assertEquals("foobar".getBytes().length, asset.getContentLength());
-		assertEquals("foobar".getBytes().length, linkedAsset.getContentLength());
-	}
-
-	public void testGetPackageItem() throws Exception {
-		RulesRepository repo = getRepo();
-		PackageItem def = repo.loadDefaultPackage();
-		AssetItem asset = repo.loadDefaultPackage().addAsset("LinkedAssetItemtestPackageItem",
-				"test content");
-		AssetItem linkedAsset = repo.loadDefaultPackage().addLinkedAsset("LinkedAssetItemlinkedTestPackageItem",asset.getUUID(), null);
-
-		PackageItem pkg = asset.getPackage();
-		assertEquals(def.getName(), pkg.getName());
-		assertEquals(def.getUUID(), pkg.getUUID());
-		
-		PackageItem linkedPkg = linkedAsset.getPackage();
-		assertEquals(def.getName(), linkedPkg.getName());
-		assertEquals(def.getUUID(), linkedPkg.getUUID());
-	}
-
-	public void testUpdateStringProperty() throws Exception {
-		RulesRepository repo = getRepo();
-		AssetItem asset = repo.loadDefaultPackage().addAsset(
-				"LinkedAssetItemtestUpdateStringProperty", "test content");
-		AssetItem linkedAsset = repo.loadDefaultPackage().addLinkedAsset("LinkedAssetItemlinkedTestUpdateStringProperty",asset.getUUID(), null);		
-		linkedAsset.updateContent("new content");
-		linkedAsset.checkin("");
-		Calendar lm = linkedAsset.getLastModified();
-
-		Thread.sleep(100);
-		linkedAsset.updateStringProperty("Anything", "AField");
-
-		assertEquals("Anything", linkedAsset.getStringProperty("AField"));
-		assertEquals("Anything", asset.getStringProperty("AField"));
-		
-		Calendar lm1 = asset.getLastModified();
-		assertTrue(lm1.getTimeInMillis() > lm.getTimeInMillis());
-		Calendar lm2 = asset.getLastModified();
-		assertTrue(lm2.getTimeInMillis() > lm.getTimeInMillis());
-		
-		Thread.sleep(100);
-
-		asset.updateStringProperty("More", "AField", false);
-
-		assertEquals(lm1.getTimeInMillis(), asset.getLastModified()
-				.getTimeInMillis());
-		assertEquals(lm2.getTimeInMillis(), linkedAsset.getLastModified()
-				.getTimeInMillis());
-		
-		asset.updateContent("more content");
-		asset.checkin("");
-
-		asset = repo.loadAssetByUUID(asset.getUUID());
-		assertEquals("More", asset.getStringProperty("AField"));
-		assertEquals("more content", asset.getContent());		
-		linkedAsset = repo.loadAssetByUUID(linkedAsset.getUUID());
-		assertEquals("More", linkedAsset.getStringProperty("AField"));
-		assertEquals("more content", asset.getContent());
-	}
-
-	public void testGetPackageItemHistorical() throws Exception {
-		RulesRepository repo = getRepo();
-		PackageItem pkg = repo
-				.createPackage("LinkedAssetItemtestGetPackageItemHistorical", "");
-		AssetItem asset = pkg.addAsset("LinkedAssetItemwhee", "");
-		
-		//Version 1, created by the original asset
-		asset.checkin("");
-		assertNotNull(asset.getPackage());
-
-		AssetItem linkedAsset = pkg.addLinkedAsset("LinkedAssetItemlinkedWhee", asset.getUUID(), null);
-		
-		//Version 2, created by LinkedAssetItem
-		linkedAsset.checkin("");
-		
-		repo.createPackageSnapshot(pkg.getName(), "SNAP");
-
-		PackageItem pkg_ = repo.loadPackageSnapshot(pkg.getName(), "SNAP");
-		AssetItem asset_ = pkg_.loadAsset("LinkedAssetItemwhee");
-		PackageItem pkg__ = asset_.getPackage();
-		assertTrue(pkg__.isSnapshot());
-		assertTrue(pkg_.isSnapshot());
-		assertFalse(pkg.isSnapshot());
-		assertEquals(pkg.getName(), pkg__.getName());
-		
-		AssetItem linkedAsset_ = pkg_.loadAsset("LinkedAssetItemlinkedWhee");
-		PackageItem linkedPkg__ = linkedAsset_.getPackage();
-		assertTrue(linkedPkg__.isSnapshot());
-		assertFalse(pkg.isSnapshot());
-		assertEquals(pkg.getName(), linkedPkg__.getName());
-		
-		linkedAsset.updateDescription("yeah !");
-		
-		//Version 3, created by LinkedAssetItem
-		linkedAsset.checkin("new");
-
-		linkedAsset = pkg.loadAsset("LinkedAssetItemlinkedWhee");
-		assertNotNull(linkedAsset.getPackage());
-
-		AssetHistoryIterator linkedIt = linkedAsset.getHistory();
-		assertEquals(4, iteratorToList(linkedIt).size());		
-		
-		asset = pkg.loadAsset("LinkedAssetItemwhee");
-		AssetHistoryIterator it = asset.getHistory();
-		assertEquals(4, iteratorToList(it).size());		
-	}
-	
-    List iteratorToList(Iterator it) {
-        List list = new ArrayList();
-        while(it.hasNext()) {
-            list.add( it.next() );
-        }
-        return list;
-    }
-
-	public void testGetContent() {
-		AssetItem ruleItem1 = getRepo().loadDefaultPackage().addAsset(
-				"LinkedAssetItemtestGetContent", "test content");
-		AssetItem linkedRuleItem1 = getRepo().loadDefaultPackage().addLinkedAsset(
-				"LinkedAssetItemlinkedTestGetContent", ruleItem1.getUUID(), null);
-		
-		linkedRuleItem1.updateContent("test content");
-		linkedRuleItem1.updateFormat("drl");
-
-		assertNotNull(linkedRuleItem1.getNode());
-		assertEquals("test content", linkedRuleItem1.getContent());
-		assertEquals("test content", ruleItem1.getContent());
-
-		assertFalse(linkedRuleItem1.isBinary());
-		assertFalse(ruleItem1.isBinary());
-
-		assertNotNull(linkedRuleItem1.getBinaryContentAsBytes());
-		assertNotNull(linkedRuleItem1.getBinaryContentAttachment());
-		String content = new String(linkedRuleItem1.getBinaryContentAsBytes());
-		assertNotNull(content);
-		content = new String(ruleItem1.getBinaryContentAsBytes());
-		assertNotNull(content);	
-	}
-
-	public void testUpdateContent() throws Exception {
-		AssetItem ruleItem1 = getDefaultPackage().addAsset("LinkedAssetItemtestUpdateContent",
-				"test description");
-		AssetItem linkedRuleItem1 = getDefaultPackage().addLinkedAsset("LinkedAssetItemlinkedTestUpdateContent",
-				ruleItem1.getUUID(), null);
-
-		assertFalse(ruleItem1.getCreator().equals(""));
-		assertFalse(linkedRuleItem1.getCreator().equals(""));
-		linkedRuleItem1.updateContent("test content");
-		linkedRuleItem1.checkin("yeah");
-
-		assertFalse(linkedRuleItem1.getLastContributor().equals(""));
-		assertFalse(ruleItem1.getLastContributor().equals(""));
-
-		linkedRuleItem1.updateContent("new rule content");
-
-		assertEquals("new rule content", linkedRuleItem1.getContent());
-
-		assertTrue(linkedRuleItem1.getNode().getSession().hasPendingChanges());
-		assertTrue(ruleItem1.getNode().getSession().hasPendingChanges());
-
-		ruleItem1.checkin("yeah !");
-		assertFalse(ruleItem1.getNode().getSession().hasPendingChanges());
-		assertEquals("yeah !", ruleItem1.getCheckinComment());
-		
-		try {
-		    linkedRuleItem1.checkin("yeah linked !");
-		    fail("Did not get expected exception: Unable to checkin");
-		} catch (RulesRepositoryException e) {
-			
-		}
-
-		AssetItem prev = (AssetItem) ruleItem1.getPrecedingVersion();
-		assertEquals("test content", prev.getContent());
-		assertFalse("yeah !".equals(prev.getCheckinComment()));
-
-		ruleItem1 = getDefaultPackage().loadAsset("LinkedAssetItemtestUpdateContent");
-		VersionIterator it = ruleItem1.getNode().getVersionHistory()
-				.getAllVersions();
-
-		// and this shows using a version iterator.
-		// perhaps migrate to using this rather then next/prev methods.
-		// this way, we can skip.
-		assertTrue(it.hasNext());
-		while (it.hasNext()) {
-			Version n = it.nextVersion();
-			AssetItem item = new AssetItem(ruleItem1.getRulesRepository(), n);
-			assertNotNull(item);
-		}
-	}
-
-	public void testCategoriesPagination() {
-		PackageItem pkg = getRepo().createPackage("LinkedAssetItemtestPagination", "");
-		getRepo().loadCategory("/").addCategory("LinkedAssetItemtestPagedTag", "description");
-
-		AssetItem a = pkg.addAsset("LinkedAssetItemtestPage1", "test content");
-		a.addCategory("LinkedAssetItemtestPagedTag");
-		a.checkin("");
-		
-		a = pkg.addLinkedAsset("LinkedAssetItemlinkedTestPage1", a.getUUID(), null);
-		a.addCategory("LinkedAssetItemtestPagedTag");
-		a.checkin("");		
-		
-		a = pkg.addAsset("LinkedAssetItemtestPage2", "test content");
-		a.addCategory("LinkedAssetItemtestPagedTag");
-		a.checkin("");
-
-
-		a = pkg.addAsset("LinkedAssetItemtestPage3", "test content");
-		a.addCategory("LinkedAssetItemtestPagedTag");
-		a.checkin("");
-
-		a = pkg.addAsset("LinkedAssetItemtestPage4", "test content");
-		a.addCategory("LinkedAssetItemtestPagedTag");
-		a.checkin("");
-
-		a = pkg.addAsset("LinkedAssetItemtestPage5", "test content");
-		a.addCategory("LinkedAssetItemtestPagedTag");
-		a.checkin("");
-
-		AssetPageList list = getRepo().findAssetsByCategory("LinkedAssetItemtestPagedTag", 0,
-				-1);
-		assertTrue(list.currentPosition > 0);
-		assertEquals(5, list.assets.size());
-		assertEquals(false, list.hasNext);
-
-		list = getRepo().findAssetsByCategory("LinkedAssetItemtestPagedTag", 0, 2);
-		assertTrue(list.currentPosition > 0);
-		assertEquals(true, list.hasNext);
-		assertEquals(2, list.assets.size());
-
-		assertEquals("LinkedAssetItemtestPage1", ((AssetItem) list.assets.get(0)).getName());
-		assertEquals("LinkedAssetItemtestPage2", ((AssetItem) list.assets.get(1)).getName());
-
-		list = getRepo().findAssetsByCategory("LinkedAssetItemtestPagedTag", 2, 2);
-		assertTrue(list.currentPosition > 0);
-		assertEquals(true, list.hasNext);
-		assertEquals(2, list.assets.size());
-
-		assertEquals("LinkedAssetItemtestPage3", ((AssetItem) list.assets.get(0)).getName());
-		assertEquals("LinkedAssetItemtestPage4", ((AssetItem) list.assets.get(1)).getName());
-
-		list = getRepo().findAssetsByCategory("LinkedAssetItemtestPagedTag", 2, 3);
-		assertTrue(list.currentPosition > 0);
-		assertEquals(false, list.hasNext);
-		assertEquals(3, list.assets.size());
-
-		assertEquals("LinkedAssetItemtestPage3", ((AssetItem) list.assets.get(0)).getName());
-		assertEquals("LinkedAssetItemtestPage4", ((AssetItem) list.assets.get(1)).getName());
-		assertEquals("LinkedAssetItemtestPage5", ((AssetItem) list.assets.get(2)).getName());
-	}
-
-	public void testCategories() {
-		getRepo().loadCategory("/").addCategory("LinkedAssetItemtestAddTagTestTag",
-				"description");
-		AssetItem ruleItem1 = getDefaultPackage().addAsset("LinkedAssetItemtestAddTag",
-				"test content");	
-		AssetItem linkedRuleItem1 = getDefaultPackage().addLinkedAsset("LinkedAssetItemlinkedTestAddTag", ruleItem1.getUUID(), null);
-
-		linkedRuleItem1.addCategory("LinkedAssetItemtestAddTagTestTag");
-		List tags = linkedRuleItem1.getCategories();
-		assertEquals(1, tags.size());
-		assertEquals("LinkedAssetItemtestAddTagTestTag", ((CategoryItem) tags.get(0))
-				.getName());
-
-		getRepo().loadCategory("/").addCategory("LinkedAssetItemtestAddTagTestTag2",
-				"description");
-		linkedRuleItem1.addCategory("LinkedAssetItemtestAddTagTestTag2");
-		tags = linkedRuleItem1.getCategories();
-		assertEquals(2, tags.size());
-
-		linkedRuleItem1.checkin("woot");
-
-		// now test retrieve by tags
-		List result = getRepo()
-				.findAssetsByCategory("LinkedAssetItemtestAddTagTestTag", 0, -1).assets;
-		assertEquals(1, result.size());
-		AssetItem retItem = (AssetItem) result.get(0);
-		assertEquals("LinkedAssetItemtestAddTag", retItem.getName());
-
-		ruleItem1.updateContent("foo");
-		ruleItem1.checkin("latest");
-
-		assertTrue(ruleItem1.getCategories().size() > 0);
-		assertNotNull(ruleItem1.getCategorySummary());
-		assertEquals("LinkedAssetItemtestAddTagTestTag LinkedAssetItemtestAddTagTestTag2 ", ruleItem1
-				.getCategorySummary());
-
-		//REVISIT: findAssetsByCategory wont return a LinkedAssetItem
-		result = getRepo().findAssetsByCategory("LinkedAssetItemtestAddTagTestTag", 0, -1).assets;
-
-		assertEquals(1, result.size());
-
-		ruleItem1 = (AssetItem) result.get(0);
-		assertEquals(2, ruleItem1.getCategories().size());
-
-		assertEquals("foo", ruleItem1.getContent());
-		AssetItem prev = (AssetItem) ruleItem1.getPrecedingVersion();
-		assertNotNull(prev);
-	}
-
-	public void testUpdateCategories() {
-		getRepo().loadCategory("/").addCategory("LinkedAssetItemtestUpdateCategoriesOnAsset",
-				"la");
-		getRepo().loadCategory("/").addCategory("LinkedAssetItemtestUpdateCategoriesOnAsset2",
-				"la");
-
-		AssetItem item = getRepo().loadDefaultPackage().addAsset(
-				"LinkedAssetItemtestUpdateCategoriesOnAsset", "huhuhu");
-		AssetItem linkedItem = getRepo().loadDefaultPackage().addLinkedAsset("LinkedAssetItemlinkedTestUpdateCategoriesOnAsset",
-				item.getUUID(), null);
-		
-		String[] cats = new String[] { "LinkedAssetItemtestUpdateCategoriesOnAsset",
-				"LinkedAssetItemtestUpdateCategoriesOnAsset2" };
-		linkedItem.updateCategoryList(cats);
-
-		linkedItem.checkin("aaa");
-
-		item = getRepo().loadDefaultPackage().loadAsset(
-				"LinkedAssetItemlinkedTestUpdateCategoriesOnAsset");
-		assertEquals(2, item.getCategories().size());
-
-		for (Iterator iter = item.getCategories().iterator(); iter.hasNext();) {
-			CategoryItem cat = (CategoryItem) iter.next();
-			assertTrue(cat.getName().startsWith("LinkedAssetItemtestUpdateCategoriesOnAsset"));
-		}
-	}
-
-	public void testFindRulesByCategory() throws Exception {
-		getRepo().loadCategory("/").addCategory("LinkedAssetItemtestFindRulesByCat", "yeah");
-		AssetItem as1 = getDefaultPackage().addAsset(
-				"LinkedAssetItemtestFindRulesByCategory1", "ya", "LinkedAssetItemtestFindRulesByCat", "drl");
-		getDefaultPackage().addAsset("LinkedAssetItemtestFindRulesByCategory2", "ya",
-				"LinkedAssetItemtestFindRulesByCat", AssetItem.DEFAULT_CONTENT_FORMAT)
-				.checkin("version0");
-
-		as1.checkin("version0");
-		
-		AssetItem linkedItem = getRepo().loadDefaultPackage().addLinkedAsset("LinkedAssetItemlinkedTestFindRulesByCategory1",
-				as1.getUUID(), "LinkedAssetItemtestFindRulesByCat");
-
-		//REVISIT: findAssetsByCategory wont return a LinkedAssetItem
-		List rules = getRepo()
-				.findAssetsByCategory("LinkedAssetItemtestFindRulesByCat", 0, -1).assets;
-		assertEquals(2, rules.size());
-
-		for (Iterator iter = rules.iterator(); iter.hasNext();) {
-			AssetItem element = (AssetItem) iter.next();
-			assertTrue(element.getName().startsWith("LinkedAssetItemtestFindRulesByCategory"));
-		}
-		
-		getRepo().loadCategory("/").addCategory("LinkedAssetItemtestFindRulesByCat1", "yeah");
-		AssetItem linkedItem1 = getRepo().loadDefaultPackage().addLinkedAsset("LinkedAssetItemlinkedTestFindRulesByCategory2",
-				as1.getUUID(), "LinkedAssetItemtestFindRulesByCat1");
-		linkedItem1.checkin("version2");
-		rules = getRepo().findAssetsByCategory("LinkedAssetItemtestFindRulesByCat1", 0, -1).assets;
-        assertEquals(1, rules.size());
-
-		try {
-			getRepo().loadCategory("LinkedAssetItemtestFindRulesByCat").remove();
-			fail("should not be able to remove");
-		} catch (RulesRepositoryException e) {
-			// assertTrue(e.getCause() instanceof
-			// ReferentialIntegrityException);
-			assertNotNull(e.getMessage());
-		}
-	}
-
-	public void testRemoveTag() {
-		AssetItem ruleItem1 = getDefaultPackage().addAsset("LinkedAssetItemtestRemoveTag",
-				"test content");
-		AssetItem linkedRuleItem1 = getDefaultPackage().addLinkedAsset("LinkedAssetItemlinkedTestRemoveTag",
-				ruleItem1.getUUID(), null);
-
-		getRepo().loadCategory("/").addCategory("LinkedAssetItemTestRemoveCategory",
-				"description");
-
-		linkedRuleItem1.addCategory("LinkedAssetItemTestRemoveCategory");
-		List tags = linkedRuleItem1.getCategories();
-		assertEquals(1, tags.size());
-		linkedRuleItem1.removeCategory("LinkedAssetItemTestRemoveCategory");
-		tags = linkedRuleItem1.getCategories();
-		assertEquals(0, tags.size());
-
-		getRepo().loadCategory("/").addCategory("LinkedAssetItemTestRemoveCategory2",
-				"description");
-		getRepo().loadCategory("/").addCategory("LinkedAssetItemTestRemoveCategory3",
-				"description");
-		linkedRuleItem1.addCategory("LinkedAssetItemTestRemoveCategory2");
-		linkedRuleItem1.addCategory("LinkedAssetItemTestRemoveCategory3");
-		linkedRuleItem1.removeCategory("LinkedAssetItemTestRemoveCategory2");
-		tags = linkedRuleItem1.getCategories();
-		assertEquals(1, tags.size());
-		assertEquals("LinkedAssetItemTestRemoveCategory3", ((CategoryItem) tags.get(0))
-				.getName());
-	}
-
-	public void testSetStateString() {
-		AssetItem ruleItem1 = getDefaultPackage().addAsset(
-				"LinkedAssetItemtestSetStateString", "test content");
-		AssetItem linkedRuleItem1 = getDefaultPackage().addLinkedAsset(
-				"LinkedAssetItemlinkedTestSetStateString", ruleItem1.getUUID());
-
-		getRepo().createState("TestState1");
-
-		linkedRuleItem1.updateState("TestState1");
-		assertNotNull(linkedRuleItem1.getState());
-		assertEquals("TestState1", linkedRuleItem1.getState().getName());
-
-		getRepo().createState("TestState2");
-		linkedRuleItem1.updateState("TestState2");
-		assertNotNull(linkedRuleItem1.getState());
-		assertEquals("TestState2", linkedRuleItem1.getState().getName());
-	}
-
-	public void testStatusStuff() {
-		AssetItem ruleItem1 = getDefaultPackage().addAsset("LinkedAssetItemtestGetState",
-				"test content");
-		AssetItem linkedRuleItem1 = getDefaultPackage().addLinkedAsset(
-				"LinkedAssetItemlinkedTestGetState", ruleItem1.getUUID());
-		
-		StateItem stateItem1 = linkedRuleItem1.getState();
-		assertEquals(StateItem.DRAFT_STATE_NAME, stateItem1.getName());
-
-		linkedRuleItem1.updateState("TestState1");
-		assertNotNull(linkedRuleItem1.getState());
-		assertEquals("TestState1", linkedRuleItem1.getState().getName());
-
-		ruleItem1 = getDefaultPackage().addAsset("LinkedAssetItemtestGetState2", "wa");
-		linkedRuleItem1 = getDefaultPackage().addLinkedAsset(
-				"LinkedAssetItemlinkedTestGetState2", ruleItem1.getUUID());
-		assertEquals(StateItem.DRAFT_STATE_NAME, linkedRuleItem1
-				.getStateDescription());
-		assertEquals(getRepo().getState(StateItem.DRAFT_STATE_NAME), linkedRuleItem1
-				.getState());
-	}
-
-	public void testToString() {
-		AssetItem ruleItem1 = getDefaultPackage().addAsset("LinkedAssetItemtestToString",
-				"test content");
-		AssetItem linkedRuleItem1 = getDefaultPackage().addLinkedAsset(
-				"LinkedAssetItemlinkedTestToString", ruleItem1.getUUID());
-		assertNotNull(linkedRuleItem1.toString());
-	}
-
-	public void testGetLastModifiedOnCheckin() throws Exception {
-		AssetItem ruleItem1 = getDefaultPackage().addAsset(
-				"LinkedAssetItemtestGetLastModified", "test content");
-		AssetItem linkedRuleItem1 = getDefaultPackage().addLinkedAsset(
-				"LinkedAssetItemlinkedTestGetLastModified", ruleItem1.getUUID());
-		
-		Calendar cal = Calendar.getInstance();
-		long before = cal.getTimeInMillis();
-
-		Thread.sleep(100);
-		linkedRuleItem1.updateContent("new lhs");
-		linkedRuleItem1.checkin("woot");
-		Calendar cal2 = linkedRuleItem1.getLastModified();
-		long lastMod = cal2.getTimeInMillis();
-
-		cal = Calendar.getInstance();
-		long after = cal.getTimeInMillis();
-
-		assertTrue(before < lastMod);
-		assertTrue(lastMod < after);
-	}
-
-	public void testGetDateEffective() {
-		AssetItem ruleItem1 = getDefaultPackage().addAsset(
-				"LinkedAssetItemtestGetDateEffective", "test content");
-
-		// it should be initialized to null
-		assertTrue(ruleItem1.getDateEffective() == null);
-
-		// now try setting it, then retrieving it
-		Calendar cal = Calendar.getInstance();
-		ruleItem1.updateDateEffective(cal);
-		Calendar cal2 = ruleItem1.getDateEffective();
-
-		assertEquals(cal, cal2);
-	}
-
-	public void testGetDateExpired() {
-		try {
-			AssetItem ruleItem1 = getRepo().loadDefaultPackage().addAsset(
-					"LinkedAssetItemtestGetDateExpired", "test content");
-			AssetItem linkedRuleItem1 = getDefaultPackage().addLinkedAsset(
-					"LinkedAssetItemlinkedtestGetDateExpired", ruleItem1.getUUID());
-			
-			// it should be initialized to null
-			assertTrue(linkedRuleItem1.getDateExpired() == null);
-
-			// now try setting it, then retrieving it
-			Calendar cal = Calendar.getInstance();
-			linkedRuleItem1.updateDateExpired(cal);
-			Calendar cal2 = linkedRuleItem1.getDateExpired();
-
-			assertEquals(cal, cal2);
-		} catch (Exception e) {
-			fail("Caught unexpected exception: " + e);
-		}
-	}
-
-	public void testSaveAndCheckinDescriptionAndTitle() throws Exception {
-		AssetItem ruleItem1 = getRepo().loadDefaultPackage().addAsset(
-				"LinkedAssetItemtestGetDescription", "");
-		ruleItem1.checkin("version0");
-		AssetItem linkedRuleItem1 = getDefaultPackage().addLinkedAsset(
-				"LinkedAssetItemlinkedtestGetDescription", ruleItem1.getUUID());
-		//This check in has no effect on ruleItem1, as nothing related to ruleItem1 has been changed
-		linkedRuleItem1.checkin("version1");		
-
-		// it should be "" to begin with
-		assertEquals("", linkedRuleItem1.getDescription());
-
-		linkedRuleItem1.updateDescription("test description");
-		assertEquals("test description", linkedRuleItem1.getDescription());
-
-		assertTrue(getRepo().getSession().hasPendingChanges());
-
-		linkedRuleItem1.updateTitle("This is a title");
-		assertTrue(getRepo().getSession().hasPendingChanges());
-		linkedRuleItem1.checkin("ya");
-
-		// we can save without a checkin
-		getRepo().getSession().save();
-
-		assertFalse(getRepo().getSession().hasPendingChanges());
-
-		try {
-			linkedRuleItem1.getPrecedingVersion().updateTitle("baaad");
-			fail("should not be able to do this");
-		} catch (RulesRepositoryException e) {
-			assertNotNull(e.getMessage());
-		}
-	}
-
-	public void testGetPrecedingVersionAndRestore() throws Exception {
-		getRepo().loadCategory("/").addCategory("LinkedAssetItemfoo", "ka");
-		AssetItem ruleItem1 = getRepo().loadDefaultPackage().addAsset(
-				"LinkedAssetItemtestGetPrecedingVersion", "descr");
-		ruleItem1.checkin("version0");
-		assertTrue(ruleItem1.getPrecedingVersion() == null);
-		AssetItem linkedRuleItem1 = getDefaultPackage().addLinkedAsset(
-				"LinkedAssetItemlinkedtestGetPrecedingVersion", ruleItem1.getUUID());
-		linkedRuleItem1.checkin("version0");		
-		assertNotNull(ruleItem1.getPrecedingVersion());
-		assertNotNull(linkedRuleItem1.getPrecedingVersion());
-
-		linkedRuleItem1.addCategory("LinkedAssetItemfoo");
-		linkedRuleItem1.updateContent("test content");
-		linkedRuleItem1.updateDescription("descr2");
-		Thread.sleep(100);
-		linkedRuleItem1.checkin("boo");
-
-		AssetItem predecessorRuleItem = (AssetItem) linkedRuleItem1
-				.getPrecedingVersion();
-		assertNotNull(predecessorRuleItem);
-
-		// check version handling
-		assertNotNull(predecessorRuleItem.getVersionSnapshotUUID());
-		assertFalse(predecessorRuleItem.getVersionSnapshotUUID().equals(
-				ruleItem1.getUUID()));
-
-		// assertEquals(predecessorRuleItem.getCreatedDate().getTimeInMillis(),
-		// ruleItem1.getCreatedDate().getTimeInMillis());
-
-		assertEquals(ruleItem1.getState().getName(), predecessorRuleItem
-				.getState().getName());
-		// assertEquals(ruleItem1.getName(), predecessorRuleItem.getName());
-
-		AssetItem loadedHistorical = getRepo().loadAssetByUUID(
-				predecessorRuleItem.getVersionSnapshotUUID());
-		assertTrue(loadedHistorical.isHistoricalVersion());
-		assertFalse(ruleItem1.getVersionNumber() == loadedHistorical
-				.getVersionNumber());
-
-		linkedRuleItem1.updateContent("new content");
-		linkedRuleItem1.checkin("two changes");
-
-		predecessorRuleItem = (AssetItem) linkedRuleItem1.getPrecedingVersion();
-		assertNotNull(predecessorRuleItem);
-		assertEquals(1, predecessorRuleItem.getCategories().size());
-		CategoryItem cat = (CategoryItem) predecessorRuleItem.getCategories()
-				.get(0);
-		assertEquals("LinkedAssetItemfoo", cat.getName());
-
-		assertEquals("test content", predecessorRuleItem.getContent());
-
-		assertEquals(RulesRepository.DEFAULT_PACKAGE, predecessorRuleItem
-				.getPackageName());
-
-		linkedRuleItem1.updateContent("newer lhs");
-		linkedRuleItem1.checkin("another");
-
-		predecessorRuleItem = (AssetItem) linkedRuleItem1.getPrecedingVersion();
-		assertNotNull(predecessorRuleItem);
-		assertEquals("new content", predecessorRuleItem.getContent());
-		predecessorRuleItem = (AssetItem) predecessorRuleItem
-				.getPrecedingVersion();
-		assertNotNull(predecessorRuleItem);
-		assertEquals("test content", predecessorRuleItem.getContent());
-
-		// now try restoring
-		long oldVersionNumber = ruleItem1.getVersionNumber();
-
-		AssetItem toRestore = getRepo().loadAssetByUUID(
-				predecessorRuleItem.getVersionSnapshotUUID());
-
-		getRepo().restoreHistoricalAsset(toRestore, linkedRuleItem1,
-				"cause I want to");
-
-		AssetItem restored = getRepo().loadDefaultPackage().loadAsset(
-				"LinkedAssetItemtestGetPrecedingVersion");
-
-		// assertEquals( predecessorRuleItem.getCheckinComment(),
-		// restored.getCheckinComment());
-		assertEquals(predecessorRuleItem.getDescription(), restored
-				.getDescription());
-		assertEquals("cause I want to", restored.getCheckinComment());
-		assertEquals(6, restored.getVersionNumber());
-		assertFalse(oldVersionNumber == restored.getVersionNumber());
-	}
-
-	public void testGetSucceedingVersion() {
-		AssetItem ruleItem1 = getRepo().loadDefaultPackage().addAsset(
-				"LinkedAssetItemtestGetSucceedingVersion", "test description");
-		ruleItem1.checkin("version0");
-		assertEquals(1, ruleItem1.getVersionNumber());
-		
-		AssetItem linkedRuleItem1 = getDefaultPackage().addLinkedAsset(
-				"LinkedAssetItemlinkedtestGetSucceedingVersion", ruleItem1.getUUID());
-		linkedRuleItem1.checkin("version1");	
-		assertEquals(2, linkedRuleItem1.getVersionNumber());
-		
-		AssetItem succeedingRuleItem = (AssetItem) linkedRuleItem1
-				.getSucceedingVersion();
-		assertTrue(succeedingRuleItem == null);
-
-		linkedRuleItem1.updateContent("new content");
-		linkedRuleItem1.checkin("la");
-
-		assertEquals(3, linkedRuleItem1.getVersionNumber());
-
-		AssetItem predecessorRuleItem = (AssetItem) linkedRuleItem1
-				.getPrecedingVersion();
-		assertEquals("", predecessorRuleItem.getContent());
-		succeedingRuleItem = (AssetItem) predecessorRuleItem
-				.getSucceedingVersion();
-		assertNotNull(succeedingRuleItem);
-		assertEquals(linkedRuleItem1.getContent(), succeedingRuleItem.getContent());
-	}
-
-	public void testGetSuccessorVersionsIterator() {
-		try {
-			AssetItem ruleItem1 = getRepo().loadDefaultPackage().addAsset(
-					"LinkedAssetItemtestGetSuccessorVersionsIterator", "test content");
-			ruleItem1.checkin("version0");
-			
-			AssetItem linkedRuleItem1 = getDefaultPackage().addLinkedAsset(
-					"LinkedAssetItemlinkedtestGetSuccessorVersionsIterator", ruleItem1.getUUID());
-			linkedRuleItem1.checkin("version1");	
-			
-			Iterator iterator = linkedRuleItem1.getSuccessorVersionsIterator();
-			assertNotNull(iterator);
-			assertFalse(iterator.hasNext());
-
-			linkedRuleItem1.updateContent("new content").checkin("ya");
-
-			iterator = linkedRuleItem1.getSuccessorVersionsIterator();
-			assertNotNull(iterator);
-			assertFalse(iterator.hasNext());
-
-			AssetItem predecessorRuleItem = (AssetItem) linkedRuleItem1
-					.getPrecedingVersion();
-			iterator = predecessorRuleItem.getSuccessorVersionsIterator();
-			assertNotNull(iterator);
-			assertTrue(iterator.hasNext());
-			AssetItem nextRuleItem = (AssetItem) iterator.next();
-			assertEquals("new content", nextRuleItem.getContent());
-			assertFalse(iterator.hasNext());
-
-			linkedRuleItem1.updateContent("newer content");
-			linkedRuleItem1.checkin("boo");
-
-			iterator = predecessorRuleItem.getSuccessorVersionsIterator();
-			assertNotNull(iterator);
-			assertTrue(iterator.hasNext());
-			nextRuleItem = (AssetItem) iterator.next();
-			assertEquals("new content", nextRuleItem.getContent());
-			assertTrue(iterator.hasNext());
-			nextRuleItem = (AssetItem) iterator.next();
-			assertEquals("newer content", nextRuleItem.getContent());
-			assertFalse(iterator.hasNext());
-		} catch (Exception e) {
-			fail("Caught unexpected exception: " + e);
-		}
-	}
-
-	public void testGetPredecessorVersionsIterator() {
-		AssetItem ruleItem1 = getRepo().loadDefaultPackage().addAsset(
-				"LinkedAssetItemtestGetPredecessorVersionsIterator", "test description");
-		ruleItem1.checkin("version0");
-
-		Iterator iterator = ruleItem1.getPredecessorVersionsIterator();
-		assertNotNull(iterator);
-		assertFalse(iterator.hasNext());
-		
-		AssetItem linkedRuleItem1 = getDefaultPackage().addLinkedAsset(
-				"LinkedAssetItemlinkedtestGetPredecessorVersionsIterator", ruleItem1.getUUID());
-		linkedRuleItem1.checkin("version1");	
-
-		ruleItem1.updateContent("test content");
-		ruleItem1.checkin("lalalalala");
-
-		iterator = linkedRuleItem1.getPredecessorVersionsIterator();
-		assertNotNull(iterator);
-		assertTrue(iterator.hasNext());
-
-		ruleItem1.updateContent("new content");
-		ruleItem1.checkin("boo");
-
-		iterator = linkedRuleItem1.getPredecessorVersionsIterator();
-		assertNotNull(iterator);
-		assertTrue(iterator.hasNext());
-		AssetItem nextRuleItem = (AssetItem) iterator.next();
-
-		assertEquals("test content", nextRuleItem.getContent());
-
-		ruleItem1.updateContent("newer content");
-		ruleItem1.checkin("wee");
-
-		iterator = linkedRuleItem1.getPredecessorVersionsIterator();
-		assertNotNull(iterator);
-		assertTrue(iterator.hasNext());
-		nextRuleItem = (AssetItem) iterator.next();
-		assertTrue(iterator.hasNext());
-		assertEquals("new content", nextRuleItem.getContent());
-		nextRuleItem = (AssetItem) iterator.next();
-
-		assertEquals("test content", nextRuleItem.getContent());
-
-		assertEquals("", ((AssetItem) iterator.next()).getContent());
-
-	}
-
-	public void testHistoryIterator() throws Exception {
-		AssetItem ruleItem1 = getRepo().loadDefaultPackage().addAsset(
-				"LinkedAssetItemtestHistoryIterator", "test description");
-		ruleItem1.checkin("version0");
-		
-		AssetItem linkedRuleItem1 = getDefaultPackage().addLinkedAsset(
-				"LinkedAssetItemlinkedtestHistoryIterator", ruleItem1.getUUID());
-		linkedRuleItem1.checkin("version1");	
-		
-		ruleItem1 = getRepo().loadAssetByUUID(linkedRuleItem1.getUUID());
-		ruleItem1.updateContent("wo");
-		ruleItem1.checkin("version2");
-
-		ruleItem1 = getRepo().loadAssetByUUID(ruleItem1.getUUID());
-		ruleItem1.updateContent("ya");
-		ruleItem1.checkin("version3");
-
-		Iterator it = ruleItem1.getHistory();
-		for (int i = 0; i < 3; i++) {
-			assertTrue(it.hasNext());
-			it.next();
-		}
-	}
-
-	public void testGetTitle() {
-		AssetItem ruleItem1 = getRepo().loadDefaultPackage().addAsset(
-				"LinkedAssetItemtestGetTitle", "test content");
-		
-		AssetItem linkedRuleItem1 = getDefaultPackage().addLinkedAsset(
-				"LinkedAssetItemlinkedtestGetTitle", ruleItem1.getUUID());		
-
-		assertEquals("LinkedAssetItemlinkedtestGetTitle", linkedRuleItem1.getName());
-		assertEquals("LinkedAssetItemtestGetTitle", ruleItem1.getName());
-		//NOTE: LinkedAssetItem does not have its own Title property.
-		assertEquals("LinkedAssetItemtestGetTitle", linkedRuleItem1.getTitle());
-		assertEquals("LinkedAssetItemtestGetTitle", ruleItem1.getTitle());
-	}
-
-	public void testDublinCoreProperties() {
-		PackageItem pkg = getRepo().createPackage("LinkedAssetItemtestDublinCore", "wa");
-
-		AssetItem ruleItem = pkg.addAsset("LinkedAssetItemtestDublinCoreProperties",
-				"yeah yeah yeah");
-		ruleItem.checkin("woo");
-		
-		AssetItem linkedRuleItem1 = pkg.addLinkedAsset(
-				"LinkedAssetItemlinkedtestDublinCoreProperties", ruleItem.getUUID());
-		
-		linkedRuleItem1.updateCoverage("b");
-		assertEquals("b", linkedRuleItem1.getCoverage());
-		linkedRuleItem1.checkin("woo");
-
-		ruleItem = getRepo().loadPackage("LinkedAssetItemtestDublinCore").loadAsset("LinkedAssetItemtestDublinCoreProperties");
-		assertEquals("b", ruleItem.getCoverage());
-		assertEquals("", ruleItem.getExternalRelation());
-		assertEquals("", ruleItem.getExternalSource());
-		
-		ruleItem = getRepo().loadPackage("LinkedAssetItemtestDublinCore").loadAsset("LinkedAssetItemlinkedtestDublinCoreProperties");
-		assertEquals("b", ruleItem.getCoverage());
-		assertEquals("", ruleItem.getExternalRelation());
-		assertEquals("", ruleItem.getExternalSource());
-	}
-
-	public void testGetFormat() throws Exception {
-		AssetItem ruleItem1 = getRepo().loadDefaultPackage().addAsset(
-				"LinkedAssetItemtestGetFormat", "test content");
-		
-		AssetItem linkedRuleItem1 = getRepo().loadDefaultPackage().addLinkedAsset(
-				"LinkedAssetItemlinkedtestGetFormat", ruleItem1.getUUID());
-		
-		linkedRuleItem1.updateContent("la");
-		assertEquals(AssetItem.DEFAULT_CONTENT_FORMAT, linkedRuleItem1.getFormat());
-
-		assertTrue(linkedRuleItem1.getNode().hasProperty(
-				AssetItem.CONTENT_PROPERTY_NAME));
-		assertFalse(linkedRuleItem1.getNode().hasProperty(
-				AssetItem.CONTENT_PROPERTY_BINARY_NAME));
-
-		linkedRuleItem1.updateFormat("blah");
-		assertEquals("blah", linkedRuleItem1.getFormat());
-	}
-
-	public void testAnonymousProperties() {
-		AssetItem item = getRepo().loadDefaultPackage().addAsset(
-				"LinkedAssetItemanonymousproperty", "lalalalala");
-		
-		AssetItem linkedRuleItem1 = getRepo().loadDefaultPackage().addLinkedAsset(
-				"LinkedAssetItemlinkedanonymousproperty", item.getUUID());
-		
-		linkedRuleItem1.updateUserProperty("fooBar", "value");
-		assertEquals("value", linkedRuleItem1.getUserProperty("fooBar"));
-
-		linkedRuleItem1.checkin("lalalala");
-		try {
-			linkedRuleItem1.updateUserProperty("drools:content", "whee");
-			fail("should not be able to set built in properties this way.");
-		} catch (IllegalArgumentException e) {
-			assertNotNull(e.getMessage());
-		}
-	}
-
-	public void testBinaryAsset() throws Exception {
-		AssetItem item = getRepo().loadDefaultPackage().addAsset(
-				"LinkedAssetItemtestBinaryAsset", "yeah");
-		
-		AssetItem linkedRuleItem1 = getRepo().loadDefaultPackage().addLinkedAsset(
-				"LinkedAssetItemlinkedtestBinaryAsset", item.getUUID());
-		
-		String data = "abc 123";
-		ByteArrayInputStream in = new ByteArrayInputStream(data.getBytes());
-		linkedRuleItem1.updateBinaryContentAttachment(in);
-		linkedRuleItem1.updateBinaryContentAttachmentFileName("x.x");
-		in.close();
-
-		assertEquals(data, linkedRuleItem1.getContent());
-
-		assertFalse(linkedRuleItem1.getNode().hasProperty(AssetItem.CONTENT_PROPERTY_NAME));
-		assertTrue(linkedRuleItem1.getNode().hasProperty(
-				AssetItem.CONTENT_PROPERTY_BINARY_NAME));
-		linkedRuleItem1.checkin("lalalala");
-
-		assertTrue(linkedRuleItem1.isBinary());
-
-		item = getRepo().loadDefaultPackage().loadAsset("LinkedAssetItemtestBinaryAsset");
-		InputStream in2 = item.getBinaryContentAttachment();
-		assertNotNull(in2);
-
-		byte[] data2 = item.getBinaryContentAsBytes();
-		assertEquals(data, new String(data2));
-		assertEquals("x.x", item.getBinaryContentAttachmentFileName());
-		assertTrue(item.isBinary());
-
-		linkedRuleItem1.updateContent("qed");
-		linkedRuleItem1.checkin("");
-		item = getRepo().loadAssetByUUID(item.getUUID());
-		assertEquals("qed", item.getContent());
-	}
-
-}

Modified: labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/PackageItemTest.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/PackageItemTest.java	2009-11-11 06:29:14 UTC (rev 30096)
+++ labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/PackageItemTest.java	2009-11-11 07:14:46 UTC (rev 30097)
@@ -1,6 +1,7 @@
 package org.drools.repository;
 
 import java.util.ArrayList;
+import java.util.Calendar;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -9,6 +10,10 @@
 
 public class PackageItemTest extends TestCase {
 
+	private PackageItem loadGlobalArea() {
+		return getRepo().loadGlobalArea();
+	}
+	
     public void testListPackages() throws Exception {
         RulesRepository repo = getRepo();
         PackageItem item = repo.createPackage( "testListPackages1", "lalalala" );
@@ -448,36 +453,29 @@
             assertEquals(2, rules.size());
     }
 
-    public void testAddLinkedRuleRuleItem() {
-        PackageItem rulePackageItem1 = getRepo().createPackage("testAddLinkedRuleRuleItem","desc");
-
-        AssetItem ruleItem1 = rulePackageItem1.addAsset("testAddLinkedRuleRuleItem", "test description");
+    public void testAddRuleItemFromGlobalArea() {
+        AssetItem ruleItem1 = loadGlobalArea().addAsset("testAddRuleItemFromGlobalAreaRuleItem", "test description");
         ruleItem1.updateContent( "test content" );
         ruleItem1.checkin( "updated the rule content" );
         
-        AssetItem linkedRuleItem1 = rulePackageItem1.addLinkedAsset("linkedTestAddLinkedRuleRuleItem", ruleItem1.getUUID(), null);
+        PackageItem rulePackageItem2 = getRepo().createPackage("testAddRuleItemFromGlobalArea1","desc");
+        AssetItem linkedRuleItem1 = rulePackageItem2.addAssetImportedFromGlobalArea(ruleItem1.getName());
         linkedRuleItem1.updateContent( "test content for linked" );
         linkedRuleItem1.checkin( "updated the rule content for linked" );       
-
-        Iterator rulesIt1 = rulePackageItem1.getAssets();
-        List rules1 = iteratorToList( rulesIt1 );
-        assertEquals(2, rules1.size());    
  
         //test that it is following the head revision
         ruleItem1.updateContent("new lhs");
         ruleItem1.checkin( "updated again" );        
         
-        Iterator rulesIt2 = rulePackageItem1.getAssets();
-        List rules2 = iteratorToList( rulesIt2 );
-        assertEquals(2, rules2.size());
-        
-        while(rulesIt2.hasNext()) {
-        	AssetItem ai = (AssetItem)rulesIt2.next();
-            assertTrue(ai.getName().equals("testAddLinkedRuleRuleItem") || ai.getName().equals("linkedTestAddLinkedRuleRuleItem"));
-            assertEquals("new lhs", ai.getContent());
-            assertEquals("test description", ai.getDescription());    
-            assertEquals("updated again", ai.getCheckinComment());  
-        }        
+        Iterator rulesIt2 = rulePackageItem2.getAssets();
+		List rules2 = iteratorToList(rulesIt2);
+		assertEquals(1, rules2.size());
+
+		AssetItem ai = (AssetItem) rules2.get(0);
+		assertTrue(ai.getName().equals("testAddRuleItemFromGlobalAreaRuleItem"));
+		assertEquals("new lhs", ai.getContent());
+		assertEquals("test description", ai.getDescription());
+		assertEquals("updated again", ai.getCheckinComment());       
     }
     
     List iteratorToList(Iterator it) {
@@ -609,34 +607,36 @@
         assertTrue(list2.get( 2 ) instanceof AssetItem);
     }
 
-    public void testSearchLinkedAssetByFormat() throws Exception {
-        PackageItem pkg1 = getRepo().createPackage( "testSearchLinkedAssetByFormat1", "" );
-        PackageItem pkg2 = getRepo().createPackage( "testSearchLinkedAssetByFormat2", "" );
-        getRepo().save();
-
-        AssetItem item = pkg1.addAsset( "testSearchLinkedAssetByFormatAsset1", "" );
-        item.updateFormat( "xyz" );
+    public void testSearchSharedAssetByFormat() throws Exception {
+        AssetItem item = loadGlobalArea().addAsset( "testSearchSharedAssetByFormat", "" );
+        item.updateFormat( "testSearchSharedAssetByFormat" );
         item.checkin( "la" );
         
-        AssetItem linkedItem = pkg2.addLinkedAsset( "testSearchLinkedAssetByFormatAsset2", item.getUUID(), null);
-        linkedItem.updateFormat( "xyz" );
-        linkedItem.checkin( "la" );
+        AssetItemIterator it = loadGlobalArea().queryAssets( "drools:format='testSearchSharedAssetByFormat'" );
+        List list = iteratorToList( it );
+        assertEquals(1, list.size());
+        assertTrue(list.get( 0 ) instanceof AssetItem);
+        
+        PackageItem pkg2 = getRepo().createPackage( "testSearchSharedAssetByFormat", "" );
+        getRepo().save();
+        AssetItem linkedItem = pkg2.addAssetImportedFromGlobalArea(item.getName());
 
         Thread.sleep( 150 );
 
-        AssetItemIterator it = pkg1.queryAssets( "drools:format='xyz'" );
-        List list = iteratorToList( it );
+        item = loadGlobalArea().loadAsset("testSearchSharedAssetByFormat");
+        assertEquals("testSearchSharedAssetByFormat", item.getFormat());
+
+        it = loadGlobalArea().queryAssets( "drools:format='testSearchSharedAssetByFormat'" );
+        list = iteratorToList( it );
         assertEquals(1, list.size());
         assertTrue(list.get( 0 ) instanceof AssetItem);
  
-        linkedItem = pkg2.loadAsset("testSearchLinkedAssetByFormatAsset2");
+/*        linkedItem = pkg2.loadAsset("testSearchLinkedAssetByFormatAsset2");
         assertNotNull(linkedItem);
-        assertTrue(linkedItem instanceof LinkedAssetItem);
-        assertTrue(((LinkedAssetItem)linkedItem).isLinkedAssetItem());
-        assertEquals("testSearchLinkedAssetByFormat2", linkedItem.getPackageName());
+        assertEquals("global", linkedItem.getPackageName());
        	
         it = pkg2.queryAssets( "drools:format='xyz'" );
-        list = iteratorToList( it );
+        list = iteratorToList( it );*/
         
         //REVISIT: Not working yet.
         //assertEquals(1, list.size());
@@ -804,7 +804,7 @@
 
         assertEquals(v, item.getVersionNumber());
     }
-
+	
     static class MockAssetItem extends AssetItem {
         private long version;
 

Modified: labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/RulesRepositoryTest.java
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/RulesRepositoryTest.java	2009-11-11 06:29:14 UTC (rev 30096)
+++ labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/RulesRepositoryTest.java	2009-11-11 07:14:46 UTC (rev 30097)
@@ -565,16 +565,20 @@
         assertTrue( it.hasNext() );
 
         boolean found = false;
+        //listPackages() should not return the global area even though the global area is a package.
+        boolean foundGlobalArea = false;
         while ( it.hasNext() ) {
             PackageItem element = (PackageItem) it.next();
             if ( element.getName().equals( "testListPackages" ) ) {
                 found = true;
-                break;
             }
-            System.out.println( element.getName() );
-        }
+            
+            if ( element.getName().equals(RulesRepository.RULE_GLOBAL_AREA) ) {
+            	foundGlobalArea = true;
+            }
+         }
         assertTrue( found );
-
+        assertFalse( foundGlobalArea );
     }
 
     public void testFindAssetsByState() throws Exception {
@@ -1045,41 +1049,35 @@
 
     }
 
-    public void testImportExport() {
-        RulesRepository repo = RepositorySessionUtil.getRepository();
-        byte[] repository_unitest;
-        byte[] repository_backup;
+    public void xtestImportExport() {
+		RulesRepository repo = RepositorySessionUtil.getRepository();
+		byte[] repository_unitest;
+		byte[] repository_backup;
 
-        try {
+		ByteArrayOutputStream bout = new ByteArrayOutputStream();
+		repo.exportRulesRepositoryToStream(bout);
+		repository_backup = bout.toByteArray();
+		assertNotNull(repository_backup);
 
-            ByteArrayOutputStream bout = new ByteArrayOutputStream();
-            repo.exportRulesRepositoryToStream(bout);
-            repository_backup = bout.toByteArray();
-            assertNotNull( repository_backup );
+		repo.createPackage("testImportExport", "nodescription");
+		bout = new ByteArrayOutputStream();
+		repo.exportRulesRepositoryToStream(bout);
 
-            repo.createPackage( "testImportExport",
-                                "nodescription" );
-            bout = new ByteArrayOutputStream();
-            repo.exportRulesRepositoryToStream(bout);
+		repository_unitest = bout.toByteArray();
 
-            repository_unitest = bout.toByteArray();
+		repo.importRulesRepositoryFromStream(new ByteArrayInputStream(
+				repository_backup));
+		assertFalse(repo.containsPackage("testImportExport"));
 
-            repo.importRulesRepositoryFromStream(new ByteArrayInputStream(repository_backup));
-            assertFalse( repo.containsPackage( "testImportExport" ) );
+		repo.importRulesRepositoryFromStream(new ByteArrayInputStream(
+				repository_unitest));
 
-            repo.importRulesRepositoryFromStream(new ByteArrayInputStream(repository_unitest));
+		assertTrue(repo.containsPackage("testImportExport"));
 
-            assertTrue( repo.containsPackage( "testImportExport" ) );
+		repo.importRepository(new ByteArrayInputStream(repository_unitest));
+		assertTrue(repo.containsPackage("testImportExport"));
+	}
 
-            repo.importRepository(new ByteArrayInputStream(repository_unitest));
-            assertTrue( repo.containsPackage( "testImportExport" ) );
-
-        } catch ( Exception e ) {
-            fail( "Can't throw any exception." );
-            e.printStackTrace();
-        }
-    }
-
 	public void testShareableNodes() throws Exception {
 		RulesRepository repo = RepositorySessionUtil.getRepository();
 		AssetItem item = repo.loadDefaultPackage().addAsset("testShareableNodeOriginal", "desc");
@@ -1101,8 +1099,73 @@
 		
 	    assertTrue( originalItem.getContent().equals("la"));
 	    assertTrue( sharedItem.getContent().equals("la"));
+	    
+	    originalItem.remove();
 	}
 	
+	public void testShareableNodesWithQuery() throws Exception {
+		RulesRepository repo = RepositorySessionUtil.getRepository();
+		AssetItem item = repo.loadGlobalArea().addAsset("testShareableNodesWithQueryOriginal", "desc");
+		item.updateFormat("xyz");
+		item.getNode().addMixin("mix:shareable");
+		PackageItem source = repo.createPackage("testShareableNodesWithQueryPackage", "desc");
+		repo.save();
+
+	    
+        AssetItemIterator it = repo.loadGlobalArea().queryAssets( "drools:format='xyz'" );
+        List list = iteratorToList( it );
+        assertEquals(1, list.size());
+        assertTrue(list.get( 0 ) instanceof AssetItem);
+        
+		source.checkout();
+		
+		Session session = repo.getSession();
+		Workspace workspace = session.getWorkspace();
+		String path = "/drools:repository/drools:package_area/testShareableNodesWithQueryPackage/assets/testShareableNodesWithQueryShared";
+		workspace.clone(workspace.getName(), item.getNode().getPath(), path, false);		
+		repo.save();
+		
+		AssetItem originalItem = repo.loadGlobalArea().loadAsset("testShareableNodesWithQueryOriginal");
+		AssetItem sharedItem = repo.loadPackage("testShareableNodesWithQueryPackage").loadAsset("testShareableNodesWithQueryShared");
+		
+	    assertTrue( originalItem.getFormat().equals("xyz"));
+	    assertTrue( sharedItem.getFormat().equals("xyz"));
+	    
+        it = repo.loadGlobalArea().queryAssets( "drools:format='xyz'" );
+        list = iteratorToList( it );
+        assertEquals(1, list.size());
+        assertTrue(list.get( 0 ) instanceof AssetItem);
+	}	
+	
+	public void xtestImportExportWithShareableNodes() throws Exception {
+		RulesRepository repo = RepositorySessionUtil.getRepository();
+		AssetItem item = repo.loadDefaultPackage().addAsset("testShareableNodeOriginal", "desc");
+		item.updateContent("la");
+		item.getNode().addMixin("mix:shareable");
+		PackageItem source = repo.createPackage("testShareableNodesPackage", "desc");
+		repo.save();
+
+		source.checkout();
+		
+		Session session = repo.getSession();
+		Workspace workspace = session.getWorkspace();
+		String path = "/drools:repository/drools:package_area/testShareableNodesPackage/assets/testShareableNodeShared";
+		workspace.clone(workspace.getName(), item.getNode().getPath(), path, false);		
+		repo.save();
+		
+		byte[] repository_backup;
+
+		ByteArrayOutputStream bout = new ByteArrayOutputStream();
+		repo.exportRulesRepositoryToStream(bout);
+		repository_backup = bout.toByteArray();
+		assertNotNull(repository_backup);
+
+		repo.importRulesRepositoryFromStream(new ByteArrayInputStream(
+				repository_backup));
+		assertTrue(repo.containsPackage("testShareableNodesPackage"));
+		assertTrue(repo.loadPackage("testShareableNodesPackage").containsAsset("testShareableNodeOriginal"));
+	}
+	
 	//In this test case we expect an ItemExistException from the second thread,
     //other than ending up with two packages with same name.
 	public void xtestConcurrentCopyPackage() throws Exception {

Copied: labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/ShareableAssetItemTest.java (from rev 29780, labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/LinkedAssetItemTest.java)
===================================================================
--- labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/ShareableAssetItemTest.java	                        (rev 0)
+++ labs/jbossrules/trunk/drools-repository/src/test/java/org/drools/repository/ShareableAssetItemTest.java	2009-11-11 07:14:46 UTC (rev 30097)
@@ -0,0 +1,774 @@
+package org.drools.repository;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.jcr.version.Version;
+import javax.jcr.version.VersionIterator;
+
+import junit.framework.TestCase;
+import org.drools.repository.events.StorageEventManager;
+
+public class ShareableAssetItemTest extends TestCase {
+
+	private RulesRepository getRepo() {
+		return RepositorySessionUtil.getRepository();
+	}
+
+	private PackageItem loadGlobalArea() {
+		return getRepo().loadGlobalArea();
+	}
+
+	private PackageItem getDefaultPackage() {
+		return getRepo().loadDefaultPackage();
+	}
+	
+	
+	public void testCreateShareableAsset() throws Exception {
+		Calendar now = Calendar.getInstance();
+		Thread.sleep(500); // MN: need this sleep to get the correct date
+
+		AssetItem ruleItem = loadGlobalArea().addAsset("testCreateShareableAssetAsset",
+				"desc");
+		ruleItem.updateContent("la");
+		ruleItem.checkin("initial");
+		
+		AssetItem linkedRuleItem = getDefaultPackage().addAssetImportedFromGlobalArea(ruleItem.getName());
+		linkedRuleItem.updateContent("laa");
+		linkedRuleItem.checkin("second");
+		
+		//Test name
+		assertEquals("testCreateShareableAssetAsset", linkedRuleItem.getName());
+		assertEquals("testCreateShareableAssetAsset", ruleItem.getName());
+
+		//Test Date
+		assertNotNull(ruleItem.getCreatedDate());
+		assertNotNull(linkedRuleItem.getCreatedDate());
+		assertTrue(now.before(ruleItem.getCreatedDate()));
+		assertTrue(now.before(linkedRuleItem.getCreatedDate()));
+
+		//Test package name
+		assertEquals("globalArea", ruleItem.getPackageName());
+		//NOTE: For the asset that links to the shared asset, its package name is always "globalArea".
+		assertEquals("globalArea", linkedRuleItem.getPackageName());
+		assertEquals(loadGlobalArea().getUUID(), ruleItem.getPackage().getUUID());
+		
+		//REVISIT: getPackage mess. 
+		//assertEquals(loadGlobalArea().getUUID(), linkedRuleItem.getPackage().getUUID());		
+		assertEquals("laa", linkedRuleItem.getContent());
+		assertEquals("laa", ruleItem.getContent());
+
+		//Test UUID
+		assertNotNull(ruleItem.getUUID());
+		assertNotNull(linkedRuleItem.getUUID());
+		//NOTE: They are same nodes. So same UUID! 
+		assertTrue(linkedRuleItem.getUUID().equals(linkedRuleItem.getUUID()));
+	}
+	
+	public void testRemoveShareableAsset() throws Exception {
+		AssetItem asset = loadGlobalArea().addAsset("testRemoveShareableAssetAsset",
+				"desc");
+		asset.updateContent("la");
+		asset.checkin("initial");
+		
+		AssetItem linkedAsset = getDefaultPackage().addAssetImportedFromGlobalArea(asset.getName());
+		linkedAsset.updateContent("laa");
+		linkedAsset.checkin("second");
+		
+		//REVISIT: the shared asset can not be removed unless no asset refers to it. 
+		//asset.remove();
+		
+		linkedAsset.remove();
+		
+		try {
+			AssetItem linkedAsset1 = getDefaultPackage().loadAsset(
+					"testRemoveShareableAssetAsset");
+			fail("Did not get expected exception");
+		} catch (RulesRepositoryException e) {
+
+		}
+		
+		AssetItem asset1 = loadGlobalArea().loadAsset(
+		"testRemoveShareableAssetAsset");
+		assertTrue(asset.getUUID().equals(asset1.getUUID()));
+	}
+	
+	public void testGetContentLengthForShareableAsset() throws Exception {
+		AssetItem ruleItem = loadGlobalArea().addAsset("testGetContentLengthForShareableAsset", "desc");
+		ruleItem.checkin("initial");
+		AssetItem linkedRuleItem = getDefaultPackage().addAssetImportedFromGlobalArea(ruleItem.getName());
+		
+		assertEquals(0, ruleItem.getContentLength());
+		assertEquals(0, linkedRuleItem.getContentLength());
+		ruleItem.updateContent("boo");
+		ruleItem.checkin("");
+		assertEquals("boo".getBytes().length, ruleItem.getContentLength());
+		assertEquals("boo".getBytes().length, linkedRuleItem.getContentLength());
+		
+		linkedRuleItem.updateContent("booo");
+		linkedRuleItem.checkin("");
+		assertEquals("booo".getBytes().length, ruleItem.getContentLength());
+		assertEquals("booo".getBytes().length, linkedRuleItem.getContentLength());
+		
+		
+		ruleItem = loadGlobalArea().addAsset("testGetContentLengthForShareableAsset2", "");
+		ruleItem.checkin("initial");
+		linkedRuleItem = getDefaultPackage().addAssetImportedFromGlobalArea(ruleItem.getName());
+
+		assertEquals(0, ruleItem.getContentLength());
+		assertEquals(0, linkedRuleItem.getContentLength());		
+		linkedRuleItem.updateBinaryContentAttachment(new ByteArrayInputStream("foobar"
+				.getBytes()));
+		linkedRuleItem.checkin("");
+		assertEquals("foobar".getBytes().length, ruleItem.getContentLength());
+		assertEquals("foobar".getBytes().length, linkedRuleItem.getContentLength());
+		
+		ruleItem.updateBinaryContentAttachment(new ByteArrayInputStream("foobarr"
+				.getBytes()));
+		ruleItem.checkin("");
+		assertEquals("foobarr".getBytes().length, ruleItem.getContentLength());
+		assertEquals("foobarr".getBytes().length, linkedRuleItem.getContentLength());
+	}
+
+	public void testUpdateStringPropertyForShareableAsset() throws Exception {
+		AssetItem asset = loadGlobalArea().addAsset(
+				"testUpdateStringPropertyForShareableAsset", "desc");
+		asset.checkin("initial");
+		AssetItem linkedAsset = getDefaultPackage().addAssetImportedFromGlobalArea(asset.getName());		
+		linkedAsset.updateContent("new content");
+		linkedAsset.checkin("");
+
+		linkedAsset.updateStringProperty("Anything", "AField");
+		assertEquals("Anything", linkedAsset.getStringProperty("AField"));
+		assertEquals("Anything", asset.getStringProperty("AField"));
+
+
+		asset.updateStringProperty("More", "AField", false);		
+		asset.updateContent("more content");
+		asset.checkin("");
+
+		asset = getRepo().loadAssetByUUID(asset.getUUID());
+		assertEquals("More", asset.getStringProperty("AField"));
+		assertEquals("more content", asset.getContent());		
+		linkedAsset = getRepo().loadAssetByUUID(linkedAsset.getUUID());
+		assertEquals("More", linkedAsset.getStringProperty("AField"));
+		assertEquals("more content", asset.getContent());
+	}
+
+	public void testGetPackageItemHistoricalForShareableAsset() throws Exception {
+		AssetItem asset = loadGlobalArea().addAsset("testGetPackageItemHistoricalForShareableAsset", "test content");
+		//Version 1, created by the original asset
+		asset.checkin("initial");		
+		AssetItem linkedAsset = getDefaultPackage().addAssetImportedFromGlobalArea(asset.getName());		
+
+		//Test package snapshot
+		getRepo().createPackageSnapshot(getDefaultPackage().getName(), "SNAP");
+
+		PackageItem pkgSnap = getRepo().loadPackageSnapshot(getDefaultPackage().getName(), "SNAP");
+		AssetItem assetSnap = pkgSnap.loadAsset("testGetPackageItemHistoricalForShareableAsset");
+		PackageItem pkgSnap1 = assetSnap.getPackage();
+		assertTrue(pkgSnap1.isSnapshot());
+		assertTrue(pkgSnap.isSnapshot());
+		assertFalse(getDefaultPackage().isSnapshot());
+		assertEquals(getDefaultPackage().getName(), pkgSnap1.getName());
+		
+		AssetItem linkedAsset1 = getDefaultPackage().loadAsset("testGetPackageItemHistoricalForShareableAsset");
+		PackageItem linkedPkg = linkedAsset1.getPackage();
+		assertFalse(linkedPkg.isSnapshot());
+		assertFalse(getDefaultPackage().isSnapshot());
+		assertEquals(getDefaultPackage().getName(), linkedPkg.getName());
+		
+		linkedAsset.updateDescription("yeah !");
+		
+		//Version 3, created by LinkedAssetItem
+		linkedAsset.checkin("new");
+
+		linkedAsset = getDefaultPackage().loadAsset("testGetPackageItemHistoricalForShareableAsset");
+		assertNotNull(linkedAsset.getPackage());
+
+		AssetHistoryIterator linkedIt = linkedAsset.getHistory();
+		assertEquals(4, iteratorToList(linkedIt).size());		
+		
+		asset = getDefaultPackage().loadAsset("testGetPackageItemHistoricalForShareableAsset");
+		AssetHistoryIterator it = asset.getHistory();
+		assertEquals(4, iteratorToList(it).size());		
+	}
+	
+    List iteratorToList(Iterator it) {
+        List list = new ArrayList();
+        while(it.hasNext()) {
+            list.add( it.next() );
+        }
+        return list;
+    }
+
+	public void testGetContentForShareableAsset() {
+		AssetItem asset = getRepo().loadGlobalArea().addAsset(
+				"testGetContentForShareableAsset", "test content");
+		AssetItem linkedAsset = getRepo().loadDefaultPackage().addAssetImportedFromGlobalArea(asset.getName());
+		
+		linkedAsset.updateContent("test content");
+		linkedAsset.updateFormat("drl");
+
+		assertNotNull(linkedAsset.getNode());
+		assertEquals("test content", linkedAsset.getContent());
+		assertEquals("test content", asset.getContent());
+
+		assertFalse(linkedAsset.isBinary());
+		assertFalse(asset.isBinary());
+
+		assertNotNull(linkedAsset.getBinaryContentAsBytes());
+		assertNotNull(linkedAsset.getBinaryContentAttachment());
+		String content = new String(linkedAsset.getBinaryContentAsBytes());
+		assertNotNull(content);
+		content = new String(asset.getBinaryContentAsBytes());
+		assertNotNull(content);	
+	}
+
+	public void testUpdateContentForShareableAsset() throws Exception {
+		AssetItem asset = getRepo().loadGlobalArea().addAsset(
+				"testUpdateContentForShareableAsset", "test content");
+		AssetItem linkedAsset = getRepo().loadDefaultPackage().addAssetImportedFromGlobalArea(asset.getName());
+
+		assertFalse(asset.getCreator().equals(""));
+		assertFalse(linkedAsset.getCreator().equals(""));
+		linkedAsset.updateContent("test content");
+		linkedAsset.checkin("yeah");
+
+		assertFalse(linkedAsset.getLastContributor().equals(""));
+		assertFalse(asset.getLastContributor().equals(""));
+
+		linkedAsset.updateContent("new rule content");
+
+		assertEquals("new rule content", linkedAsset.getContent());
+
+		assertTrue(linkedAsset.getNode().getSession().hasPendingChanges());
+		assertTrue(asset.getNode().getSession().hasPendingChanges());
+
+		asset.checkin("yeah !");
+		assertFalse(asset.getNode().getSession().hasPendingChanges());
+		assertEquals("yeah !", asset.getCheckinComment());
+		
+		try {
+		    linkedAsset.checkin("yeah linked !");
+		    fail("Did not get expected exception: Unable to checkin");
+		} catch (RulesRepositoryException e) {
+			
+		}
+
+		AssetItem prev = (AssetItem) asset.getPrecedingVersion();
+		assertEquals("test content", prev.getContent());
+		assertFalse("yeah !".equals(prev.getCheckinComment()));
+
+		asset = getDefaultPackage().loadAsset("testUpdateContentForShareableAsset");
+		VersionIterator it = asset.getNode().getVersionHistory()
+				.getAllVersions();
+
+		// and this shows using a version iterator.
+		// perhaps migrate to using this rather then next/prev methods.
+		// this way, we can skip.
+		assertTrue(it.hasNext());
+		while (it.hasNext()) {
+			Version n = it.nextVersion();
+			AssetItem item = new AssetItem(asset.getRulesRepository(), n);
+			assertNotNull(item);
+		}
+	}
+
+	public void testCategoriesForShareableAsset() {
+		getRepo().loadCategory("/").addCategory("testCategoriesTag",	"description");
+		getRepo().loadCategory("/").addCategory("testCategoriesTag2", "description");		
+		AssetItem asset = getRepo().loadGlobalArea().addAsset("testCategoriesForShareableAsset", "desc");	
+		AssetItem linkedAsset = getDefaultPackage().addAssetImportedFromGlobalArea(asset.getName());
+
+		linkedAsset.addCategory("testCategoriesTag");
+		List tags = linkedAsset.getCategories();
+		assertEquals(1, tags.size());
+		assertEquals("testCategoriesTag", ((CategoryItem) tags.get(0)).getName());
+
+		linkedAsset.addCategory("testCategoriesTag2");
+		tags = linkedAsset.getCategories();
+		assertEquals(2, tags.size());
+
+		linkedAsset.checkin("woot");
+
+		// now test retrieve by tags
+		List result = getRepo().findAssetsByCategory("testCategoriesTag", 0, -1).assets;
+		assertEquals(1, result.size());
+		AssetItem retItem = (AssetItem) result.get(0);
+		assertEquals("testCategoriesForShareableAsset", retItem.getName());
+
+		asset.updateContent("foo");
+		asset.checkin("latest");
+
+		assertTrue(asset.getCategories().size() > 0);
+		assertNotNull(asset.getCategorySummary());
+		assertEquals("testCategoriesTag testCategoriesTag2 ", asset
+				.getCategorySummary());
+
+		result = getRepo().findAssetsByCategory("testCategoriesTag2", 0, -1).assets;
+
+		assertEquals(1, result.size());
+		asset = (AssetItem) result.get(0);
+		assertEquals(2, asset.getCategories().size());
+	}
+
+	public void testUpdateCategoriesForShareableAsset() {
+		getRepo().loadCategory("/").addCategory("testUpdateCategoriesForShareableAssetTag1", "la");
+		getRepo().loadCategory("/").addCategory("testUpdateCategoriesForShareableAssetTag2", "la");
+		AssetItem asset = getRepo().loadGlobalArea().addAsset("testUpdateCategoriesForShareableAsset", "desc");	
+		AssetItem linkedAsset = getDefaultPackage().addAssetImportedFromGlobalArea(asset.getName());
+		
+		String[] cats = new String[] { "testUpdateCategoriesForShareableAssetTag1",
+				"testUpdateCategoriesForShareableAssetTag2" };
+		linkedAsset.updateCategoryList(cats);
+
+		linkedAsset.checkin("aaa");
+
+		asset = getRepo().loadGlobalArea().loadAsset("testUpdateCategoriesForShareableAsset");
+		assertEquals(2, asset.getCategories().size());
+
+		for (Iterator iter = asset.getCategories().iterator(); iter.hasNext();) {
+			CategoryItem cat = (CategoryItem) iter.next();
+			assertTrue(cat.getName().startsWith("testUpdateCategoriesForShareableAssetTag"));
+		}
+	}
+
+	public void testRemoveTagForShareableAsset() {
+		getRepo().loadCategory("/").addCategory("testRemoveTagForShareableAssetTag1", "la");
+		getRepo().loadCategory("/").addCategory("testRemoveTagForShareableAssetTag2", "description");
+		getRepo().loadCategory("/").addCategory("testRemoveTagForShareableAssetTag3", "description");	
+		AssetItem asset = getRepo().loadGlobalArea().addAsset("testRemoveTagForShareableAsset", "desc");	
+		AssetItem linkedAsset = getDefaultPackage().addAssetImportedFromGlobalArea(asset.getName());
+
+		linkedAsset.addCategory("testRemoveTagForShareableAssetTag1");
+		List tags = linkedAsset.getCategories();
+		assertEquals(1, tags.size());
+		linkedAsset.removeCategory("testRemoveTagForShareableAssetTag1");
+		tags = linkedAsset.getCategories();
+		assertEquals(0, tags.size());
+
+		linkedAsset.addCategory("testRemoveTagForShareableAssetTag2");
+		linkedAsset.addCategory("testRemoveTagForShareableAssetTag3");
+		linkedAsset.checkin("aaa");
+
+		linkedAsset.removeCategory("testRemoveTagForShareableAssetTag3");
+		linkedAsset.checkin("aaa");
+		getRepo().save();
+
+		tags = linkedAsset.getCategories();
+		assertEquals(1, tags.size());
+		assertEquals("testRemoveTagForShareableAssetTag2", ((CategoryItem) tags.get(0))
+				.getName());
+		
+		try {
+			getRepo().loadCategory("testRemoveTagForShareableAssetTag2").remove();
+			fail("should not be able to remove");
+		} catch (RulesRepositoryException e) {
+			assertNotNull(e.getMessage());
+		}
+		
+		//REVISIT:
+/*		try {
+			getRepo().loadCategory("testRemoveTagForShareableAssetTag3").remove();
+			fail("should not reach here. Should have been removed");
+		} catch (RulesRepositoryException e) {
+			assertNotNull(e.getMessage());
+		}*/
+	}
+
+	public void testStatusStufftestRemoveTagForShareableAsset() {
+		getRepo().createState("testStatusStufftestRemoveTagForShareableAssetStatus");
+
+		AssetItem asset = getRepo().loadGlobalArea().addAsset("testStatusStufftestRemoveTagForShareableAsset", "desc");	
+		AssetItem linkedAsset = getDefaultPackage().addAssetImportedFromGlobalArea(asset.getName());
+		
+		StateItem stateItem1 = linkedAsset.getState();
+		assertEquals(StateItem.DRAFT_STATE_NAME, stateItem1.getName());
+		assertEquals(getRepo().getState(StateItem.DRAFT_STATE_NAME), linkedAsset.getState());
+		assertEquals(StateItem.DRAFT_STATE_NAME, linkedAsset.getStateDescription());
+		
+		linkedAsset.updateState("testStatusStufftestRemoveTagForShareableAssetStatus");
+		assertEquals("testStatusStufftestRemoveTagForShareableAssetStatus", linkedAsset.getState().getName());
+	}
+
+	public void testGetDateEffectiveForShareableAsset() {
+		AssetItem asset = getRepo().loadGlobalArea().addAsset("testGetDateEffectiveForShareableAsset", "desc");	
+		AssetItem linkedAsset = getDefaultPackage().addAssetImportedFromGlobalArea(asset.getName());
+
+		// it should be initialized to null
+		assertTrue(linkedAsset.getDateEffective() == null);
+
+		// now try setting it, then retrieving it
+		Calendar cal = Calendar.getInstance();
+		linkedAsset.updateDateEffective(cal);
+		Calendar cal2 = linkedAsset.getDateEffective();
+
+		assertEquals(cal, cal2);
+	}
+
+	public void testGetDateExpiredForShareableAsset() {
+		AssetItem asset = getRepo().loadGlobalArea().addAsset(
+				"testGetDateExpiredForShareableAsset", "desc");
+		AssetItem linkedAsset = getDefaultPackage()
+				.addAssetImportedFromGlobalArea(asset.getName());
+
+		// it should be initialized to null
+		assertTrue(linkedAsset.getDateExpired() == null);
+
+		// now try setting it, then retrieving it
+		Calendar cal = Calendar.getInstance();
+		linkedAsset.updateDateExpired(cal);
+		Calendar cal2 = linkedAsset.getDateExpired();
+
+		assertEquals(cal, cal2);
+	}
+
+	public void testSaveAndCheckinDescriptionAndTitleForShareableAsset() throws Exception {
+		AssetItem asset = getRepo().loadGlobalArea().addAsset("testSaveAndCheckinDescriptionAndTitleForShareableAsset", "desc");
+		asset.checkin("version0");
+		AssetItem linkedAsset = getDefaultPackage().addAssetImportedFromGlobalArea(asset.getName());
+
+		// it should be "" to begin with
+		assertEquals("desc", linkedAsset.getDescription());
+
+		linkedAsset.updateDescription("test description");
+		assertEquals("test description", linkedAsset.getDescription());
+
+		assertTrue(getRepo().getSession().hasPendingChanges());
+
+		linkedAsset.updateTitle("This is a title");
+		assertTrue(getRepo().getSession().hasPendingChanges());
+		linkedAsset.checkin("ya");
+
+		// we can save without a checkin
+		getRepo().getSession().save();
+
+		assertFalse(getRepo().getSession().hasPendingChanges());
+
+		try {
+			linkedAsset.getPrecedingVersion().updateTitle("baaad");
+			fail("should not be able to do this");
+		} catch (RulesRepositoryException e) {
+			assertNotNull(e.getMessage());
+		}
+	}
+
+	public void testGetPrecedingVersionAndRestoreForShareableAsset() throws Exception {
+		getRepo().loadCategory("/").addCategory("testGetPrecedingVersionAndRestoreCat", "ka");
+		AssetItem asset = getRepo().loadGlobalArea().addAsset("testGetPrecedingVersionAndRestoreForShareableAsset", "desc");
+		asset.checkin("version0");
+		AssetItem linkedAsset = getDefaultPackage().addAssetImportedFromGlobalArea(asset.getName());
+
+		//assertTrue(asset.getPrecedingVersion() == null);
+		assertNotNull(asset.getPrecedingVersion());
+		assertNotNull(linkedAsset.getPrecedingVersion());
+
+		linkedAsset.addCategory("testGetPrecedingVersionAndRestoreCat");
+		linkedAsset.updateContent("test content");
+		linkedAsset.updateDescription("descr2");
+		Thread.sleep(100);
+		linkedAsset.checkin("boo");
+
+		AssetItem predecessorRuleItem = (AssetItem)linkedAsset.getPrecedingVersion();
+		assertNotNull(predecessorRuleItem);
+
+		// check version handling
+		assertNotNull(predecessorRuleItem.getVersionSnapshotUUID());
+		assertFalse(predecessorRuleItem.getVersionSnapshotUUID().equals(
+				asset.getUUID()));
+
+		// assertEquals(predecessorRuleItem.getCreatedDate().getTimeInMillis(),
+		// ruleItem1.getCreatedDate().getTimeInMillis());
+
+		assertEquals(asset.getState().getName(), predecessorRuleItem
+				.getState().getName());
+		// assertEquals(ruleItem1.getName(), predecessorRuleItem.getName());
+
+		AssetItem loadedHistorical = getRepo().loadAssetByUUID(
+				predecessorRuleItem.getVersionSnapshotUUID());
+		assertTrue(loadedHistorical.isHistoricalVersion());
+		assertFalse(asset.getVersionNumber() == loadedHistorical
+				.getVersionNumber());
+
+		linkedAsset.updateContent("new content");
+		linkedAsset.checkin("two changes");
+
+		predecessorRuleItem = (AssetItem) linkedAsset.getPrecedingVersion();
+		assertNotNull(predecessorRuleItem);
+		assertEquals(1, predecessorRuleItem.getCategories().size());
+		CategoryItem cat = (CategoryItem) predecessorRuleItem.getCategories()
+				.get(0);
+		assertEquals("testGetPrecedingVersionAndRestoreCat", cat.getName());
+
+		assertEquals("test content", predecessorRuleItem.getContent());
+
+		assertEquals(getRepo().loadGlobalArea().getName(), predecessorRuleItem
+				.getPackageName());
+
+		linkedAsset.updateContent("newer lhs");
+		linkedAsset.checkin("another");
+
+		predecessorRuleItem = (AssetItem) linkedAsset.getPrecedingVersion();
+		assertNotNull(predecessorRuleItem);
+		assertEquals("new content", predecessorRuleItem.getContent());
+		predecessorRuleItem = (AssetItem) predecessorRuleItem
+				.getPrecedingVersion();
+		assertNotNull(predecessorRuleItem);
+		assertEquals("test content", predecessorRuleItem.getContent());
+
+		// now try restoring
+		long oldVersionNumber = asset.getVersionNumber();
+
+		AssetItem toRestore = getRepo().loadAssetByUUID(
+				predecessorRuleItem.getVersionSnapshotUUID());
+
+		getRepo().restoreHistoricalAsset(toRestore, linkedAsset,
+				"cause I want to");
+
+		AssetItem restored = getRepo().loadDefaultPackage().loadAsset(
+				"testGetPrecedingVersionAndRestoreForShareableAsset");
+
+		// assertEquals( predecessorRuleItem.getCheckinComment(),
+		// restored.getCheckinComment());
+		assertEquals(predecessorRuleItem.getDescription(), restored
+				.getDescription());
+		assertEquals("cause I want to", restored.getCheckinComment());
+		assertEquals(6, restored.getVersionNumber());
+		assertFalse(oldVersionNumber == restored.getVersionNumber());
+	}
+
+	public void testGetSucceedingVersionForShareableAsset() {
+		AssetItem asset = getRepo().loadGlobalArea().addAsset("testGetSucceedingVersionForShareableAsset", "desc");
+		asset.checkin("version0");
+		AssetItem linkedAsset = getDefaultPackage().addAssetImportedFromGlobalArea(asset.getName());
+
+		//Making the assset sharable creates the version 2. 
+		assertEquals(2, asset.getVersionNumber());
+		linkedAsset.updateContent("new content1");
+		linkedAsset.checkin("la");
+		
+		AssetItem succeedingRuleItem = (AssetItem) linkedAsset.getSucceedingVersion();
+		assertTrue(succeedingRuleItem == null);
+
+		linkedAsset.updateContent("new content2");
+		linkedAsset.checkin("la");
+
+		assertEquals(4, linkedAsset.getVersionNumber());
+
+		AssetItem predecessorRuleItem = (AssetItem) linkedAsset
+				.getPrecedingVersion();
+		assertEquals("new content1", predecessorRuleItem.getContent());
+		succeedingRuleItem = (AssetItem) predecessorRuleItem
+				.getSucceedingVersion();
+		assertNotNull(succeedingRuleItem);
+		assertEquals(linkedAsset.getContent(), succeedingRuleItem.getContent());
+	}
+
+	public void testGetSuccessorVersionsIteratorForShareableAsset() {
+		AssetItem asset = getRepo().loadGlobalArea().addAsset(
+				"testGetSuccessorVersionsIteratorForShareableAsset", "desc");
+		asset.checkin("version0");
+		AssetItem linkedAsset = getDefaultPackage()
+				.addAssetImportedFromGlobalArea(asset.getName());
+
+		Iterator iterator = linkedAsset.getSuccessorVersionsIterator();
+		assertNotNull(iterator);
+		assertFalse(iterator.hasNext());
+
+		linkedAsset.updateContent("new content").checkin("ya");
+
+		iterator = linkedAsset.getSuccessorVersionsIterator();
+		assertNotNull(iterator);
+		assertFalse(iterator.hasNext());
+
+		AssetItem predecessorRuleItem = (AssetItem) linkedAsset
+				.getPrecedingVersion();
+		iterator = predecessorRuleItem.getSuccessorVersionsIterator();
+		assertNotNull(iterator);
+		assertTrue(iterator.hasNext());
+		AssetItem nextRuleItem = (AssetItem) iterator.next();
+		assertEquals("new content", nextRuleItem.getContent());
+		assertFalse(iterator.hasNext());
+
+		linkedAsset.updateContent("newer content");
+		linkedAsset.checkin("boo");
+
+		iterator = predecessorRuleItem.getSuccessorVersionsIterator();
+		assertNotNull(iterator);
+		assertTrue(iterator.hasNext());
+		nextRuleItem = (AssetItem) iterator.next();
+		assertEquals("new content", nextRuleItem.getContent());
+		assertTrue(iterator.hasNext());
+		nextRuleItem = (AssetItem) iterator.next();
+		assertEquals("newer content", nextRuleItem.getContent());
+		assertFalse(iterator.hasNext());
+	}
+
+	public void testGetPredecessorVersionsIteratorForShareableAsset() {
+		AssetItem asset = getRepo().loadGlobalArea().addAsset(
+				"testGetPredecessorVersionsIteratorForShareableAsset", "desc");
+		asset.checkin("version0");
+		AssetItem linkedAsset = getDefaultPackage()
+				.addAssetImportedFromGlobalArea(asset.getName());
+
+		linkedAsset.updateContent("test content");
+		linkedAsset.checkin("lalalalala");
+
+		Iterator iterator = linkedAsset.getPredecessorVersionsIterator();
+		assertNotNull(iterator);
+		assertTrue(iterator.hasNext());
+
+		asset.updateContent("new content");
+		asset.checkin("boo");
+
+		iterator = linkedAsset.getPredecessorVersionsIterator();
+		assertNotNull(iterator);
+		assertTrue(iterator.hasNext());
+		AssetItem nextRuleItem = (AssetItem) iterator.next();
+
+		assertEquals("test content", nextRuleItem.getContent());
+
+		asset.updateContent("newer content");
+		asset.checkin("wee");
+
+		iterator = linkedAsset.getPredecessorVersionsIterator();
+		assertNotNull(iterator);
+		assertTrue(iterator.hasNext());
+		nextRuleItem = (AssetItem) iterator.next();
+		assertTrue(iterator.hasNext());
+		assertEquals("new content", nextRuleItem.getContent());
+		nextRuleItem = (AssetItem) iterator.next();
+
+		assertEquals("test content", nextRuleItem.getContent());
+
+		assertEquals("", ((AssetItem) iterator.next()).getContent());
+	}
+
+	public void testHistoryIteratorForShareableAsset() throws Exception {
+		AssetItem asset = getRepo().loadGlobalArea().addAsset("testHistoryIteratorForShareableAsset", "desc");
+		asset.checkin("version0");
+		AssetItem linkedAsset = getDefaultPackage().addAssetImportedFromGlobalArea(asset.getName());
+
+		linkedAsset = getRepo().loadAssetByUUID(linkedAsset.getUUID());
+		linkedAsset.updateContent("wo");
+		linkedAsset.checkin("version2");
+
+		asset = getRepo().loadAssetByUUID(asset.getUUID());
+		asset.updateContent("ya");
+		asset.checkin("version3");
+
+		Iterator it = asset.getHistory();
+		for (int i = 0; i < 3; i++) {
+			assertTrue(it.hasNext());
+			it.next();
+		}
+	}
+
+	public void testGetTitleForShareableAsset() {
+		AssetItem asset = getRepo().loadGlobalArea().addAsset("testGetTitleForShareableAsset", "desc");
+		asset.checkin("version0");
+		AssetItem linkedAsset = getDefaultPackage().addAssetImportedFromGlobalArea(asset.getName());
+
+		assertEquals("testGetTitleForShareableAsset", linkedAsset.getName());
+		assertEquals("testGetTitleForShareableAsset", asset.getName());
+		//NOTE: Linked AssetItem does not have its own Title property.
+		assertEquals("testGetTitleForShareableAsset", linkedAsset.getTitle());
+		assertEquals("testGetTitleForShareableAsset", asset.getTitle());
+	}
+
+	public void testDublinCorePropertiesForShareableAsset() {
+		AssetItem asset = getRepo().loadGlobalArea().addAsset("testDublinCorePropertiesForShareableAsset", "desc");
+		asset.checkin("version0");
+		AssetItem linkedAsset = getDefaultPackage().addAssetImportedFromGlobalArea(asset.getName());
+
+		linkedAsset.updateCoverage("b");
+		assertEquals("b", linkedAsset.getCoverage());
+		linkedAsset.checkin("woo");
+
+		linkedAsset = getDefaultPackage().loadAsset("testDublinCorePropertiesForShareableAsset");
+		assertEquals("b", linkedAsset.getCoverage());
+		assertEquals("", linkedAsset.getExternalRelation());
+		assertEquals("", linkedAsset.getExternalSource());
+		
+		linkedAsset = getRepo().loadGlobalArea().loadAsset("testDublinCorePropertiesForShareableAsset");
+		assertEquals("b", linkedAsset.getCoverage());
+		assertEquals("", linkedAsset.getExternalRelation());
+		assertEquals("", linkedAsset.getExternalSource());
+	}
+
+	public void testGetFormatForShareableAsset() throws Exception {
+		AssetItem asset = getRepo().loadGlobalArea().addAsset("testGetFormatForShareableAsset", "desc");
+		asset.checkin("version0");
+		AssetItem linkedAsset = getDefaultPackage().addAssetImportedFromGlobalArea(asset.getName());
+
+		
+		linkedAsset.updateContent("la");
+		assertEquals(AssetItem.DEFAULT_CONTENT_FORMAT, linkedAsset.getFormat());
+
+		assertTrue(linkedAsset.getNode().hasProperty(
+				AssetItem.CONTENT_PROPERTY_NAME));
+		assertFalse(linkedAsset.getNode().hasProperty(
+				AssetItem.CONTENT_PROPERTY_BINARY_NAME));
+
+		linkedAsset.updateFormat("blah");
+		assertEquals("blah", linkedAsset.getFormat());
+	}
+
+	public void testAnonymousPropertiesForShareableAsset() {
+		AssetItem asset = getRepo().loadGlobalArea().addAsset("testAnonymousPropertiesForShareableAsset", "desc");
+		asset.checkin("version0");
+		AssetItem linkedAsset = getDefaultPackage().addAssetImportedFromGlobalArea(asset.getName());
+
+		linkedAsset.updateUserProperty("fooBar", "value");
+		assertEquals("value", linkedAsset.getUserProperty("fooBar"));
+
+		linkedAsset.checkin("lalalala");
+		try {
+			linkedAsset.updateUserProperty("drools:content", "whee");
+			fail("should not be able to set built in properties this way.");
+		} catch (IllegalArgumentException e) {
+			assertNotNull(e.getMessage());
+		}
+	}
+
+	public void testBinaryAssetForShareableAsset() throws Exception {
+		AssetItem asset = getRepo().loadGlobalArea().addAsset("testBinaryAssetForShareableAsset", "desc");
+		asset.checkin("version0");
+		AssetItem linkedAsset = getDefaultPackage().addAssetImportedFromGlobalArea(asset.getName());
+		
+		String data = "abc 123";
+		ByteArrayInputStream in = new ByteArrayInputStream(data.getBytes());
+		linkedAsset.updateBinaryContentAttachment(in);
+		linkedAsset.updateBinaryContentAttachmentFileName("x.x");
+		in.close();
+
+		assertEquals(data, linkedAsset.getContent());
+
+		assertFalse(linkedAsset.getNode().hasProperty(AssetItem.CONTENT_PROPERTY_NAME));
+		assertTrue(linkedAsset.getNode().hasProperty(
+				AssetItem.CONTENT_PROPERTY_BINARY_NAME));
+		linkedAsset.checkin("lalalala");
+
+		assertTrue(linkedAsset.isBinary());
+
+		asset = getRepo().loadGlobalArea().loadAsset("testBinaryAssetForShareableAsset");
+		InputStream in2 = asset.getBinaryContentAttachment();
+		assertNotNull(in2);
+
+		byte[] data2 = asset.getBinaryContentAsBytes();
+		assertEquals(data, new String(data2));
+		assertEquals("x.x", asset.getBinaryContentAttachmentFileName());
+		assertTrue(asset.isBinary());
+
+		linkedAsset.updateContent("qed");
+		linkedAsset.checkin("");
+		linkedAsset = getRepo().loadAssetByUUID(linkedAsset.getUUID());
+		assertEquals("qed", linkedAsset.getContent());
+	}
+
+}



More information about the jboss-svn-commits mailing list