DsFrameworkCliServerGroup.java revision fbbcdae277f66a56a2e5450858b249f82470dc56
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at
* trunk/opends/resource/legal-notices/OpenDS.LICENSE
* or https://OpenDS.dev.java.net/OpenDS.LICENSE.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at
* trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable,
* add the following below this CDDL HEADER, with the fields enclosed
* by brackets "[]" replaced with your own identifying information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
*
* Copyright 2006-2008 Sun Microsystems, Inc.
*/
package org.opends.server.admin.client.cli;
import static org.opends.messages.AdminMessages.*;
import static org.opends.messages.ToolMessages.*;
import static org.opends.server.tools.ToolConstants.*;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.naming.NamingException;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.Rdn;
import org.opends.admin.ads.ADSContext;
import org.opends.admin.ads.ADSContextException;
import org.opends.admin.ads.ADSContext.ServerGroupProperty;
import org.opends.admin.ads.ADSContext.ServerProperty;
import org.opends.admin.ads.ADSContextException.ErrorType;
import org.opends.server.util.args.ArgumentException;
import org.opends.server.util.args.BooleanArgument;
import org.opends.server.util.args.StringArgument;
import org.opends.server.util.args.SubCommand;
import static org.opends.server.admin.client.cli.DsFrameworkCliReturnCode.*;
/**
* This class is handling server group CLI.
*/
public class DsFrameworkCliServerGroup implements DsFrameworkCliSubCommandGroup
{
/**
* End Of Line.
*/
private String EOL = System.getProperty("line.separator");
/**
* The subcommand Parser.
*/
DsFrameworkCliParser argParser ;
/**
* The verbose argument.
*/
BooleanArgument verboseArg ;
/**
* The enumeration containing the different subCommand names.
*/
private enum SubCommandNameEnum
{
/**
* The create-group subcommand.
*/
CREATE_GROUP("create-group"),
/**
* The delete-group subcommand.
*/
DELETE_GROUP("delete-group"),
/**
* The modify-group subcommand.
*/
MODIFY_GROUP("modify-group"),
/**
* The list-groups subcommand.
*/
LIST_GROUPS("list-groups"),
/**
* The list-members subcommand.
*/
LIST_MEMBERS("list-members"),
/**
* The list-membership subcommand.
*/
LIST_MEMBERSHIP("list-membership"),
/**
* The add-to-group subcommand.
*/
ADD_TO_GROUP("add-to-group"),
/**
* The remove-from-group subcommand.
*/
REMOVE_FROM_GROUP("remove-from-group");
// String representation of the value.
private final String name;
// Private constructor.
private SubCommandNameEnum(String name)
{
this.name = name;
}
/**
* {@inheritDoc}
*/
public String toString()
{
return name;
}
// A lookup table for resolving a unit from its name.
private static final List<String> nameToSubCmdName ;
static
{
nameToSubCmdName = new ArrayList<String>();
for (SubCommandNameEnum subCmd : SubCommandNameEnum.values())
{
nameToSubCmdName.add(subCmd.toString());
}
}
public static boolean isSubCommand(String name)
{
return nameToSubCmdName.contains(name);
}
}
/**
* The 'create-group' subcommand.
*/
public SubCommand createGroupSubCmd;
/**
* The 'description' argument of the 'create-group' subcommand.
*/
private StringArgument createGroupDescriptionArg;
/**
* The 'group-name' argument of the 'create-group' subcommand.
*/
private StringArgument createGroupGroupNameArg;
/**
* The 'modify-group' subcommand.
*/
private SubCommand modifyGroupSubCmd;
/**
* The 'description' argument of the 'modify-group' subcommand.
*/
private StringArgument modifyGroupDescriptionArg;
/**
* The 'group-id' argument of the 'modify-group' subcommand.
*/
private StringArgument modifyGroupGroupIdArg;
/**
* The 'group-name' argument of the 'modify-group' subcommand.
*/
private StringArgument modifyGroupGroupNameArg;
/**
* The 'delete-group' subcommand.
*/
private SubCommand deleteGroupSubCmd;
/**
* The 'group-name' argument of the 'delete-group' subcommand.
*/
private StringArgument deleteGroupGroupNameArg;
/**
* The 'list-group' subcommand.
*/
private SubCommand listGroupSubCmd;
/**
* The 'add-to-group' subcommand.
*/
private SubCommand addToGroupSubCmd;
/**
* The 'group-name' argument of the 'add-to-group' subcommand.
*/
private StringArgument addToGroupGroupNameArg;
/**
* The 'member-id' argument of the 'add-to-group' subcommand.
*/
private StringArgument addToGoupMemberNameArg;
/**
* The 'remove-from-group' subcommand.
*/
private SubCommand removeFromGroupSubCmd;
/**
* The 'group-name' argument of the 'remove-from-group' subcommand.
*/
private StringArgument removeFromGroupGroupNameArg;
/**
* The 'member-id' argument of the 'remove-from-group' subcommand.
*/
private StringArgument removeFromGoupMemberNameArg;
/**
* The 'list-members' subcommand.
*/
private SubCommand listMembersSubCmd;
/**
* The 'group-name' argument of the 'list-members' subcommand.
*/
private StringArgument listMembersGroupNameArg;
/**
* The 'list-membership' subcommand.
*/
private SubCommand listMembershipSubCmd;
/**
* The 'member-name' argument of the 'list-membership' subcommand.
*/
private StringArgument listMembershipMemberNameArg;
/**
* Association between ADSContext enum and display field.
*/
private HashMap<ServerGroupProperty, String> attributeDisplayName;
/**
* The subcommand list.
*/
private HashSet<SubCommand> subCommands = new HashSet<SubCommand>();
/**
* Indicates whether this subCommand should be hidden in the usage
* information.
*/
private boolean isHidden;
/**
* The subcommand group name.
*/
private String groupName;
/**
* Get the display attribute name for a given attribute.
* @param prop The server property
* @return the display attribute name for a given attribute
*/
public String getAttributeDisplayName(ServerGroupProperty prop)
{
return attributeDisplayName.get(prop);
}
/**
* {@inheritDoc}
*/
public Set<SubCommand> getSubCommands()
{
return subCommands;
}
/**
* {@inheritDoc}
*/
public boolean isHidden()
{
return isHidden;
}
/**
* {@inheritDoc}
*/
public String getGroupName()
{
return groupName ;
}
/**
* {@inheritDoc}
*/
public void initializeCliGroup(DsFrameworkCliParser argParser,
BooleanArgument verboseArg)
throws ArgumentException
{
this.verboseArg = verboseArg ;
isHidden = false ;
groupName = "server-group";
this.argParser = argParser;
// Create-group subcommand
createGroupSubCmd = new SubCommand(argParser,
SubCommandNameEnum.CREATE_GROUP.toString(),
INFO_ADMIN_SUBCMD_CREATE_GROUP_DESCRIPTION.get());
subCommands.add(createGroupSubCmd);
createGroupDescriptionArg = new StringArgument("description",
OPTION_SHORT_DESCRIPTION, OPTION_LONG_DESCRIPTION, false, false,
true, INFO_DESCRIPTION_PLACEHOLDER.get(), "", null,
INFO_ADMIN_ARG_DESCRIPTION_DESCRIPTION.get());
createGroupSubCmd.addArgument(createGroupDescriptionArg);
createGroupGroupNameArg = new StringArgument("groupName",
OPTION_SHORT_GROUPNAME, OPTION_LONG_GROUPNAME, true, true,
INFO_GROUPNAME_PLACEHOLDER.get(),
INFO_ADMIN_ARG_CREATE_GROUP_GROUPNAME_DESCRIPTION.get());
createGroupSubCmd.addArgument(createGroupGroupNameArg);
// modify-group
modifyGroupSubCmd = new SubCommand(argParser,
SubCommandNameEnum.MODIFY_GROUP.toString(),
INFO_ADMIN_SUBCMD_MODIFY_GROUP_DESCRIPTION.get());
subCommands.add(modifyGroupSubCmd);
modifyGroupDescriptionArg = new StringArgument("new-description",
OPTION_SHORT_DESCRIPTION, OPTION_LONG_DESCRIPTION, false, false,
true, INFO_DESCRIPTION_PLACEHOLDER.get(), "", null,
INFO_ADMIN_ARG_NEW_DESCRIPTION_DESCRIPTION.get());
modifyGroupSubCmd.addArgument(modifyGroupDescriptionArg);
modifyGroupGroupIdArg = new StringArgument("new-groupName",
OPTION_SHORT_NEWGROUPNAME, OPTION_LONG_NEWGROUPNAME, false, false, true,
INFO_GROUPNAME_PLACEHOLDER.get(), "", null,
INFO_ADMIN_ARG_NEW_GROUPNAME_DESCRIPTION.get());
modifyGroupSubCmd.addArgument(modifyGroupGroupIdArg);
modifyGroupGroupNameArg = new StringArgument("groupName",
OPTION_SHORT_GROUPNAME, OPTION_LONG_GROUPNAME, true, true,
INFO_GROUPNAME_PLACEHOLDER.get(),
INFO_ADMIN_ARG_GROUPNAME_DESCRIPTION.get());
modifyGroupSubCmd.addArgument(modifyGroupGroupNameArg);
// delete-group
deleteGroupSubCmd = new SubCommand(argParser,SubCommandNameEnum.DELETE_GROUP
.toString(), INFO_ADMIN_SUBCMD_DELETE_GROUP_DESCRIPTION.get());
subCommands.add(deleteGroupSubCmd);
deleteGroupGroupNameArg = new StringArgument("groupName",
OPTION_SHORT_GROUPNAME, OPTION_LONG_GROUPNAME, true, true,
INFO_GROUPNAME_PLACEHOLDER.get(),
INFO_ADMIN_ARG_GROUPNAME_DESCRIPTION.get());
deleteGroupSubCmd.addArgument(deleteGroupGroupNameArg);
// list-groups
listGroupSubCmd = new SubCommand(argParser, "list-groups",
INFO_ADMIN_SUBCMD_LIST_GROUPS_DESCRIPTION.get());
subCommands.add(listGroupSubCmd);
// add-to-group
addToGroupSubCmd = new SubCommand(argParser,
SubCommandNameEnum.ADD_TO_GROUP.toString(),
INFO_ADMIN_SUBCMD_ADD_TO_GROUP_DESCRIPTION.get());
subCommands.add(addToGroupSubCmd);
addToGoupMemberNameArg = new StringArgument("memberName",
OPTION_SHORT_MEMBERNAME, OPTION_LONG_MEMBERNAME, true, true,
INFO_MEMBERNAME_PLACEHOLDER.get(),
INFO_ADMIN_ARG_ADD_MEMBERNAME_DESCRIPTION.get());
addToGroupSubCmd.addArgument(addToGoupMemberNameArg);
addToGroupGroupNameArg = new StringArgument("groupName",
OPTION_SHORT_GROUPNAME, OPTION_LONG_GROUPNAME, true, true,
INFO_GROUPNAME_PLACEHOLDER.get(),
INFO_ADMIN_ARG_GROUPNAME_DESCRIPTION.get());
addToGroupSubCmd.addArgument(addToGroupGroupNameArg);
// remove-from-group
removeFromGroupSubCmd = new SubCommand(argParser,
SubCommandNameEnum.REMOVE_FROM_GROUP.toString(),
INFO_ADMIN_SUBCMD_REMOVE_FROM_GROUP_DESCRIPTION.get());
subCommands.add(removeFromGroupSubCmd);
removeFromGoupMemberNameArg = new StringArgument("memberName",
OPTION_SHORT_MEMBERNAME, OPTION_LONG_MEMBERNAME, true, true,
INFO_MEMBERNAME_PLACEHOLDER.get(),
INFO_ADMIN_ARG_REMOVE_MEMBERNAME_DESCRIPTION.get());
removeFromGroupSubCmd.addArgument(removeFromGoupMemberNameArg);
removeFromGroupGroupNameArg = new StringArgument("groupName",
OPTION_SHORT_GROUPNAME, OPTION_LONG_GROUPNAME, true, true,
INFO_GROUPNAME_PLACEHOLDER.get(),
INFO_ADMIN_ARG_GROUPNAME_DESCRIPTION.get());
removeFromGroupSubCmd.addArgument(removeFromGroupGroupNameArg);
// list-members
listMembersSubCmd = new SubCommand(argParser,SubCommandNameEnum.LIST_MEMBERS
.toString(), INFO_ADMIN_SUBCMD_LIST_MEMBERS_DESCRIPTION.get());
subCommands.add(listMembersSubCmd);
listMembersGroupNameArg = new StringArgument("groupName",
OPTION_SHORT_GROUPNAME, OPTION_LONG_GROUPNAME, true, true,
INFO_GROUPNAME_PLACEHOLDER.get(),
INFO_ADMIN_ARG_GROUPNAME_DESCRIPTION.get());
listMembersSubCmd.addArgument(listMembersGroupNameArg);
// list-membership
listMembershipSubCmd = new SubCommand(argParser,
SubCommandNameEnum.LIST_MEMBERSHIP.toString(),
INFO_ADMIN_SUBCMD_LIST_MEMBERSHIP_DESCRIPTION.get());
subCommands.add(listMembershipSubCmd);
listMembershipMemberNameArg = new StringArgument("memberName",
OPTION_SHORT_MEMBERNAME, OPTION_LONG_MEMBERNAME, true, true,
INFO_MEMBERNAME_PLACEHOLDER.get(),
INFO_ADMIN_ARG_MEMBERNAME_DESCRIPTION.get());
listMembershipSubCmd.addArgument(listMembershipMemberNameArg);
// Create association between ADSContext enum and display field
attributeDisplayName = new HashMap<ServerGroupProperty, String>();
attributeDisplayName.put(ServerGroupProperty.UID, OPTION_LONG_GROUPNAME);
attributeDisplayName.put(ServerGroupProperty.DESCRIPTION,
OPTION_LONG_DESCRIPTION);
attributeDisplayName.put(ServerGroupProperty.MEMBERS,
OPTION_LONG_MEMBERNAME);
}
/**
* {@inheritDoc}
*/
public boolean isSubCommand(SubCommand subCmd)
{
return SubCommandNameEnum.isSubCommand(subCmd.getName());
}
/**
* {@inheritDoc}
*/
public DsFrameworkCliReturnCode performSubCommand(SubCommand subCmd,
OutputStream outStream, OutputStream errStream)
throws ADSContextException, ArgumentException
{
ADSContext adsCtx = null ;
InitialLdapContext ctx = null ;
DsFrameworkCliReturnCode returnCode = ERROR_UNEXPECTED;
try
{
// -----------------------
// create-group subcommand
// -----------------------
if (subCmd.getName().equals(createGroupSubCmd.getName()))
{
String groupId = createGroupGroupNameArg.getValue();
HashMap<ServerGroupProperty, Object> serverGroupProperties =
new HashMap<ServerGroupProperty, Object>();
// get the GROUP_NAME
serverGroupProperties.put(ServerGroupProperty.UID, groupId);
// get the Description
if (createGroupDescriptionArg.isPresent())
{
serverGroupProperties.put(ServerGroupProperty.DESCRIPTION,
createGroupDescriptionArg.getValue());
}
// Create the group
ctx = argParser.getContext(outStream, errStream);
if (ctx == null)
{
return CANNOT_CONNECT_TO_ADS;
}
adsCtx = new ADSContext(ctx) ;
adsCtx.createServerGroup(serverGroupProperties);
returnCode = SUCCESSFUL;
}
// -----------------------
// delete-group subcommand
// -----------------------
else if (subCmd.getName().equals(deleteGroupSubCmd.getName()))
{
returnCode = SUCCESSFUL;
String groupId = deleteGroupGroupNameArg.getValue();
if (groupId.equals(ADSContext.ALL_SERVERGROUP_NAME))
{
return ACCESS_PERMISSION ;
}
HashMap<ServerGroupProperty, Object> serverGroupProperties =
new HashMap<ServerGroupProperty, Object>();
// Get ADS context
ctx = argParser.getContext(outStream, errStream);
if (ctx == null)
{
return CANNOT_CONNECT_TO_ADS;
}
adsCtx = new ADSContext(ctx) ;
// update server Property "GROUPS"
Set<String> serverList = adsCtx.getServerGroupMemberList(groupId);
for (String serverId : serverList)
{
// serverId contains "cn=" string, just remove it.
removeServerFromGroup(adsCtx, groupId,serverId.substring(3));
}
// Delete the group
serverGroupProperties.put(ServerGroupProperty.UID, groupId);
adsCtx.deleteServerGroup(serverGroupProperties);
}
// -----------------------
// list-groups subcommand
// -----------------------
else if (subCmd.getName().equals(listGroupSubCmd.getName()))
{
ctx = argParser.getContext(outStream, errStream);
if (ctx == null)
{
return CANNOT_CONNECT_TO_ADS;
}
adsCtx = new ADSContext(ctx) ;
Set<Map<ServerGroupProperty, Object>> result = adsCtx
.readServerGroupRegistry();
StringBuilder buffer = new StringBuilder();
// if not verbose mode, print group name (1 per line)
if (! verboseArg.isPresent())
{
for (Map<ServerGroupProperty, Object> groupProps : result)
{
// Get the group name
buffer.append(groupProps.get(ServerGroupProperty.UID));
buffer.append(EOL);
}
}
else
{
// Look for the max group identifier length
int uidLength = 0 ;
for (ServerGroupProperty sgp : ServerGroupProperty.values())
{
int cur = attributeDisplayName.get(sgp).toString().length();
if (cur > uidLength)
{
uidLength = cur;
}
}
uidLength++;
for (Map<ServerGroupProperty, Object> groupProps : result)
{
// Get the group name
buffer.append(attributeDisplayName.get(ServerGroupProperty.UID));
// add space
int curLen = attributeDisplayName.get(ServerGroupProperty.UID)
.length();
for (int i = curLen; i < uidLength; i++)
{
buffer.append(" ");
}
buffer.append(": ");
buffer.append(groupProps.get(ServerGroupProperty.UID));
buffer.append(EOL);
// Write other props
for (ServerGroupProperty propName : ServerGroupProperty.values())
{
if (propName.compareTo(ServerGroupProperty.UID) == 0)
{
// We have already displayed the group Id
continue;
}
buffer.append(attributeDisplayName.get(propName));
// add space
curLen = attributeDisplayName.get(propName).length();
for (int i = curLen; i < uidLength; i++)
{
buffer.append(" ");
}
buffer.append(": ");
if (propName.compareTo(ServerGroupProperty.MEMBERS) == 0)
{
Set atts = (Set) groupProps.get(propName);
if (atts != null)
{
boolean indent = false;
for (Object att : atts)
{
if (indent)
{
buffer.append(EOL);
for (int i = 0; i < uidLength + 2; i++)
{
buffer.append(" ");
}
}
else
{
indent = true;
}
buffer.append(att.toString().substring(3));
}
}
}
else
{
if (groupProps.get(propName) != null)
{
buffer.append(groupProps.get(propName));
}
}
buffer.append(EOL);
}
buffer.append(EOL);
}
}
try
{
outStream.write(buffer.toString().getBytes());
}
catch (IOException e)
{
}
returnCode = SUCCESSFUL;
}
// -----------------------
// modify-group subcommand
// -----------------------
else if (subCmd.getName().equals(modifyGroupSubCmd.getName()))
{
String groupId = modifyGroupGroupNameArg.getValue();
HashMap<ServerGroupProperty, Object> serverGroupProperties =
new HashMap<ServerGroupProperty, Object>();
HashSet<ServerGroupProperty> serverGroupPropertiesToRemove =
new HashSet<ServerGroupProperty>();
Boolean updateRequired = false;
Boolean removeRequired = false;
// get the GROUP_ID
if (modifyGroupGroupIdArg.isPresent())
{
// rename the entry !
serverGroupProperties.put(ServerGroupProperty.UID,
modifyGroupGroupIdArg.getValue());
updateRequired = true;
}
else
{
serverGroupProperties.put(ServerGroupProperty.UID, groupId) ;
}
// get the Description
if (modifyGroupDescriptionArg.isPresent())
{
String newDesc = modifyGroupDescriptionArg.getValue();
if (newDesc.length() == 0)
{
serverGroupPropertiesToRemove.add(ServerGroupProperty.DESCRIPTION);
removeRequired = true;
}
else
{
serverGroupProperties.put(ServerGroupProperty.DESCRIPTION,
modifyGroupDescriptionArg.getValue());
updateRequired = true;
}
}
// Update the server group
if ( ! (updateRequired || removeRequired ) )
{
returnCode = SUCCESSFUL_NOP;
}
// We need to perform an update
ctx = argParser.getContext(outStream, errStream);
if (ctx == null)
{
return CANNOT_CONNECT_TO_ADS;
}
adsCtx = new ADSContext(ctx) ;
if (updateRequired)
{
adsCtx.updateServerGroup(groupId, serverGroupProperties);
}
if (removeRequired)
{
adsCtx.removeServerGroupProp(groupId,
serverGroupPropertiesToRemove);
}
returnCode = SUCCESSFUL;
}
// -----------------------
// add-to-group subcommand
// -----------------------
else if (subCmd.getName().equals(addToGroupSubCmd.getName()))
{
String groupId = addToGroupGroupNameArg.getValue();
ctx = argParser.getContext(outStream, errStream);
if (ctx == null)
{
return CANNOT_CONNECT_TO_ADS;
}
adsCtx = new ADSContext(ctx) ;
// Check if the server is registered inside to ADS
Set<Map<ServerProperty, Object>> serverList = adsCtx
.readServerRegistry();
boolean found = false ;
Map<ServerProperty, Object> foundServerProperties = null ;
for (Map<ServerProperty, Object> serverProperties : serverList)
{
String serverId = ADSContext
.getServerIdFromServerProperties(serverProperties);
if (addToGoupMemberNameArg.getValue().equals(serverId))
{
found = true;
foundServerProperties = serverProperties ;
break;
}
}
if ( !found )
{
throw new ADSContextException (ErrorType.NOT_YET_REGISTERED) ;
}
// Add the server inside the group
returnCode = addServerTogroup(adsCtx, groupId, foundServerProperties);
}
// -----------------------
// remove-from-group subcommand
// -----------------------
else if (subCmd.getName().equals(removeFromGroupSubCmd.getName()))
{
ctx = argParser.getContext(outStream, errStream);
if (ctx == null)
{
return CANNOT_CONNECT_TO_ADS;
}
adsCtx = new ADSContext(ctx) ;
returnCode = removeServerFromGroup(adsCtx,
removeFromGroupGroupNameArg.getValue(),
removeFromGoupMemberNameArg.getValue());
}
// -----------------------
// list-members subcommand
// -----------------------
else if (subCmd.getName().equals(listMembersSubCmd.getName()))
{
String groupId = listMembersGroupNameArg.getValue();
ctx = argParser.getContext(outStream, errStream);
if (ctx == null)
{
return CANNOT_CONNECT_TO_ADS;
}
adsCtx = new ADSContext(ctx) ;
// get the current member list
Set<String> memberList = adsCtx.getServerGroupMemberList(groupId);
if (memberList == null)
{
returnCode = SUCCESSFUL;
}
StringBuilder buffer = new StringBuilder();
for (String member : memberList)
{
// We shouldn't print out the "cn="
buffer.append(member.substring(3));
buffer.append(EOL);
}
try
{
outStream.write(buffer.toString().getBytes());
}
catch (IOException e)
{
}
returnCode = SUCCESSFUL;
}
// -----------------------
// list-membership subcommand
// -----------------------
else if (subCmd.getName().equals(listMembershipSubCmd.getName()))
{
ctx = argParser.getContext(outStream, errStream);
if (ctx == null)
{
return CANNOT_CONNECT_TO_ADS;
}
adsCtx = new ADSContext(ctx) ;
Set<Map<ServerGroupProperty, Object>> result = adsCtx
.readServerGroupRegistry();
String MemberId = listMembershipMemberNameArg.getValue();
StringBuilder buffer = new StringBuilder();
for (Map<ServerGroupProperty, Object> groupProps : result)
{
// Get the group name;
String groupId = groupProps.get(ServerGroupProperty.UID).toString();
// look for member list attribute
for (ServerGroupProperty propName : groupProps.keySet())
{
if (propName.compareTo(ServerGroupProperty.MEMBERS) != 0)
{
continue;
}
// Check if the member list contains the member-id
Set atts = (Set) groupProps.get(propName);
for (Object att : atts)
{
if (att.toString().substring(3).toLowerCase().equals(
MemberId.toLowerCase()))
{
buffer.append(groupId);
buffer.append(EOL);
break;
}
}
break;
}
}
try
{
outStream.write(buffer.toString().getBytes());
}
catch (IOException e)
{
}
returnCode = SUCCESSFUL;
}
else
{
// Should never occurs: If we are here, it means that the code to
// handle to subcommand is not yet written.
returnCode = ERROR_UNEXPECTED;
}
}
catch (ADSContextException e)
{
if (ctx != null)
{
try
{
ctx.close();
}
catch (NamingException x)
{
}
}
throw e;
}
// Close the connection, if needed
if (ctx != null)
{
try
{
ctx.close();
}
catch (NamingException x)
{
}
}
// return part
return returnCode;
}
/**
* Remove a server from a group.
*
* @param adsCtx
* The ADS context to use.
* @param groupId
* The group identifier from which a server has to be
* remove.
* @param serverId
* The server identifier to be removed.
* @return The return code.
* @throws ADSContextException
* If there is a problem with any of the parameters used
* to create this argument.
*/
static DsFrameworkCliReturnCode removeServerFromGroup(ADSContext adsCtx,
String groupId, String serverId)
throws ADSContextException
{
DsFrameworkCliReturnCode returnCode = SUCCESSFUL;
// get the current group member list
Set<String> memberList = adsCtx.getServerGroupMemberList(groupId);
if (memberList == null)
{
returnCode = NOT_YET_REGISTERED;
}
String memberToRemove = "cn="
+ Rdn.escapeValue(serverId);
if (!memberList.contains(memberToRemove))
{
returnCode = NOT_YET_REGISTERED;
}
memberList.remove(memberToRemove);
HashMap<ServerGroupProperty, Object> serverGroupProperties =
new HashMap<ServerGroupProperty, Object>();
serverGroupProperties.put(ServerGroupProperty.MEMBERS, memberList);
// Update the server group
adsCtx.updateServerGroup(groupId, serverGroupProperties);
// Update the server property "GROUPS"
Set<Map<ServerProperty,Object>> serverList = adsCtx.readServerRegistry() ;
boolean found = false;
Map<ServerProperty,Object> serverProperties = null ;
for (Map<ServerProperty,Object> elm : serverList)
{
if (serverId.equals(elm.get(ServerProperty.ID)))
{
found = true ;
serverProperties = elm ;
break ;
}
}
if ( ! found )
{
return SERVER_NOT_REGISTERED ;
}
Set rawGroupList = (Set) serverProperties.get(ServerProperty.GROUPS);
Set<String> groupList = new HashSet<String>();
if (rawGroupList != null)
{
for (Object elm :rawGroupList.toArray() )
{
if (groupId.equals(elm))
{
continue ;
}
groupList.add(elm.toString());
}
}
serverProperties.put(ServerProperty.GROUPS, groupList);
adsCtx.updateServer(serverProperties, null);
return returnCode;
}
/**
* Add a server inside a group.
*
* @param adsCtx
* The ADS context to use.
* @param groupId
* The group identifier in which a server has to be added.
* @param map
* The properties of the server that have to be added to the
* group.
* @return the return code.
* @throws ADSContextException
* If there is a problem with any of the parameters used
* to create this argument.
*/
static DsFrameworkCliReturnCode addServerTogroup(ADSContext adsCtx,
String groupId, Map<ServerProperty, Object> map)
throws ADSContextException
{
DsFrameworkCliReturnCode returnCode = SUCCESSFUL;
String serverId = (String) map.get(ServerProperty.ID);
// Add the server inside the group
HashMap<ServerGroupProperty, Object> serverGroupProperties =
new HashMap<ServerGroupProperty, Object>();
Set<String> memberList = adsCtx.getServerGroupMemberList(groupId);
if (memberList == null)
{
memberList = new HashSet<String>();
}
String newMember = "cn="
+ Rdn.escapeValue(serverId);
if (memberList.contains(newMember))
{
returnCode = ALREADY_REGISTERED;
}
memberList.add(newMember);
serverGroupProperties.put(ServerGroupProperty.MEMBERS, memberList);
adsCtx.updateServerGroup(groupId, serverGroupProperties);
// Update the server property "GROUPS"
Set rawGroupList = (Set) map.get(ServerProperty.GROUPS);
Set<String> groupList = new HashSet<String>();
if (rawGroupList != null)
{
for (Object elm :rawGroupList.toArray() )
{
groupList.add(elm.toString());
}
}
groupList.add(groupId) ;
map.put(ServerProperty.GROUPS, groupList);
adsCtx.updateServer(map, null);
return returnCode;
}
}