[exo-jcr-commits] exo-jcr SVN: r3368 - in jcr/trunk/exo.jcr.component.core: src/main/java/org/exoplatform/services/jcr/core/security and 8 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Fri Oct 29 07:45:19 EDT 2010


Author: tolusha
Date: 2010-10-29 07:45:18 -0400 (Fri, 29 Oct 2010)
New Revision: 3368

Added:
   jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/access/TestPermissions.java
Modified:
   jcr/trunk/exo.jcr.component.core/pom.xml
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/core/security/JCRRuntimePermissions.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NamespaceDataPersister.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/ScratchWorkspaceInitializer.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/JCRNodeTypeDataPersister.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/VersionHistoryImpl.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/VersionImpl.java
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/version/VersionHistoryDataHelper.java
   jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/cluster/test-configuration.xml
   jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/cluster/test-jcr-config.xml
   jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/test-configuration.xml
   jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/test-jcr-config.xml
   jcr/trunk/exo.jcr.component.core/src/test/resources/test.policy
Log:
JCR-1485: Unknown error and strange behavior when mary edits a webcontent

Modified: jcr/trunk/exo.jcr.component.core/pom.xml
===================================================================
--- jcr/trunk/exo.jcr.component.core/pom.xml	2010-10-29 11:35:39 UTC (rev 3367)
+++ jcr/trunk/exo.jcr.component.core/pom.xml	2010-10-29 11:45:18 UTC (rev 3368)
@@ -727,7 +727,6 @@
                         <exclude>org/exoplatform/services/jcr/**/impl/**/TestDBCleanerService.java</exclude>
                         <exclude>org/exoplatform/services/jcr/**/impl/**/TestSaveConfiguration.java</exclude>
                         <exclude>org/exoplatform/services/jcr/**/impl/**/ValueStoragePluginTest.java</exclude>
-                        <exclude>org/exoplatform/services/jcr/**/impl/**/TestWorkspaceRestore.java</exclude>
                         <exclude>org/exoplatform/services/jcr/**/impl/**/TestSessionCleaner.java</exclude>
                         <exclude>org/exoplatform/services/jcr/**/impl/**/Base*.java</exclude>
                         <exclude>org/exoplatform/services/jcr/**/impl/**/TestJCRSerializationStream.java</exclude>

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/core/security/JCRRuntimePermissions.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/core/security/JCRRuntimePermissions.java	2010-10-29 11:35:39 UTC (rev 3367)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/core/security/JCRRuntimePermissions.java	2010-10-29 11:45:18 UTC (rev 3368)
@@ -27,6 +27,8 @@
 
    public static final RuntimePermission CREATE_SYSTEM_SESSION_PERMISSION = new RuntimePermission("createSystemSession");
 
