[ 
https://issues.apache.org/jira/browse/IGNITE-16056?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Vyacheslav Koptilin updated IGNITE-16056:
-----------------------------------------
    Description: 
Using polymorphic schema can lead to ClassCastException.
Let's consider the following configuration example:
{code:java}
    ConfigurationRegistry registry = new ConfigurationRegistry(
            List.of(ThirdRootConfiguration.KEY),
            Map.of(),
            new TestConfigurationStorage(LOCAL),
            List.of(),
            List.of(
                    First0PolymorphicConfigurationSchema.class,
                    First1PolymorphicConfigurationSchema.class));

    registry.start();

    registry.getConfiguration(ThirdRootConfiguration.KEY).change(c -> {
        c.changeEntity(entity -> {
            entity.create("new entity", upd -> {
                upd.changePolymorphicConfig(p -> {
                    p.create("key", polymorphicChange -> {
                        polymorphicChange.changeName("entity name");
                        
polymorphicChange.convert(First0PolymorphicChange.class).changeTest0(12);
                    });
                });
            });
        });
    }).get();

    registry.stop();
{code}

where polymorphic schemas are defined as follows:

{code:java}
    @ConfigurationRoot(rootName = "third")
    public static class ThirdRootConfigurationSchema {
        @NamedConfigValue
        public EntityConfigurationSchema entity;
    }

    @Config
    public static class EntityConfigurationSchema {
        @NamedConfigValue
        public FirstPolymorphicConfigurationSchema polymorphicConfig;
    }

    @PolymorphicConfig
    public static class FirstPolymorphicConfigurationSchema {
        /** Polymorphic type id field. */
        @PolymorphicId
        public String typeId;

        @Value
        public String name;
    }

    @PolymorphicConfigInstance("first0")
    public static class First0PolymorphicConfigurationSchema extends 
FirstPolymorphicConfigurationSchema {
        @Value
        public int test0;
    }

    @PolymorphicConfigInstance("first1")
    public static class First1PolymorphicConfigurationSchema extends 
FirstPolymorphicConfigurationSchema {
        @Value
        public long test1;
    }
{code}

This example results in ClassCastException
{noformat}
java.util.concurrent.ExecutionException: 
org.apache.ignite.configuration.ConfigurationChangeException: Failed to change 
configuration
        at 
java.base/java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:395)
        at 
java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1999)
        at 
org.apache.ignite.internal.configuration.ConfigurationRegistryTest.testAAA(ConfigurationRegistryTest.java:140)
        ...
Caused by: org.apache.ignite.configuration.ConfigurationChangeException: Failed 
to change configuration
        at 
org.apache.ignite.internal.configuration.ConfigurationChanger.lambda$changeInternally$3(ConfigurationChanger.java:401)
        ...
Caused by: java.lang.ClassCastException: class 
org.apache.ignite.internal.configuration.First0PolymorphicConfigurationImpl 
cannot be cast to class 
org.apache.ignite.internal.configuration.DynamicConfiguration 
(org.apache.ignite.internal.configuration.First0PolymorphicConfigurationImpl is 
in unnamed module of loader com.facebook.presto.bytecode.DynamicClassLoader 
@24313fcc; org.apache.ignite.internal.configuration.DynamicConfiguration is in 
unnamed module of loader 'app')
        at 
org.apache.ignite.internal.configuration.util.ConfigurationNotificationsUtil$2.visitNamedListNode(ConfigurationNotificationsUtil.java:625)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationNotificationsUtil$2.visitNamedListNode(ConfigurationNotificationsUtil.java:563)
        at 
org.apache.ignite.internal.configuration.EntityNode.traverseChildren(Unknown 
Source)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationNotificationsUtil.notifyAnyListenersOnCreate(ConfigurationNotificationsUtil.java:563)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationNotificationsUtil$1.visitNamedListNode(ConfigurationNotificationsUtil.java:298)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationNotificationsUtil$1.visitNamedListNode(ConfigurationNotificationsUtil.java:139)
        at 
