Merge "Bug 460031 - GroupDescriptorMatcher: NullPointerException with GroupByObject which contains null value "
diff --git a/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/test/data/PersonService.java b/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/test/data/PersonService.java
index 309ad53..2d5002b 100644
--- a/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/test/data/PersonService.java
+++ b/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/test/data/PersonService.java
@@ -106,6 +106,38 @@
         return result;
     }
 
+    /**
+     * Creates a fixed list of {@link Person}s with a few null values.
+     */
+    public static List<Person> getFixedPersonsWithNull() {
+        List<Person> result = new ArrayList<Person>();
+
+        // create 5 Simpsons
+        // 2 Homer
+        result.add(new Person(1, maleNames[1], lastNames[0], Gender.MALE, true,
+                new Date(), 100d));
+        result.add(new Person(3, maleNames[1], lastNames[0], Gender.MALE, true,
+                new Date(), 100d));
+        // 2 Marge
+        result.add(new Person(7, femaleNames[0], lastNames[0], Gender.FEMALE,
+                true, new Date(), 100d));
+        result.add(new Person(8, femaleNames[0], lastNames[0], Gender.FEMALE,
+                true, new Date(), 100d));
+        // 1 Bart without money
+        result.add(new Person(7, femaleNames[0], lastNames[0], Gender.FEMALE,
+                true, new Date(), null));
+
+        // create 2 Flanders without last name
+        // 1 Ned
+        result.add(new Person(11, maleNames[5], null, Gender.MALE,
+                true, new Date(), 100d));
+        // 1 Maude
+        result.add(new Person(13, femaleNames[6], null, Gender.FEMALE,
+                true, new Date(), 100d));
+
+        return result;
+    }
+
     public static List<Person> getFixedMixedPersons() {
         List<Person> result = new ArrayList<Person>();
 
diff --git a/org.eclipse.nebula.widgets.nattable.extension.glazedlists.test/src/org/eclipse/nebula/widgets/nattable/extension/glazedlists/groupby/GroupByDataLayerTest.java b/org.eclipse.nebula.widgets.nattable.extension.glazedlists.test/src/org/eclipse/nebula/widgets/nattable/extension/glazedlists/groupby/GroupByDataLayerTest.java
index 07c8393..871967d 100644
--- a/org.eclipse.nebula.widgets.nattable.extension.glazedlists.test/src/org/eclipse/nebula/widgets/nattable/extension/glazedlists/groupby/GroupByDataLayerTest.java
+++ b/org.eclipse.nebula.widgets.nattable.extension.glazedlists.test/src/org/eclipse/nebula/widgets/nattable/extension/glazedlists/groupby/GroupByDataLayerTest.java
@@ -14,7 +14,9 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
+import java.util.ArrayList;
 import java.util.Comparator;
+import java.util.List;
 
 import org.eclipse.nebula.widgets.nattable.config.ConfigRegistry;
 import org.eclipse.nebula.widgets.nattable.config.DefaultComparator;
@@ -158,6 +160,34 @@
     }
 
     @Test
+    public void testGetElementsInGroupWithNullValue() {
+        // Test with another list with null values
+        this.sortedList.clear();
+        this.sortedList.addAll(PersonService.getFixedPersonsWithNull());
+
+        // groupBy lastname
+        this.groupByModel.addGroupByColumnIndex(1);
+
+        // collect GroupBy Objects
+        List<GroupByObject> groupByObjects = new ArrayList<GroupByObject>();
+        for (Object o : this.dataLayer.getTreeList()) {
+            if (o instanceof GroupByObject) {
+                groupByObjects.add((GroupByObject) o);
+            }
+        }
+
+        // test with getElementsInGroup() class GroupDescriptorMatcher.
+        // testing like this, cause setup would be complex
+        for (GroupByObject o : groupByObjects) {
+            this.dataLayer.getElementsInGroup(o);
+        }
+
+        // if we get here, there is no NullPointerException in
+        // GroupDescriptorMatcher.
+
+    }
+
+    @Test
     public void testTwoLevelGrouping() {
         assertEquals(18, this.dataLayer.getRowCount());
 
@@ -826,7 +856,7 @@
         // groupBy lastname
         this.groupByModel.addGroupByColumnIndex(1);
 
-        // if we get here, there is no class cast exception as reported in 
+        // if we get here, there is no class cast exception as reported in
         // Bug 459422
 
     }
diff --git a/org.eclipse.nebula.widgets.nattable.extension.glazedlists/src/org/eclipse/nebula/widgets/nattable/extension/glazedlists/groupBy/GroupByDataLayer.java b/org.eclipse.nebula.widgets.nattable.extension.glazedlists/src/org/eclipse/nebula/widgets/nattable/extension/glazedlists/groupBy/GroupByDataLayer.java
index a70c978..d20d718 100644
--- a/org.eclipse.nebula.widgets.nattable.extension.glazedlists/src/org/eclipse/nebula/widgets/nattable/extension/glazedlists/groupBy/GroupByDataLayer.java
+++ b/org.eclipse.nebula.widgets.nattable.extension.glazedlists/src/org/eclipse/nebula/widgets/nattable/extension/glazedlists/groupBy/GroupByDataLayer.java
@@ -11,6 +11,7 @@
  *     Dirk Fauth <dirk.fauth@googlemail.com> - Bug 448115, 449361, 453874
  *     Dirk Fauth <dirk.fauth@googlemail.com> - Bug 444839, 444855, 453885
  *     Dirk Fauth <dirk.fauth@googlemail.com> - Bug 459246
+ *     Daniel Fritsch <danielw.fritsch@web.de> - Bug 460031
  ******************************************************************************/
 package org.eclipse.nebula.widgets.nattable.extension.glazedlists.groupBy;
 
@@ -625,12 +626,19 @@
             for (Entry<Integer, Object> desc : this.group.getDescriptor().entrySet()) {
                 int columnIndex = desc.getKey();
                 Object groupName = desc.getValue();
-                if (!groupName.equals(this.columnAccessor.getDataValue(element, columnIndex))) {
+                if (!equals(groupName, this.columnAccessor.getDataValue(element, columnIndex))) {
                     return false;
                 }
             }
             return true;
         }
+
+        /**
+         * java 1.7 style Objects.equals() logic
+         */
+        private boolean equals(Object a, Object b) {
+            return (a == b) || (a != null && a.equals(b));
+        }
     }
 
     /**