| author | kwilk | 2011-12-20 15:33:01 (EST) |
|---|---|---|
| committer | Roberto E. Escobar | 2011-12-20 15:33:01 (EST) |
| commit | 7f096d30b6f0ed36471488cc7b999f0b0557399f (patch) (side-by-side diff) | |
| tree | de50a006a59b706f27fc9fefd80c34483446e8a0 | |
| parent | e469efb531b7f11987ce70257cd7d8a17187a97d (diff) | |
| download | org.eclipse.osee-7f096d30b6f0ed36471488cc7b999f0b0557399f.zip org.eclipse.osee-7f096d30b6f0ed36471488cc7b999f0b0557399f.tar.gz org.eclipse.osee-7f096d30b6f0ed36471488cc7b999f0b0557399f.tar.bz2 | |
bug[ats_61B71]: Short branch names ending in period cause exceptions during editing
4 files changed, 193 insertions, 74 deletions
diff --git a/plugins/org.eclipse.osee.framework.jdk.core.test/src/org/eclipse/osee/framework/jdk/core/util/StringsTest.java b/plugins/org.eclipse.osee.framework.jdk.core.test/src/org/eclipse/osee/framework/jdk/core/util/StringsTest.java index 9a705a7..aff96d8 100644 --- a/plugins/org.eclipse.osee.framework.jdk.core.test/src/org/eclipse/osee/framework/jdk/core/util/StringsTest.java +++ b/plugins/org.eclipse.osee.framework.jdk.core.test/src/org/eclipse/osee/framework/jdk/core/util/StringsTest.java @@ -8,23 +8,14 @@ * Contributors: * Boeing - initial API and implementation *******************************************************************************/ -/******************************************************************************* - * Copyright (c) 2004, 2007 Boeing. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Boeing - initial API and implementation - *******************************************************************************/ package org.eclipse.osee.framework.jdk.core.util; -import org.eclipse.osee.framework.jdk.core.util.Strings; +import java.util.Arrays; import org.junit.Assert; -import org.junit.Test; /** + * {@link Strings} + * * @author Donald G. Dunne */ public class StringsTest { @@ -38,16 +29,16 @@ public class StringsTest { String withDots = Strings.truncate(name, 20, true); Assert.assertEquals(20, Strings.truncate(withDots, 20).length()); - Assert.assertEquals(withDots, "Now is the time f..."); + Assert.assertEquals("Now is the time f...", withDots); } - @Test + @org.junit.Test public void testUnQuote() { String actual = Strings.unquote(null); Assert.assertNull(actual); - actual = Strings.unquote(""); - Assert.assertEquals("", actual); + actual = Strings.unquote(Strings.EMPTY_STRING); + Assert.assertEquals(Strings.EMPTY_STRING, actual); actual = Strings.unquote("hello"); Assert.assertEquals("hello", actual); @@ -56,15 +47,72 @@ public class StringsTest { Assert.assertEquals("hello", actual); } - @Test + @org.junit.Test public void testQuote() { String actual = Strings.quote(null); Assert.assertNull(actual); - actual = Strings.quote(""); - Assert.assertEquals("", actual); + actual = Strings.quote(Strings.EMPTY_STRING); + Assert.assertEquals(Strings.EMPTY_STRING, actual); actual = Strings.quote("hello"); Assert.assertEquals("\"hello\"", actual); } + + @org.junit.Test + public void testSafeReplace() { + String actual = Strings.saferReplace(null, null, null); + Assert.assertNull(actual); + + actual = Strings.saferReplace(Strings.EMPTY_STRING, Strings.EMPTY_STRING, Strings.EMPTY_STRING); + Assert.assertEquals(Strings.EMPTY_STRING, actual); + + actual = Strings.saferReplace("hello", "e", "o"); + Assert.assertEquals("hollo", actual); + + actual = Strings.saferReplace(".S.t.r.i.n.g.s.T.e.s.t..", "\\.", "_"); + Assert.assertEquals("_S_t_r_i_n_g_s_T_e_s_t__", actual); + } + + @org.junit.Test + public void test_BuildStatement() { + String actual = Strings.buildStatement(null, null); + Assert.assertNull(actual); + + actual = Strings.buildStatement(Arrays.asList(Strings.EMPTY_STRING), Strings.EMPTY_STRING); + Assert.assertEquals(Strings.EMPTY_STRING, actual); + + actual = Strings.buildStatement(Arrays.asList("hello"), "e"); + Assert.assertEquals("hello", actual); + + actual = Strings.buildStatement(Arrays.asList("hello", "hello"), "e"); + Assert.assertEquals("hello e hello", actual); + + actual = Strings.buildStatement(Arrays.asList("hello", "hello", "olleh"), "e"); + Assert.assertEquals("hello, hello e olleh", actual); + + actual = Strings.buildStatment(Arrays.asList("hello", "hello", "olleh")); + Assert.assertEquals("hello, hello and olleh", actual); + } + + @org.junit.Test + public void test_minimize() { + String actual = Strings.minimize(null); + Assert.assertNull(actual); + + actual = Strings.minimize(Strings.EMPTY_STRING); + Assert.assertEquals(Strings.EMPTY_STRING, actual); + + actual = Strings.minimize("hello"); + Assert.assertEquals("hello", actual); + + actual = Strings.minimize("hello\nhello\t\thello\nhello"); + Assert.assertEquals("hellohellohellohello", actual); + + actual = Strings.minimize(System.getProperty("line.separator")); + Assert.assertEquals(Strings.EMPTY_STRING, actual); + + actual = Strings.minimize("Test\r\ning\n\tstuff"); + Assert.assertEquals("Testingstuff", actual); + } } diff --git a/plugins/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Strings.java b/plugins/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Strings.java index 38f54ad..3935910 100644 --- a/plugins/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Strings.java +++ b/plugins/org.eclipse.osee.framework.jdk.core/src/org/eclipse/osee/framework/jdk/core/util/Strings.java @@ -14,12 +14,22 @@ package org.eclipse.osee.framework.jdk.core.util; import java.util.List; /** + * {@link StringsTest} + * * @author Jeff C. Phillips * @author Don Dunne * @author Karol M. Wilk */ public class Strings { - private final static String EMPTY_STRING = ""; + + private static final String AMP = "&"; + private static final String DBL_AMP = AMP + AMP; + + private static final String SPACE_COMMON = "\n|\t|\r|" + System.getProperty("line.separator"); + private static final String AND = "and"; + private static final String STR = "%s%s%s"; + private static final String QUOTE_STR = "\""; + public static final String EMPTY_STRING = ""; private Strings() { // Utility class @@ -32,6 +42,10 @@ public class Strings { return value != null && value.length() > 0; } + public static String intern(String str) { + return (str == null) ? null : str.intern(); + } + public static boolean isValid(CharSequence... values) { for (CharSequence value : values) { if (value == null || value.length() == 0) { @@ -52,58 +66,96 @@ public class Strings { * @return a string with doubled ampersands. */ public static String escapeAmpersands(String stringWithAmp) { - return isValid(stringWithAmp) ? stringWithAmp.replace("&", "&&") : null; + return saferReplace(stringWithAmp, AMP, DBL_AMP); } - public static String intern(String str) { - return (str == null) ? null : str.intern(); + /** + * <p> + * Remove all <code>\n</code> and <code>\t</code>. + * </p> + */ + public static String minimize(String value) { + return saferReplace(value, SPACE_COMMON, EMPTY_STRING); + } + + /** + * <b>NOTE</b> isValid() check is only applied to <code>inputStr</code>. + * + * @param inputStr string to be evaluated + * @param target + * @param replacement + * @return returns modified, new version of <code>inputStr</code> or <code>inputStr</code> if it is not valid. + */ + public static String saferReplace(String inputStr, String target, String replacement) { + return isValid(inputStr) ? inputStr.replaceAll(target, replacement) : inputStr; + } + + /** + * Truncates at length, with no ellipsis. + */ + public static String truncate(String value, int length) { + return truncate(value, length, false); + } + + /** + * Trims ASCII <code>value</code> from end of <code>str</code> iff <b>found</b>. + * + * @param str "Requirement." + * @param value of the character from the ASCII charset, i.e. <code>0x2E</code> for '.' + * @return "Requirement" + */ + public static String truncateEndChar(String str, int value) { + if (isValid(str) && value == str.charAt(str.length() - 1)) { + str = truncate(str, str.length() - 1); + } + return str; } /** * Will truncate string if necessary and add "..." to end if addDots and truncated */ public static String truncate(String value, int length, boolean ellipsis) { - if (value == null) { + if (!isValid(value)) { return emptyString(); } + String toReturn = value; - if (Strings.isValid(value) && value.length() > length) { + if (value.length() > length) { int len = ellipsis && length - 3 > 0 ? length - 3 : length; toReturn = value.substring(0, Math.min(length, len)) + (ellipsis ? "..." : emptyString()); } return toReturn; } - public static String truncate(String value, int length) { - return truncate(value, length, false); - } - public static String unquote(String nameReference) { - String toReturn = nameReference; - if (toReturn != null) { - toReturn = toReturn.trim(); - if (Strings.isValid(toReturn) && toReturn.startsWith("\"") && toReturn.endsWith("\"")) { - toReturn = toReturn.substring(1, toReturn.length() - 1); - } - } - return toReturn; + return wrapWith(nameReference, QUOTE_STR, true); } public static String quote(String nameReference) { - String toReturn = nameReference; - if (Strings.isValid(nameReference)) { - toReturn = String.format("\"%s\"", nameReference); - } - return toReturn; + return wrapWith(nameReference, QUOTE_STR, false); } /** - * <p> - * Remove all <code>\n</code> and <code>\t</code>. - * </p> + * Wrap <code>value</code> with <code>surroundStr</code>. <br/> + * <b>NOTE</b> <code>value</code> will be trimmed of whitespace. + * + * @param value <code>A</code> + * @param surroundStr <code>"</code> + * @param unWrap reverse behavior. Takes out 2 * surroundStr.lenth() from value.length() + * @return <code>"A"</code> */ - public static String minimize(String value) { - return isValid(value) ? value.replaceAll("\n|\t", "") : value; + public static String wrapWith(String value, String surroundStr, boolean unWrap) { + if (isValid(value)) { + value = value.trim(); + if (unWrap) { + if (value.startsWith(surroundStr) && value.endsWith(surroundStr) && 2 * surroundStr.length() < value.length()) { + value = value.substring(surroundStr.length(), value.length() - surroundStr.length()); + } + } else { + value = String.format(STR, surroundStr, value, surroundStr); + } + } + return value; } /** @@ -112,32 +164,39 @@ public class Strings { * @return <code>A, B, C joiningWord D</code> */ public static String buildStatment(List<?> items) { - return buildStatment(items, " and "); + return buildStatement(items, AND); } /** - * Provides a nicer list of items with an 'and' at the end. This could be done using iterator(). + * Provides a nicer list of items with an 'and' at the end. <br/> + * TODO:This could be done using iterator(). * * @param items Lists of form { apple, banana, orange } or { apple, banana } * @return string of form "apple, banana and orange" or "apple and banana" depending on size of list */ - public static String buildStatment(List<?> items, String joiningWord) { - StringBuilder niceList = new StringBuilder(); - if (items.size() >= 2) { - int andIndex = items.size() - 2; - for (int itemIndex = 0; itemIndex < items.size(); itemIndex++) { - niceList.append(items.get(itemIndex)); - if (itemIndex == andIndex) { - niceList.append(joiningWord); - } else if (itemIndex < andIndex) { - niceList.append(", "); + public static String buildStatement(List<?> items, String joiningWord) { + String statement = null; + if (items != null) { + StringBuilder niceList = new StringBuilder(); + if (items.size() >= 2) { + int andIndex = items.size() - 2; + for (int itemIndex = 0; itemIndex < items.size(); itemIndex++) { + niceList.append(items.get(itemIndex)); + if (itemIndex == andIndex) { + niceList.append(' '); + niceList.append(joiningWord); + niceList.append(' '); + } else if (itemIndex < andIndex) { + niceList.append(", "); + } + } + } else { + if (!items.isEmpty()) { + niceList.append(items.get(0)); } } - } else { - if (!items.isEmpty()) { - niceList.append(items.get(0)); - } + statement = niceList.toString(); } - return niceList.toString(); + return statement; } } diff --git a/plugins/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/renderer/RenderingUtilTest.java b/plugins/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/renderer/RenderingUtilTest.java index fe31b93..153e2d4 100644 --- a/plugins/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/renderer/RenderingUtilTest.java +++ b/plugins/org.eclipse.osee.framework.ui.skynet.test/src/org/eclipse/osee/framework/ui/skynet/test/renderer/RenderingUtilTest.java @@ -23,34 +23,45 @@ import org.eclipse.osee.framework.core.model.mocks.MockOseeDataAccessor; import org.eclipse.osee.framework.jdk.core.util.GUID; import org.eclipse.osee.framework.ui.skynet.render.RenderingUtil; import org.junit.Assert; +import org.junit.BeforeClass; import org.junit.Test; /** * @author Roberto E. Escobar */ public class RenderingUtilTest { + + private static AbstractOseeCache<String, Branch> cache; + private static Branch branch; + + @BeforeClass + public static void setUpOnce() throws OseeCoreException { + cache = new BranchCache(new MockOseeDataAccessor<String, Branch>()); + branch = createBranch(cache, GUID.create(), "Test 1", 1); + } + @Test public void testBranchToFileName() throws Exception { - AbstractOseeCache<String, Branch> cache = new TestCache(); - Branch branch = createBranch(cache, GUID.create(), "Test 1", 1); String actual = RenderingUtil.toFileName(branch); Assert.assertEquals(encode(branch.getShortName()), actual); } + @Test + public void test_branchToFileName_notAllowedCharsInName() throws OseeCoreException { + branch.setName("0123455789012345578901234557890123.5"); + String branchShortName = RenderingUtil.toFileName(branch); + Assert.assertEquals("Not safe character found at end of branch name.", "0123455789012345578901234557890123_", + branchShortName); + } + private String encode(String guid) throws UnsupportedEncodingException { return URLEncoder.encode(guid, "UTF-8"); } - private Branch createBranch(AbstractOseeCache<String, Branch> cache, String guid, String name, int id) throws OseeCoreException { + private static Branch createBranch(AbstractOseeCache<String, Branch> cache, String guid, String name, int id) throws OseeCoreException { Branch branch = new BranchFactory().create(guid, name, BranchType.WORKING, BranchState.MODIFIED, false); Assert.assertNotNull(branch); branch.setId(id); return branch; } - - private final class TestCache extends BranchCache { - public TestCache() { - super(new MockOseeDataAccessor<String, Branch>()); - } - } }
\ No newline at end of file diff --git a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/RenderingUtil.java b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/RenderingUtil.java index 1dbbfad..d280793 100644 --- a/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/RenderingUtil.java +++ b/plugins/org.eclipse.osee.framework.ui.skynet/src/org/eclipse/osee/framework/ui/skynet/render/RenderingUtil.java @@ -195,7 +195,8 @@ public final class RenderingUtil { } public static String toFileName(IOseeBranch branch) throws OseeCoreException { - return encode(Branch.getShortName(branch)); + String shortName = Strings.saferReplace(Branch.getShortName(branch), "\\.", "_"); + return encode(shortName); } private static String encode(String name) throws OseeCoreException { |