org.apache.ignite.internal.configuration.ThirdRootNode.traverseChildren(Unknown 
Source)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationNotificationsUtil.notifyListeners(ConfigurationNotificationsUtil.java:139)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationNotificationsUtil.notifyListeners(ConfigurationNotificationsUtil.java:79)
        at 
org.apache.ignite.internal.configuration.ConfigurationRegistry$2.visitInnerNode(ConfigurationRegistry.java:283)
        at 
org.apache.ignite.internal.configuration.ConfigurationRegistry$2.visitInnerNode(ConfigurationRegistry.java:272)
        at 
org.apache.ignite.internal.configuration.SuperRoot.traverseChildren(SuperRoot.java:103)
        at 
org.apache.ignite.internal.configuration.ConfigurationRegistry.notificator(ConfigurationRegistry.java:272)
        at 
org.apache.ignite.internal.configuration.ConfigurationChanger.updateFromListener(ConfigurationChanger.java:484)
        at 
org.apache.ignite.internal.configuration.storage.TestConfigurationStorage.lambda$write$1(TestConfigurationStorage.java:115)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
        at 
org.apache.ignite.internal.configuration.storage.TestConfigurationStorage.write(TestConfigurationStorage.java:115)
        at 
org.apache.ignite.internal.configuration.ConfigurationChanger.lambda$changeInternally0$7(ConfigurationChanger.java:444)
        at 
java.base/java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1072)
        ... 8 more
{noformat}

In addition, the following incorrect configuration throws NullPointerException. 
In my understanding, we need to throw something useful instead of NPE.

{code:java}
    ConfigurationRegistry registry = new ConfigurationRegistry(
            List.of(ThirdRootConfiguration.KEY),
            Map.of(),
            new TestConfigurationStorage(LOCAL),
            List.of(),
            List.of(
                    First0PolymorphicConfigurationSchema.class,
                    First1PolymorphicConfigurationSchema.class));

    ...
    registry.getConfiguration(ThirdRootConfiguration.KEY).change(c -> {
        c.changeEntity(entity -> {
            entity.create("new entity", upd -> {
                upd.changePolymorphicConfig(p -> {
                    p.create("key", polymorphicChange -> {
                        polymorphicChange.changeName("entity name");
                    });
                });
            });
        });
    }).get();
{code}

{noformat}
Caused by: java.lang.NullPointerException
        at 
org.apache.ignite.internal.configuration.FirstPolymorphicNode.schemaType(Unknown
 Source)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationFlattener$FlattenerVisitor.lambda$doVisitNamedListNode$0(ConfigurationFlattener.java:194)
        at 
org.apache.ignite.internal.configuration.util.KeysTrackingConfigurationVisitor.withTracking(KeysTrackingConfigurationVisitor.java:131)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationFlattener$FlattenerVisitor.doVisitNamedListNode(ConfigurationFlattener.java:176)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationFlattener$FlattenerVisitor.doVisitNamedListNode(ConfigurationFlattener.java:82)
        at 
org.apache.ignite.internal.configuration.util.KeysTrackingConfigurationVisitor.visitNamedListNode(KeysTrackingConfigurationVisitor.java:67)
        at 
org.apache.ignite.internal.configuration.EntityNode.traverseChildren(Unknown 
Source)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationFlattener$FlattenerVisitor.visitAsymmetricInnerNode(ConfigurationFlattener.java:248)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationFlattener$FlattenerVisitor.lambda$doVisitNamedListNode$0(ConfigurationFlattener.java:193)
        at 
org.apache.ignite.internal.configuration.util.KeysTrackingConfigurationVisitor.withTracking(KeysTrackingConfigurationVisitor.java:131)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationFlattener$FlattenerVisitor.doVisitNamedListNode(ConfigurationFlattener.java:176)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationFlattener$FlattenerVisitor.doVisitNamedListNode(ConfigurationFlattener.java:82)
        at 
org.apache.ignite.internal.configuration.util.KeysTrackingConfigurationVisitor.visitNamedListNode(KeysTrackingConfigurationVisitor.java:67)
        at 
