This is an automated email from the ASF dual-hosted git repository. asf-gitbox-commits pushed a commit to branch past-M2 in repository https://gitbox.apache.org/repos/asf/cayenne.git
commit d40e32258db2986022c7f2a89c95134a960724f9 Author: Andrus Adamchik <[email protected]> AuthorDate: Sun Jun 7 12:05:55 2026 -0400 DataChanne.getParent() replacing DataDomainQuery (gross overengineering) with direct parent lookup --- .../main/java/org/apache/cayenne/DataChannel.java | 8 ++ .../java/org/apache/cayenne/ObjectContext.java | 9 +- .../org/apache/cayenne/access/DataContext.java | 38 ++--- .../cayenne/access/DataContextMergeHandler.java | 6 +- .../java/org/apache/cayenne/access/DataDomain.java | 10 ++ .../org/apache/cayenne/access/DataDomainQuery.java | 157 --------------------- .../cayenne/access/DataDomainQueryAction.java | 13 +- .../org/apache/cayenne/access/ObjectStore.java | 8 +- .../flush/operation/GraphBasedDbRowOpSorter.java | 2 +- .../cayenne/ashwood/AshwoodEntitySorter.java | 2 +- .../apache/cayenne/commitlog/CommitLogFilter.java | 2 +- .../org/apache/cayenne/graph/ChildDiffLoader.java | 2 +- .../org/apache/cayenne/tx/TransactionFilter.java | 2 +- .../cayenne/util/ObjectContextQueryAction.java | 4 +- .../org/apache/cayenne/util/RelationshipFault.java | 2 +- .../java/org/apache/cayenne/MockDataChannel.java | 4 + .../access/DataContextDecoratedStackIT.java | 2 +- .../apache/cayenne/runtime/CayenneRuntimeTest.java | 4 + 18 files changed, 65 insertions(+), 210 deletions(-) diff --git a/cayenne/src/main/java/org/apache/cayenne/DataChannel.java b/cayenne/src/main/java/org/apache/cayenne/DataChannel.java index 0157be276..d244ad20c 100644 --- a/cayenne/src/main/java/org/apache/cayenne/DataChannel.java +++ b/cayenne/src/main/java/org/apache/cayenne/DataChannel.java @@ -77,6 +77,14 @@ public interface DataChannel { */ EntityResolver getEntityResolver(); + /** + * Returns the parent channel of this channel in the DataChannel stack, or null if this is a + * root channel (such as a {@link org.apache.cayenne.access.DataDomain}). + * + * @since 5.0 + */ + DataChannel getParent(); + /** * Executes a query, using provided <em>context</em> to register persistent objects if * query returns any objects. diff --git a/cayenne/src/main/java/org/apache/cayenne/ObjectContext.java b/cayenne/src/main/java/org/apache/cayenne/ObjectContext.java index cc9d45c6d..c5aa5a672 100644 --- a/cayenne/src/main/java/org/apache/cayenne/ObjectContext.java +++ b/cayenne/src/main/java/org/apache/cayenne/ObjectContext.java @@ -260,9 +260,14 @@ public interface ObjectContext extends DataChannel, Serializable { GraphManager getGraphManager(); /** - * Returns an DataChannel used by this context. + * Returns a DataChannel used by this context. + * + * @deprecated since 5.0 in favor of {@link DataChannel#getParent()} */ - DataChannel getChannel(); + @Deprecated(since = "5.0") + default DataChannel getChannel() { + return getParent(); + } /** * Returns <code>true</code> if there are any modified, deleted or new diff --git a/cayenne/src/main/java/org/apache/cayenne/access/DataContext.java b/cayenne/src/main/java/org/apache/cayenne/access/DataContext.java index 8b485ee2b..9d110dd5d 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/DataContext.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/DataContext.java @@ -269,7 +269,7 @@ public class DataContext implements ObjectContext { } @Override - public DataChannel getChannel() { + public DataChannel getParent() { attachToRuntimeIfNeeded(); return channel; } @@ -298,29 +298,21 @@ public class DataContext implements ObjectContext { /** - * Returns a DataDomain used by this DataContext. DataDomain is looked up in - * the DataChannel hierarchy. If a channel is not a DataDomain or a - * DataContext, null is returned. + * Returns a DataDomain used by this DataContext. DataDomain is looked up in the DataChannel hierarchy. If the final + * channel is not a DataDomain, null is returned. * - * @return DataDomain that is a direct or indirect parent of this - * DataContext in the DataChannel hierarchy. + * @return DataDomain that is a direct or indirect parent of this DataContext in the DataChannel hierarchy. * @since 1.1 */ public DataDomain getParentDataDomain() { attachToRuntimeIfNeeded(); - if (channel == null) { - return null; - } - - if (channel instanceof DataDomain dataDomain) { - return dataDomain; - } - - List<?> response = channel.onQuery(this, new DataDomainQuery()).firstList(); - - if (response != null && !response.isEmpty() && response.getFirst() instanceof DataDomain dataDomain) { - return dataDomain; + DataChannel c = channel; + while (c != null) { + if (c instanceof DataDomain dataDomain) { + return dataDomain; + } + c = c.getParent(); } return null; @@ -618,7 +610,7 @@ public class DataContext implements ObjectContext { } private List <?> objectsFromDataRowsFromParentContext(ClassDescriptor descriptor, List<? extends DataRow> dataRows) { - return getChannel().onQuery(this, new ObjectsFromDataRowsQuery(descriptor, dataRows)).firstList(); + return getParent().onQuery(this, new ObjectsFromDataRowsQuery(descriptor, dataRows)).firstList(); } /** @@ -824,7 +816,7 @@ public class DataContext implements ObjectContext { */ GraphDiff flushToParent(boolean cascade) { - if (this.getChannel() == null) { + if (this.getParent() == null) { throw new CayenneRuntimeException("Cannot commit changes - channel is not set."); } @@ -845,7 +837,7 @@ public class DataContext implements ObjectContext { } else { try { - parentChanges = getChannel().onSync(this, changes, syncType); + parentChanges = getParent().onSync(this, changes, syncType); // note that this is a hack resulting from a fix to CAY-766... // To support valid object state in PostPersist callback, @@ -882,7 +874,7 @@ public class DataContext implements ObjectContext { // this event is caught by child DataContexts to update temporary ObjectIds with permanent if (!diff.isNoop()) { - fireDataChannelCommitted(getChannel(), diff); + fireDataChannelCommitted(getParent(), diff); } return diff; @@ -992,7 +984,7 @@ public class DataContext implements ObjectContext { return new GenericResponse(); } - if (this.getChannel() == null) { + if (this.getParent() == null) { throw new CayenneRuntimeException("Can't run query - parent DataChannel is not set."); } diff --git a/cayenne/src/main/java/org/apache/cayenne/access/DataContextMergeHandler.java b/cayenne/src/main/java/org/apache/cayenne/access/DataContextMergeHandler.java index e87daa2fa..5c37d3527 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/DataContextMergeHandler.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/DataContextMergeHandler.java @@ -65,11 +65,11 @@ class DataContextMergeHandler implements GraphChangeHandler, DataChannelListener // this effectively filters out all events that are not coming from peers or // grandparents... - return e.getSource() == context.getChannel() + return e.getSource() == context.getParent() && e.getPostedBy() != context - && e.getPostedBy() != context.getChannel(); + && e.getPostedBy() != context.getParent(); - // the first condition (e.getSource() == context.getChannel()) is actually always + // the first condition (e.getSource() == context.getParent()) is actually always // 'true' because of how the listener is registered. Still keep it here as an // extra safegurad } diff --git a/cayenne/src/main/java/org/apache/cayenne/access/DataDomain.java b/cayenne/src/main/java/org/apache/cayenne/access/DataDomain.java index e4d33513a..e4774de8f 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/DataDomain.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/DataDomain.java @@ -527,6 +527,16 @@ public class DataDomain implements DataChannel { } } + /** + * Returns null, as DataDomain is the root of the DataChannel stack. + * + * @since 5.0 + */ + @Override + public DataChannel getParent() { + return null; + } + /** * Runs query returning generic QueryResponse. * diff --git a/cayenne/src/main/java/org/apache/cayenne/access/DataDomainQuery.java b/cayenne/src/main/java/org/apache/cayenne/access/DataDomainQuery.java deleted file mode 100644 index 5f64410a7..000000000 --- a/cayenne/src/main/java/org/apache/cayenne/access/DataDomainQuery.java +++ /dev/null @@ -1,157 +0,0 @@ -/***************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you 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 - * - * https://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. See the License for the - * specific language governing permissions and limitations - * under the License. - ****************************************************************/ -package org.apache.cayenne.access; - -import java.util.List; -import java.util.Map; - -import org.apache.cayenne.map.DataMap; -import org.apache.cayenne.map.DbEntity; -import org.apache.cayenne.map.EntityResolver; -import org.apache.cayenne.map.ObjEntity; -import org.apache.cayenne.map.Procedure; -import org.apache.cayenne.query.PrefetchTreeNode; -import org.apache.cayenne.query.Query; -import org.apache.cayenne.query.QueryCacheStrategy; -import org.apache.cayenne.query.QueryMetadata; -import org.apache.cayenne.query.QueryRouter; -import org.apache.cayenne.query.SQLAction; -import org.apache.cayenne.query.SQLActionVisitor; -import org.apache.cayenne.reflect.ClassDescriptor; - -/** - * A query that allows DataContext to retrieve parent DataDomain through a chain of - * decorator DataChannels. - * - * @since 3.0 - */ -class DataDomainQuery implements Query, QueryMetadata { - - public SQLAction createSQLAction(SQLActionVisitor visitor) { - throw new UnsupportedOperationException("Not an executable query."); - } - - public QueryMetadata getMetaData(EntityResolver resolver) { - return this; - } - - public List<Object> getResultSetMapping() { - return null; - } - - /** - * @since 4.0 - */ - @Override - public boolean isSingleResultSetMapping() { - return false; - } - - /** - * @since 4.0 - */ - public Query getOriginatingQuery() { - return null; - } - - public void route(QueryRouter router, EntityResolver resolver, Query substitutedQuery) { - } - - /** - * @since 4.0 - */ - public String getCacheGroup() { - return null; - } - - public String getCacheKey() { - return null; - } - - public Map<String, String> getPathSplitAliases() { - return null; - } - - public QueryCacheStrategy getCacheStrategy() { - return null; - } - - public DataMap getDataMap() { - return null; - } - - public DbEntity getDbEntity() { - return null; - } - - public int getFetchLimit() { - return 0; - } - - public int getFetchOffset() { - return 0; - } - - public ObjEntity getObjEntity() { - return null; - } - - public ClassDescriptor getClassDescriptor() { - return null; - } - - public int getPageSize() { - return 0; - } - - public PrefetchTreeNode getPrefetchTree() { - return null; - } - - public Procedure getProcedure() { - return null; - } - - public boolean isFetchingDataRows() { - // must return true, otherwise the stack will attempt Persistent conversion - return true; - } - - public boolean isRefreshingObjects() { - return false; - } - - public boolean isResolvingInherited() { - return false; - } - - public int getStatementFetchSize() { - return 0; - } - - @Override - public int getQueryTimeout() { - return QueryMetadata.QUERY_TIMEOUT_DEFAULT; - } - - @Override - public boolean isSuppressingDistinct() { - return false; - } -} diff --git a/cayenne/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java b/cayenne/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java index ed842df51..a9a0826b2 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java @@ -137,9 +137,7 @@ class DataDomainQueryAction implements QueryRouter, OperationObserver { if (interceptRelationshipQuery() != DONE) { if (interceptRefreshQuery() != DONE) { if (interceptSharedCache() != DONE) { - if (interceptDataDomainQuery() != DONE) { - runQueryInTransaction(); - } + runQueryInTransaction(); } } } @@ -200,15 +198,6 @@ class DataDomainQueryAction implements QueryRouter, OperationObserver { } } - private boolean interceptDataDomainQuery() { - if (query instanceof DataDomainQuery) { - response = new ListResponse(domain); - return DONE; - } - - return !DONE; - } - private boolean interceptOIDQuery() { if (query instanceof ObjectIdQuery oidQuery) { diff --git a/cayenne/src/main/java/org/apache/cayenne/access/ObjectStore.java b/cayenne/src/main/java/org/apache/cayenne/access/ObjectStore.java index 955036dc8..a9e57b84c 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/ObjectStore.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/ObjectStore.java @@ -448,9 +448,9 @@ public class ObjectStore implements Serializable, SnapshotEventListener, GraphMa */ public DataRow getCachedSnapshot(ObjectId oid) { - if (context != null && context.getChannel() != null) { + if (context != null && context.getParent() != null) { ObjectIdQuery query = new CachedSnapshotQuery(oid); - List<?> results = context.getChannel().onQuery(context, query).firstList(); + List<?> results = context.getParent().onQuery(context, query).firstList(); return results.isEmpty() ? null : (DataRow) results.get(0); } else { @@ -468,9 +468,9 @@ public class ObjectStore implements Serializable, SnapshotEventListener, GraphMa */ public synchronized DataRow getSnapshot(ObjectId oid) { - if (context != null && context.getChannel() != null) { + if (context != null && context.getParent() != null) { ObjectIdQuery query = new ObjectIdQuery(oid, true, ObjectIdQuery.CACHE); - List<?> results = context.getChannel().onQuery(context, query).firstList(); + List<?> results = context.getParent().onQuery(context, query).firstList(); return results.isEmpty() ? null : (DataRow) results.get(0); } else { diff --git a/cayenne/src/main/java/org/apache/cayenne/access/flush/operation/GraphBasedDbRowOpSorter.java b/cayenne/src/main/java/org/apache/cayenne/access/flush/operation/GraphBasedDbRowOpSorter.java index 19037bef7..42c910677 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/flush/operation/GraphBasedDbRowOpSorter.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/flush/operation/GraphBasedDbRowOpSorter.java @@ -272,7 +272,7 @@ public class GraphBasedDbRowOpSorter implements DbRowOpSorter { private Map<String, Object> getCachedSnapshot(Persistent object) { ObjectIdQuery query = new ObjectIdQuery(object.getObjectId(), true, ObjectIdQuery.CACHE); - QueryResponse response = object.getObjectContext().getChannel().onQuery(null, query); + QueryResponse response = object.getObjectContext().getParent().onQuery(null, query); @SuppressWarnings("unchecked") List<DataRow> result = (List<DataRow>) response.firstList(); if (result == null || result.isEmpty()) { diff --git a/cayenne/src/main/java/org/apache/cayenne/ashwood/AshwoodEntitySorter.java b/cayenne/src/main/java/org/apache/cayenne/ashwood/AshwoodEntitySorter.java index 7a1ba2674..942f39b0a 100644 --- a/cayenne/src/main/java/org/apache/cayenne/ashwood/AshwoodEntitySorter.java +++ b/cayenne/src/main/java/org/apache/cayenne/ashwood/AshwoodEntitySorter.java @@ -319,7 +319,7 @@ public class AshwoodEntitySorter implements EntitySorter { } ObjectIdQuery query = new ObjectIdQuery(object.getObjectId(), true, ObjectIdQuery.CACHE); - QueryResponse response = context.getChannel().onQuery(null, query); + QueryResponse response = context.getParent().onQuery(null, query); List<?> result = response.firstList(); if (result == null || result.size() == 0) { return null; diff --git a/cayenne/src/main/java/org/apache/cayenne/commitlog/CommitLogFilter.java b/cayenne/src/main/java/org/apache/cayenne/commitlog/CommitLogFilter.java index 706ea2fe1..758cb4495 100644 --- a/cayenne/src/main/java/org/apache/cayenne/commitlog/CommitLogFilter.java +++ b/cayenne/src/main/java/org/apache/cayenne/commitlog/CommitLogFilter.java @@ -67,7 +67,7 @@ public class CommitLogFilter implements DataChannelSyncFilter { // passing DataDomain, not ObjectContext to speed things up // and avoid capturing changed state when fetching snapshots - DataChannel channel = originatingContext.getChannel(); + DataChannel channel = originatingContext.getParent(); beforeCommit(changes, channel, beforeDiff); GraphDiff afterDiff = filterChain.onSync(originatingContext, beforeDiff, syncType); diff --git a/cayenne/src/main/java/org/apache/cayenne/graph/ChildDiffLoader.java b/cayenne/src/main/java/org/apache/cayenne/graph/ChildDiffLoader.java index 790b51c99..a2f4bca35 100644 --- a/cayenne/src/main/java/org/apache/cayenne/graph/ChildDiffLoader.java +++ b/cayenne/src/main/java/org/apache/cayenne/graph/ChildDiffLoader.java @@ -276,7 +276,7 @@ public class ChildDiffLoader implements GraphChangeHandler { // skip context cache lookup, go directly to its channel Query query = new ObjectIdQuery((ObjectId) nodeId); - QueryResponse response = context.getChannel().onQuery(context, query); + QueryResponse response = context.getParent().onQuery(context, query); List<?> objects = response.firstList(); if (objects.size() == 0) { diff --git a/cayenne/src/main/java/org/apache/cayenne/tx/TransactionFilter.java b/cayenne/src/main/java/org/apache/cayenne/tx/TransactionFilter.java index c8cd17c60..8e28ca212 100644 --- a/cayenne/src/main/java/org/apache/cayenne/tx/TransactionFilter.java +++ b/cayenne/src/main/java/org/apache/cayenne/tx/TransactionFilter.java @@ -41,7 +41,7 @@ public class TransactionFilter implements DataChannelSyncFilter { @Override public GraphDiff onSync(ObjectContext originatingContext, GraphDiff changes, int syncType, DataChannelSyncFilterChain filterChain) { DataChannelSyncCallbackAction callbackAction = DataChannelSyncCallbackAction.getCallbackAction( - originatingContext.getChannel().getEntityResolver().getCallbackRegistry(), + originatingContext.getParent().getEntityResolver().getCallbackRegistry(), originatingContext.getGraphManager(), changes, syncType diff --git a/cayenne/src/main/java/org/apache/cayenne/util/ObjectContextQueryAction.java b/cayenne/src/main/java/org/apache/cayenne/util/ObjectContextQueryAction.java index 0efab27c0..05cbed1d1 100644 --- a/cayenne/src/main/java/org/apache/cayenne/util/ObjectContextQueryAction.java +++ b/cayenne/src/main/java/org/apache/cayenne/util/ObjectContextQueryAction.java @@ -321,7 +321,7 @@ public abstract class ObjectContextQueryAction { * nested contexts). */ if (((Persistent) object).getPersistenceState() == PersistenceState.NEW - && !(actingContext.getChannel() instanceof ObjectContext)) { + && !(actingContext.getParent() instanceof ObjectContext)) { this.response = new ListResponse(); return DONE; } @@ -411,6 +411,6 @@ public abstract class ObjectContextQueryAction { * Fetches data from the channel. */ protected void runQuery() { - this.response = actingContext.getChannel().onQuery(actingContext, query); + this.response = actingContext.getParent().onQuery(actingContext, query); } } diff --git a/cayenne/src/main/java/org/apache/cayenne/util/RelationshipFault.java b/cayenne/src/main/java/org/apache/cayenne/util/RelationshipFault.java index cc5ce408f..0ab58de8b 100644 --- a/cayenne/src/main/java/org/apache/cayenne/util/RelationshipFault.java +++ b/cayenne/src/main/java/org/apache/cayenne/util/RelationshipFault.java @@ -92,7 +92,7 @@ public abstract class RelationshipFault<E> { * Doing that to refresh query (see CAY-2509) while resolving RelationshipFault. * Refreshing query is used only for parent contexts. */ - boolean refresh = relationshipOwner.getObjectContext().getChannel() instanceof DataDomain; + boolean refresh = relationshipOwner.getObjectContext().getParent() instanceof DataDomain; List<E> resolved = relationshipOwner.getObjectContext().performQuery( new RelationshipQuery(relationshipOwner.getObjectId(), relationshipName, refresh)); diff --git a/cayenne/src/test/java/org/apache/cayenne/MockDataChannel.java b/cayenne/src/test/java/org/apache/cayenne/MockDataChannel.java index 0319d9af0..d41be474c 100644 --- a/cayenne/src/test/java/org/apache/cayenne/MockDataChannel.java +++ b/cayenne/src/test/java/org/apache/cayenne/MockDataChannel.java @@ -72,6 +72,10 @@ public class MockDataChannel implements DataChannel { return null; } + public DataChannel getParent() { + return null; + } + public void reset() { requestObjects.clear(); } diff --git a/cayenne/src/test/java/org/apache/cayenne/access/DataContextDecoratedStackIT.java b/cayenne/src/test/java/org/apache/cayenne/access/DataContextDecoratedStackIT.java index bf4d33543..9fad357c0 100644 --- a/cayenne/src/test/java/org/apache/cayenne/access/DataContextDecoratedStackIT.java +++ b/cayenne/src/test/java/org/apache/cayenne/access/DataContextDecoratedStackIT.java @@ -111,7 +111,7 @@ public class DataContextDecoratedStackIT { return channel.onSync(originatingContext, changes, syncType); } - public DataChannel getChannel() { + public DataChannel getParent() { return channel; } diff --git a/cayenne/src/test/java/org/apache/cayenne/runtime/CayenneRuntimeTest.java b/cayenne/src/test/java/org/apache/cayenne/runtime/CayenneRuntimeTest.java index 327b1e4b8..d324f11bb 100644 --- a/cayenne/src/test/java/org/apache/cayenne/runtime/CayenneRuntimeTest.java +++ b/cayenne/src/test/java/org/apache/cayenne/runtime/CayenneRuntimeTest.java @@ -104,6 +104,10 @@ public class CayenneRuntimeTest { return null; } + public DataChannel getParent() { + return null; + } + public QueryResponse onQuery(ObjectContext originatingContext, Query query) { return null; }
