You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2017/03/21 15:01:58 UTC

cayenne git commit: CAY-2268 DI: Refactor ListBuilder API ambiguities for before() / after() bindings

Repository: cayenne
Updated Branches:
  refs/heads/master 7901698c9 -> 9cc58c63f


CAY-2268 DI: Refactor ListBuilder API ambiguities for before() / after() bindings


Project: http://git-wip-us.apache.org/repos/asf/cayenne/repo
Commit: http://git-wip-us.apache.org/repos/asf/cayenne/commit/9cc58c63
Tree: http://git-wip-us.apache.org/repos/asf/cayenne/tree/9cc58c63
Diff: http://git-wip-us.apache.org/repos/asf/cayenne/diff/9cc58c63

Branch: refs/heads/master
Commit: 9cc58c63fd1243d982dac4f00ac0270ba3b9efce
Parents: 7901698
Author: Nikita Timofeev <st...@gmail.com>
Authored: Tue Mar 21 16:14:57 2017 +0300
Committer: Nikita Timofeev <st...@gmail.com>
Committed: Tue Mar 21 16:14:57 2017 +0300

----------------------------------------------------------------------
 .../java/org/apache/cayenne/di/ListBuilder.java |  31 +++++-
 .../apache/cayenne/di/UnorderedListBuilder.java |  42 --------
 .../cayenne/di/spi/DefaultListBuilder.java      | 103 ++++++++++++-------
 .../org/apache/cayenne/di/spi/ListProvider.java |  43 ++++----
 .../di/spi/DefaultInjectorInjectionTest.java    |  63 +++++++-----
 .../cache/CacheInvalidationModuleBuilder.java   |   2 +-
 .../postcommit/PostCommitModuleBuilder.java     |   4 +-
 docs/doc/src/main/resources/RELEASE-NOTES.txt   |   1 +
 docs/doc/src/main/resources/UPGRADE.txt         |   4 +
 9 files changed, 154 insertions(+), 139 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cayenne/blob/9cc58c63/cayenne-di/src/main/java/org/apache/cayenne/di/ListBuilder.java
----------------------------------------------------------------------
diff --git a/cayenne-di/src/main/java/org/apache/cayenne/di/ListBuilder.java b/cayenne-di/src/main/java/org/apache/cayenne/di/ListBuilder.java
index 4088d4c..aaa90ee 100644
--- a/cayenne-di/src/main/java/org/apache/cayenne/di/ListBuilder.java
+++ b/cayenne-di/src/main/java/org/apache/cayenne/di/ListBuilder.java
@@ -16,34 +16,55 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
+
 package org.apache.cayenne.di;
 
+import java.util.Collection;
+
 /**
  * A binding builder for list configurations.
  * 
  * @param <T> A type of list values.
  * @since 3.1
  */
