/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.vertical.engine.handlers;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.w3c.dom.Document;
import com.enonic.esl.xml.XMLTool;
import com.enonic.vertical.engine.VerticalEngineLogger;
import com.enonic.cms.framework.xml.XMLDocumentFactory;
import com.enonic.cms.core.security.group.GroupKey;
import com.enonic.cms.core.security.user.User;
import com.enonic.cms.core.security.user.UserEntity;
import com.enonic.cms.core.security.user.UserNameXmlCreator;
import com.enonic.cms.core.security.user.UserSpecification;
import com.enonic.cms.core.security.userstore.UserStoreKey;
import com.enonic.cms.store.dao.UserDao;
@Component
public final class UserHandler
extends BaseHandler
{
@Autowired
protected UserDao userDao;
public String generateUID( String fName, String sName, UserStoreKey userStoreKey )
{
final int uidLength = 8;
if ( fName == null || sName == null )
{
return null;
}
if ( fName.length() == 0 || sName.length() == 0 )
{
return null;
}
fName = NameGenerator.transcribeName( fName );
sName = NameGenerator.transcribeName( sName );
String suffix = "";
int counter = 0;
boolean done = false;
String newUID = null;
while ( !done )
{
int iterations = sName.length() + fName.length() - 1;
if ( ( iterations + 1 ) > ( uidLength - suffix.length() ) )
{
iterations -= iterations + 1 - ( uidLength - suffix.length() );
}
for ( int i = 1; i <= iterations; i++ )
{
int letters_from_sname = Math.min( Math.min( i, sName.length() ), uidLength - 1 - suffix.length() );
int letters_from_fname =
Math.min( fName.length(), uidLength - letters_from_sname - suffix.length() ) - Math.max( 0, i - letters_from_sname );
newUID = fName.substring( 0, letters_from_fname ) + sName.substring( 0, letters_from_sname ) + suffix;
if ( !existsUser( newUID, userStoreKey ) )
{
done = true;
break;
}
else
{
newUID = null;
}
}
counter++;
suffix = Integer.toString( counter );
// Not very likely to happen, exit to prevent infinite loop
if ( counter == 100 )
{
newUID = null;
break;
}
}
if ( newUID == null )
{
VerticalEngineLogger.warn( "Unable to generate UID for user ({0}, {1}).", new Object[]{fName, sName} );
}
return newUID;
}
private boolean existsUser( String uid, UserStoreKey userStoreKey )
{
UserSpecification userSpec = new UserSpecification();
userSpec.setName( uid );
userSpec.setUserStoreKey( userStoreKey );
userSpec.setDeletedStateNotDeleted();
final List<UserEntity> users = userDao.findBySpecification( userSpec );
return users != null && users.size() > 0;
}
public Document getUsersByGroupKeys( String[] groupKeys )
{
if ( groupKeys.length == 0 )
{
return XMLTool.createDocument( "usernames" );
}
List<User> userKeys = new ArrayList<User>();
for ( String groupKey : groupKeys )
{
UserSpecification userSpec = new UserSpecification();
userSpec.setUserGroupKey( new GroupKey( groupKey ) );
userSpec.setDeletedStateNotDeleted();
UserEntity user = userDao.findSingleBySpecification( userSpec );
if ( user != null )
{
userKeys.add( user );
}
}
UserNameXmlCreator userNameXmlCreator = new UserNameXmlCreator();
return XMLDocumentFactory.create( userNameXmlCreator.createUserNamesDocument( userKeys ) ).getAsDOMDocument();
}
public User getAnonymousUser()
{
return userDao.findBuiltInAnonymousUser();
}
}