/*
* Copyright 2000-2013 Enonic AS
* http://www.enonic.com/license
*/
package com.enonic.cms.core.security.group;
import java.util.List;
import java.util.Set;
import org.jdom.Document;
import org.jdom.Element;
import com.enonic.cms.framework.util.JDOMUtil;
import com.enonic.cms.core.AbstractPagedXmlCreator;
import com.enonic.cms.core.security.user.UserEntity;
import com.enonic.cms.core.security.user.UserXmlCreator;
import com.enonic.cms.core.security.userstore.UserStoreEntity;
public class GroupXmlCreator
extends AbstractPagedXmlCreator
{
private final UserXmlCreator userXmlCreator;
private boolean includeDescription;
private boolean adminConsoleStyle = true;
public GroupXmlCreator( UserXmlCreator userXmlCreator )
{
this.userXmlCreator = userXmlCreator;
}
public GroupXmlCreator()
{
this.userXmlCreator = new UserXmlCreator( this );
}
public Document createGroupsDocument( List<GroupEntity> groups, boolean includeMembership, boolean includeMembers )
{
Document doc = new Document();
Element groupsEl = new Element( "groups" );
groupsEl.setAttribute( "count", String.valueOf( groups.size() ) );
for ( GroupEntity group : groups )
{
groupsEl.addContent( doCreateElement( group, includeMembership, includeMembers, false ) );
}
doc.setRootElement( groupsEl );
return doc;
}
public Document createGroupDocument( GroupEntity group, boolean includeMembership, boolean includeMembers, boolean normalizeGroups )
{
Document doc = new Document();
Element rootEl = doCreateElement( group, includeMembership, includeMembers, normalizeGroups );
doc.setRootElement( rootEl );
return doc;
}
public Document createEmptyGroupDocument()
{
return new Document();
}
public Element createElement( GroupEntity group, boolean includeMembership, boolean includeMembers )
{
return doCreateElement( group, includeMembership, includeMembers, false );
}
private Element doCreateElement( GroupEntity group, boolean includeMembership, boolean includeMembers, boolean normalizeGroups )
{
if ( adminConsoleStyle )
{
return doCreateElementAdminConsoleStyle( group, includeMembership, includeMembers, normalizeGroups );
}
else
{
return doCreateElementPresentationStyle( group, includeMembership, includeMembers, normalizeGroups );
}
}
private Element doCreateElementAdminConsoleStyle( GroupEntity group, boolean includeMembership, boolean includeMembers,
boolean normalizeGroups )
{
final GroupType type = group.getType();
if ( type.equals( GroupType.USER ) )
{
UserEntity userEntity = group.getUser();
return userXmlCreator.createUserElement( userEntity, false );
}
Element groupEl = new Element( "group" );
groupEl.setAttribute( "builtIn", type.isBuiltIn() ? "true" : "false" );
groupEl.setAttribute( "deleted", group.isDeleted() ? "true" : "false" );
groupEl.setAttribute( "key", group.getGroupKey().toString() );
groupEl.setAttribute( "restricted", group.isRestricted() ? "true" : "false" );
groupEl.setAttribute( "type", String.valueOf( type.toInteger() ) );
groupEl.setAttribute( "typeName", type.getName() );
UserStoreEntity userStore = group.getUserStore();
if ( userStore != null )
{
groupEl.setAttribute( "userStoreKey", String.valueOf( userStore.getKey() ) );
}
JDOMUtil.createElement( groupEl, "name", group.getName() );
JDOMUtil.createElement( groupEl, "displayName", getDisplayName( group ) );
if ( group.getQualifiedName() != null )
{
JDOMUtil.createElement( groupEl, "qualifiedName", group.getQualifiedName().toString() );
}
if ( includeDescription )
{
JDOMUtil.createElement( groupEl, "description", group.getDescription() );
}
if ( includeMembers )
{
Element membersEl = new Element( "members" );
final Set<GroupEntity> groupMembers = group.getMembers( false );
membersEl.setAttribute( "count", String.valueOf( groupMembers.size() ) );
for ( GroupEntity member : groupMembers )
{
Element msgroupEl = doCreateElement( member, false, false, false );
membersEl.addContent( msgroupEl );
}
groupEl.addContent( membersEl );
}
if ( includeMembership )
{
Element membershipEl = new Element( "memberOf" );
final Set<GroupEntity> memberships = normalizeGroups ? group.getAllMemberships() : group.getMemberships( false );
membershipEl.setAttribute( "count", String.valueOf( memberships.size() ) );
for ( GroupEntity membershipGroup : memberships )
{
Element membershipGroupEl = doCreateElement( membershipGroup, false, false, false );
membershipEl.addContent( membershipGroupEl );
}
groupEl.addContent( membershipEl );
}
return groupEl;
}
private Element doCreateElementPresentationStyle( GroupEntity group, boolean includeMembership, boolean includeMembers,
boolean normalizeGroups )
{
final GroupType type = group.getType();
if ( type.equals( GroupType.USER ) )
{
UserEntity userEntity = group.getUser();
return userXmlCreator.createUserElement( userEntity, false );
}
Element groupEl = new Element( "group" );
groupEl.setAttribute( "key", group.getGroupKey().toString() );
groupEl.setAttribute( "built-in", type.isBuiltIn() ? "true" : "false" );
groupEl.setAttribute( "deleted", group.isDeleted() ? "true" : "false" );
groupEl.setAttribute( "type", String.valueOf( type.toInteger() ) );
groupEl.setAttribute( "type-name", type.getName() );
if ( group.getQualifiedName() != null )
{
groupEl.setAttribute( "qualified-name", group.getQualifiedName().toString() );
}
UserStoreEntity userStore = group.getUserStore();
if ( userStore != null )
{
groupEl.addContent( new Element( "userstore" ).setText( userStore.getName() ) );
}
JDOMUtil.createElement( groupEl, "name", group.getName() );
JDOMUtil.createElement( groupEl, "display-name", getDisplayName( group ) );
groupEl.addContent( new Element( "restricted" ).setText( group.isRestricted() ? "true" : "false" ) );
if ( includeDescription )
{
JDOMUtil.createElement( groupEl, "description", group.getDescription() );
}
if ( includeMembers )
{
Element membersEl = new Element( "members" );
final Set<GroupEntity> groupMembers = group.getMembers( false );
membersEl.setAttribute( "count", String.valueOf( groupMembers.size() ) );
for ( GroupEntity member : groupMembers )
{
Element msgroupEl = doCreateElement( member, false, false, false );
membersEl.addContent( msgroupEl );
}
groupEl.addContent( membersEl );
}
if ( includeMembership )
{
Element membershipEl = new Element( "memberships" );
final Set<GroupEntity> memberships = normalizeGroups ? group.getAllMemberships() : group.getMemberships( false );
membershipEl.setAttribute( "count", String.valueOf( memberships.size() ) );
for ( GroupEntity membershipGroup : memberships )
{
Element membershipGroupEl = doCreateElement( membershipGroup, false, false, false );
membershipEl.addContent( membershipGroupEl );
}
groupEl.addContent( membershipEl );
}
return groupEl;
}
private String getDisplayName( GroupEntity group )
{
final GroupType type = group.getType();
StringBuffer s = new StringBuffer();
if ( type.equals( GroupType.GLOBAL_GROUP ) || type.equals( GroupType.USERSTORE_GROUP ) )
{
s.append( group.getName() );
}
else
{
s.append( type.getName() );
if ( type.isBuiltIn() )
{
s.append( " (built-in)" );
}
}
return s.toString();
}
@Override
public Element createElement( Object obj )
{
return doCreateElement( (GroupEntity) obj, false, true, false );
}
@Override
public String getRootName()
{
return "groups";
}
public void setIncludeDescription( boolean value )
{
this.includeDescription = value;
}
public void setAdminConsoleStyle( boolean value )
{
this.adminConsoleStyle = value;
}
}