/*
* 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.api.security.user;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
import javax.jcr.InvalidItemStateException;
import javax.jcr.Node;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import org.apache.jackrabbit.api.JackrabbitSession;
import org.apache.jackrabbit.core.AbstractConcurrencyTest;
import org.apache.jackrabbit.core.security.TestPrincipal;
public class ConcurrentCreateUserTest extends AbstractConcurrencyTest {
/**
* The number of threads.
*/
private static final int CONCURRENCY = 5;
/**
* Number of tries per user.
*/
private static final int RETRIES = 3;
List<String> userIDs = Collections
.synchronizedList(new ArrayList<String>());
public static final String INTERMEDIATE_PATH = UUID.randomUUID().toString();
@Override
protected void tearDown() throws Exception {
try {
for (String id : userIDs) {
Authorizable a = ((JackrabbitSession) superuser)
.getUserManager().getAuthorizable(id);
a.remove();
superuser.save();
}
} catch (Exception e) {
// this is best effort
}
super.tearDown();
}
public void testCreateUsers() throws Exception {
log.println("ConcurrentCreateUserTest.testCreateUsers: c="
+ CONCURRENCY);
log.flush();
runTask(new Task() {
public void execute(Session session, Node test)
throws RepositoryException {
JackrabbitSession s = null;
try {
s = (JackrabbitSession) getHelper().getSuperuserSession();
String name = "newname-" + UUID.randomUUID();
Authorizable authorizable = null;
int maxtries = RETRIES;
RepositoryException lastex = null;
while (authorizable == null && maxtries > 0) {
try {
maxtries -= 1;
authorizable = s.getUserManager().createUser(name,
"password1", new TestPrincipal(name),
INTERMEDIATE_PATH);
s.save();
} catch (InvalidItemStateException ex) {
lastex = ex;
log.println("got " + ex + ", retrying");
}
}
if (authorizable == null) {
throw new RepositoryException("user " + name
+ " not created in " + RETRIES + " attempts.",
lastex);
}
userIDs.add(authorizable.getID());
log.println(authorizable + " created");
} finally {
s.logout();
}
}
}, CONCURRENCY, "/" + testPath);
}
}