diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java index dee839b2b811d6e97bc9855c53e564f7617e4c4f..bd726b7360e30c1f43183437f3c5eda7bc5e1bfd 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java @@ -109,6 +109,19 @@ public abstract class AbstractServer<T extends IServer> implements IServer, return person; } + private final static PersonPE getSystemUser(final List<PersonPE> persons) + { + for (final PersonPE personPE : persons) + { + if (personPE.isSystemUser()) + { + return personPE; + } + } + throw new IllegalStateException(String.format( + "No system user could be found in given list '%s'.", persons)); + } + protected final IGenericBusinessObjectFactory getBusinessObjectFactory() { return businessObjectFactory; @@ -174,25 +187,28 @@ public abstract class AbstractServer<T extends IServer> implements IServer, } final Session session = sessionManager.getSession(sessionToken); final List<PersonPE> persons = daoFactory.getPersonDAO().listPersons(); + assert persons.size() > 0 : "At least system user should be in the database"; + // If only one user (system user), then this is the first logged user. final boolean isFirstLoggedUser = persons.size() == 1; - final PersonPE registrator = persons.get(0); - PersonPE personPE = daoFactory.getPersonDAO().tryFindPersonByUserId(user); - if (personPE == null) + final PersonPE systemUser = getSystemUser(persons); + PersonPE person = daoFactory.getPersonDAO().tryFindPersonByUserId(user); + if (person == null) { - personPE = createPerson(session.getPrincipal(), registrator); + person = createPerson(session.getPrincipal(), systemUser); } else { - HibernateUtils.initialize(personPE.getRoleAssignments()); + HibernateUtils.initialize(person.getRoleAssignments()); } if (session.tryGetPerson() == null) { - session.setPerson(personPE); + session.setPerson(person); } if (isFirstLoggedUser) { - final PersonPE person = session.tryGetPerson(); - final RoleAssignmentPE roleAssignmentPE = createRoleAssigment(registrator, person); - person.setRoleAssignments(Collections.singleton(roleAssignmentPE)); + // First logged user does have any role assignment yet. Make him database instance + // administrator. + final RoleAssignmentPE roleAssignment = createRoleAssigment(systemUser, person); + person.setRoleAssignments(Collections.singleton(roleAssignment)); daoFactory.getPersonDAO().updatePerson(person); } return session; diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java index ce9fa3a2e9ed952a6851f1fe16c1bc664820c3f9..7ea868bf873b18820c6b879807144d12cbe75e2b 100644 --- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java +++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java @@ -50,6 +50,13 @@ public final class GenericServerTest extends AbstractServerTestCase return new GenericServer(authenticationService, sessionManager, daoFactory, boFactory); } + private final static PersonPE createSystemUser() + { + final PersonPE systemPerson = new PersonPE(); + systemPerson.setUserId(PersonPE.SYSTEM_USER_ID); + return systemPerson; + } + @Test public void testLogout() { @@ -88,7 +95,7 @@ public final class GenericServerTest extends AbstractServerTestCase final String user = "user"; final String password = "password"; final Session session = createExampleSession(); - final PersonPE systemPerson = new PersonPE(); + final PersonPE systemPerson = createSystemUser(); final PersonPE person = createPersonFromPrincipal(PRINCIPAL); final RoleAssignmentPE roleAssignment = new RoleAssignmentPE(); roleAssignment.setPerson(person); @@ -129,7 +136,7 @@ public final class GenericServerTest extends AbstractServerTestCase final String user = "user"; final String password = "password"; final Session session = createExampleSession(); - final PersonPE systemPerson = new PersonPE(); + final PersonPE systemPerson = createSystemUser(); final PersonPE person = createPersonFromPrincipal(PRINCIPAL); context.checking(new Expectations() { @@ -163,7 +170,7 @@ public final class GenericServerTest extends AbstractServerTestCase final String user = "user"; final String password = "password"; final Session session = createExampleSession(); - final PersonPE systemPerson = new PersonPE(); + final PersonPE systemPerson = createSystemUser(); final PersonPE person = createPersonFromPrincipal(PRINCIPAL); context.checking(new Expectations() {