org.apache.ignite.internal.configuration.ThirdRootNode.traverseChildren(Unknown 
Source)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationFlattener$FlattenerVisitor.doVisitInnerNode(ConfigurationFlattener.java:146)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationFlattener$FlattenerVisitor.doVisitInnerNode(ConfigurationFlattener.java:82)
        at 
org.apache.ignite.internal.configuration.util.KeysTrackingConfigurationVisitor.visitInnerNode(KeysTrackingConfigurationVisitor.java:55)
        at 
org.apache.ignite.internal.configuration.SuperRoot.traverseChildren(SuperRoot.java:103)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationFlattener.createFlattenedUpdatesMap(ConfigurationFlattener.java:52)
        at 
org.apache.ignite.internal.configuration.ConfigurationChanger.lambda$changeInternally0$4(ConfigurationChanger.java:425)
        at 
java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1700)
        ... 6 more
{noformat}


  was:
Using polymorphic schema can lead to ClassCastException.
Let's consider the following configuration example:
{code:java}
    ConfigurationRegistry registry = new ConfigurationRegistry(
            List.of(ThirdRootConfiguration.KEY),
            Map.of(),
            new TestConfigurationStorage(LOCAL),
            List.of(),
            List.of(
                    First0PolymorphicConfigurationSchema.class,
                    First1PolymorphicConfigurationSchema.class));

    registry.start();

    registry.getConfiguration(ThirdRootConfiguration.KEY).change(c -> {
        c.changeEntity(entity -> {
            entity.create("new entity", upd -> {
                upd.changePolymorphicConfig(p -> {
                    p.create("key", polymorphicChange -> {
                        polymorphicChange.changeName("entity name");
polymorphicChange.convert(First0PolymorphicChange.class).changeTest0(12);
                    });
                });
            });
        });
    }).get();

    registry.stop();
{code}

where polymorphic schemas are defined as follows:

{code:java}
    @ConfigurationRoot(rootName = "third")
    public static class ThirdRootConfigurationSchema {
        @NamedConfigValue
        public EntityConfigurationSchema entity;
    }

    @Config
    public static class EntityConfigurationSchema {
        @NamedConfigValue
        public FirstPolymorphicConfigurationSchema polymorphicConfig;
    }

    @PolymorphicConfig
    public static class FirstPolymorphicConfigurationSchema {
        /** Polymorphic type id field. */
        @PolymorphicId
        public String typeId;

        @Value
        public String name;
    }

    @PolymorphicConfigInstance("first0")
    public static class First0PolymorphicConfigurationSchema extends 
FirstPolymorphicConfigurationSchema {
        @Value
        public int test0;
    }

    @PolymorphicConfigInstance("first1")
    public static class First1PolymorphicConfigurationSchema extends 
FirstPolymorphicConfigurationSchema {
        @Value
        public long test1;
    }
{code}

This example results in ClassCastException
{noformat}
java.util.concurrent.ExecutionException: 
org.apache.ignite.configuration.ConfigurationChangeException: Failed to change 
configuration
        at 
java.base/java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:395)
        at 
java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1999)
        at 
org.apache.ignite.internal.configuration.ConfigurationRegistryTest.testAAA(ConfigurationRegistryTest.java:140)
        ...
Caused by: org.apache.ignite.configuration.ConfigurationChangeException: Failed 
to change configuration
        at 
org.apache.ignite.internal.configuration.ConfigurationChanger.lambda$changeInternally$3(ConfigurationChanger.java:401)
        ...
Caused by: java.lang.ClassCastException: class 
org.apache.ignite.internal.configuration.First0PolymorphicConfigurationImpl 
cannot be cast to class 
org.apache.ignite.internal.configuration.DynamicConfiguration 
(org.apache.ignite.internal.configuration.First0PolymorphicConfigurationImpl is 
in unnamed module of loader com.facebook.presto.bytecode.DynamicClassLoader 
@24313fcc; org.apache.ignite.internal.configuration.DynamicConfiguration is in 
unnamed module of loader 'app')
        at 
org.apache.ignite.internal.configuration.util.ConfigurationNotificationsUtil$2.visitNamedListNode(ConfigurationNotificationsUtil.java:625)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationNotificationsUtil$2.visitNamedListNode(ConfigurationNotificationsUtil.java:563)
        at 
