diff --git a/kie-wb-common-widgets/kie-wb-common-ui/src/main/java/org/kie/workbench/common/widgets/client/datamodel/AsyncPackageDataModelOracleImpl.java b/kie-wb-common-widgets/kie-wb-common-ui/src/main/java/org/kie/workbench/common/widgets/client/datamodel/AsyncPackageDataModelOracleImpl.java index 31805fae2cd..f2d3cfcab79 100644 --- a/kie-wb-common-widgets/kie-wb-common-ui/src/main/java/org/kie/workbench/common/widgets/client/datamodel/AsyncPackageDataModelOracleImpl.java +++ b/kie-wb-common-widgets/kie-wb-common-ui/src/main/java/org/kie/workbench/common/widgets/client/datamodel/AsyncPackageDataModelOracleImpl.java @@ -476,7 +476,8 @@ public void getFieldCompletions( final String factType, if (fields == null || fields.length == 0) { fields = projectModelFields.get(factTypeName); - if (isLazyProxy(fields)) { + + if (fields == null || isLazyProxy(fields)) { fields = null; } else { AsyncPackageDataModelOracleUtilities.correctModelFields(packageName, fields, imports); @@ -493,14 +494,19 @@ public void callback(final PackageDataModelOracleIncrementalPayload dataModel) { AsyncPackageDataModelOracleImpl.this, dataModel); - getFieldCompletions(factType, callback); + // This will stop an infinite loop if there are no fields to be found + if (dataModel.getModelFields().get(factTypeName) == null || dataModel.getModelFields().get(factTypeName).length == 0) { + callback.callback(new ModelField[0]); + } else { + getFieldCompletions(factType, callback); + } } }).getUpdates( resourcePath, imports, factTypeName); } else { - callback.callback( fields ); + callback.callback(fields); } } diff --git a/kie-wb-common-widgets/kie-wb-common-ui/src/test/java/org/kie/workbench/common/widgets/client/datamodel/AsyncPackageDataModelOracleImplTest.java b/kie-wb-common-widgets/kie-wb-common-ui/src/test/java/org/kie/workbench/common/widgets/client/datamodel/AsyncPackageDataModelOracleImplTest.java index 64faf1b1818..75e338b1511 100644 --- a/kie-wb-common-widgets/kie-wb-common-ui/src/test/java/org/kie/workbench/common/widgets/client/datamodel/AsyncPackageDataModelOracleImplTest.java +++ b/kie-wb-common-widgets/kie-wb-common-ui/src/test/java/org/kie/workbench/common/widgets/client/datamodel/AsyncPackageDataModelOracleImplTest.java @@ -43,6 +43,7 @@ public class AsyncPackageDataModelOracleImplTest { private PackageDataModelOracleIncrementalPayload personPayload; private PackageDataModelOracleIncrementalPayload addressPayload; private PackageDataModelOracleIncrementalPayload giantPayload; + private PackageDataModelOracleIncrementalPayload defaultPayload; @Before public void setUp() throws Exception { @@ -52,6 +53,7 @@ public void setUp() throws Exception { personPayload = createPersonPayload(); addressPayload = createAddressPayload(); giantPayload = createGiantPayload(); + defaultPayload = createDefaultPayload(); oracle.addGlobals(createGlobals()); @@ -77,6 +79,10 @@ private Imports createImports() { return imports; } + private PackageDataModelOracleIncrementalPayload createDefaultPayload() { + return new PackageDataModelOracleIncrementalPayload(); + } + private PackageDataModelOracleIncrementalPayload createGiantPayload() { PackageDataModelOracleIncrementalPayload payload = new PackageDataModelOracleIncrementalPayload(); HashMap addressModelFields = new HashMap(); @@ -165,6 +171,21 @@ public void callback(ModelField[] result) { } + @Test + public void testGetFieldCompletitionsForSomethingThatDoesNotReturnFields() throws Exception { + Callback callback = spy(new Callback() { + @Override + public void callback(ModelField[] result) { + assertEquals(0, result.length); + } + }); + + oracle.getFieldCompletions("I.do.not.Exist", callback); + + verify(callback).callback(any(ModelField[].class)); + + } + @Test public void testGetFieldCompletitionsMutators() throws Exception { Callback callback = spy(new Callback() { @@ -254,8 +275,11 @@ public PackageDataModelOracleIncrementalPayload getUpdates(Path resourcePath, Im callback.callback(addressPayload); } else if (factType.equals("org.globals.GiantContainerOfInformation")) { callback.callback(giantPayload); + } else { + callback.callback(defaultPayload); } + return null; } };