/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.security.userstore.connector; import org.apache.commons.lang.StringUtils; import org.springframework.util.Assert; import com.enonic.vertical.engine.handlers.NameGenerator; import com.enonic.cms.core.security.group.DeleteGroupCommand; import com.enonic.cms.core.security.group.GroupEntity; import com.enonic.cms.core.security.group.GroupKey; import com.enonic.cms.core.security.group.StoreNewGroupCommand; import com.enonic.cms.core.security.group.UpdateGroupCommand; import com.enonic.cms.core.security.user.DeleteUserCommand; import com.enonic.cms.core.security.user.DisplayNameResolver; import com.enonic.cms.core.security.user.StoreNewUserCommand; import com.enonic.cms.core.security.user.UpdateUserCommand; import com.enonic.cms.core.security.user.UserEntity; import com.enonic.cms.core.security.user.UserKey; import com.enonic.cms.core.security.user.UserSpecification; import com.enonic.cms.core.security.user.UsernameResolver; import com.enonic.cms.core.security.userstore.GroupStorerFactory; import com.enonic.cms.core.security.userstore.UserStoreEntity; import com.enonic.cms.core.security.userstore.UserStoreKey; import com.enonic.cms.core.security.userstore.UserStorerFactory; import com.enonic.cms.store.dao.GroupDao; import com.enonic.cms.store.dao.UserDao; import com.enonic.cms.store.dao.UserStoreDao; /** * Jun 25, 2009 */ public abstract class AbstractBaseUserStoreConnector implements UserStoreConnector { protected final UserStoreKey userStoreKey; protected final String userStoreName; protected final String connectorName; protected UserDao userDao; protected GroupDao groupDao; protected UserStoreDao userStoreDao; protected GroupStorerFactory groupStorerFactory; protected UserStorerFactory userStorerFactory; protected abstract boolean isUsernameUnique( String username ); protected AbstractBaseUserStoreConnector( UserStoreKey userStoreKey, String userStoreName, String connectorName ) { this.userStoreKey = userStoreKey; this.userStoreName = userStoreName; this.connectorName = connectorName; } public String getUserStoreName() { return userStoreName; } public String getConnectorName() { return connectorName; } protected UserStoreEntity getUserStore() { return userStoreDao.findByKey( userStoreKey ); } protected void ensureValidUserName( final StoreNewUserCommand command ) { boolean usernameProvided = StringUtils.isNotBlank( command.getUsername() ); if ( usernameProvided ) { return; } String resolvedUsername = new UsernameResolver( getUserStore().getConfig() ).resolveUsername( command ); String createdUniqueUsername = getUniqueUsername( resolvedUsername ); command.setUsername( createdUniqueUsername ); } private String getUniqueUsername( String suggestedUsername ) { Assert.isTrue( StringUtils.isNotBlank( suggestedUsername ) ); suggestedUsername = NameGenerator.transcribeName( suggestedUsername ); int i = 0; String baseName = suggestedUsername; while ( true ) { if ( isUsernameUnique( suggestedUsername ) ) { return suggestedUsername; } else { i++; suggestedUsername = baseName + i; } Assert.isTrue( i < 100, "Not able to resolve user name within 100 attempts to create unique" ); } } protected UserEntity getLocalUserWithUsername( String userName ) { UserSpecification userSpec = new UserSpecification(); userSpec.setUserStoreKey( userStoreKey ); userSpec.setName( userName ); userSpec.setDeletedStateNotDeleted(); return userDao.findSingleBySpecification( userSpec ); } protected UserKey storeNewUserLocally( StoreNewUserCommand command, DisplayNameResolver displayNameResolver ) { return userStorerFactory.create( userStoreKey ).storeNewUser( command, displayNameResolver ); } protected void updateUserLocally( UpdateUserCommand command ) { userStorerFactory.create( userStoreKey ).updateUser( command ); } protected void deleteUserLocally( DeleteUserCommand command ) { userStorerFactory.create( userStoreKey ).deleteUser( command.getSpecification() ); } protected GroupKey storeNewGroupLocally( StoreNewGroupCommand command ) { return groupStorerFactory.create( userStoreKey ).storeNewGroup( command ); } protected void updateGroupLocally( UpdateGroupCommand command ) { groupStorerFactory.create( userStoreKey ).updateGroup( command ); } protected void removeMembershipFromGroupLocally( GroupEntity groupToRemove, GroupEntity groupToRemoveFrom ) { groupStorerFactory.create( userStoreKey ).removeMembershipFromGroup( groupToRemove, groupToRemoveFrom ); } protected void addMembershipToGroupLocally( GroupEntity groupToAdd, GroupEntity groupToAddTo ) { groupStorerFactory.create( userStoreKey ).addMembershipToGroup( groupToAdd, groupToAddTo ); } protected void deleteGroupLocally( DeleteGroupCommand command ) { groupStorerFactory.create( userStoreKey ).deleteGroup( command ); } public void setUserDao( UserDao value ) { this.userDao = value; } public void setGroupDao( GroupDao groupDao ) { this.groupDao = groupDao; } public void setGroupStorerFactory( GroupStorerFactory value ) { this.groupStorerFactory = value; } public void setUserStorerFactory( UserStorerFactory value ) { this.userStorerFactory = value; } public void setUserStoreDao( UserStoreDao value ) { this.userStoreDao = value; } }