diff --git a/src/main/java/org/olat/core/util/StringHelper.java b/src/main/java/org/olat/core/util/StringHelper.java index c3bc38653ca141c035a8974bba89f464209362bf..e7d4e98501a2c07ee7134ad3291d49add2b07135 100644 --- a/src/main/java/org/olat/core/util/StringHelper.java +++ b/src/main/java/org/olat/core/util/StringHelper.java @@ -68,6 +68,8 @@ public class StringHelper { private static final String WHITESPACE_REGEXP = "^\\s*$"; private static final Pattern WHITESPACE_PATTERN = Pattern.compile(WHITESPACE_REGEXP); + private static final int LONG_MAX_LENGTH = Long.toString(Long.MAX_VALUE).length(); + /** * regex for not allowing * <code>;,:</code> <code>ALL_WITHOUT_COMMA_2POINT_STRPNT</code> @@ -384,11 +386,21 @@ public class StringHelper { return FileUtils.normalizeFilename(s); } + /** + * The method do only a precheck if the string can be a number. It's goal + * is to prevent to generate hunderds of exceptions in a loop by using + * the Long.parseLong() method (exceptions is time and CPU intensive). + * + * return True if the string can be a digit (there is not boundaries check) + */ public static boolean isLong(String string) { if(string == null || string.length() == 0) { return false; } int stop = string.startsWith("-") ? 1 : 0; + if(string.length() > LONG_MAX_LENGTH + stop) { + return false; + } char[] charArr = string.toCharArray(); for(int i=charArr.length; i-->stop; ) { char ch = charArr[i]; diff --git a/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java b/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java index b7396c45ee2ca47f67c8a2b50db4857989b9fdb3..9d913c92c2a911a03685fab5373b34655cc9d133 100644 --- a/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java +++ b/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java @@ -172,8 +172,12 @@ public class PersistingCourseGroupManager extends BasicManager implements Course public boolean existGroup(String nameOrKey) { SearchBusinessGroupParams params = new SearchBusinessGroupParams(); if(StringHelper.isLong(nameOrKey)) { - params.setGroupKeys(Collections.singletonList(new Long(nameOrKey))); - }else { + try { + params.setGroupKeys(Collections.singletonList(new Long(nameOrKey))); + } catch (NumberFormatException e) { + params.setExactName(nameOrKey); + } + } else { params.setExactName(nameOrKey); } return businessGroupService.countBusinessGroups(params, courseResource) > 0; diff --git a/src/test/java/org/olat/core/util/StringHelperTest.java b/src/test/java/org/olat/core/util/StringHelperTest.java index 5e33de1258278900f0b00076935b3171f958582f..df5b39c56763f18ab80d407e9aa8417ad5df1fb9 100644 --- a/src/test/java/org/olat/core/util/StringHelperTest.java +++ b/src/test/java/org/olat/core/util/StringHelperTest.java @@ -108,4 +108,16 @@ public class StringHelperTest { String value12 = StringHelper.cleanUTF8ForXml("Hello\u10B7x pahlavi"); Assert.assertEquals("Pahlavi test", "Hello\u10B7x pahlavi", value12); } + + @Test + public void isLong() { + Assert.assertTrue(StringHelper.isLong("234")); + Assert.assertTrue(StringHelper.isLong("9223372036854775807")); + Assert.assertTrue(StringHelper.isLong("-9223372036854775807")); + + Assert.assertFalse(StringHelper.isLong("10223372036854775807")); + Assert.assertFalse(StringHelper.isLong("-dru")); + Assert.assertFalse(StringHelper.isLong("OpenOLAT")); + Assert.assertFalse(StringHelper.isLong("A very long number with a lot of characters")); + } }