+   public static final RuntimePermission INVOKE_INTERNAL_API_PERMISSION = new RuntimePermission("invokeInternalAPI");
+
    public static final RuntimePermission MANAGE_REPOSITORY_PERMISSION = new RuntimePermission("manageRepository");
 
 }

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NamespaceDataPersister.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NamespaceDataPersister.java	2010-10-29 11:35:39 UTC (rev 3367)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NamespaceDataPersister.java	2010-10-29 11:45:18 UTC (rev 3368)
@@ -352,12 +352,13 @@
 
       if (addACL)
       {
-         AccessControlList acl = new AccessControlList();
          InternalQName[] mixins = new InternalQName[]{Constants.EXO_OWNEABLE, Constants.EXO_PRIVILEGEABLE};
 
          exoNamespaces =
             TransientNodeData.createNodeData(nsSystem, Constants.EXO_NAMESPACES, Constants.NT_UNSTRUCTURED, mixins);
 
+         AccessControlList acl = exoNamespaces.getACL();
+
          TransientPropertyData primaryType =
             TransientPropertyData.createPropertyData(exoNamespaces, Constants.JCR_PRIMARYTYPE, PropertyType.NAME,
                false, new TransientValueData(exoNamespaces.getPrimaryTypeName()));

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java	2010-10-29 11:35:39 UTC (rev 3367)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java	2010-10-29 11:45:18 UTC (rev 3368)
@@ -395,6 +395,12 @@
    public void cancelMerge(Version version) throws VersionException, InvalidItemStateException,
       UnsupportedRepositoryOperationException, RepositoryException
    {
+      if (!session.getAccessManager().hasPermission(getACL(),
+         new String[]{PermissionType.ADD_NODE, PermissionType.SET_PROPERTY}, session.getUserState().getIdentity()))
+      {
+         throw new AccessDeniedException("Access denied: cancel merge operation " + getPath() + " for: "
+            + session.getUserID() + " item owner " + getACL().getOwner());
+      }
 
       checkValid();
 
@@ -445,6 +451,13 @@
    {
 
       checkValid();
+      
+      if (!session.getAccessManager().hasPermission(getACL(),
+         new String[]{PermissionType.ADD_NODE, PermissionType.SET_PROPERTY}, session.getUserState().getIdentity()))
+      {
+         throw new AccessDeniedException("Access denied: checkin operation " + getPath() + " for: "
+            + session.getUserID() + " item owner " + getACL().getOwner());
+      }
 
       if (!this.isNodeType(Constants.MIX_VERSIONABLE))
       {
@@ -491,7 +504,7 @@
 
       dataManager.getTransactManager().save(changesLog);
 
-      VersionImpl version = (VersionImpl)dataManager.getItemByIdentifier(verIdentifier, true);
+      VersionImpl version = (VersionImpl)dataManager.getItemByIdentifier(verIdentifier, true, false);
 
       session.getActionHandler().postCheckin(this);
       return version;
@@ -505,6 +518,13 @@
 
       checkValid();
 
+      if (!session.getAccessManager().hasPermission(getACL(), new String[]{PermissionType.SET_PROPERTY},
+         session.getUserState().getIdentity()))
+      {
+         throw new AccessDeniedException("Access denied: checkout operation " + getPath() + " for: "
+            + session.getUserID() + " item owner " + getACL().getOwner());
+      }
+
       if (!this.isNodeType(Constants.MIX_VERSIONABLE))
       {
          throw new UnsupportedRepositoryOperationException(
@@ -670,6 +690,13 @@
       UnsupportedRepositoryOperationException, RepositoryException
    {
 
+      if (!session.getAccessManager().hasPermission(getACL(),
+         new String[]{PermissionType.ADD_NODE, PermissionType.SET_PROPERTY}, session.getUserState().getIdentity()))
+      {
+         throw new AccessDeniedException("Access denied: done merge operation " + getPath() + " for: "
+            + session.getUserID() + " item owner " + getACL().getOwner());
+      }
+
       PlainChangesLog changesLog = new PlainChangesLogImpl(session.getId());
 
       VersionImpl base = (VersionImpl)getBaseVersion();
@@ -747,7 +774,8 @@
             ItemType.PROPERTY);
       try
       {
-         return (Version)session.getNodeByUUID(ValueDataConvertor.readString(bvProp.getValues().get(0)));
+         return (Version)dataManager.getItemByIdentifier(ValueDataConvertor.readString(bvProp.getValues().get(0)),
+            true, false);
       }
       catch (IOException e)
       {
@@ -1552,7 +1580,7 @@
                new InternalQName[]{Constants.NT_BASE}, null, false);
          return;
       }
-
+      
       if (parent == null)
       {
          parent = (NodeData)dataManager.getItemData(getParentIdentifier());
@@ -1685,6 +1713,13 @@
 
       checkValid();
 
+      if (!session.getAccessManager().hasPermission(getACL(),
+         new String[]{PermissionType.ADD_NODE, PermissionType.SET_PROPERTY}, session.getUserState().getIdentity()))
+      {
+         throw new AccessDeniedException("Access denied: checkin operation " + getPath() + " for: "
+            + session.getUserID() + " item owner " + getACL().getOwner());
+      }
+
       if (session.hasPendingChanges())
       {
          throw new InvalidItemStateException("Session has pending changes ");
@@ -1917,6 +1952,13 @@
 
       checkValid();
 
+      if (!session.getAccessManager().hasPermission(getACL(),
+         new String[]{PermissionType.ADD_NODE, PermissionType.SET_PROPERTY}, session.getUserState().getIdentity()))
+      {
+         throw new AccessDeniedException("Access denied: restore operation " + getPath() + " for: "
+            + session.getUserID() + " item owner " + getACL().getOwner());
+      }
+
       if (!this.isNodeType(Constants.MIX_VERSIONABLE))
       {
          throw new UnsupportedRepositoryOperationException("Node is not versionable " + getPath());
@@ -1967,6 +2009,13 @@
          // restore at relPath
          checkValid();
 
+         if (!session.getAccessManager().hasPermission(getACL(),
+            new String[]{PermissionType.ADD_NODE, PermissionType.SET_PROPERTY}, session.getUserState().getIdentity()))
+         {
+            throw new AccessDeniedException("Access denied: checkin operation " + getPath() + " for: "
+               + session.getUserID() + " item owner " + getACL().getOwner());
+         }
+
          if (session.hasPendingChanges())
          {
             throw new InvalidItemStateException("Session has pending changes ");
@@ -2520,7 +2569,7 @@
       try
       {
          return (VersionHistoryImpl)dataManager.getItemByIdentifier(new String(vhProp.getValues().get(0)
-            .getAsByteArray()), pool);
+            .getAsByteArray()), pool, false);
       }
       catch (IOException e)
       {

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/ScratchWorkspaceInitializer.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/ScratchWorkspaceInitializer.java	2010-10-29 11:35:39 UTC (rev 3367)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/ScratchWorkspaceInitializer.java	2010-10-29 11:45:18 UTC (rev 3368)
@@ -139,9 +139,6 @@
             : Constants.NT_UNSTRUCTURED;
 
       this.dataManager = dataManager;
-      // this.nsPersister = nsPersister;
-      // this.ntRegistry = ntRegistry;
-
    }
 
    public NodeData initWorkspace() throws RepositoryException
@@ -273,13 +270,14 @@
 
       if (addACL)
       {
-         AccessControlList acl = new AccessControlList();
          InternalQName[] mixins = new InternalQName[]{Constants.EXO_OWNEABLE, Constants.EXO_PRIVILEGEABLE};
 
          jcrSystem =
             TransientNodeData.createNodeData(root, Constants.JCR_SYSTEM, Constants.NT_UNSTRUCTURED, mixins,
                Constants.SYSTEM_UUID);
 
+         AccessControlList acl = jcrSystem.getACL();
+
          TransientPropertyData primaryType =
             TransientPropertyData.createPropertyData(jcrSystem, Constants.JCR_PRIMARYTYPE, PropertyType.NAME, false,
                new TransientValueData(jcrSystem.getPrimaryTypeName()));
@@ -340,15 +338,6 @@
 
       dataManager.save(new TransactionChangesLog(changesLog));
 
-      //nsPersister.initStorage(jcrSystem, addACL, NamespaceRegistryImpl.DEF_NAMESPACES);
-      // nodeTypes save
-      // changesLog = new PlainChangesLogImpl();
-      // changesLog.addAll(ntPersister.initNodetypesRoot(jcrSystem,
-      // addACL).getAllStates());
-      // changesLog.addAll(ntPersister.initStorage(nodeTypeDataManager.getAllNodeTypes()).getAllStates());
-      // ntPersister.saveChanges(changesLog);
-
-      // nodeTypeDataManager.initDefaultNodeTypes(addACL);
       return jcrSystem;
    }
 

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java	2010-10-29 11:35:39 UTC (rev 3367)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionDataManager.java	2010-10-29 11:45:18 UTC (rev 3368)
@@ -22,6 +22,7 @@
 import org.exoplatform.services.jcr.access.AccessManager;
 import org.exoplatform.services.jcr.access.PermissionType;
 import org.exoplatform.services.jcr.core.nodetype.ItemDefinitionData;
+import org.exoplatform.services.jcr.core.security.JCRRuntimePermissions;
 import org.exoplatform.services.jcr.dataflow.DataManager;
 import org.exoplatform.services.jcr.dataflow.ItemDataConsumer;
 import org.exoplatform.services.jcr.dataflow.ItemState;
@@ -334,6 +335,35 @@
    public ItemImpl getItem(NodeData parent, QPathEntry name, boolean pool, ItemType itemType)
       throws RepositoryException
    {
+      return getItem(parent, name, pool, itemType, true);
+   }
+
+   /**
+    * For internal use, required privileges. Return Item by parent NodeDada and the name of searched item.
+    * 
+    * @param parent
+    *          - parent of the searched item
+    * @param name
+    *          - item name
+    * @param itemType
+    *          - item type
+    * @param pool
+    *          - indicates does the item fall in pool
+    * @param apiRead 
+    *          - if true will call postRead Action and check permissions              
+    * @return existed item or null if not found
+    * @throws RepositoryException
+    */
+   public ItemImpl getItem(NodeData parent, QPathEntry name, boolean pool, ItemType itemType, boolean apiRead)
+      throws RepositoryException
+   {
+      // Need privileges
+      SecurityManager security = System.getSecurityManager();
+      if (security != null)
+      {
+         security.checkPermission(JCRRuntimePermissions.INVOKE_INTERNAL_API_PERMISSION);
+      }
+
       long start = System.currentTimeMillis();
       if (log.isDebugEnabled())
       {
@@ -343,7 +373,7 @@
       ItemImpl item = null;
       try
       {
-         return item = readItem(getItemData(parent, name, itemType), pool);
+         return item = readItem(getItemData(parent, name, itemType), parent, pool, apiRead);
       }
       finally
       {
@@ -542,7 +572,7 @@
     * @param pool boolean, if true will reload pooled ItemImpl
     * @param apiRead boolean, if true will call postRead Action and check permissions 
     * @return ItemImpl
-    * @throws RepositoryException if errro occurs
+    * @throws RepositoryException if error occurs
     */
    protected ItemImpl readItem(ItemData itemData, NodeData parent, boolean pool, boolean apiRead)
       throws RepositoryException
@@ -592,6 +622,30 @@
     */
    public ItemImpl getItemByIdentifier(String identifier, boolean pool) throws RepositoryException
    {
+      return getItemByIdentifier(identifier, pool, true);
+   }
+
+   /**
+    * For internal use, required privileges. Return item by identifier in this transient storage then in workspace container.
+    * 
+    * @param identifier
+    *          - identifier of searched item
+    * @param pool
+    *          - indicates does the item fall in pool
+    * @param apiRead 
+    *          - if true will call postRead Action and check permissions          
+    * @return existed item data or null if not found
+    * @throws RepositoryException
+    */
+   public ItemImpl getItemByIdentifier(String identifier, boolean pool, boolean apiRead) throws RepositoryException
+   {
+      // Need privileges
+      SecurityManager security = System.getSecurityManager();
+      if (security != null)
+      {
+         security.checkPermission(JCRRuntimePermissions.INVOKE_INTERNAL_API_PERMISSION);
+      }
+
       long start = System.currentTimeMillis();
       if (log.isDebugEnabled())
       {
@@ -601,7 +655,7 @@
       ItemImpl item = null;
       try
       {
-         return item = readItem(getItemData(identifier), pool);
+         return item = readItem(getItemData(identifier), null, pool, apiRead);
       }
       finally
       {
@@ -765,7 +819,7 @@
             if (accessManager.hasPermission(parent.getACL(), new String[]{PermissionType.READ}, session.getUserState()
                .getIdentity()))
             {
-               PropertyImpl item = (PropertyImpl)readItem(data, null, true, false);
+               PropertyImpl item = (PropertyImpl)readItem(data, parent, true, false);
 
                refs.add(item);
                session.getActionHandler().postRead(item);
@@ -1139,12 +1193,17 @@
     */
    public void delete(ItemData itemData) throws RepositoryException
    {
-      delete(itemData, itemData.getQPath());
+      delete(itemData, itemData.getQPath(), false);
    }
 
    public void delete(ItemData itemData, QPath ancestorToSave) throws RepositoryException
    {
+      delete(itemData, ancestorToSave, false);
+   }
 
+   protected void delete(ItemData itemData, QPath ancestorToSave, boolean isInternall) throws RepositoryException
+   {
+
       List<? extends ItemData> list = mergeList(itemData, transactionableManager, true, MERGE_ITEMS);
 
       List<ItemState> deletes = new ArrayList<ItemState>();
@@ -1169,7 +1228,8 @@
          {
             rootAdded = true;
          }
-         deletes.add(new ItemState(data, ItemState.DELETED, fireEvent, ancestorToSave, false));
+
+         deletes.add(new ItemState(data, ItemState.DELETED, fireEvent, ancestorToSave, isInternall));
          // if subnode contains JCR_VERSIONHISTORY property
          // we should remove version storage manually
          if (checkRemoveChildVersionStorages && !data.isNode()
@@ -1202,7 +1262,7 @@
       // 4 add item itself if not added
       if (!rootAdded)
       {
-         deletes.add(new ItemState(itemData, ItemState.DELETED, fireEvent, ancestorToSave, false));
+         deletes.add(new ItemState(itemData, ItemState.DELETED, fireEvent, ancestorToSave, isInternall));
 
          ItemImpl pooled = itemsPool.remove(itemData.getIdentifier());
          if (pooled != null)
@@ -1322,7 +1382,7 @@
       vhnode.accept(cvremover);
 
       // remove VH
-      delete(vhnode, ancestorToSave);
+      delete(vhnode, ancestorToSave, true);
    }
 
    /**
@@ -1636,6 +1696,17 @@
                      + parent.getACL().getOwner());
                }
             }
+            else if (changedItem.isMixinChanged())
+            {
+               if (!accessManager.hasPermission(parent.getACL(), new String[]{PermissionType.ADD_NODE,
+                  PermissionType.SET_PROPERTY}, session.getUserState().getIdentity()))
+               {
+                  throw new AccessDeniedException("Access denied: ADD_NODE or SET_PROPERTY"
+                     + changedItem.getData().getQPath().getAsString() + " for: " + session.getUserID() + " item owner "
+                     + parent.getACL().getOwner());
+               }
+            }
+
          }
          else if (changedItem.isAdded() || changedItem.isUpdated())
          {

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/JCRNodeTypeDataPersister.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/JCRNodeTypeDataPersister.java	2010-10-29 11:35:39 UTC (rev 3367)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/JCRNodeTypeDataPersister.java	2010-10-29 11:45:18 UTC (rev 3368)
@@ -155,13 +155,14 @@
 
       if (addACL)
       {
-         AccessControlList acl = new AccessControlList();
          InternalQName[] mixins = new InternalQName[]{Constants.EXO_OWNEABLE, Constants.EXO_PRIVILEGEABLE};
 
          jcrNodetypes =
             TransientNodeData.createNodeData(nsSystem, Constants.JCR_NODETYPES, Constants.NT_UNSTRUCTURED, mixins,
                Constants.NODETYPESROOT_UUID);
 
+         AccessControlList acl = jcrNodetypes.getACL();
+
          TransientPropertyData primaryType =
             TransientPropertyData.createPropertyData(jcrNodetypes, Constants.JCR_PRIMARYTYPE, PropertyType.NAME, false,
                new TransientValueData(jcrNodetypes.getPrimaryTypeName()));

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/VersionHistoryImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/VersionHistoryImpl.java	2010-10-29 11:35:39 UTC (rev 3367)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/VersionHistoryImpl.java	2010-10-29 11:45:18 UTC (rev 3368)
@@ -191,7 +191,7 @@
       JCRName jcrVersionName = locationFactory.parseJCRName(versionName);
       VersionImpl version =
          (VersionImpl)dataManager.getItem(nodeData(), new QPathEntry(jcrVersionName.getInternalName(), 1), pool,
-            ItemType.NODE);
+            ItemType.NODE, false);
       if (version == null)
       {
          throw new VersionException("There are no version with name '" + versionName + "' in the version history "
@@ -214,7 +214,7 @@
          throw new RepositoryException("There are no label '" + label + "' in the version history " + getPath());
       }
 
-      VersionImpl version = (VersionImpl)dataManager.getItemByIdentifier(versionData.getIdentifier(), true);
+      VersionImpl version = (VersionImpl)dataManager.getItemByIdentifier(versionData.getIdentifier(), true, false);
 
       if (version == null)
       {
@@ -377,7 +377,7 @@
          for (ValueData pvalue : predecessorsData.getValues())
          {
             String pidentifier = new String(pvalue.getAsByteArray());
-            VersionImpl predecessor = (VersionImpl)dataManager.getItemByIdentifier(pidentifier, false);
+            VersionImpl predecessor = (VersionImpl)dataManager.getItemByIdentifier(pidentifier, false, false);
             // actually predecessor is V2's successor
             if (predecessor != null)
             {// V2's successor
@@ -415,7 +415,7 @@
             for (ValueData svalue : successorsData.getValues())
             {
                String sidentifier = new String(svalue.getAsByteArray());
-               VersionImpl successor = (VersionImpl)dataManager.getItemByIdentifier(sidentifier, false);
+               VersionImpl successor = (VersionImpl)dataManager.getItemByIdentifier(sidentifier, false, false);
                if (successor != null)
                {
                   // case of VH graph merge
@@ -611,7 +611,7 @@
          {
             throw new RepositoryException(e);
          }
-         VersionImpl predecessor = (VersionImpl)dataManager.getItemByIdentifier(new String(pib), false);
+         VersionImpl predecessor = (VersionImpl)dataManager.getItemByIdentifier(new String(pib), false, false);
          predecessor.addSuccessor(versionData.getIdentifier(), changesLog);
 
          predecessorsNew.add(new TransientValueData(pib));

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/VersionImpl.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/VersionImpl.java	2010-10-29 11:35:39 UTC (rev 3367)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/version/VersionImpl.java	2010-10-29 11:45:18 UTC (rev 3368)
@@ -161,7 +161,7 @@
          for (int i = 0; i < predecessorsValues.size(); i++)
          {
             String videntifier = new String(predecessorsValues.get(i).getAsByteArray());
-            VersionImpl version = (VersionImpl)dataManager.getItemByIdentifier(videntifier, false);
+            VersionImpl version = (VersionImpl)dataManager.getItemByIdentifier(videntifier, false, false);
             if (version != null)
             {
                predecessors[i] = version;
@@ -446,7 +446,7 @@
       checkValid();
 
       VersionHistoryImpl vhistory =
-         (VersionHistoryImpl)dataManager.getItemByIdentifier(nodeData().getParentIdentifier(), true);
+         (VersionHistoryImpl)dataManager.getItemByIdentifier(nodeData().getParentIdentifier(), true, false);
 
       if (vhistory == null)
       {

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/version/VersionHistoryDataHelper.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/version/VersionHistoryDataHelper.java	2010-10-29 11:35:39 UTC (rev 3367)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/version/VersionHistoryDataHelper.java	2010-10-29 11:45:18 UTC (rev 3368)
@@ -335,19 +335,19 @@
 
       // update all
       QPath vpath = versionable.getQPath();
-      changes.add(new ItemState(versionHistory, ItemState.ADDED, true, vpath));
-      changes.add(new ItemState(vhPrimaryType, ItemState.ADDED, true, vpath));
-      changes.add(new ItemState(vhUuid, ItemState.ADDED, true, vpath));
-      changes.add(new ItemState(vhVersionableUuid, ItemState.ADDED, true, vpath));
+      changes.add(new ItemState(versionHistory, ItemState.ADDED, true, vpath, true));
+      changes.add(new ItemState(vhPrimaryType, ItemState.ADDED, true, vpath, true));
+      changes.add(new ItemState(vhUuid, ItemState.ADDED, true, vpath, true));
+      changes.add(new ItemState(vhVersionableUuid, ItemState.ADDED, true, vpath, true));
 
-      changes.add(new ItemState(vhVersionLabels, ItemState.ADDED, true, vpath));
-      changes.add(new ItemState(vlPrimaryType, ItemState.ADDED, true, vpath));
+      changes.add(new ItemState(vhVersionLabels, ItemState.ADDED, true, vpath, true));
+      changes.add(new ItemState(vlPrimaryType, ItemState.ADDED, true, vpath, true));
 
-      changes.add(new ItemState(rootVersionData, ItemState.ADDED, true, vpath));
-      changes.add(new ItemState(rvPrimaryType, ItemState.ADDED, true, vpath));
-      changes.add(new ItemState(rvMixinTypes, ItemState.ADDED, true, vpath));
-      changes.add(new ItemState(rvUuid, ItemState.ADDED, true, vpath));
-      changes.add(new ItemState(rvCreated, ItemState.ADDED, true, vpath));
+      changes.add(new ItemState(rootVersionData, ItemState.ADDED, true, vpath, true));
+      changes.add(new ItemState(rvPrimaryType, ItemState.ADDED, true, vpath, true));
+      changes.add(new ItemState(rvMixinTypes, ItemState.ADDED, true, vpath, true));
+      changes.add(new ItemState(rvUuid, ItemState.ADDED, true, vpath, true));
+      changes.add(new ItemState(rvCreated, ItemState.ADDED, true, vpath, true));
 
       changes.add(ItemState.createAddedState(vh));
       changes.add(ItemState.createAddedState(bv));

Added: jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/access/TestPermissions.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/access/TestPermissions.java	                        (rev 0)
+++ jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/access/TestPermissions.java	2010-10-29 11:45:18 UTC (rev 3368)
@@ -0,0 +1,260 @@
+/*
+ * Copyright (C) 2010 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.access;
+
+import org.exoplatform.services.jcr.BaseStandaloneTest;
+import org.exoplatform.services.jcr.access.PermissionType;
+import org.exoplatform.services.jcr.access.SystemIdentity;
+import org.exoplatform.services.jcr.core.CredentialsImpl;
+import org.exoplatform.services.jcr.impl.core.NodeImpl;
+import org.exoplatform.services.jcr.impl.core.SessionImpl;
+
+import javax.jcr.AccessDeniedException;
+import javax.jcr.Credentials;
+import javax.jcr.Node;
+import javax.jcr.Repository;
+import javax.jcr.version.Version;
+
+/**
+ * Test is run on special repository db2.<br>
+ * System workspace 'ws' has permissions configuration: <br>
+ * <br>
+ * *:/platform/administrators read;*:/platform/administrators add_node;
+ * *:/platform/administrators set_property;*:/platform/administrators remove
+ * <br><br>
+ * Workspace 'ws1' has permissions configuration:<br>
+ * <br>
+ * any read;any add_node;any set_property;any remove
+ * 
+ * @author <a href="anatoliy.bazko at exoplatform.org">Anatoliy Bazko</a>
+ * @version $Id: TestRemoveSysteNode.java 111 2010-11-11 11:11:11Z tolusha $
+ */
+public class TestPermissions extends BaseStandaloneTest
+{
+
+   protected SessionImpl sessionMaryWS;
+   
+   protected SessionImpl sessionMaryWS1;
+
+   protected SessionImpl sessionWS;
+
+   protected SessionImpl sessionWS1;
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   protected String getRepositoryName()
+   {
+      return null;
+   }
+
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   public void setUp() throws Exception
+   {
+      super.setUp();
+
+      Repository repository = repositoryService.getRepository("db2");
+      Credentials credentials = new CredentialsImpl("admin", "admin".toCharArray());
+      sessionWS = (SessionImpl)repository.login(credentials, "ws");
+      sessionWS1 = (SessionImpl)repository.login(credentials, "ws1");
+      
+      repository = repositoryService.getRepository("db2");
+      credentials = new CredentialsImpl("mary", "exo".toCharArray());
+      sessionMaryWS = (SessionImpl)repository.login(credentials, "ws");
+      sessionMaryWS1 = (SessionImpl)repository.login(credentials, "ws1");
+      
+      // add node with only read permission for mary
+      NodeImpl node = (NodeImpl)sessionWS1.getRootNode().addNode("MARY-ReadOnly");
+      node.addMixin("exo:privilegeable");
+      node.addMixin("exo:owneable");
+      node.setPermission("mary", new String[]{PermissionType.READ});
+      node.setPermission("admin", PermissionType.ALL);
+      node.removePermission(SystemIdentity.ANY);
+      node.addNode("test");
+      sessionWS1.save();
+
+      sessionWS1.getRootNode().addNode("MARY-ReadWrite");
+      sessionWS1.save();
+   }
+
+   @Override
+   public void tearDown() throws Exception
+   {
+      sessionMaryWS.logout();
+      sessionMaryWS1.logout();
+      sessionWS.logout();
+      sessionWS1.logout();
+
+      super.tearDown();
+   }
+
+   /**
+    * Test if Mary can read root node of system workspace.
+    */
+   public void testGetRootNodeWSFailed() throws Exception
+   {
+      try
+      {
+         sessionMaryWS.getRootNode();
+
+         fail("Exception should be thrown.");
+      }
+      catch (AccessDeniedException e)
+      {
+      }
+   }
+
+   /**
+    * Test if Mary can perform versions operations in workspace where she has all right
+    * and in same time she has not rights in system workspace. 
+    */
+   public void testCheckinCheckoutWS1Success() throws Exception
+   {
+      NodeImpl node = (NodeImpl)sessionMaryWS1.getRootNode().getNode("MARY-ReadWrite");
+      node.addMixin("mix:versionable");
+      sessionMaryWS1.save();
+
+      node.checkin();
+      node.checkout();
+
+      Version version = node.getVersionHistory().getVersion("1");
+      version.getPredecessors();
+      version.getSuccessors();
+      version.getContainingHistory();
+
+      node.restore("1", true);
+
+      node.remove();
+      sessionMaryWS1.save();
+   }
+
+   /**
+    * Test if Mary can add mixin on node with only read permission.
+    */
+   public void testAddMixinWS1Failed() throws Exception
+   {
+      NodeImpl node = (NodeImpl)sessionMaryWS1.getRootNode().getNode("MARY-ReadOnly").getNode("test");
+
+      try
+      {
+         node.addMixin("mix:versionable");
+         sessionMaryWS1.save();
+
+         fail("Exception should be thrown.");
+      }
+      catch (AccessDeniedException e)
+      {
+      }
+   }
+
+   /**
+    * Test if Mary can remove mixin on node with only read permission.
+    */
+   public void testRemoveMixinWS1Failed() throws Exception
+   {
+      NodeImpl node = (NodeImpl)sessionWS1.getRootNode().getNode("MARY-ReadOnly").getNode("test");
+      node.addMixin("mix:versionable");
+      sessionWS1.save();
+
+      node = (NodeImpl)sessionMaryWS1.getRootNode().getNode("MARY-ReadOnly").getNode("test");
+
+      try
+      {
+         node.removeMixin("mix:versionable");
+         sessionMaryWS1.save();
+
+         fail("Exception should be thrown.");
+      }
+      catch (AccessDeniedException e)
+      {
+      }
+   }
+
+   /**
+    * Test if Mary can checkin on node with only read permission.
+    */
+   public void testCheckinWS1Failed() throws Exception
+   {
+      Node node = sessionWS1.getRootNode().getNode("MARY-ReadOnly").getNode("test");
+      node.addMixin("mix:versionable");
+      sessionWS1.save();
+
+      node = sessionMaryWS1.getRootNode().getNode("MARY-ReadOnly").getNode("test");
+
+      try
+      {
+         node.checkin();
+         fail("Exception should be thrown.");
+      }
+      catch (AccessDeniedException e)
+      {
+      }
+   }
+
+   /**
+    * Test if Mary can checkout on node with only read permission.
+    */
+   public void testCheckoutWS1Failed() throws Exception
+   {
+      Node node = sessionWS1.getRootNode().getNode("MARY-ReadOnly").getNode("test");
+      node.addMixin("mix:versionable");
+      sessionWS1.save();
+
+      node.checkin();
+
+      node = sessionMaryWS1.getRootNode().getNode("MARY-ReadOnly").getNode("test");
+
+      try
+      {
+         node.checkout();
+         fail("Exception should be thrown.");
+      }
+      catch (AccessDeniedException e)
+      {
+      }
+   }
+
+   /**
+    * Test if Mary can restore on node with only read permission.
+    */
+   public void testRestoreWS1Failed() throws Exception
+   {
+      Node node = sessionWS1.getRootNode().getNode("MARY-ReadOnly").getNode("test");
+      node.addMixin("mix:versionable");
+      sessionWS1.save();
+
+      node.checkin();
+      node.checkout();
+
+      node = sessionMaryWS1.getRootNode().getNode("MARY-ReadOnly").getNode("test");
+
+      try
+      {
+         node.restore("1", true);
+         fail("Exception should be thrown.");
+      }
+      catch (AccessDeniedException e)
+      {
+      }
+   }
+}

Modified: jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/cluster/test-configuration.xml
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/cluster/test-configuration.xml	2010-10-29 11:35:39 UTC (rev 3367)
+++ jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/cluster/test-configuration.xml	2010-10-29 11:45:18 UTC (rev 3368)
@@ -370,6 +370,60 @@
       <init-params>
         <value-param>
           <name>bind-name</name>
+          <value>jdbcjcrdb2</value>
+        </value-param>
+        <value-param>
+          <name>class-name</name>
+          <value>javax.sql.DataSource</value>
+        </value-param>
+        <value-param>
+          <name>factory</name>
+          <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
+        </value-param>
+        <properties-param>
+          <name>ref-addresses</name>
+          <description>ref-addresses</description>
+          <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
+          <property name="url" value="jdbc:hsqldb:file:target/temp/data/portaldb2"/>
+          <property name="username" value="sa"/>
+          <property name="password" value=""/>
+        </properties-param>
+      </init-params>
+    </component-plugin>
+    <component-plugin>
+      <name>bind.datasource</name>
+      <set-method>addPlugin</set-method>
+      <type>org.exoplatform.services.naming.BindReferencePlugin</type>
+      <init-params>
+        <value-param>
+          <name>bind-name</name>
+          <value>jdbcjcr1db2</value>
+        </value-param>
+        <value-param>
+          <name>class-name</name>
+          <value>javax.sql.DataSource</value>
+        </value-param>
+        <value-param>
+          <name>factory</name>
+          <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
+        </value-param>
+        <properties-param>
+          <name>ref-addresses</name>
+          <description>ref-addresses</description>
+          <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
+          <property name="url" value="jdbc:hsqldb:file:target/temp/data/jcrdb2"/>
+          <property name="username" value="sa"/>
+          <property name="password" value=""/>
+        </properties-param>
+      </init-params>
+    </component-plugin>
+    <component-plugin>
+      <name>bind.datasource</name>
+      <set-method>addPlugin</set-method>
+      <type>org.exoplatform.services.naming.BindReferencePlugin</type>
+      <init-params>
+        <value-param>
+          <name>bind-name</name>
           <value>jdbcjcrtck</value>
         </value-param>
         <value-param>

Modified: jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/cluster/test-jcr-config.xml
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/cluster/test-jcr-config.xml	2010-10-29 11:35:39 UTC (rev 3367)
+++ jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/cluster/test-jcr-config.xml	2010-10-29 11:45:18 UTC (rev 3368)
@@ -328,6 +328,153 @@
          </workspaces>
       </repository>
 
+      <repository name="db2" system-workspace="ws" default-workspace="ws">
+         <security-domain>exo-domain</security-domain>
+         <!-- access-control>optional</access-control -->
+         <!-- access-control>disable</access-control -->
+         <session-max-age>1h</session-max-age>
+         <authentication-policy>org.exoplatform.services.jcr.impl.core.access.JAASAuthenticator</authentication-policy>
+         <workspaces>
+            <workspace name="ws">
+               <!-- for system storage -->
+               <container class="org.exoplatform.services.jcr.impl.storage.jdbc.optimisation.CQJDBCWorkspaceDataContainer">
+                  <properties>
+                     <property name="source-name" value="jdbcjcrdb2" />
+                     <property name="multi-db" value="true" />
+                     <property name="update-storage" value="false" />
+                     <property name="max-buffer-size" value="200k" />
+                     <property name="swap-directory" value="target/temp/swap/wsdb2" />
+                  </properties>
+                  <value-storages>
+                     <value-storage id="ws"
+                        class="org.exoplatform.services.jcr.impl.storage.value.fs.TreeFileValueStorage">
+                        <properties>
+                           <property name="path" value="target/temp/values/wsdb2" />
+                        </properties>
+                        <filters>
+                           <filter property-type="Binary" min-value-size="100K" />
+                        </filters>
+                     </value-storage>
+                  </value-storages>
+               </container>
+               <initializer class="org.exoplatform.services.jcr.impl.core.ScratchWorkspaceInitializer">
+                  <properties>
+                     <property name="root-nodetype" value="nt:unstructured" />
+                     <property name="root-permissions" value="*:/platform/administrators read;*:/platform/administrators add_node;*:/platform/administrators set_property;*:/platform/administrators remove" />
+                  </properties>
+               </initializer>
+               <cache enabled="true"
+                  class="org.exoplatform.services.jcr.impl.dataflow.persistent.jbosscache.JBossCacheWorkspaceStorageCache">
+                  <properties>
+                     <property name="jbosscache-configuration" value="test-jbosscache-data.xml" />
+                     <property name="jgroups-configuration" value="udp-mux.xml" />
+                     <property name="jgroups-multiplexer-stack" value="false" />
+                     <property name="jbosscache-cluster-name" value="JCR-cluster-data" />
+                     <property name="jbosscache-shareable" value="${jbosscache-shareable}" />
+                  </properties>
+               </cache>
+               <query-handler class="org.exoplatform.services.jcr.impl.core.query.lucene.SearchIndex">
+                  <properties>
+                     <property name="index-dir" value="target/temp/index/db2/ws" />
+                     <property name="changesfilter-class" value="org.exoplatform.services.jcr.impl.core.query.jbosscache.JBossCacheIndexChangesFilter" />
+                     <property name="jbosscache-configuration" value="test-jbosscache-indexer.xml" />
+                     <property name="jgroups-configuration" value="udp-mux.xml" />
+                     <property name="jgroups-multiplexer-stack" value="false" />
+                     <property name="jbosscache-cluster-name" value="JCR-cluster-indexer" />
+                     <property name="jbosscache-shareable" value="${jbosscache-shareable}" />
+                  </properties>
+               </query-handler>
+               <lock-manager class="org.exoplatform.services.jcr.impl.core.lock.jbosscache.CacheableLockManagerImpl">
+                  <properties>
+                     <property name="time-out" value="15m" />
+                     <property name="jbosscache-configuration" value="test-jbosscache-lock.xml" />
+                     <property name="jgroups-configuration" value="udp-mux.xml" />
+                     <property name="jgroups-multiplexer-stack" value="false" />
+                     <property name="jbosscache-cluster-name" value="JCR-cluster-locks" />
+                     <property name="jbosscache-cl-cache.jdbc.table.name" value="jcrlocks" />
+                     <property name="jbosscache-cl-cache.jdbc.table.create" value="true" />
+                     <property name="jbosscache-cl-cache.jdbc.table.drop" value="false" />
+                     <property name="jbosscache-cl-cache.jdbc.table.primarykey" value="jcrlocks_pk" />
+                     <property name="jbosscache-cl-cache.jdbc.fqn.column" value="fqn" />
+                     <property name="jbosscache-cl-cache.jdbc.node.column" value="node" />
+                     <property name="jbosscache-cl-cache.jdbc.parent.column" value="parent" />
+                     <property name="jbosscache-cl-cache.jdbc.datasource" value="jdbcjcr" />
+                     <property name="jbosscache-shareable" value="${jbosscache-shareable}" />
+                  </properties>
+               </lock-manager>
+            </workspace>
+
+            <workspace name="ws1">
+               <container class="org.exoplatform.services.jcr.impl.storage.jdbc.optimisation.CQJDBCWorkspaceDataContainer">
+                  <properties>
+                     <property name="source-name" value="jdbcjcr1db2" />
+                     <property name="multi-db" value="true" />
+                     <property name="update-storage" value="false" />
+                     <property name="max-buffer-size" value="200k" />
+                     <property name="swap-directory" value="target/temp/swap/ws1db2" />
+                  </properties>
+                  <value-storages>
+                     <value-storage id="ws1"
+                        class="org.exoplatform.services.jcr.impl.storage.value.fs.TreeFileValueStorage">
+                        <properties>
+                           <property name="path" value="target/temp/values/ws1db2" />
+                        </properties>
+                        <filters>
+                           <filter property-type="Binary" min-value-size="100K" />
+                        </filters>
+                     </value-storage>
+                  </value-storages>
+               </container>
+               <initializer class="org.exoplatform.services.jcr.impl.core.ScratchWorkspaceInitializer">
+                  <properties>
+                     <property name="root-nodetype" value="nt:unstructured" />
+                     <property name="root-permissions"
+                        value="any read;any add_node;any set_property;any remove" />
+                  </properties>
+               </initializer>
+               <cache enabled="true"
+                  class="org.exoplatform.services.jcr.impl.dataflow.persistent.jbosscache.JBossCacheWorkspaceStorageCache">
+                  <properties>
+                     <property name="jbosscache-configuration" value="test-jbosscache-data.xml" />
+                     <property name="jgroups-configuration" value="udp-mux.xml" />
+                     <property name="jgroups-multiplexer-stack" value="false" />
+                     <property name="jbosscache-cluster-name" value="JCR-cluster-data" />
+                     <property name="jbosscache-shareable" value="${jbosscache-shareable}" />
+                  </properties>
+               </cache>
+               <query-handler class="org.exoplatform.services.jcr.impl.core.query.lucene.SearchIndex">
+                  <properties>
+                     <property name="index-dir" value="target/temp/index/db2/ws1" />
+                     <property name="changesfilter-class" value="org.exoplatform.services.jcr.impl.core.query.jbosscache.JBossCacheIndexChangesFilter" />
+                     <property name="jbosscache-configuration" value="test-jbosscache-indexer.xml" />
+                     <property name="jgroups-configuration" value="udp-mux.xml" />
+                     <property name="jgroups-multiplexer-stack" value="false" />
+                     <property name="jbosscache-cluster-name" value="JCR-cluster-indexer" />
+                     <property name="jbosscache-shareable" value="${jbosscache-shareable}" />
+                  </properties>
+               </query-handler>
+               <lock-manager class="org.exoplatform.services.jcr.impl.core.lock.jbosscache.CacheableLockManagerImpl">
+                  <properties>
+                     <property name="time-out" value="15m" />
+                     <property name="jbosscache-configuration" value="test-jbosscache-lock.xml" />
+                     <property name="jgroups-configuration" value="udp-mux.xml" />
+                     <property name="jgroups-multiplexer-stack" value="false" />
+                     <property name="jbosscache-cluster-name" value="JCR-cluster-locks" />
+                     <property name="jbosscache-cl-cache.jdbc.table.name" value="jcrlocks" />
+                     <property name="jbosscache-cl-cache.jdbc.table.create" value="true" />
+                     <property name="jbosscache-cl-cache.jdbc.table.drop" value="false" />
+                     <property name="jbosscache-cl-cache.jdbc.table.primarykey" value="jcrlocks_pk" />
+                     <property name="jbosscache-cl-cache.jdbc.fqn.column" value="fqn" />
+                     <property name="jbosscache-cl-cache.jdbc.node.column" value="node" />
+                     <property name="jbosscache-cl-cache.jdbc.parent.column" value="parent" />
+                     <property name="jbosscache-cl-cache.jdbc.datasource" value="jdbcjcr" />
+                     <property name="jbosscache-shareable" value="${jbosscache-shareable}" />
+                  </properties>
+               </lock-manager>
+            </workspace>
+         </workspaces>
+      </repository>
+
       <repository name="db1tck" system-workspace="ws" default-workspace="ws">
          <security-domain>exo-domain</security-domain>
          <!-- access-control>optional</access-control -->

Modified: jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/test-configuration.xml
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/test-configuration.xml	2010-10-29 11:35:39 UTC (rev 3367)
+++ jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/test-configuration.xml	2010-10-29 11:45:18 UTC (rev 3368)
@@ -255,7 +255,7 @@
         </properties-param>
       </init-params>
     </component-plugin>
-	<component-plugin>
+    <component-plugin>
       <name>bind.datasource</name>
       <set-method>addPlugin</set-method>
       <type>org.exoplatform.services.naming.BindReferencePlugin</type>
@@ -336,7 +336,7 @@
         </properties-param>
       </init-params>
     </component-plugin>
-	<component-plugin>
+    <component-plugin>
       <name>bind.datasource</name>
       <set-method>addPlugin</set-method>
       <type>org.exoplatform.services.naming.BindReferencePlugin</type>
@@ -370,6 +370,60 @@
       <init-params>
         <value-param>
           <name>bind-name</name>
+          <value>jdbcjcrdb2</value>
+        </value-param>
+        <value-param>
+          <name>class-name</name>
+          <value>javax.sql.DataSource</value>
+        </value-param>
+        <value-param>
+          <name>factory</name>
+          <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
+        </value-param>
+        <properties-param>
+          <name>ref-addresses</name>
+          <description>ref-addresses</description>
+          <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
+          <property name="url" value="jdbc:hsqldb:file:target/temp/data/portaldb2"/>
+          <property name="username" value="sa"/>
+          <property name="password" value=""/>
+        </properties-param>
+      </init-params>
+    </component-plugin>
+    <component-plugin>
+      <name>bind.datasource</name>
+      <set-method>addPlugin</set-method>
+      <type>org.exoplatform.services.naming.BindReferencePlugin</type>
+      <init-params>
+        <value-param>
+          <name>bind-name</name>
+          <value>jdbcjcr1db2</value>
+        </value-param>
+        <value-param>
+          <name>class-name</name>
+          <value>javax.sql.DataSource</value>
+        </value-param>
+        <value-param>
+          <name>factory</name>
+          <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
+        </value-param>
+        <properties-param>
+          <name>ref-addresses</name>
+          <description>ref-addresses</description>
+          <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
+          <property name="url" value="jdbc:hsqldb:file:target/temp/data/jcrdb2"/>
+          <property name="username" value="sa"/>
+          <property name="password" value=""/>
+        </properties-param>
+      </init-params>
+    </component-plugin>
+    <component-plugin>
+      <name>bind.datasource</name>
+      <set-method>addPlugin</set-method>
+      <type>org.exoplatform.services.naming.BindReferencePlugin</type>
+      <init-params>
+        <value-param>
+          <name>bind-name</name>
           <value>jdbcjcrtck</value>
         </value-param>
         <value-param>

Modified: jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/test-jcr-config.xml
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/test-jcr-config.xml	2010-10-29 11:35:39 UTC (rev 3367)
+++ jcr/trunk/exo.jcr.component.core/src/test/resources/conf/standalone/test-jcr-config.xml	2010-10-29 11:45:18 UTC (rev 3368)
@@ -207,94 +207,204 @@
             </workspace>
             
             <workspace name="ws3">
-					<!-- for system storage -->
-					<container
-						class="org.exoplatform.services.jcr.impl.storage.jdbc.optimisation.CQJDBCWorkspaceDataContainer">
-						<properties>
-							<property name="source-name" value="jdbcjcr3" />
-                            <property name="dialect" value="auto" />
-							<property name="multi-db" value="true" />
-							<property name="update-storage" value="false" />
-							<property name="max-buffer-size" value="200k" />
-							<property name="swap-directory" value="target/temp/swap/ws3" />
-						</properties>
-						<value-storages>
-							<!--
-								This storage is used to check whether properties are removed
-								correctly from each value-storage
-								(TestRemoveFromValueStorage.java)
-							-->
-							<value-storage id="ws3_big"
-								class="org.exoplatform.services.jcr.impl.storage.value.fs.TreeFileValueStorage">
-								<properties>
-									<property name="path" value="target/temp/values/ws3_big" />
-								</properties>
-								<filters>
-									<filter property-type="Binary" min-value-size="1024K" />
-								</filters>
-							</value-storage>
-							<value-storage id="ws3"
-								class="org.exoplatform.services.jcr.impl.storage.value.fs.CASableTreeFileValueStorage">
-								<properties>
-									<property name="path" value="target/temp/values/ws3" />
-									<property name="digest-algo" value="MD5" />
-									<property name="vcas-type"
-										value="org.exoplatform.services.jcr.impl.storage.value.cas.JDBCValueContentAddressStorageImpl" />
-									<property name="jdbc-source-name" value="jdbcjcr" />
-								</properties>
-								<filters>
-									<filter property-type="Binary" />
-								</filters>
-							</value-storage>
-						</value-storages>
-					</container>
-					<initializer
-						class="org.exoplatform.services.jcr.impl.core.ScratchWorkspaceInitializer">
-						<properties>
-							<property name="root-nodetype" value="nt:unstructured" />
-						</properties>
-					</initializer>
-					<cache enabled="true" class="org.exoplatform.services.jcr.impl.dataflow.persistent.jbosscache.JBossCacheWorkspaceStorageCache">
-                       <properties>
-                          <property name="jbosscache-configuration" value="conf/standalone/test-jbosscache-config.xml" />
-                          <property name="jbosscache-shareable" value="${jbosscache-shareable}" />                    
-                       </properties>
-                    </cache>
-					<query-handler
-						class="org.exoplatform.services.jcr.impl.core.query.lucene.SearchIndex">
-						<properties>
-							<property name="index-dir" value="target/temp/index/db1/ws3" />
-							<property name="synonymprovider-class"
-								value="org.exoplatform.services.jcr.impl.core.query.lucene.PropertiesSynonymProvider" />
-							<property name="synonymprovider-config-path" value="../../synonyms.properties" />
-							<property name="support-highlighting" value="true" />
-							<property name="indexing-configuration-path" value="../../indexing-configuration.xml" />
-							<property name="query-class"
-								value="org.exoplatform.services.jcr.impl.core.query.QueryImpl" />
-							<property name="spellchecker-class"
-								value="org.exoplatform.services.jcr.impl.core.query.lucene.spell.LuceneSpellChecker$FiveSecondsRefreshInterval" />
-						</properties>
-					</query-handler>
-	               <lock-manager class="org.exoplatform.services.jcr.impl.core.lock.jbosscache.CacheableLockManagerImpl">
-	                  <properties>
-	                     <property name="time-out" value="15m" />
-	                     <property name="jbosscache-configuration" value="conf/standalone/test-jbosscache-lock.xml" />
-	                     <property name="jbosscache-cl-cache.jdbc.table.name" value="jcrlocks_db1_ws3" />
-	                     <property name="jbosscache-cl-cache.jdbc.table.create" value="true" />
-	                     <property name="jbosscache-cl-cache.jdbc.table.drop" value="false" />
-	                     <property name="jbosscache-cl-cache.jdbc.table.primarykey" value="jcrlocks_db1_ws3_pk" />
-	                     <property name="jbosscache-cl-cache.jdbc.fqn.column" value="fqn" />
-	                     <property name="jbosscache-cl-cache.jdbc.node.column" value="node" />
-	                     <property name="jbosscache-cl-cache.jdbc.parent.column" value="parent" />
-	                     <property name="jbosscache-cl-cache.jdbc.datasource" value="jdbcjcr3" />
-	                     <property name="jbosscache-shareable" value="${jbosscache-shareable}" />	                     
-	                  </properties>
-	               </lock-manager>               
+               <!-- for system storage -->
+               <container class="org.exoplatform.services.jcr.impl.storage.jdbc.optimisation.CQJDBCWorkspaceDataContainer">
+                  <properties>
+                     <property name="source-name" value="jdbcjcr3" />
+                     <property name="dialect" value="auto" />
+                     <property name="multi-db" value="true" />
+                     <property name="update-storage" value="false" />
+                     <property name="max-buffer-size" value="200k" />
+                     <property name="swap-directory" value="target/temp/swap/ws3" />
+                  </properties>
+                  <value-storages>
+                      <!--
+                      This storage is used to check whether properties are removed
+                      correctly from each value-storage
+                      (TestRemoveFromValueStorage.java)
+                      -->
+                     <value-storage id="ws3_big" class="org.exoplatform.services.jcr.impl.storage.value.fs.TreeFileValueStorage">
+                        <properties>
+                           <property name="path" value="target/temp/values/ws3_big" />
+                        </properties>
+                        <filters>
+                           <filter property-type="Binary" min-value-size="1024K" />
+                        </filters>
+                     </value-storage>
+                     <value-storage id="ws3" class="org.exoplatform.services.jcr.impl.storage.value.fs.CASableTreeFileValueStorage">
+                        <properties>
+                           <property name="path" value="target/temp/values/ws3" />
+                           <property name="digest-algo" value="MD5" />
+                           <property name="vcas-type" value="org.exoplatform.services.jcr.impl.storage.value.cas.JDBCValueContentAddressStorageImpl" />
+                           <property name="jdbc-source-name" value="jdbcjcr" />
+                        </properties>
+                        <filters>
+                           <filter property-type="Binary" />
+                        </filters>
+                     </value-storage>
+                  </value-storages>
+               </container>
+               <initializer class="org.exoplatform.services.jcr.impl.core.ScratchWorkspaceInitializer">
+                  <properties>
+                     <property name="root-nodetype" value="nt:unstructured" />
+                  </properties>
+               </initializer>
+               <cache enabled="true" class="org.exoplatform.services.jcr.impl.dataflow.persistent.jbosscache.JBossCacheWorkspaceStorageCache">
+                  <properties>
+                     <property name="jbosscache-configuration" value="conf/standalone/test-jbosscache-config.xml" />
+                     <property name="jbosscache-shareable" value="${jbosscache-shareable}" />                    
+                  </properties>
+               </cache>
+               <query-handler class="org.exoplatform.services.jcr.impl.core.query.lucene.SearchIndex">
+                  <properties>
+                     <property name="index-dir" value="target/temp/index/db1/ws3" />
+                     <property name="synonymprovider-class" value="org.exoplatform.services.jcr.impl.core.query.lucene.PropertiesSynonymProvider" />
+                     <property name="synonymprovider-config-path" value="../../synonyms.properties" />
+                     <property name="support-highlighting" value="true" />
+                     <property name="indexing-configuration-path" value="../../indexing-configuration.xml" />
+                     <property name="query-class" value="org.exoplatform.services.jcr.impl.core.query.QueryImpl" />
+                     <property name="spellchecker-class" value="org.exoplatform.services.jcr.impl.core.query.lucene.spell.LuceneSpellChecker$FiveSecondsRefreshInterval" />
+                  </properties>
+               </query-handler>
+               <lock-manager class="org.exoplatform.services.jcr.impl.core.lock.jbosscache.CacheableLockManagerImpl">
+                  <properties>
+                     <property name="time-out" value="15m" />
+                     <property name="jbosscache-configuration" value="conf/standalone/test-jbosscache-lock.xml" />
+                     <property name="jbosscache-cl-cache.jdbc.table.name" value="jcrlocks_db1_ws3" />
+                     <property name="jbosscache-cl-cache.jdbc.table.create" value="true" />
+                     <property name="jbosscache-cl-cache.jdbc.table.drop" value="false" />
+                     <property name="jbosscache-cl-cache.jdbc.table.primarykey" value="jcrlocks_db1_ws3_pk" />
+                     <property name="jbosscache-cl-cache.jdbc.fqn.column" value="fqn" />
+                     <property name="jbosscache-cl-cache.jdbc.node.column" value="node" />
+                     <property name="jbosscache-cl-cache.jdbc.parent.column" value="parent" />
+                     <property name="jbosscache-cl-cache.jdbc.datasource" value="jdbcjcr3" />
+                     <property name="jbosscache-shareable" value="${jbosscache-shareable}" />	                     
+                  </properties>
+               </lock-manager>               
+            </workspace>
+         </workspaces>
+      </repository>
 
-				</workspace>
+      <repository name="db2" system-workspace="ws" default-workspace="ws">
+         <security-domain>exo-domain</security-domain>
+         <!-- access-control>optional</access-control -->
+         <!-- access-control>disable</access-control -->
+         <session-max-age>1h</session-max-age>
+         <authentication-policy>org.exoplatform.services.jcr.impl.core.access.JAASAuthenticator</authentication-policy>
+         <workspaces>
+            <workspace name="ws">
+               <!-- for system storage -->
+               <container class="org.exoplatform.services.jcr.impl.storage.jdbc.optimisation.CQJDBCWorkspaceDataContainer">
+                  <properties>
+                     <property name="source-name" value="jdbcjcrdb2" />
+                     <property name="dialect" value="auto" />
+                     <property name="multi-db" value="true" />
+                     <property name="update-storage" value="false" />
+                     <property name="max-buffer-size" value="200k" />
+                     <property name="swap-directory" value="target/temp/swap/wsdb2" />
+                  </properties>
+                  <value-storages>
+                     <value-storage id="ws" class="org.exoplatform.services.jcr.impl.storage.value.fs.TreeFileValueStorage">
+                        <properties>
+                           <property name="path" value="target/temp/values/wsdb2" />
+                        </properties>
+                        <filters>
+                           <filter property-type="Binary" min-value-size="100K" />
+                        </filters>
+                     </value-storage>
+                  </value-storages>
+               </container>
+               <initializer class="org.exoplatform.services.jcr.impl.core.ScratchWorkspaceInitializer">
+                  <properties>
+                     <property name="root-nodetype" value="nt:unstructured" />
+                     <property name="root-permissions" value="*:/platform/administrators read;*:/platform/administrators add_node;*:/platform/administrators set_property;*:/platform/administrators remove" />
+                  </properties>
+               </initializer>
+               <cache enabled="true" class="org.exoplatform.services.jcr.impl.dataflow.persistent.jbosscache.JBossCacheWorkspaceStorageCache">
+                  <properties>
+                     <property name="jbosscache-configuration" value="conf/standalone/test-jbosscache-config.xml" />
+                     <property name="jbosscache-shareable" value="${jbosscache-shareable}" />
+                  </properties>
+               </cache>
+               <query-handler class="org.exoplatform.services.jcr.impl.core.query.lucene.SearchIndex">
+                  <properties>
+                     <property name="index-dir" value="target/temp/index/db2/ws" />
+                  </properties>
+               </query-handler>
+               <lock-manager class="org.exoplatform.services.jcr.impl.core.lock.jbosscache.CacheableLockManagerImpl">
+                  <properties>
+                     <property name="time-out" value="15m" />
+                     <property name="jbosscache-configuration" value="conf/standalone/test-jbosscache-lock.xml" />
+                     <property name="jbosscache-cl-cache.jdbc.table.name" value="jcrlocks_db2_ws" />
+                     <property name="jbosscache-cl-cache.jdbc.table.create" value="true" />
+                     <property name="jbosscache-cl-cache.jdbc.table.drop" value="false" />
+                     <property name="jbosscache-cl-cache.jdbc.table.primarykey" value="jcrlocks_db2_ws_pk" />
+                     <property name="jbosscache-cl-cache.jdbc.fqn.column" value="fqn" />
+                     <property name="jbosscache-cl-cache.jdbc.node.column" value="node" />
+                     <property name="jbosscache-cl-cache.jdbc.parent.column" value="parent" />
+                     <property name="jbosscache-cl-cache.jdbc.datasource" value="jdbcjcrdb2" />
+                     <property name="jbosscache-shareable" value="${jbosscache-shareable}" />
+                  </properties>
+               </lock-manager>               
+            </workspace>
+
+            <workspace name="ws1">
+               <container class="org.exoplatform.services.jcr.impl.storage.jdbc.optimisation.CQJDBCWorkspaceDataContainer">
+                  <properties>
+                     <property name="source-name" value="jdbcjcr1db2" />
+                     <property name="dialect" value="auto" />
+                     <property name="multi-db" value="true" />
+                     <property name="update-storage" value="false" />
+                     <property name="max-buffer-size" value="200k" />
+                     <property name="swap-directory" value="target/temp/swap/ws1db2" />
+                  </properties>
+                  <value-storages>
+                     <value-storage id="ws1" class="org.exoplatform.services.jcr.impl.storage.value.fs.TreeFileValueStorage">
+                        <properties>
+                           <property name="path" value="target/temp/values/ws1db2" />
+                        </properties>
+                        <filters>
+                           <filter property-type="Binary" min-value-size="100K" />
+                        </filters>
+                     </value-storage>
+                  </value-storages>
+               </container>
+               <initializer class="org.exoplatform.services.jcr.impl.core.ScratchWorkspaceInitializer">
+                  <properties>
+                     <property name="root-nodetype" value="nt:unstructured" />
+                     <property name="root-permissions" value="any read;any add_node;any set_property;any remove" />
+                  </properties>
+               </initializer>
+               <cache enabled="true" class="org.exoplatform.services.jcr.impl.dataflow.persistent.jbosscache.JBossCacheWorkspaceStorageCache">
+                  <properties>
+                     <property name="jbosscache-configuration" value="conf/standalone/test-jbosscache-config.xml" />
+                     <property name="jbosscache-shareable" value="${jbosscache-shareable}" />
+                  </properties>
+               </cache>
+               <query-handler class="org.exoplatform.services.jcr.impl.core.query.lucene.SearchIndex">
+                  <properties>
+                     <property name="index-dir" value="target/temp/index/db2/ws1" />
+                  </properties>
+               </query-handler>
+               <lock-manager class="org.exoplatform.services.jcr.impl.core.lock.jbosscache.CacheableLockManagerImpl">
+                  <properties>
+                     <property name="time-out" value="15m" />
+                     <property name="jbosscache-configuration" value="conf/standalone/test-jbosscache-lock.xml" />
+                     <property name="jbosscache-cl-cache.jdbc.table.name" value="jcrlocks_db2_ws1" />
+                     <property name="jbosscache-cl-cache.jdbc.table.create" value="true" />
+                     <property name="jbosscache-cl-cache.jdbc.table.drop" value="false" />
+                     <property name="jbosscache-cl-cache.jdbc.table.primarykey" value="jcrlocks_db2_ws1_pk" />
+                     <property name="jbosscache-cl-cache.jdbc.fqn.column" value="fqn" />
+                     <property name="jbosscache-cl-cache.jdbc.node.column" value="node" />
+                     <property name="jbosscache-cl-cache.jdbc.parent.column" value="parent" />
+                     <property name="jbosscache-cl-cache.jdbc.datasource" value="jdbcjcr1db2" />
+                     <property name="jbosscache-shareable" value="${jbosscache-shareable}" />
+                  </properties>
+               </lock-manager> 
+            </workspace>
          </workspaces>
       </repository>
-
+
       <repository name="db1tck" system-workspace="ws" default-workspace="ws">
          <security-domain>exo-domain</security-domain>
          <!-- access-control>optional</access-control -->

Modified: jcr/trunk/exo.jcr.component.core/src/test/resources/test.policy
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/resources/test.policy	2010-10-29 11:35:39 UTC (rev 3367)
+++ jcr/trunk/exo.jcr.component.core/src/test/resources/test.policy	2010-10-29 11:45:18 UTC (rev 3368)
@@ -9,4 +9,6 @@
 grant codeBase "@TEST_CLASSES at -"{
    permission java.lang.RuntimePermission "createSystemSession";
    permission java.lang.RuntimePermission "manageRepository";
+   permission java.lang.RuntimePermission "invokeInternalAPI";
 };
+



More information about the exo-jcr-commits mailing list