lallemand created CAY-2880:
------------------------------

             Summary: Unable to Set Name for Child Nodes in PrefetchTreeNode
                 Key: CAY-2880
                 URL: https://issues.apache.org/jira/browse/CAY-2880
             Project: Cayenne
          Issue Type: Bug
          Components: Core Library
    Affects Versions: 4.2.1
            Reporter: lallemand
             Fix For: 4.2.2


*Description:*

It is currently impossible to use child nodes for {{PrefetchTreeNode}} because 
the {{name}} variable cannot be set. This leads to an error when calling 
{{{}addChild(){}}}, making the intended functionality unusable.

*Affected Code:*
{code:java}
PrefetchTreeNode prefetchTreeNode = new PrefetchTreeNode();

// Prefetch 1
PrefetchTreeNode childPrefetchTreeNode = new PrefetchTreeNode();
childPrefetchTreeNode.addPath("example.test");
childPrefetchTreeNode.setSemantics(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
prefetchTreeNode.addChild(childPrefetchTreeNode);
// Prefetch 2
childPrefetchTreeNode = new PrefetchTreeNode();
childPrefetchTreeNode.addPath("example.test2");
childPrefetchTreeNode.setSemantics(PrefetchTreeNode.DISJOINT_PREFETCH_SEMANTICS);
prefetchTreeNode.addChild(childPrefetchTreeNode);

query.prefetch(prefetchTreeNode);

ObjectContext context = BaseContext.getThreadObjectContext();
List<?> items = context.performQuery(query); {code}
*Cayenne* {{*addChild*}} *Function:*
{code:java}
public void addChild(PrefetchTreeNode child) {
    if (Util.isEmptyString(child.getName())) {
        throw new IllegalArgumentException("Child has no segmentPath: " + 
child);
    } else {
        if (child.getParent() != this) {
            child.getParent().removeChild(child.getName());
            child.parent = this;
        }

        if (this.children == null) {
            this.children = new ArrayList(4);
        }

        this.children.add(child);
    }
} {code}
*Issue:*

The {{addChild}} function requires the child node to have a name. However:
 * The {{PrefetchTreeNode}} constructor that accepts a {{name}} is protected.

 * The {{name}} variable itself is protected and cannot be accessed externally.

 * There is no public setter method for {{{}name{}}}.

As a result, it is impossible to set the name of a child node, making the 
{{addChild()}} method non-functional for child nodes.

*Workaround:*

None available at this time.

*Suggested Fix:*
 * Provide a public constructor that allows setting the {{{}name{}}}.

 * Alternatively, add a public setter method for {{name}} to enable proper 
initialization of child nodes.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to