-public interface ListBuilder<T> extends UnorderedListBuilder<T> {
+public interface ListBuilder<T> {
+
+    ListBuilder<T> add(Class<? extends T> interfaceType) throws DIRuntimeException;
+
+    ListBuilder<T> add(T value) throws DIRuntimeException;
+
+    ListBuilder<T> addAll(Collection<T> values) throws DIRuntimeException;
+
+    /**
+     * @since 4.0
+     */
+    ListBuilder<T> addAfter(Class<? extends T> interfaceType, Class<? extends T> afterType) throws DIRuntimeException;
 
     /**
      * @since 4.0
      */
-    UnorderedListBuilder<T> after(Class<? extends T> type);
+    ListBuilder<T> addAfter(T value, Class<? extends T> afterType) throws DIRuntimeException;
 
     /**
      * @since 4.0
      */
-    UnorderedListBuilder<T> after(Key<? extends T> key);
+    ListBuilder<T> addAllAfter(Collection<T> values, Class<? extends T> afterType) throws DIRuntimeException;
 
     /**
      * @since 4.0
      */
-    UnorderedListBuilder<T> before(Class<? extends T> type);
+    ListBuilder<T> insertBefore(Class<? extends T> interfaceType, Class<? extends T> beforeType) throws DIRuntimeException;
 
     /**
      * @since 4.0
      */
-    UnorderedListBuilder<T> before(Key<? extends T> key);
+    ListBuilder<T> insertBefore(T value, Class<? extends T> beforeType) throws DIRuntimeException;
+
+    /**
+     * @since 4.0
+     */
+    ListBuilder<T> insertAllBefore(Collection<T> values, Class<? extends T> afterType) throws DIRuntimeException;
+
+    void in(Scope scope);
 
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/9cc58c63/cayenne-di/src/main/java/org/apache/cayenne/di/UnorderedListBuilder.java
----------------------------------------------------------------------
diff --git a/cayenne-di/src/main/java/org/apache/cayenne/di/UnorderedListBuilder.java b/cayenne-di/src/main/java/org/apache/cayenne/di/UnorderedListBuilder.java
deleted file mode 100644
index 3287873..0000000
--- a/cayenne-di/src/main/java/org/apache/cayenne/di/UnorderedListBuilder.java
+++ /dev/null
@@ -1,42 +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
- *
- *    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.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.di;
-
-import java.util.Collection;
-
-/**
- * A binding builder for unordered list configurations.
- *
- * @param <T> A type of list values.
- * @since 4.0
- */
-public interface UnorderedListBuilder<T> {
-
-    ListBuilder<T> add(Class<? extends T> interfaceType) throws DIRuntimeException;
-
-    ListBuilder<T> add(T value) throws DIRuntimeException;
-
-    ListBuilder<T> add(Key<T> key, T object) throws DIRuntimeException;
-
-    ListBuilder<T> addAll(Collection<T> values) throws DIRuntimeException;
-
-    void in(Scope scope);
-
-}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/9cc58c63/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultListBuilder.java
----------------------------------------------------------------------
diff --git a/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultListBuilder.java b/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultListBuilder.java
index edf1b39..58549f2 100644
--- a/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultListBuilder.java
+++ b/cayenne-di/src/main/java/org/apache/cayenne/di/spi/DefaultListBuilder.java
@@ -23,7 +23,6 @@ import org.apache.cayenne.di.Key;
 import org.apache.cayenne.di.ListBuilder;
 import org.apache.cayenne.di.Provider;
 import org.apache.cayenne.di.Scope;
-import org.apache.cayenne.di.UnorderedListBuilder;
 
 import java.util.Collection;
 import java.util.LinkedHashMap;
@@ -50,77 +49,92 @@ class DefaultListBuilder<T> implements ListBuilder<T> {
     }
 
     @Override
-    public ListBuilder<T> add(Class<? extends T> interfaceType)
-            throws DIRuntimeException {
+    public ListBuilder<T> add(Class<? extends T> interfaceType) {
 
-        Key<? extends T> key = Key.get(interfaceType);
-        Binding<? extends T> binding = injector.getBinding(key);
+        Provider<? extends T> provider = getProvider(interfaceType);
+        getListProvider().add(Key.get(interfaceType), provider);
+        return this;
+    }
 
-        if (binding == null) {
-            return addWithBinding(interfaceType);
-        }
+    @Override
+    public ListBuilder<T> addAfter(Class<? extends T> interfaceType, Class<? extends T> afterType) {
 
-        getListProvider().add(key, binding.getScoped());
+        Provider<? extends T> provider = getProvider(interfaceType);
+        getListProvider().addAfter(Key.get(interfaceType), provider, Key.get(afterType));
         return this;
     }
 
-    <K extends T> ListBuilder<T> addWithBinding(Class<K> interfaceType) {
-        Key<K> key = Key.get(interfaceType);
-
-        Provider<K> provider0 = new ConstructorInjectingProvider<>(interfaceType, injector);
-        Provider<K> provider1 = new FieldInjectingProvider<>(provider0, injector);
-        injector.putBinding(key, provider1);
+    @Override
+    public ListBuilder<T> insertBefore(Class<? extends T> interfaceType, Class<? extends T> beforeType) {
 
-        getListProvider().add(key, injector.getProvider(key));
+        Provider<? extends T> provider = getProvider(interfaceType);
+        getListProvider().insertBefore(Key.get(interfaceType), provider, Key.get(beforeType));
         return this;
     }
 
     @SuppressWarnings("unchecked")
     @Override
-    public ListBuilder<T> add(T object) throws DIRuntimeException {
-
-        Provider<T> provider0 = new InstanceProvider<>(object);
-        Provider<T> provider1 = new FieldInjectingProvider<>(provider0, injector);
-
-        getListProvider().add(Key.get((Class<? extends T>)object.getClass(), String.valueOf(incrementer.getAndIncrement())), provider1);
+    public ListBuilder<T> add(T value) {
+        Key<? extends T> key = Key.get((Class<? extends T>)value.getClass(),
+                String.valueOf(incrementer.getAndIncrement()));
+        getListProvider().add(key, createProvider(value));
         return this;
     }
 
+    @SuppressWarnings("unchecked")
     @Override
-    public ListBuilder<T> add(Key<T> key, T object) throws DIRuntimeException {
-
-        Provider<T> provider0 = new InstanceProvider<>(object);
-        Provider<T> provider1 = new FieldInjectingProvider<>(provider0, injector);
-
-        getListProvider().add(key, provider1);
+    public ListBuilder<T> addAfter(T value, Class<? extends T> afterType) {
+        Key<? extends T> key = Key.get((Class<? extends T>)value.getClass(),
+                String.valueOf(incrementer.getAndIncrement()));
+        getListProvider().addAfter(key, createProvider(value), Key.get(afterType));
         return this;
     }
 
+    @SuppressWarnings("unchecked")
     @Override
-    public UnorderedListBuilder<T> after(Class<? extends T> type) {
-        return after(Key.get(type));
+    public ListBuilder<T> insertBefore(T value, Class<? extends T> beforeType) {
+        Key<? extends T> key = Key.get((Class<? extends T>)value.getClass(),
+                String.valueOf(incrementer.getAndIncrement()));
+        getListProvider().insertBefore(key, createProvider(value), Key.get(beforeType));
+        return this;
     }
 
     @Override
-    public UnorderedListBuilder<T> after(Key<? extends T> key) {
-        getListProvider().after(key);
+    public ListBuilder<T> addAll(Collection<T> values) {
+        getListProvider().addAll(createProviderMap(values));
         return this;
     }
 
     @Override
-    public UnorderedListBuilder<T> before(Class<? extends T> type) {
-        return before(Key.get(type));
+    public ListBuilder<T> addAllAfter(Collection<T> values, Class<? extends T> afterType) {
+        getListProvider().addAllAfter(createProviderMap(values), Key.get(afterType));
+        return this;
     }
 
     @Override
-    public UnorderedListBuilder<T> before(Key<? extends T> key) {
-        getListProvider().before(key);
+    public ListBuilder<T> insertAllBefore(Collection<T> values, Class<? extends T> beforeType) {
+        getListProvider().insertAllBefore(createProviderMap(values), Key.get(beforeType));
         return this;
     }
 
-    @Override
-    public ListBuilder<T> addAll(Collection<T> objects) throws DIRuntimeException {
+    private Provider<? extends T> getProvider(Class<? extends T> interfaceType)
+            throws DIRuntimeException {
+
+        Key<? extends T> key = Key.get(interfaceType);
+        Binding<? extends T> binding = injector.getBinding(key);
+        if (binding == null) {
+            return addWithBinding(interfaceType);
+        }
+        return binding.getScoped();
+    }
+
+    @SuppressWarnings("unchecked")
+    private Provider<T> createProvider(T value) {
+        Provider<T> provider0 = new InstanceProvider<>(value);
+        return new FieldInjectingProvider<>(provider0, injector);
+    }
 
+    private Map<Key<? extends T>, Provider<? extends T>> createProviderMap(Collection<T> objects) {
         Map<Key<? extends T>, Provider<? extends T>> keyProviderMap = new LinkedHashMap<>();
         for (T object : objects) {
             Provider<T> provider0 = new InstanceProvider<>(object);
@@ -131,8 +145,17 @@ class DefaultListBuilder<T> implements ListBuilder<T> {
             keyProviderMap.put(Key.get(objectType, String.valueOf(incrementer.getAndIncrement())), provider1);
         }
 
-        getListProvider().addAll(keyProviderMap);
-        return this;
+        return keyProviderMap;
+    }
+
+    private <K extends T> Provider<? extends T> addWithBinding(Class<K> interfaceType) {
+        Key<K> key = Key.get(interfaceType);
+
+        Provider<K> provider0 = new ConstructorInjectingProvider<>(interfaceType, injector);
+        Provider<K> provider1 = new FieldInjectingProvider<>(provider0, injector);
+        injector.putBinding(key, provider1);
+
+        return injector.getProvider(key);
     }
 
     private ListProvider<T> getListProvider() {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/9cc58c63/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ListProvider.java
----------------------------------------------------------------------
diff --git a/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ListProvider.java b/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ListProvider.java
index 400b331..83297cc 100644
--- a/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ListProvider.java
+++ b/cayenne-di/src/main/java/org/apache/cayenne/di/spi/ListProvider.java
@@ -36,13 +36,10 @@ class ListProvider<T> implements Provider<List<T>> {
 
     private Map<Key<? extends T>, Provider<? extends T>> providers;
     private DIGraph<Key<? extends T>> graph;
-    private Key<? extends T> lastKey;
-    private Collection<Key<? extends T>> lastKeys;
 
     public ListProvider() {
         this.providers = new HashMap<>();
         this.graph = new DIGraph<>();
-        this.lastKeys = Collections.emptySet();
     }
 
     @Override
@@ -72,38 +69,34 @@ class ListProvider<T> implements Provider<List<T>> {
     void add(Key<? extends T> key, Provider<? extends T> provider) {
         providers.put(key, provider);
         graph.add(key);
-        lastKey = key;
-        lastKeys.clear();
+    }
+
+    void addAfter(Key<? extends T> key, Provider<? extends T> provider, Key<? extends T> after) {
+        providers.put(key, provider);
+        graph.add(key, after);
+    }
+
+    void insertBefore(Key<? extends T> key, Provider<? extends T> provider, Key<? extends T> before) {
+        providers.put(key, provider);
+        graph.add(before, key);
     }
 
     void addAll(Map<Key<? extends T>, Provider<? extends T>> keyProviderMap) {
         providers.putAll(keyProviderMap);
         graph.addAll(keyProviderMap.keySet());
-        lastKeys = keyProviderMap.keySet();
     }
 
-    void after(Key<? extends T> after) {
-        if (!lastKeys.isEmpty()) {
-            for (Key<? extends T> key : lastKeys) {
-                graph.add(key, after);
-            }
-
-            return;
+    void addAllAfter(Map<Key<? extends T>, Provider<? extends T>> keyProviderMap, Key<? extends T> after) {
+        providers.putAll(keyProviderMap);
+        for (Key<? extends T> key : keyProviderMap.keySet()) {
+            graph.add(key, after);
         }
-
-        graph.add(lastKey, after);
     }
 
-    void before(Key<? extends T> before) {
-        if (!lastKeys.isEmpty()) {
-            for (Key<? extends T> key: lastKeys) {
-                graph.add(before, key);
-            }
-
-            return;
+    void insertAllBefore(Map<Key<? extends T>, Provider<? extends T>> keyProviderMap, Key<? extends T> before) {
+        providers.putAll(keyProviderMap);
+        for (Key<? extends T> key : keyProviderMap.keySet()) {
+            graph.add(before, key);
         }
-
-        graph.add(before, lastKey);
     }
-
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/9cc58c63/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorInjectionTest.java
----------------------------------------------------------------------
diff --git a/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorInjectionTest.java b/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorInjectionTest.java
index 6f4966b..27411e3 100644
--- a/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorInjectionTest.java
+++ b/cayenne-di/src/test/java/org/apache/cayenne/di/spi/DefaultInjectorInjectionTest.java
@@ -20,18 +20,36 @@ package org.apache.cayenne.di.spi;
 
 import org.apache.cayenne.di.Binder;
 import org.apache.cayenne.di.Key;
-import org.apache.cayenne.di.ListBuilder;
 import org.apache.cayenne.di.Module;
-import org.apache.cayenne.di.mock.*;
+import org.apache.cayenne.di.mock.MockImplementation1;
+import org.apache.cayenne.di.mock.MockImplementation1Alt;
+import org.apache.cayenne.di.mock.MockImplementation1Alt2;
+import org.apache.cayenne.di.mock.MockImplementation1_ListConfiguration;
+import org.apache.cayenne.di.mock.MockImplementation1_ListConfigurationMock5;
+import org.apache.cayenne.di.mock.MockImplementation1_MapConfiguration;
+import org.apache.cayenne.di.mock.MockImplementation1_WithInjector;
+import org.apache.cayenne.di.mock.MockImplementation2;
+import org.apache.cayenne.di.mock.MockImplementation2Sub1;
+import org.apache.cayenne.di.mock.MockImplementation2_ConstructorProvider;
+import org.apache.cayenne.di.mock.MockImplementation2_ListConfiguration;
+import org.apache.cayenne.di.mock.MockImplementation2_Named;
+import org.apache.cayenne.di.mock.MockImplementation3;
+import org.apache.cayenne.di.mock.MockImplementation4;
+import org.apache.cayenne.di.mock.MockImplementation4Alt;
+import org.apache.cayenne.di.mock.MockImplementation4Alt2;
+import org.apache.cayenne.di.mock.MockImplementation5;
+import org.apache.cayenne.di.mock.MockInterface1;
+import org.apache.cayenne.di.mock.MockInterface2;
+import org.apache.cayenne.di.mock.MockInterface3;
+import org.apache.cayenne.di.mock.MockInterface4;
+import org.apache.cayenne.di.mock.MockInterface5;
 import org.junit.Test;
 
 import java.util.ArrayList;
 import java.util.Collection;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 
 public class DefaultInjectorInjectionTest {
@@ -267,14 +285,14 @@ public class DefaultInjectorInjectionTest {
                 binder.bind(MockInterface1.class).to(
                         MockImplementation1_ListConfiguration.class);
 
+                binder.bind(MockInterface5.class).to(MockImplementation5.class);
+
                 binder.bindList(Object.class, "xyz")
                         .add("1value")
                         .add("2value")
-                        .add(Key.get(Object.class, "5value"), "5value")
-                        .after(Key.get(Object.class, "4value"))
-                        .add("3value")
-                        .before(Key.get(Object.class, "4value"))
-                        .add(Key.get(Object.class, "4value"), "4value");
+                        .addAfter("5value", MockInterface5.class)
+                        .insertBefore("3value", MockInterface5.class)
+                        .add(MockInterface5.class);
             }
         };
 
@@ -282,7 +300,7 @@ public class DefaultInjectorInjectionTest {
 
         MockInterface1 service = injector.getInstance(MockInterface1.class);
         assertNotNull(service);
-        assertEquals(";1value;2value;3value;4value;5value", service.getName());
+        assertEquals(";1value;2value;3value;xyz;5value", service.getName());
     }
 
     @Test
@@ -302,13 +320,14 @@ public class DefaultInjectorInjectionTest {
                 secondList.add("6value");
                 secondList.add("7value");
                 secondList.add("8value");
+
+                binder.bind(MockInterface5.class).to(MockImplementation5.class);
+
                 binder.bindList(Object.class, "xyz")
-                        .add(Key.get(Object.class, "4value"), "4value")
-                        .addAll(firstList)
-                        .before(Key.get(Object.class, "4value"))
-                        .addAll(secondList)
-                        .after(Key.get(Object.class, "5value"))
-                        .add(Key.get(Object.class, "5value"), "5value");
+                        .insertAllBefore(firstList, MockInterface5.class)
+                        .addAllAfter(secondList, MockInterface5.class)
+                        .add("5value")
+                        .add(MockInterface5.class);
             }
         };
 
@@ -316,7 +335,7 @@ public class DefaultInjectorInjectionTest {
 
         MockInterface1 service = injector.getInstance(MockInterface1.class);
         assertNotNull(service);
-        assertEquals(";1value;2value;3value;4value;5value;6value;7value;8value", service.getName());
+        assertEquals(";1value;2value;3value;xyz;6value;7value;8value;5value", service.getName());
     }
 
     @Test
@@ -352,14 +371,10 @@ public class DefaultInjectorInjectionTest {
 
                 binder.bindList(Object.class, "xyz")
                         .add("1value")
-                        .add("5value")
-                        .before(MockInterface5.class)
+                        .insertBefore("5value", MockInterface5.class)
                         .add("2value")
-                        .add(Key.get(Object.class, "4value"), "4value")
-                        .add("6value")
-                        .after(MockInterface5.class)
+                        .addAfter("6value", MockInterface5.class)
                         .add("3value")
-                        .before(Key.get(Object.class, "4value"))
                         .add(MockInterface5.class);
             }
         };
@@ -368,7 +383,7 @@ public class DefaultInjectorInjectionTest {
 
         MockInterface1 service = injector.getInstance(MockInterface1.class);
         assertNotNull(service);
-        assertEquals(";1value;2value;3value;4value;5value;xyz;6value", service.getName());
+        assertEquals(";1value;2value;5value;xyz;6value;3value", service.getName());
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/cayenne/blob/9cc58c63/cayenne-lifecycle/src/main/java/org/apache/cayenne/lifecycle/cache/CacheInvalidationModuleBuilder.java
----------------------------------------------------------------------
diff --git a/cayenne-lifecycle/src/main/java/org/apache/cayenne/lifecycle/cache/CacheInvalidationModuleBuilder.java b/cayenne-lifecycle/src/main/java/org/apache/cayenne/lifecycle/cache/CacheInvalidationModuleBuilder.java
index 92d7993..7b3b6bb 100644
--- a/cayenne-lifecycle/src/main/java/org/apache/cayenne/lifecycle/cache/CacheInvalidationModuleBuilder.java
+++ b/cayenne-lifecycle/src/main/java/org/apache/cayenne/lifecycle/cache/CacheInvalidationModuleBuilder.java
@@ -89,7 +89,7 @@ public class CacheInvalidationModuleBuilder {
 
                 // want the filter to be INSIDE transaction
                 ServerModule.contributeDomainFilters(binder)
-                        .add(CacheInvalidationFilter.class).before(TransactionFilter.class);
+                        .insertBefore(CacheInvalidationFilter.class, TransactionFilter.class);
             }
         };
     }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/9cc58c63/cayenne-lifecycle/src/main/java/org/apache/cayenne/lifecycle/postcommit/PostCommitModuleBuilder.java
----------------------------------------------------------------------
diff --git a/cayenne-lifecycle/src/main/java/org/apache/cayenne/lifecycle/postcommit/PostCommitModuleBuilder.java b/cayenne-lifecycle/src/main/java/org/apache/cayenne/lifecycle/postcommit/PostCommitModuleBuilder.java
index 6158937..78efb63 100644
--- a/cayenne-lifecycle/src/main/java/org/apache/cayenne/lifecycle/postcommit/PostCommitModuleBuilder.java
+++ b/cayenne-lifecycle/src/main/java/org/apache/cayenne/lifecycle/postcommit/PostCommitModuleBuilder.java
@@ -134,9 +134,9 @@ public class PostCommitModuleBuilder {
 				binder.bind(PostCommitFilter.class).to(PostCommitFilter.class);
 
 				if (excludeFromTransaction) {
-					ServerModule.contributeDomainFilters(binder).add(PostCommitFilter.class).after(TransactionFilter.class);
+					ServerModule.contributeDomainFilters(binder).addAfter(PostCommitFilter.class, TransactionFilter.class);
 				} else {
-					ServerModule.contributeDomainFilters(binder).add(PostCommitFilter.class).before(TransactionFilter.class);
+					ServerModule.contributeDomainFilters(binder).insertBefore(PostCommitFilter.class, TransactionFilter.class);
 				}
 			}
 		};

http://git-wip-us.apache.org/repos/asf/cayenne/blob/9cc58c63/docs/doc/src/main/resources/RELEASE-NOTES.txt
----------------------------------------------------------------------
diff --git a/docs/doc/src/main/resources/RELEASE-NOTES.txt b/docs/doc/src/main/resources/RELEASE-NOTES.txt
index d658bae..197956b 100644
--- a/docs/doc/src/main/resources/RELEASE-NOTES.txt
+++ b/docs/doc/src/main/resources/RELEASE-NOTES.txt
@@ -19,6 +19,7 @@ CAY-2258 DI: type-safe binding of List and Map
 CAY-2266 Move EventBridge implementations into autoloadable modules
 CAY-2267 Contribute lifecycle events listeners via DI
 CAY-2259 QueryCache: support for referencing type-safe caches
+CAY-2268 DI: Refactor ListBuilder API ambiguities for before() / after() bindings
 CAY-2269 Add support for date/time components extraction in expression functions
 CAY-2270 Update function support in expression parser
 CAY-2271 ColumnSelect: support for prefetch and limit

http://git-wip-us.apache.org/repos/asf/cayenne/blob/9cc58c63/docs/doc/src/main/resources/UPGRADE.txt
----------------------------------------------------------------------
diff --git a/docs/doc/src/main/resources/UPGRADE.txt b/docs/doc/src/main/resources/UPGRADE.txt
index 06e90ed..ff68183 100644
--- a/docs/doc/src/main/resources/UPGRADE.txt
+++ b/docs/doc/src/main/resources/UPGRADE.txt
@@ -7,6 +7,10 @@ IMPORTANT: be sure to read all notes for the intermediate releases between your
 
 UPGRADING TO 4.0.M6
 
+* Per CAY-2268 DI methods for binding ordered lists, introduced in 4.0.M3 where changed:
+       - method after() replaced by explicit addAfter(), addAllAfter()
+       - method before() replaced by insertBefore(), insertAllBefore()
+
 * Per CAY-2258 Injection of List and Map are made type-safe, if you are using following methods:
         - bindMap(String bindingName)
         - bindList(String bindingName)