Merge branch 'GP-0_ryanmkurtz_PR-7112_hippietrail_decendent'

This commit is contained in:
Ryan Kurtz 2024-10-28 13:43:30 -04:00
commit df050c0556
16 changed files with 78 additions and 78 deletions

View File

@ -4,9 +4,9 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*
* http://www.apache.org/licenses/LICENSE-2.0
*
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@ -90,7 +90,7 @@ public class ObjectTree implements ObjectPane {
if (selectionPaths != null && selectionPaths.length > 0) {
TreePath currentPath = currentSelectionPaths[0];
TreePath selectedPath = selectionPaths[0];
// NB. isDescendant == has a descendent
// NB. isDescendant == has a descendant
if (selectedPath.isDescendant(currentPath)) {
return;
}

View File

@ -4,9 +4,9 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*
* http://www.apache.org/licenses/LICENSE-2.0
*
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@ -556,7 +556,7 @@ public enum VariableValueUtils {
}
/**
* Find the descendent that dereferences this given varnode
* Find the descendant that dereferences this given varnode
*
* <p>
* This searches only one hop for a {@link PcodeOp#LOAD} or {@link PcodeOp#STORE}. If it find a

View File

@ -4,9 +4,9 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*
* http://www.apache.org/licenses/LICENSE-2.0
*
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@ -203,7 +203,7 @@ public class RTTIClassRecoverer extends RecoveredClassHelper {
* @throws CancelledException if cancelled
* @throws InvalidInputException if issues setting function return
* @throws DuplicateNameException if try to create same symbol name already in namespace
* @throws CircularDependencyException if parent namespace is descendent of given namespace
* @throws CircularDependencyException if parent namespace is descendant of given namespace
*/
public void figureOutClassDataMembers(List<RecoveredClass> recoveredClasses)
throws CancelledException, DuplicateNameException, InvalidInputException,

View File

@ -2009,16 +2009,16 @@ public class RTTIWindowsClassRecoverer extends RTTIClassRecoverer {
for (RecoveredClass ancestor : ancestors) {
monitor.checkCancelled();
List<RecoveredClass> decendentList = ancestorToCommonChild.get(ancestor);
if (decendentList == null) {
List<RecoveredClass> newDecendentList = new ArrayList<RecoveredClass>();
newDecendentList.add(parentClass);
ancestorToCommonChild.put(ancestor, newDecendentList);
List<RecoveredClass> descendantList = ancestorToCommonChild.get(ancestor);
if (descendantList == null) {
List<RecoveredClass> newDescendantList = new ArrayList<RecoveredClass>();
newDescendantList.add(parentClass);
ancestorToCommonChild.put(ancestor, newDescendantList);
}
else {
if (!decendentList.contains(parentClass)) {
decendentList.add(parentClass);
ancestorToCommonChild.replace(ancestor, decendentList);
if (!descendantList.contains(parentClass)) {
descendantList.add(parentClass);
ancestorToCommonChild.replace(ancestor, descendantList);
}
}
}

View File

@ -1040,7 +1040,7 @@ public class RecoveredClassHelper {
* @throws CancelledException if cancelled
* @throws DuplicateNameException if try to create same symbol name already in namespace
* @throws InvalidInputException if issues setting return type
* @throws CircularDependencyException if parent namespace is descendent of given namespace
* @throws CircularDependencyException if parent namespace is descendant of given namespace
*/
public void gatherClassMemberDataInfoForFunction(RecoveredClass recoveredClass,
Function function) throws CancelledException, DuplicateNameException,
@ -1256,7 +1256,7 @@ public class RecoveredClassHelper {
* @throws CancelledException if cancelled
* @throws DuplicateNameException if try to create same symbol name already in namespace
* @throws InvalidInputException if issue making function thiscall
* @throws CircularDependencyException if parent namespace is descendent of given namespace
* @throws CircularDependencyException if parent namespace is descendant of given namespace
*/
private void temporarilyReplaceEmptyStructures(Function function, Namespace classNamespace)
throws CancelledException, DuplicateNameException, InvalidInputException,
@ -1823,7 +1823,7 @@ public class RecoveredClassHelper {
* @throws CancelledException if cancelled
* @throws InvalidInputException if issue setting return type
* @throws DuplicateNameException if try to create same symbol name already in namespace
* @throws CircularDependencyException if parent namespace is descendent of given namespace
* @throws CircularDependencyException if parent namespace is descendant of given namespace
*/
public boolean processConstructorsAndDestructorsUsingParent(RecoveredClass recoveredClass,
RecoveredClass parentClass) throws CancelledException, InvalidInputException,
@ -1965,7 +1965,7 @@ public class RecoveredClassHelper {
* @throws CancelledException if cancelled
* @throws InvalidInputException if error setting return type
* @throws DuplicateNameException if try to create same symbol name already in namespace
* @throws CircularDependencyException if parent namespace is descendent of given namespace
* @throws CircularDependencyException if parent namespace is descendant of given namespace
*/
public void addConstructorToClass(RecoveredClass recoveredClass, Function constructorFunction)
throws CancelledException, InvalidInputException, DuplicateNameException,
@ -2090,7 +2090,7 @@ public class RecoveredClassHelper {
* @throws CancelledException if cancelled
* @throws InvalidInputException if error setting return type
* @throws DuplicateNameException if try to create same symbol name already in namespace
* @throws CircularDependencyException if parent namespace is descendent of given namespace
* @throws CircularDependencyException if parent namespace is descendant of given namespace
*/
public void createListedConstructorFunctions(Map<Address, RecoveredClass> referenceToClassMap,
List<Address> referencesToConstructors) throws CancelledException,
@ -2124,7 +2124,7 @@ public class RecoveredClassHelper {
* @throws CancelledException if cancelled
* @throws InvalidInputException if issue setting return type
* @throws DuplicateNameException if try to create same symbol name already in namespace
* @throws CircularDependencyException if parent namespace is descendent of given namespace
* @throws CircularDependencyException if parent namespace is descendant of given namespace
*/
public void processInlineConstructor(RecoveredClass recoveredClass,
@ -2542,7 +2542,7 @@ public class RecoveredClassHelper {
/**
* Method to use existing pdb names to assign class constructors and destructors
* @param recoveredClasses List of classes
* @throws CircularDependencyException if parent namespace is descendent of given namespace
* @throws CircularDependencyException if parent namespace is descendant of given namespace
* @throws DuplicateNameException if try to create same symbol name already in namespace
* @throws InvalidInputException if error setting return type
* @throws CancelledException if cancelled
@ -3480,7 +3480,7 @@ public class RecoveredClassHelper {
* @param address the given address
* @param name the name to give the new symbol
* @param namespace the namespace to put the new symbol in
* @throws CircularDependencyException if parent namespace is descendent of given namespace
* @throws CircularDependencyException if parent namespace is descendant of given namespace
* @throws InvalidInputException if issues setting return type
* @throws DuplicateNameException if try to create same symbol name already in namespace
* @throws CancelledException if cancelled
@ -3563,7 +3563,7 @@ public class RecoveredClassHelper {
* @param namespace the namespace to put the new symbol in
* @param setPrimary if true, set the new symbol primary, if false do not make the new symbol primary
* @param removeBadFID if true, check for and remove any incorrect FID symbols, if false leave them there
* @throws CircularDependencyException if parent namespace is descendent of given namespace
* @throws CircularDependencyException if parent namespace is descendant of given namespace
* @throws InvalidInputException if issues setting return type
* @throws DuplicateNameException if try to create same symbol name already in namespace
* @throws CancelledException if cancelled
@ -3640,7 +3640,7 @@ public class RecoveredClassHelper {
* @param name the given name
* @param function the given function
* @throws CancelledException if cancelled
* @throws CircularDependencyException if parent namespace is descendent of given namespace
* @throws CircularDependencyException if parent namespace is descendant of given namespace
* @throws DuplicateNameException if try to create same symbol name already in namespace
* @throws InvalidInputException if issues setting return type
*/
@ -3728,7 +3728,7 @@ public class RecoveredClassHelper {
* @throws CancelledException if cancelled
* @throws InvalidInputException if error setting return type
* @throws DuplicateNameException if try to create same symbol name already in namespace
* @throws CircularDependencyException if parent namespace is descendent of given namespace
* @throws CircularDependencyException if parent namespace is descendant of given namespace
*/
private void findAndRemoveBadStructuresFromFunction(Function function, Namespace namespace)
throws CancelledException, InvalidInputException, DuplicateNameException,
@ -3765,7 +3765,7 @@ public class RecoveredClassHelper {
* @throws CancelledException if cancelled
* @throws DuplicateNameException if try to create same symbol name already in namespace
* @throws InvalidInputException if invalid data input
* @throws CircularDependencyException if parent namespace is descendent of given namespace
* @throws CircularDependencyException if parent namespace is descendant of given namespace
*/
private void fixBadSignatures(Function function, List<Structure> badStructureDataTypes)
throws CancelledException, InvalidInputException, DuplicateNameException,
@ -3842,7 +3842,7 @@ public class RecoveredClassHelper {
* @throws CancelledException if cancelled
* @throws DuplicateNameException if try to create same symbol name already in namespace
* @throws InvalidInputException if invalid data input
* @throws CircularDependencyException if parent namespace is descendent of given namespace
* @throws CircularDependencyException if parent namespace is descendant of given namespace
*/
private void removeBadParameterDataTypes(Function function,
List<Structure> badStructureDataTypes) throws CancelledException,
@ -4694,7 +4694,7 @@ public class RecoveredClassHelper {
* @throws CancelledException if cancelled
* @throws InvalidInputException if issues setting return type
* @throws DuplicateNameException if try to create same symbol name already in namespace
* @throws CircularDependencyException if parent namespace is descendent of given namespace
* @throws CircularDependencyException if parent namespace is descendant of given namespace
*/
private void nameVfunctions(RecoveredClass recoveredClass, Address vftableAddress,
String vftableStructureName) throws CancelledException, InvalidInputException,
@ -6078,7 +6078,7 @@ public class RecoveredClassHelper {
* determine, using vftable order, which class contains the constructor/destructor and which
* contains the inlined constructor/destructor.
* @param recoveredClasses List of classes
* @throws CircularDependencyException if parent namespace is descendent of given namespace
* @throws CircularDependencyException if parent namespace is descendant of given namespace
* @throws DuplicateNameException if try to create same symbol name already in namespace
* @throws InvalidInputException if error setting return type
* @throws CancelledException when cancelled and others
@ -6258,7 +6258,7 @@ public class RecoveredClassHelper {
* @throws CancelledException if cancelled
* @throws InvalidInputException if issues setting return type
* @throws DuplicateNameException if try to create same symbol name already in namespace
* @throws CircularDependencyException if parent namespace is descendent of given namespace
* @throws CircularDependencyException if parent namespace is descendant of given namespace
*/
public void processRemainingIndeterminateConstructorsAndDestructors(
List<RecoveredClass> recoveredClasses) throws CancelledException, InvalidInputException,
@ -6561,7 +6561,7 @@ public class RecoveredClassHelper {
* @throws CancelledException if cancelled
* @throws InvalidInputException if issues setting return type
* @throws DuplicateNameException if try to create same symbol name already in namespace
* @throws CircularDependencyException if parent namespace is descendent of given namespace
* @throws CircularDependencyException if parent namespace is descendant of given namespace
*/
public void processRegularConstructorsAndDestructorsUsingCallOrder(
List<RecoveredClass> recoveredClasses) throws CancelledException, InvalidInputException,
@ -6592,7 +6592,7 @@ public class RecoveredClassHelper {
* indeterminate functions are constructors or destructors.
* @param recoveredClasses List of class objects
* @throws CancelledException if cancelled
* @throws CircularDependencyException if parent namespace is descendent of given namespace
* @throws CircularDependencyException if parent namespace is descendant of given namespace
* @throws DuplicateNameException if try to create same symbol name already in namespace
* @throws InvalidInputException if error setting return type
*/
@ -6661,7 +6661,7 @@ public class RecoveredClassHelper {
* descendant regular list.
* @param recoveredClasses list of classes
* @throws CancelledException if cancelled
* @throws CircularDependencyException if parent namespace is descendent of given namespace
* @throws CircularDependencyException if parent namespace is descendant of given namespace
* @throws DuplicateNameException if try to create same symbol name already in namespace
* @throws InvalidInputException if error setting return type
*/

View File

@ -6303,7 +6303,7 @@ int4 RulePtrArith::evaluatePointerExpression(PcodeOp *op,int4 slot)
return 0;
if (count > 1) {
if (outVn->isSpacebase())
return 0; // For the RESULT to be a spacebase pointer it must have only 1 descendent
return 0; // For the RESULT to be a spacebase pointer it must have only 1 descendant
// res = 2; // Uncommenting this line will not let pointers get pushed to multiple descendants
}
return res;

View File

@ -2795,7 +2795,7 @@ TransformVar *SubfloatFlow::setReplacement(Varnode *vn)
/// \brief Try to trace logical variable through descendant Varnodes
///
/// Given a Varnode placeholder, look at all descendent PcodeOps and create
/// Given a Varnode placeholder, look at all descendant PcodeOps and create
/// placeholders for the op and its output Varnode. If appropriate add the
/// output placeholder to the worklist.
/// \param rvn is the given Varnode placeholder

View File

@ -4,9 +4,9 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*
* http://www.apache.org/licenses/LICENSE-2.0
*
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@ -313,7 +313,7 @@ public class RepositoryFolder {
/**
* Returns true if any file/item contained within this folder
* or its descendents is checked-out.
* or its descendants is checked-out.
*/
private boolean containsCheckout() throws IOException {
@ -376,8 +376,8 @@ public class RepositoryFolder {
if (parent == null) {
throw new IOException("Root folder may not be moved");
}
if (newParent.isDescendentOf(this)) {
throw new IOException("New folder must not be decendent");
if (newParent.isDescendantOf(this)) {
throw new IOException("New folder must not be descendant");
}
if (containsCheckout()) {
throw new FileInUseException(
@ -426,9 +426,9 @@ public class RepositoryFolder {
}
/**
* Returns true if this folder is a descendent of the specified folder
* Returns true if this folder is a descendant of the specified folder
*/
private boolean isDescendentOf(RepositoryFolder folder) {
private boolean isDescendantOf(RepositoryFolder folder) {
RepositoryFolder rf = parent;
while (rf != null) {
if (rf == folder) {

View File

@ -4,9 +4,9 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*
* http://www.apache.org/licenses/LICENSE-2.0
*
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@ -299,7 +299,7 @@ public class DockingUtils {
}
/**
* Perform some operation on a component and all of its descendents, recursively.
* Perform some operation on a component and all of its descendants, recursively.
*
* This applies the operation to all components in the tree, children first.
*

View File

@ -4,9 +4,9 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*
* http://www.apache.org/licenses/LICENSE-2.0
*
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@ -32,7 +32,7 @@ import ghidra.util.SystemUtilities;
* that this will allow direct thread-safe access to the children without having to worry about
* {@link ConcurrentModificationException}s while iterating the children. Also, the assumption
* is that accessing the children will occur much more frequently than modifying the children.
* This should only be a problem if a direct descendent of GTreeNode creates its children by calling
* This should only be a problem if a direct descendant of GTreeNode creates its children by calling
* addNode many times. But in that case, the tree should be using Lazy or
* SlowLoading nodes which always load into another list first and all the children will be set
* on a node in a single operation.

View File

@ -4,9 +4,9 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*
* http://www.apache.org/licenses/LICENSE-2.0
*
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@ -223,7 +223,7 @@ public interface FileSystem {
* @param newParentPath path to where the folder is to be moved.
* @throws FileNotFoundException if the moved folder does not exist.
* @throws DuplicateFileException if folder with the same name exists within the new parent folder
* @throws FileInUseException if any file within this folder or its decendents are in-use or checked-out
* @throws FileInUseException if any file within this folder or its descendants are in-use or checked-out
* @throws IOException if an IO error occurs.
* @throws InvalidNameException if the new FolderPath contains an illegal file name.
* @throws IllegalArgumentException if new Parent is invalid.
@ -238,7 +238,7 @@ public interface FileSystem {
* @param newFolderName the name the folder to be renamed to.
* @throws FileNotFoundException if the folder to be renamed does not exist.
* @throws DuplicateFileException if folder with the new name already exists.
* @throws FileInUseException if any file within this folder or its decendents are in-use or checked-out
* @throws FileInUseException if any file within this folder or its descendants are in-use or checked-out
* @throws IOException if an IO error occurs.
* @throws InvalidNameException if the new FolderName contains an illegal file name.
*/

View File

@ -4,9 +4,9 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*
* http://www.apache.org/licenses/LICENSE-2.0
*
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@ -133,7 +133,7 @@ public class ProjectDataPasteAction extends ProjectDataCopyCutBaseAction {
return;
}
boolean listChanged = removeDecendantsFromList(list);
boolean listChanged = removeDescendantsFromList(list);
boolean resetClipboard = false;
StringBuffer sb = new StringBuffer();
@ -188,7 +188,7 @@ public class ProjectDataPasteAction extends ProjectDataCopyCutBaseAction {
* Remove descendant nodes from the list; having the parent node
* is enough when folders are getting pasted.
*/
private boolean removeDecendantsFromList(List<GTreeNode> list) {
private boolean removeDescendantsFromList(List<GTreeNode> list) {
List<GTreeNode> newList = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
GTreeNode destNode = list.get(i);

View File

@ -4,9 +4,9 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*
* http://www.apache.org/licenses/LICENSE-2.0
*
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@ -107,7 +107,7 @@ public class DecisionNode {
(startbit + bitsize - 1) + "), value=0x" + Integer.toHexString(val) + ", context=");
debug.append(walker.getParserContext().getContextBytes(), startbit, bitsize);
debug.append("\n");
debugDumpDecendentConstructors(debug, children[val]);
debugDumpDescendantConstructors(debug, children[val]);
}
private void debugInstructionBitsDecision(SleighDebugLogger debug, ParserWalker walker,
@ -135,15 +135,15 @@ public class DecisionNode {
(startbit + bitsize - 1) + "), value=0x" + Integer.toHexString(val) + ", bytes=");
debug.append(bytes, (offset * 8) + startbit, bitsize);
debug.append("\n");
debugDumpDecendentConstructors(debug, children[val]);
debugDumpDescendantConstructors(debug, children[val]);
}
private void debugDumpDecendentConstructors(SleighDebugLogger debug, DecisionNode child) {
private void debugDumpDescendantConstructors(SleighDebugLogger debug, DecisionNode child) {
debug.indent();
debug.append(
"decendent constructors for decision node (complete tree dump ordered by line number):\n");
"descendant constructors for decision node (complete tree dump ordered by line number):\n");
List<Constructor> clist = new ArrayList<>();
child.dumpDecendentConstructors(clist);
child.dumpDescendantConstructors(clist);
for (Constructor c : clist) {
debug.dumpConstructor(null, c);
}
@ -158,7 +158,7 @@ public class DecisionNode {
}
};
private void dumpDecendentConstructors(List<Constructor> clist) {
private void dumpDescendantConstructors(List<Constructor> clist) {
if (bitsize == 0) { // The node is terminal
for (Constructor c : constructlist) {
int index = Collections.binarySearch(clist, c, debugInstructionComparator);
@ -171,7 +171,7 @@ public class DecisionNode {
}
else {
for (DecisionNode child : children) {
child.dumpDecendentConstructors(clist);
child.dumpDescendantConstructors(clist);
}
}
}

View File

@ -4,9 +4,9 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*
* http://www.apache.org/licenses/LICENSE-2.0
*
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@ -522,9 +522,9 @@ class ModuleManager {
}
/**
* Perform recursive check to determine if specified id is a child or decendant
* Perform recursive check to determine if specified id is a child or descendant
* of the specified module.
* @param id descendent child id (positive for module, negative for fragment)
* @param id descendant child id (positive for module, negative for fragment)
* @param moduleID module id (positive)
* @return true if specified id is a descendant of moduleID.
* @throws IOException if database IO error occurs

View File

@ -4,9 +4,9 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*
* http://www.apache.org/licenses/LICENSE-2.0
*
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@ -110,7 +110,7 @@ public interface Namespace {
* this namespace.
* @throws DuplicateNameException if another symbol exists in the parent namespace with
* the same name as this namespace
* @throws CircularDependencyException if the parent namespace is a descendent of this
* @throws CircularDependencyException if the parent namespace is a descendant of this
* namespace.
*/
public void setParentNamespace(Namespace parentNamespace)

View File

@ -4,9 +4,9 @@
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*
* http://www.apache.org/licenses/LICENSE-2.0
*
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@ -152,7 +152,7 @@ public class GroupPath implements Serializable {
}
/**
* Return true if the indicated group path is a descendent of this group path.
* Return true if the indicated group path is a descendant of this group path.
* @param grpPath the group path
*/
public boolean isDescendant(GroupPath grpPath) {