/*
* Copyright (C) 2009 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.storage;
import org.exoplatform.services.jcr.JcrImplBaseTest;
import org.exoplatform.services.jcr.access.AccessControlEntry;
import org.exoplatform.services.jcr.access.PermissionType;
import org.exoplatform.services.jcr.dataflow.DataManager;
import org.exoplatform.services.jcr.dataflow.ItemState;
import org.exoplatform.services.jcr.dataflow.PlainChangesLogImpl;
import org.exoplatform.services.jcr.dataflow.TransactionChangesLog;
import org.exoplatform.services.jcr.datamodel.IllegalNameException;
import org.exoplatform.services.jcr.datamodel.InternalQName;
import org.exoplatform.services.jcr.datamodel.ItemType;
import org.exoplatform.services.jcr.datamodel.NodeData;
import org.exoplatform.services.jcr.datamodel.PropertyData;
import org.exoplatform.services.jcr.datamodel.QPathEntry;
import org.exoplatform.services.jcr.datamodel.ValueData;
import org.exoplatform.services.jcr.impl.Constants;
import org.exoplatform.services.jcr.impl.dataflow.TransientNodeData;
import org.exoplatform.services.jcr.impl.dataflow.TransientPropertyData;
import org.exoplatform.services.jcr.impl.dataflow.TransientValueData;
import org.exoplatform.services.jcr.impl.dataflow.persistent.WorkspacePersistentDataManager;
import org.exoplatform.services.security.IdentityConstants;
import java.util.ArrayList;
import java.util.List;
import javax.jcr.PropertyType;
import javax.jcr.RepositoryException;
/**
* Created by The eXo Platform SAS Author : Peter Nedonosko peter.nedonosko@exoplatform.com.ua
* 30.01.2008
*
* @author <a href="mailto:peter.nedonosko@exoplatform.com.ua">Peter Nedonosko</a>
* @version $Id: JDBCStorageConnectionTest.java 11907 2008-03-13 15:36:21Z ksm $
*/
public class JDBCStorageConnectionTest extends JcrImplBaseTest
{
private DataManager dataManager;
private NodeData testRoot;
private NodeData root;
@Override
public void setUp() throws Exception
{
super.setUp();
dataManager =
(WorkspacePersistentDataManager)session.getContainer().getComponentInstanceOfType(
WorkspacePersistentDataManager.class); // .
// getTransientNodesManager
// (
// )
// .
// getTransactManager
// (
// )
// .
// getStorageDataManager
// (
// )
root = (NodeData)dataManager.getItemData(Constants.ROOT_UUID);
TransientNodeData troot =
TransientNodeData.createNodeData(root, InternalQName.parse("[]jdbcStorageConnectionTest"),
Constants.NT_UNSTRUCTURED);
TransientPropertyData pt =
TransientPropertyData.createPropertyData(troot, Constants.JCR_PRIMARYTYPE, PropertyType.NAME, false,
new TransientValueData(Constants.NT_UNSTRUCTURED));
PlainChangesLogImpl chlog = new PlainChangesLogImpl();
chlog.add(ItemState.createAddedState(troot));
chlog.add(ItemState.createAddedState(pt));
dataManager.save(new TransactionChangesLog(chlog));
testRoot =
(NodeData)dataManager.getItemData(root,
troot.getQPath().getEntries()[troot.getQPath().getEntries().length - 1], ItemType.NODE);
assertNotNull("Can't find test root node " + troot.getQPath().getAsString(), testRoot);
}
@Override
protected void tearDown() throws Exception
{
PlainChangesLogImpl chlog = new PlainChangesLogImpl();
List<PropertyData> cps = dataManager.listChildPropertiesData(testRoot);
for (PropertyData p : cps)
{
TransientPropertyData tp =
new TransientPropertyData(p.getQPath(), p.getIdentifier(), p.getPersistedVersion(), p.getType(), p
.getParentIdentifier(), p.isMultiValued());
chlog.add(ItemState.createDeletedState(tp));
}
// just a TransientNodeData
TransientNodeData troot =
new TransientNodeData(testRoot.getQPath(), testRoot.getIdentifier(), testRoot.getPersistedVersion(), testRoot
.getPrimaryTypeName(), testRoot.getMixinTypeNames(), testRoot.getOrderNumber(), testRoot
.getParentIdentifier(), testRoot.getACL());
chlog.add(ItemState.createDeletedState(troot));
dataManager.save(new TransactionChangesLog(chlog));
super.tearDown();
}
public void testGetItem_InheritedACL() throws RepositoryException, IllegalNameException
{
NodeData troot =
(NodeData)dataManager.getItemData(root, new QPathEntry(InternalQName.parse("[]jdbcStorageConnectionTest"), 1),
ItemType.NODE);
assertEquals("Inherited acl should be here", root.getACL().getOwner(), troot.getACL().getOwner());
}
public void testGetItem_MixOwneable() throws RepositoryException, IllegalNameException
{
// prepare mixin
TransientPropertyData mixin =
TransientPropertyData.createPropertyData(testRoot, Constants.JCR_MIXINTYPES, PropertyType.NAME, true,
new TransientValueData(Constants.EXO_OWNEABLE));
TransientPropertyData owner =
TransientPropertyData.createPropertyData(testRoot, Constants.EXO_OWNER, PropertyType.STRING, false,
new TransientValueData("exo"));
PlainChangesLogImpl chlog = new PlainChangesLogImpl();
chlog.add(ItemState.createAddedState(mixin));
chlog.add(ItemState.createAddedState(owner));
dataManager.save(new TransactionChangesLog(chlog));
// test
NodeData troot =
(NodeData)dataManager.getItemData(root, new QPathEntry(InternalQName.parse("[]jdbcStorageConnectionTest"), 1),
ItemType.NODE);
assertEquals("Owner is not valid", "exo", troot.getACL().getOwner());
}
public void testGetItem_MixPrivilegeable() throws RepositoryException, IllegalNameException
{
// prepare mixin
TransientPropertyData mixin =
TransientPropertyData.createPropertyData(testRoot, Constants.JCR_MIXINTYPES, PropertyType.NAME, true,
new TransientValueData(Constants.EXO_PRIVILEGEABLE));
List<ValueData> vd = new ArrayList<ValueData>();
vd.add(new TransientValueData(IdentityConstants.ANY + AccessControlEntry.DELIMITER + PermissionType.READ));
vd.add(new TransientValueData("managers" + AccessControlEntry.DELIMITER + PermissionType.SET_PROPERTY));
vd.add(new TransientValueData("operators" + AccessControlEntry.DELIMITER + PermissionType.SET_PROPERTY));
vd.add(new TransientValueData("operators" + AccessControlEntry.DELIMITER + PermissionType.ADD_NODE));
TransientPropertyData permissions =
TransientPropertyData.createPropertyData(testRoot, Constants.EXO_PERMISSIONS, PropertyType.STRING, false, vd);
PlainChangesLogImpl chlog = new PlainChangesLogImpl();
chlog.add(ItemState.createAddedState(mixin));
chlog.add(ItemState.createAddedState(permissions));
dataManager.save(new TransactionChangesLog(chlog));
// test
NodeData troot =
(NodeData)dataManager.getItemData(root, new QPathEntry(InternalQName.parse("[]jdbcStorageConnectionTest"), 1),
ItemType.NODE);
List<String> iperms = troot.getACL().getPermissions(IdentityConstants.ANY);
assertEquals("Wrong permission for " + IdentityConstants.ANY, 1, iperms.size());
assertEquals("Wrong permission for " + IdentityConstants.ANY, PermissionType.READ, iperms.get(0));
iperms = troot.getACL().getPermissions("managers");
assertEquals("Wrong permission for managers", 1, iperms.size());
assertEquals("Wrong permission for managers", PermissionType.SET_PROPERTY, iperms.get(0));
iperms = troot.getACL().getPermissions("operators");
assertEquals("Wrong permission for operators", 2, iperms.size());
assertEquals("Wrong permission for operators", PermissionType.SET_PROPERTY, iperms.get(0));
assertEquals("Wrong permission for operators", PermissionType.ADD_NODE, iperms.get(1));
}
public void testGetItem_MixOwneableMixPrivilegeable() throws RepositoryException, IllegalNameException
{
// prepare mixin
List<ValueData> mixvd = new ArrayList<ValueData>();
mixvd.add(new TransientValueData(Constants.EXO_OWNEABLE));
mixvd.add(new TransientValueData(Constants.EXO_PRIVILEGEABLE));
TransientPropertyData mixin =
TransientPropertyData.createPropertyData(testRoot, Constants.JCR_MIXINTYPES, PropertyType.NAME, true, mixvd);
List<ValueData> vd = new ArrayList<ValueData>();
vd.add(new TransientValueData(IdentityConstants.ANY + AccessControlEntry.DELIMITER + PermissionType.READ));
vd.add(new TransientValueData("managers" + AccessControlEntry.DELIMITER + PermissionType.SET_PROPERTY));
vd.add(new TransientValueData("operators" + AccessControlEntry.DELIMITER + PermissionType.SET_PROPERTY));
vd.add(new TransientValueData("operators" + AccessControlEntry.DELIMITER + PermissionType.ADD_NODE));
TransientPropertyData permissions =
TransientPropertyData.createPropertyData(testRoot, Constants.EXO_PERMISSIONS, PropertyType.STRING, false, vd);
TransientPropertyData owner =
TransientPropertyData.createPropertyData(testRoot, Constants.EXO_OWNER, PropertyType.STRING, false,
new TransientValueData("exo"));
PlainChangesLogImpl chlog = new PlainChangesLogImpl();
chlog.add(ItemState.createAddedState(mixin));
chlog.add(ItemState.createAddedState(owner));
chlog.add(ItemState.createAddedState(permissions));
dataManager.save(new TransactionChangesLog(chlog));
// test
NodeData troot =
(NodeData)dataManager.getItemData(root, new QPathEntry(InternalQName.parse("[]jdbcStorageConnectionTest"), 1),
ItemType.NODE);
assertEquals("Owner is not valid", "exo", troot.getACL().getOwner());
List<String> iperms = troot.getACL().getPermissions(IdentityConstants.ANY);
assertEquals("Wrong permission for " + IdentityConstants.ANY, 1, iperms.size());
assertEquals("Wrong permission for " + IdentityConstants.ANY, PermissionType.READ, iperms.get(0));
iperms = troot.getACL().getPermissions("managers");
assertEquals("Wrong permission for managers", 1, iperms.size());
assertEquals("Wrong permission for managers", PermissionType.SET_PROPERTY, iperms.get(0));
iperms = troot.getACL().getPermissions("operators");
assertEquals("Wrong permission for operators", 2, iperms.size());
assertEquals("Wrong permission for operators", PermissionType.SET_PROPERTY, iperms.get(0));
assertEquals("Wrong permission for operators", PermissionType.ADD_NODE, iperms.get(1));
}
}