org.apache.ignite.internal.configuration.EntityNode.traverseChildren(Unknown 
Source)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationNotificationsUtil.notifyAnyListenersOnCreate(ConfigurationNotificationsUtil.java:563)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationNotificationsUtil$1.visitNamedListNode(ConfigurationNotificationsUtil.java:298)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationNotificationsUtil$1.visitNamedListNode(ConfigurationNotificationsUtil.java:139)
        at 
org.apache.ignite.internal.configuration.ThirdRootNode.traverseChildren(Unknown 
Source)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationNotificationsUtil.notifyListeners(ConfigurationNotificationsUtil.java:139)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationNotificationsUtil.notifyListeners(ConfigurationNotificationsUtil.java:79)
        at 
org.apache.ignite.internal.configuration.ConfigurationRegistry$2.visitInnerNode(ConfigurationRegistry.java:283)
        at 
org.apache.ignite.internal.configuration.ConfigurationRegistry$2.visitInnerNode(ConfigurationRegistry.java:272)
        at 
org.apache.ignite.internal.configuration.SuperRoot.traverseChildren(SuperRoot.java:103)
        at 
org.apache.ignite.internal.configuration.ConfigurationRegistry.notificator(ConfigurationRegistry.java:272)
        at 
org.apache.ignite.internal.configuration.ConfigurationChanger.updateFromListener(ConfigurationChanger.java:484)
        at 
org.apache.ignite.internal.configuration.storage.TestConfigurationStorage.lambda$write$1(TestConfigurationStorage.java:115)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
        at 
org.apache.ignite.internal.configuration.storage.TestConfigurationStorage.write(TestConfigurationStorage.java:115)
        at 
org.apache.ignite.internal.configuration.ConfigurationChanger.lambda$changeInternally0$7(ConfigurationChanger.java:444)
        at 
java.base/java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1072)
        ... 8 more
{noformat}

In addition, the following incorrect configuration throws NullPointerException. 
In my understanding, we need to throw something useful instead of NPE.

{code:java}
    ConfigurationRegistry registry = new ConfigurationRegistry(
            List.of(ThirdRootConfiguration.KEY),
            Map.of(),
            new TestConfigurationStorage(LOCAL),
            List.of(),
            List.of(
                    First0PolymorphicConfigurationSchema.class,
                    First1PolymorphicConfigurationSchema.class));

    ...
    registry.getConfiguration(ThirdRootConfiguration.KEY).change(c -> {
        c.changeEntity(entity -> {
            entity.create("new entity", upd -> {
                upd.changePolymorphicConfig(p -> {
                    p.create("key", polymorphicChange -> {
                        polymorphicChange.changeName("entity name");
                    });
                });
            });
        });
    }).get();
{code}

{noformat}
Caused by: java.lang.NullPointerException
        at 
org.apache.ignite.internal.configuration.FirstPolymorphicNode.schemaType(Unknown
 Source)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationFlattener$FlattenerVisitor.lambda$doVisitNamedListNode$0(ConfigurationFlattener.java:194)
        at 
org.apache.ignite.internal.configuration.util.KeysTrackingConfigurationVisitor.withTracking(KeysTrackingConfigurationVisitor.java:131)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationFlattener$FlattenerVisitor.doVisitNamedListNode(ConfigurationFlattener.java:176)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationFlattener$FlattenerVisitor.doVisitNamedListNode(ConfigurationFlattener.java:82)
        at 
org.apache.ignite.internal.configuration.util.KeysTrackingConfigurationVisitor.visitNamedListNode(KeysTrackingConfigurationVisitor.java:67)
        at 
org.apache.ignite.internal.configuration.EntityNode.traverseChildren(Unknown 
Source)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationFlattener$FlattenerVisitor.visitAsymmetricInnerNode(ConfigurationFlattener.java:248)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationFlattener$FlattenerVisitor.lambda$doVisitNamedListNode$0(ConfigurationFlattener.java:193)
        at 
