diff options
| author | Dirk Fauth | 2023-02-28 09:09:52 +0000 |
|---|---|---|
| committer | Dirk Fauth | 2023-02-28 09:09:52 +0000 |
| commit | 767ece5de4a2b3c25dc31cf49ea3370118cdaf38 (patch) | |
| tree | 66c98e8c3cc465a3206fbe68ff5ef36a077a05b4 | |
| parent | f6e513a5f85244691bf53b5fa6fd88c504549d8f (diff) | |
| download | org.eclipse.nebula.widgets.nattable-767ece5de4a2b3c25dc31cf49ea3370118cdaf38.tar.gz org.eclipse.nebula.widgets.nattable-767ece5de4a2b3c25dc31cf49ea3370118cdaf38.tar.xz org.eclipse.nebula.widgets.nattable-767ece5de4a2b3c25dc31cf49ea3370118cdaf38.zip | |
Bug 581608 - GroupModel persistence breaks with special characters in
group name
Signed-off-by: Dirk Fauth <dirk.fauth@googlemail.com>
Change-Id: I2df8d28e6598e8ed8d7815d1fd37b9e03add0855
2 files changed, 110 insertions, 1 deletions
diff --git a/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/group/performance/GroupModelTest.java b/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/group/performance/GroupModelTest.java index f0e84bdf..456d102f 100644 --- a/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/group/performance/GroupModelTest.java +++ b/org.eclipse.nebula.widgets.nattable.core.test/src/org/eclipse/nebula/widgets/nattable/group/performance/GroupModelTest.java @@ -1265,4 +1265,98 @@ public class GroupModelTest { assertTrue(group3.hasMember(13)); assertTrue(group3.hasMember(14)); } + + @Test + public void shouldSaveStateWithSpecialCharactersInGroupName() { + Group group1 = this.model.getGroupByPosition(0); + Group group2 = this.model.getGroupByPosition(5); + Group group3 = this.model.getGroupByPosition(12); + + group1.setCollapseable(false); + group2.setUnbreakable(true); + group3.setCollapsed(true); + + group1.setName("test|GroupName"); + group2.setName("test=GroupName2"); + group3.setName("test:GroupName3"); + + this.model.addStaticIndexesToGroup(group1, 1, 2); + group2.setVisibleStartIndex(6); + group2.setVisibleSpan(2); + + Properties properties = new Properties(); + this.model.saveState("prefix", properties); + + assertEquals(1, properties.size()); + assertEquals( + "test" + GroupModel.PIPE_REPLACEMENT + "GroupName=0:0:0:4:4:expanded:uncollapseable:breakable:1,2:members[0,1,2,3]|" + + "test=GroupName2=5:6:5:3:2:expanded:collapseable:unbreakable:members[5,6,7]|" + + "test:GroupName3=12:12:12:2:2:collapsed:collapseable:breakable:members[12,13]|", + properties.getProperty("prefix.groupModel")); + } + + @Test + public void shouldLoadStateWithSpecialCharactersInGroupName() { + Properties properties = new Properties(); + properties.setProperty( + "prefix.groupModel", + "test" + GroupModel.PIPE_REPLACEMENT + "GroupName=0:0:0:4:4:expanded:uncollapseable:breakable:1,2:members[0,1,3,4]|" + + "test=GroupName2=5:6:5:3:2:expanded:collapseable:unbreakable:members[5,2,7]|" + + "test:GroupName3=12:12:12:2:2:collapsed:collapseable:breakable:members[14,13]|"); + + GroupModel tempModel = new GroupModel(); + tempModel.loadState("prefix", properties); + + assertTrue(tempModel.isPartOfAGroup(0)); + assertTrue(tempModel.isPartOfAGroup(5)); + assertTrue(tempModel.isPartOfAGroup(12)); + + Group group1 = tempModel.getGroupByPosition(0); + Group group2 = tempModel.getGroupByPosition(5); + Group group3 = tempModel.getGroupByPosition(12); + + assertEquals("test|GroupName", group1.getName()); + assertEquals(0, group1.getStartIndex()); + assertEquals(0, group1.getVisibleStartIndex()); + assertEquals(0, group1.getVisibleStartPosition()); + assertEquals(4, group1.getOriginalSpan()); + assertEquals(4, group1.getVisibleSpan()); + assertFalse(group1.isCollapsed()); + assertFalse(group1.isCollapseable()); + assertFalse(group1.isUnbreakable()); + assertEquals(2, group1.getStaticIndexes().length); + assertTrue(group1.containsStaticIndex(1)); + assertTrue(group1.containsStaticIndex(2)); + assertTrue(group1.hasMember(0)); + assertTrue(group1.hasMember(1)); + assertTrue(group1.hasMember(3)); + assertTrue(group1.hasMember(4)); + + assertEquals("test=GroupName2", group2.getName()); + assertEquals(5, group2.getStartIndex()); + assertEquals(6, group2.getVisibleStartIndex()); + assertEquals(5, group2.getVisibleStartPosition()); + assertEquals(3, group2.getOriginalSpan()); + assertEquals(2, group2.getVisibleSpan()); + assertFalse(group2.isCollapsed()); + assertTrue(group2.isCollapseable()); + assertTrue(group2.isUnbreakable()); + assertEquals(0, group2.getStaticIndexes().length); + assertTrue(group2.hasMember(5)); + assertTrue(group2.hasMember(2)); + assertTrue(group2.hasMember(7)); + + assertEquals("test:GroupName3", group3.getName()); + assertEquals(12, group3.getStartIndex()); + assertEquals(12, group3.getVisibleStartIndex()); + assertEquals(12, group3.getVisibleStartPosition()); + assertEquals(2, group3.getOriginalSpan()); + assertEquals(2, group3.getVisibleSpan()); + assertTrue(group3.isCollapsed()); + assertTrue(group3.isCollapseable()); + assertFalse(group3.isUnbreakable()); + assertEquals(0, group3.getStaticIndexes().length); + assertTrue(group3.hasMember(13)); + assertTrue(group3.hasMember(14)); + } } diff --git a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/performance/GroupModel.java b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/performance/GroupModel.java index 80c0b8d0..c6e814e7 100644 --- a/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/performance/GroupModel.java +++ b/org.eclipse.nebula.widgets.nattable.core/src/org/eclipse/nebula/widgets/nattable/group/performance/GroupModel.java @@ -38,6 +38,19 @@ import org.eclipse.nebula.widgets.nattable.persistence.IPersistable; public class GroupModel implements IPersistable { /** + * Replacement for the pipe character | that is used for persistence. Needed + * if a user added the pipe character in a group name. As the persistence + * mechanism in NatTable uses the pipe character for separation of values, + * the persistence breaks for such cases. By replacing the pipe in the + * regular expression with some silly uncommon value specified here, we + * ensure to be able to also persist pipes for such special group names, as + * well as being backwards compatible with already saved filter row states. + * + * @since 2.1 + */ + static final String PIPE_REPLACEMENT = "°~°"; //$NON-NLS-1$ + + /** * Persistence key for persisting the group model states. */ private static final String PERSISTENCE_KEY_GROUP_MODEL = ".groupModel"; //$NON-NLS-1$ @@ -169,6 +182,7 @@ public class GroupModel implements IPersistable { continue; } + groupName = groupName.replace("|", PIPE_REPLACEMENT); //$NON-NLS-1$ strBuilder.append(groupName); strBuilder.append('='); @@ -211,10 +225,11 @@ public class GroupModel implements IPersistable { while (groupTokenizer.hasMoreTokens()) { String groupToken = groupTokenizer.nextToken(); - int separatorIndex = groupToken.indexOf('='); + int separatorIndex = groupToken.lastIndexOf('='); // group name String groupName = groupToken.substring(0, separatorIndex); + groupName = groupName.replace(PIPE_REPLACEMENT, "|"); //$NON-NLS-1$ String[] groupProperties = groupToken.substring(separatorIndex + 1).split(":"); //$NON-NLS-1$ |
