### Eclipse Workspace Patch 1.0 #P oak-run Index: src/main/java/org/apache/jackrabbit/oak/benchmark/junit/BenchmarkStaticRunner.java =================================================================== --- src/main/java/org/apache/jackrabbit/oak/benchmark/junit/BenchmarkStaticRunner.java (revision 0) +++ src/main/java/org/apache/jackrabbit/oak/benchmark/junit/BenchmarkStaticRunner.java (revision 0) @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package org.apache.jackrabbit.oak.benchmark.junit; + +import java.util.ArrayList; +import java.util.List; + +import javax.jcr.Repository; + +import org.apache.jackrabbit.oak.benchmark.Benchmark; +import org.apache.jackrabbit.oak.benchmark.junit.security.ReadStatusTestSingleACL; +import org.apache.jackrabbit.oak.fixture.RepositoryFixture; + +public class BenchmarkStaticRunner { + + public static void main(String[] args) throws Exception { + + RepositoryFixture repositoryFixture = new RepositoryFixture() { + + @Override + public void tearDownCluster() { + // do nothing + } + + @Override + public void syncRepositoryCluster(Repository... nodes) { + // do nothing + } + + @Override + public Repository[] setUpCluster(int n) throws Exception { + return new Repository[n]; + } + + @Override + public boolean isAvailable(int n) { + return true; + } + }; + + List repositoryFixtures = new ArrayList(); + repositoryFixtures.add(repositoryFixture); + + Benchmark[] allBenchmarks = new Benchmark[] { new ReadStatusTestSingleACL().readStatusTest }; + + for (Benchmark benchmark : allBenchmarks) { + benchmark.run(repositoryFixtures); + } + + } + +} Index: src/main/java/org/apache/jackrabbit/oak/benchmark/junit/security/ReadStatusTestSingleACL.java =================================================================== --- src/main/java/org/apache/jackrabbit/oak/benchmark/junit/security/ReadStatusTestSingleACL.java (revision 0) +++ src/main/java/org/apache/jackrabbit/oak/benchmark/junit/security/ReadStatusTestSingleACL.java (revision 0) @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package org.apache.jackrabbit.oak.benchmark.junit.security; + +import static org.apache.jackrabbit.JcrConstants.NT_UNSTRUCTURED; + +import java.util.Random; + +import org.apache.jackrabbit.oak.api.Root; +import org.apache.jackrabbit.oak.benchmark.AbstractTest; +import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConstants; +import org.apache.jackrabbit.oak.util.NodeUtil; +import org.junit.Before; + + +public class ReadStatusTestSingleACL extends AbstractOakCoreTest{ + + private Root testRoot; + + @Before + public void before() throws Exception { + super.before(); + setupPermission("/", testPrincipal, true, PrivilegeConstants.JCR_READ); + + NodeUtil a = new NodeUtil(root.getTree("/a")); + Random random = new Random(); + for (int i=0;i<10000;i++){ + String name = Long.toHexString(random.nextLong()); + a.addChild(name,NT_UNSTRUCTURED); + } + root.commit(); + testRoot = getTestRoot(); + + } + + public AbstractTest readStatusTest= new AbstractTest() { + + @Override + public void beforeSuite() throws Exception { + ReadStatusTestSingleACL.this.before(); + } + + @Override + protected void runTest() throws Exception { + testRoot.getTree("/a").getChildrenCount(); + } + };;; +} Index: src/main/java/org/apache/jackrabbit/oak/benchmark/junit/security/AbstractOakCoreTest.java =================================================================== --- src/main/java/org/apache/jackrabbit/oak/benchmark/junit/security/AbstractOakCoreTest.java (revision 0) +++ src/main/java/org/apache/jackrabbit/oak/benchmark/junit/security/AbstractOakCoreTest.java (revision 0) @@ -0,0 +1,125 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package org.apache.jackrabbit.oak.benchmark.junit.security; + +import static com.google.common.base.Preconditions.checkNotNull; +import static org.apache.jackrabbit.JcrConstants.NT_UNSTRUCTURED; + +import java.security.Principal; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.jcr.security.AccessControlManager; +import javax.jcr.security.AccessControlPolicy; + +import org.apache.jackrabbit.api.security.JackrabbitAccessControlList; +import org.apache.jackrabbit.commons.jackrabbit.authorization.AccessControlUtils; +import org.apache.jackrabbit.oak.api.ContentSession; +import org.apache.jackrabbit.oak.api.Root; +import org.apache.jackrabbit.oak.util.NodeUtil; +import org.junit.After; +import org.junit.Before; + +/** + * Base class for all classes that attempt to test OAK API and OAK core functionality + * in combination with permission evaluation + */ +public abstract class AbstractOakCoreTest extends AbstractSecurityTest { + + protected Principal testPrincipal; + private ContentSession testSession; + + @Before + @Override + public void before() throws Exception { + super.before(); + + testPrincipal = getTestUser().getPrincipal(); + + NodeUtil rootNode = new NodeUtil(root.getTree("/")); + NodeUtil a = rootNode.addChild("a", NT_UNSTRUCTURED); + a.setString("aProp", "aValue"); + + NodeUtil b = a.addChild("b", NT_UNSTRUCTURED); + b.setString("bProp", "bValue"); + // sibling + NodeUtil bb = a.addChild("bb", NT_UNSTRUCTURED); + bb.setString("bbProp", "bbValue"); + + NodeUtil c = b.addChild("c", NT_UNSTRUCTURED); + c.setString("cProp", "cValue"); + root.commit(); + } + + @After + @Override + public void after() throws Exception { + try { + // clean up policies at the root node + AccessControlManager acMgr = getAccessControlManager(root); + AccessControlPolicy[] policies = acMgr.getPolicies("/"); + for (AccessControlPolicy policy : policies) { + acMgr.removePolicy("/", policy); + } + + // remove all test content + root.getTree("/a").remove(); + root.commit(); + + // release test session + if (testSession != null) { + testSession.close(); + } + } finally { + super.after(); + } + } + + @Nonnull + protected ContentSession getTestSession() throws Exception { + if (testSession == null) { + testSession = createTestSession(); + } + return testSession; + } + + @Nonnull + protected Root getTestRoot() throws Exception { + return getTestSession().getLatestRoot(); + } + + /** + * Setup simple allow/deny permissions (without restrictions). + * + * @param path + * @param principal + * @param isAllow + * @param privilegeNames + * @throws Exception + */ + protected void setupPermission(@Nullable String path, + @Nonnull Principal principal, + boolean isAllow, + @Nonnull String... privilegeNames) throws Exception { + AccessControlManager acMgr = getAccessControlManager(root); + JackrabbitAccessControlList acl = checkNotNull(AccessControlUtils.getAccessControlList(acMgr, path)); + acl.addEntry(principal, AccessControlUtils.privilegesFromNames(acMgr, privilegeNames), isAllow); + acMgr.setPolicy(path, acl); + + root.commit(); + } +} \ No newline at end of file Index: src/main/java/org/apache/jackrabbit/oak/benchmark/junit/security/AbstractSecurityTest.java =================================================================== --- src/main/java/org/apache/jackrabbit/oak/benchmark/junit/security/AbstractSecurityTest.java (revision 0) +++ src/main/java/org/apache/jackrabbit/oak/benchmark/junit/security/AbstractSecurityTest.java (revision 0) @@ -0,0 +1,198 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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. + */ +package org.apache.jackrabbit.oak.benchmark.junit.security; + +import java.util.UUID; +import javax.annotation.Nullable; +import javax.jcr.Credentials; +import javax.jcr.NoSuchWorkspaceException; +import javax.jcr.RepositoryException; +import javax.jcr.SimpleCredentials; +import javax.jcr.ValueFactory; +import javax.jcr.security.AccessControlManager; +import javax.jcr.security.Privilege; +import javax.security.auth.login.Configuration; +import javax.security.auth.login.LoginException; + +import org.apache.jackrabbit.api.security.JackrabbitAccessControlManager; +import org.apache.jackrabbit.api.security.authorization.PrivilegeManager; +import org.apache.jackrabbit.api.security.principal.PrincipalManager; +import org.apache.jackrabbit.api.security.user.User; +import org.apache.jackrabbit.api.security.user.UserManager; +import org.apache.jackrabbit.oak.Oak; +import org.apache.jackrabbit.oak.api.ContentRepository; +import org.apache.jackrabbit.oak.api.ContentSession; +import org.apache.jackrabbit.oak.api.Root; +import org.apache.jackrabbit.oak.namepath.NamePathMapper; +import org.apache.jackrabbit.oak.plugins.index.property.PropertyIndexEditorProvider; +import org.apache.jackrabbit.oak.plugins.index.property.PropertyIndexProvider; +import org.apache.jackrabbit.oak.plugins.nodetype.RegistrationEditorProvider; +import org.apache.jackrabbit.oak.plugins.nodetype.write.InitialContent; +import org.apache.jackrabbit.oak.plugins.value.ValueFactoryImpl; +import org.apache.jackrabbit.oak.security.SecurityProviderImpl; +import org.apache.jackrabbit.oak.spi.security.ConfigurationParameters; +import org.apache.jackrabbit.oak.spi.security.SecurityProvider; +import org.apache.jackrabbit.oak.spi.security.authentication.ConfigurationUtil; +import org.apache.jackrabbit.oak.spi.security.authorization.AccessControlConfiguration; +import org.apache.jackrabbit.oak.spi.security.principal.PrincipalConfiguration; +import org.apache.jackrabbit.oak.spi.security.privilege.PrivilegeConfiguration; +import org.apache.jackrabbit.oak.spi.security.user.UserConfiguration; +import org.apache.jackrabbit.oak.spi.security.user.util.UserUtility; +import org.junit.After; +import org.junit.Before; + +/** + * AbstractOakTest is the base class for oak test execution. + */ +public abstract class AbstractSecurityTest { + + private ContentRepository contentRepository; + private UserManager userManager; + private User testUser; + private PrivilegeManager privMgr; + + protected NamePathMapper namePathMapper = NamePathMapper.DEFAULT; + protected SecurityProvider securityProvider; + protected ContentSession adminSession; + protected Root root; + + @Before + public void before() throws Exception { + Oak oak = new Oak() + .with(new InitialContent()) + .with(new PropertyIndexEditorProvider()) + .with(new PropertyIndexProvider()) + .with(new RegistrationEditorProvider()) + .with(getSecurityProvider()); + withEditors(oak); + contentRepository = oak.createContentRepository(); + + adminSession = login(getAdminCredentials()); + root = adminSession.getLatestRoot(); + + Configuration.setConfiguration(getConfiguration()); + } + + @After + public void after() throws Exception { + try { + if (testUser != null) { + testUser.remove(); + root.commit(); + } + } finally { + if (adminSession != null) { + adminSession.close(); + } + Configuration.setConfiguration(null); + } + } + + protected SecurityProvider getSecurityProvider() { + if (securityProvider == null) { + securityProvider = new SecurityProviderImpl(getSecurityConfigParameters()); + } + return securityProvider; + } + + protected Oak withEditors(Oak oak) { + return oak; + } + + protected ConfigurationParameters getSecurityConfigParameters() { + return ConfigurationParameters.EMPTY; + } + + protected Configuration getConfiguration() { + return ConfigurationUtil.getDefaultConfiguration(getSecurityConfigParameters()); + } + + protected ContentSession login(@Nullable Credentials credentials) + throws LoginException, NoSuchWorkspaceException { + return contentRepository.login(credentials, null); + } + + protected Credentials getAdminCredentials() { + String adminId = UserUtility.getAdminId(getUserConfiguration().getParameters()); + return new SimpleCredentials(adminId, adminId.toCharArray()); + } + + protected NamePathMapper getNamePathMapper() { + return namePathMapper; + } + + protected UserConfiguration getUserConfiguration() { + return getConfig(UserConfiguration.class); + } + + protected UserManager getUserManager(Root root) { + if (userManager == null) { + userManager = getConfig(UserConfiguration.class).getUserManager(root, getNamePathMapper()); + } + return userManager; + } + + protected PrincipalManager getPrincipalManager(Root root) { + return getConfig(PrincipalConfiguration.class).getPrincipalManager(root, getNamePathMapper()); + } + + protected JackrabbitAccessControlManager getAccessControlManager(Root root) { + AccessControlManager acMgr = getConfig(AccessControlConfiguration.class).getAccessControlManager(root, NamePathMapper.DEFAULT); + if (acMgr instanceof JackrabbitAccessControlManager) { + return (JackrabbitAccessControlManager) acMgr; + } else { + throw new UnsupportedOperationException("Expected JackrabbitAccessControlManager found " + acMgr.getClass()); + } + } + + protected Privilege[] privilegesFromNames(String... privilegeNames) throws RepositoryException { + Privilege[] privs = new Privilege[privilegeNames.length]; + for (int i = 0; i < privilegeNames.length; i++) { + privs[i] = getPrivilegeManager(root).getPrivilege(privilegeNames[i]); + } + return privs; + } + + protected PrivilegeManager getPrivilegeManager(Root root) { + if (privMgr == null) { + privMgr = getConfig(PrivilegeConfiguration.class).getPrivilegeManager(root, getNamePathMapper()); + } + return privMgr; + } + + protected ValueFactory getValueFactory() { + return new ValueFactoryImpl(root.getBlobFactory(), getNamePathMapper()); + } + + protected User getTestUser() throws Exception { + if (testUser == null) { + String uid = "testUser" + UUID.randomUUID(); + testUser = getUserManager(root).createUser(uid, uid); + root.commit(); + } + return testUser; + } + + protected ContentSession createTestSession() throws Exception { + String uid = getTestUser().getID(); + return login(new SimpleCredentials(uid, uid.toCharArray())); + } + + protected T getConfig(Class configClass) { + return getSecurityProvider().getConfiguration(configClass); + } +} Index: src/main/java/org/apache/jackrabbit/oak/benchmark/AbstractTest.java =================================================================== --- src/main/java/org/apache/jackrabbit/oak/benchmark/AbstractTest.java (revision 1484770) +++ src/main/java/org/apache/jackrabbit/oak/benchmark/AbstractTest.java (working copy) @@ -32,7 +32,7 @@ /** * Abstract base class for individual performance benchmarks. */ -abstract class AbstractTest extends Benchmark { +public abstract class AbstractTest extends Benchmark { private Repository repository;