org.apache.ignite.internal.configuration.util.KeysTrackingConfigurationVisitor.withTracking(KeysTrackingConfigurationVisitor.java:131)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationFlattener$FlattenerVisitor.doVisitNamedListNode(ConfigurationFlattener.java:176)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationFlattener$FlattenerVisitor.doVisitNamedListNode(ConfigurationFlattener.java:82)
        at 
org.apache.ignite.internal.configuration.util.KeysTrackingConfigurationVisitor.visitNamedListNode(KeysTrackingConfigurationVisitor.java:67)
        at 
org.apache.ignite.internal.configuration.ThirdRootNode.traverseChildren(Unknown 
Source)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationFlattener$FlattenerVisitor.doVisitInnerNode(ConfigurationFlattener.java:146)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationFlattener$FlattenerVisitor.doVisitInnerNode(ConfigurationFlattener.java:82)
        at 
org.apache.ignite.internal.configuration.util.KeysTrackingConfigurationVisitor.visitInnerNode(KeysTrackingConfigurationVisitor.java:55)
        at 
org.apache.ignite.internal.configuration.SuperRoot.traverseChildren(SuperRoot.java:103)
        at 
org.apache.ignite.internal.configuration.util.ConfigurationFlattener.createFlattenedUpdatesMap(ConfigurationFlattener.java:52)
        at 
org.apache.ignite.internal.configuration.ConfigurationChanger.lambda$changeInternally0$4(ConfigurationChanger.java:425)
        at 
java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1700)
        ... 6 more
{noformat}



> Using polymorphic schema leads to ClassCastException
> ----------------------------------------------------
>
>                 Key: IGNITE-16056
>                 URL: https://issues.apache.org/jira/browse/IGNITE-16056
>             Project: Ignite
>          Issue Type: Bug
>    Affects Versions: 3.0.0-alpha3
>            Reporter: Vyacheslav Koptilin
>            Priority: Blocker
>              Labels: ignite-3
>
> Using polymorphic schema can lead to ClassCastException.
> Let's consider the following configuration example:
> {code:java}
>     ConfigurationRegistry registry = new ConfigurationRegistry(
>             List.of(ThirdRootConfiguration.KEY),
>             Map.of(),
>             new TestConfigurationStorage(LOCAL),
>             List.of(),
>             List.of(
>                     First0PolymorphicConfigurationSchema.class,
>                     First1PolymorphicConfigurationSchema.class));
>     registry.start();
>     registry.getConfiguration(ThirdRootConfiguration.KEY).change(c -> {
>         c.changeEntity(entity -> {
>             entity.create("new entity", upd -> {
>                 upd.changePolymorphicConfig(p -> {
>                     p.create("key", polymorphicChange -> {
>                         polymorphicChange.changeName("entity name");
>                         
> polymorphicChange.convert(First0PolymorphicChange.class).changeTest0(12);
>                     });
>                 });
>             });
>         });
>     }).get();
>     registry.stop();
> {code}
> where polymorphic schemas are defined as follows:
> {code:java}
>     @ConfigurationRoot(rootName = "third")
>     public static class ThirdRootConfigurationSchema {
>         @NamedConfigValue
>         public EntityConfigurationSchema entity;
>     }
>     @Config
>     public static class EntityConfigurationSchema {
>         @NamedConfigValue
>         public FirstPolymorphicConfigurationSchema polymorphicConfig;
>     }
>     @PolymorphicConfig
>     public static class FirstPolymorphicConfigurationSchema {
>         /** Polymorphic type id field. */
>         @PolymorphicId
>         public String typeId;
>         @Value
>         public String name;
>     }
>     @PolymorphicConfigInstance("first0")
>     public static class First0PolymorphicConfigurationSchema extends 
> FirstPolymorphicConfigurationSchema {
>         @Value
>         public int test0;
>     }
>     @PolymorphicConfigInstance("first1")
>     public static class First1PolymorphicConfigurationSchema extends 
> FirstPolymorphicConfigurationSchema {
>         @Value
>         public long test1;
>     }
> {code}
> This example results in ClassCastException
> {noformat}
> java.util.concurrent.ExecutionException: 
> org.apache.ignite.configuration.ConfigurationChangeException: Failed to 
> change configuration
>       at 
> java.base/java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:395)
>       at 
> java.base/java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1999)
>       at 
> org.apache.ignite.internal.configuration.ConfigurationRegistryTest.testAAA(ConfigurationRegistryTest.java:140)
>       ...
> Caused by: org.apache.ignite.configuration.ConfigurationChangeException: 
> Failed to change configuration
>       at 
> org.apache.ignite.internal.configuration.ConfigurationChanger.lambda$changeInternally$3(ConfigurationChanger.java:401)
>       ...
> Caused by: java.lang.ClassCastException: class 
> org.apache.ignite.internal.configuration.First0PolymorphicConfigurationImpl 
> cannot be cast to class 
> org.apache.ignite.internal.configuration.DynamicConfiguration 
> (org.apache.ignite.internal.configuration.First0PolymorphicConfigurationImpl 
> is in unnamed module of loader 
> com.facebook.presto.bytecode.DynamicClassLoader @24313fcc; 
> org.apache.ignite.internal.configuration.DynamicConfiguration is in unnamed 
> module of loader 'app')
>       at 
> org.apache.ignite.internal.configuration.util.ConfigurationNotificationsUtil$2.visitNamedListNode(ConfigurationNotificationsUtil.java:625)
>       at 
> org.apache.ignite.internal.configuration.util.ConfigurationNotificationsUtil$2.visitNamedListNode(ConfigurationNotificationsUtil.java:563)
>       at 
> org.apache.ignite.internal.configuration.EntityNode.traverseChildren(Unknown 
> Source)
>       at 
> org.apache.ignite.internal.configuration.util.ConfigurationNotificationsUtil.notifyAnyListenersOnCreate(ConfigurationNotificationsUtil.java:563)
>       at 
> org.apache.ignite.internal.configuration.util.ConfigurationNotificationsUtil$1.visitNamedListNode(ConfigurationNotificationsUtil.java:298)
>       at 
> org.apache.ignite.internal.configuration.util.ConfigurationNotificationsUtil$1.visitNamedListNode(ConfigurationNotificationsUtil.java:139)
>       at 
> org.apache.ignite.internal.configuration.ThirdRootNode.traverseChildren(Unknown
>  Source)
>       at 
> org.apache.ignite.internal.configuration.util.ConfigurationNotificationsUtil.notifyListeners(ConfigurationNotificationsUtil.java:139)
>       at 
> org.apache.ignite.internal.configuration.util.ConfigurationNotificationsUtil.notifyListeners(ConfigurationNotificationsUtil.java:79)
>       at 
> org.apache.ignite.internal.configuration.ConfigurationRegistry$2.visitInnerNode(ConfigurationRegistry.java:283)
>       at 
> org.apache.ignite.internal.configuration.ConfigurationRegistry$2.visitInnerNode(ConfigurationRegistry.java:272)
>       at 
> org.apache.ignite.internal.configuration.SuperRoot.traverseChildren(SuperRoot.java:103)
>       at 
> org.apache.ignite.internal.configuration.ConfigurationRegistry.notificator(ConfigurationRegistry.java:272)
>       at 
> org.apache.ignite.internal.configuration.ConfigurationChanger.updateFromListener(ConfigurationChanger.java:484)
>       at 
> org.apache.ignite.internal.configuration.storage.TestConfigurationStorage.lambda$write$1(TestConfigurationStorage.java:115)
>       at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
>       at 
> org.apache.ignite.internal.configuration.storage.TestConfigurationStorage.write(TestConfigurationStorage.java:115)
>       at 
> org.apache.ignite.internal.configuration.ConfigurationChanger.lambda$changeInternally0$7(ConfigurationChanger.java:444)
>       at 
> java.base/java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1072)
>       ... 8 more
> {noformat}
> In addition, the following incorrect configuration throws 
> NullPointerException. In my understanding, we need to throw something useful 
> instead of NPE.
> {code:java}
>     ConfigurationRegistry registry = new ConfigurationRegistry(
>             List.of(ThirdRootConfiguration.KEY),
>             Map.of(),
>             new TestConfigurationStorage(LOCAL),
>             List.of(),
>             List.of(
>                     First0PolymorphicConfigurationSchema.class,
>                     First1PolymorphicConfigurationSchema.class));
>     ...
>     registry.getConfiguration(ThirdRootConfiguration.KEY).change(c -> {
>         c.changeEntity(entity -> {
>             entity.create("new entity", upd -> {
>                 upd.changePolymorphicConfig(p -> {
>                     p.create("key", polymorphicChange -> {
>                         polymorphicChange.changeName("entity name");
>                     });
>                 });
>             });
>         });
>     }).get();
> {code}
> {noformat}
> Caused by: java.lang.NullPointerException
>       at 
> org.apache.ignite.internal.configuration.FirstPolymorphicNode.schemaType(Unknown
>  Source)
>       at 
> org.apache.ignite.internal.configuration.util.ConfigurationFlattener$FlattenerVisitor.lambda$doVisitNamedListNode$0(ConfigurationFlattener.java:194)
>       at 
> org.apache.ignite.internal.configuration.util.KeysTrackingConfigurationVisitor.withTracking(KeysTrackingConfigurationVisitor.java:131)
>       at 
> org.apache.ignite.internal.configuration.util.ConfigurationFlattener$FlattenerVisitor.doVisitNamedListNode(ConfigurationFlattener.java:176)
>       at 
> org.apache.ignite.internal.configuration.util.ConfigurationFlattener$FlattenerVisitor.doVisitNamedListNode(ConfigurationFlattener.java:82)
>       at 
> org.apache.ignite.internal.configuration.util.KeysTrackingConfigurationVisitor.visitNamedListNode(KeysTrackingConfigurationVisitor.java:67)
>       at 
> org.apache.ignite.internal.configuration.EntityNode.traverseChildren(Unknown 
> Source)
>       at 
> org.apache.ignite.internal.configuration.util.ConfigurationFlattener$FlattenerVisitor.visitAsymmetricInnerNode(ConfigurationFlattener.java:248)
>       at 
> org.apache.ignite.internal.configuration.util.ConfigurationFlattener$FlattenerVisitor.lambda$doVisitNamedListNode$0(ConfigurationFlattener.java:193)
>       at 
> org.apache.ignite.internal.configuration.util.KeysTrackingConfigurationVisitor.withTracking(KeysTrackingConfigurationVisitor.java:131)
>       at 
> org.apache.ignite.internal.configuration.util.ConfigurationFlattener$FlattenerVisitor.doVisitNamedListNode(ConfigurationFlattener.java:176)
>       at 
> org.apache.ignite.internal.configuration.util.ConfigurationFlattener$FlattenerVisitor.doVisitNamedListNode(ConfigurationFlattener.java:82)
>       at 
> org.apache.ignite.internal.configuration.util.KeysTrackingConfigurationVisitor.visitNamedListNode(KeysTrackingConfigurationVisitor.java:67)
>       at 
> org.apache.ignite.internal.configuration.ThirdRootNode.traverseChildren(Unknown
>  Source)
>       at 
> org.apache.ignite.internal.configuration.util.ConfigurationFlattener$FlattenerVisitor.doVisitInnerNode(ConfigurationFlattener.java:146)
>       at 
> org.apache.ignite.internal.configuration.util.ConfigurationFlattener$FlattenerVisitor.doVisitInnerNode(ConfigurationFlattener.java:82)
>       at 
> org.apache.ignite.internal.configuration.util.KeysTrackingConfigurationVisitor.visitInnerNode(KeysTrackingConfigurationVisitor.java:55)
>       at 
> org.apache.ignite.internal.configuration.SuperRoot.traverseChildren(SuperRoot.java:103)
>       at 
> org.apache.ignite.internal.configuration.util.ConfigurationFlattener.createFlattenedUpdatesMap(ConfigurationFlattener.java:52)
>       at 
> org.apache.ignite.internal.configuration.ConfigurationChanger.lambda$changeInternally0$4(ConfigurationChanger.java:425)
>       at 
> java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1700)
>       ... 6 more
> {noformat}



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

Reply via email to