Author: davidb Date: Fri Dec 1 08:20:24 2017 New Revision: 1816804 URL: http://svn.apache.org/viewvc?rev=1816804&view=rev Log: [Converter] Improved name mangling implementation committed on behalf of Peter Kriens with many thanks
Added: felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/UtilTest.java Modified: felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/Util.java Modified: felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/Util.java URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/Util.java?rev=1816804&r1=1816803&r2=1816804&view=diff ============================================================================== --- felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/Util.java (original) +++ felix/trunk/converter/converter/src/main/java/org/osgi/util/converter/Util.java Fri Dec 1 08:20:24 2017 @@ -345,18 +345,48 @@ class Util { } static String unMangleName(String prefix, String key) { - String res = key; - res = res.replace("$$", "\b"); // park double dollar as backspace char - res = res.replace("$_$", "-"); - res = res.replaceAll("_\\$", "."); - res = res.replace("__", "\f"); // park double underscore as formfeed - // char - res = res.replace('_', '.'); - res = res.replace("$", ""); - res = res.replace('\f', '_'); // convert formfeed char back to single - // underscore - res = res.replace('\b', '$'); // convert backspace char back go dollar // TODO handle Java keywords - return prefix + res; + return prefix + mangleMethodName(key); + } + + static String mangleMethodName(String id) { + char[] array = id.toCharArray(); + int out = 0; + + boolean changed = false; + for (int i = 0; i < array.length; i++) { + if (match("$$", array, i) || match("__", array, i)) { + array[out++] = array[i++]; + changed = true; + } else if (match("$_$", array, i)) { + array[out++] = '-'; + i += 2; + } else { + char c = array[i]; + if (c == '_') { + array[out++] = '.'; + changed = true; + } else if (c == '$') { + changed = true; + } else { + array[out++] = c; + } + } + } + if (id.length() != out || changed) + return new String(array, 0, out); + + return id; + } + + private static boolean match(String pattern, char[] array, int i) { + for (int j = 0; j < pattern.length(); j++, i++) { + if (i >= array.length) + return false; + + if (pattern.charAt(j) != array[i]) + return false; + } + return true; } } Added: felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/UtilTest.java URL: http://svn.apache.org/viewvc/felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/UtilTest.java?rev=1816804&view=auto ============================================================================== --- felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/UtilTest.java (added) +++ felix/trunk/converter/converter/src/test/java/org/osgi/util/converter/UtilTest.java Fri Dec 1 08:20:24 2017 @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.osgi.util.converter; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class UtilTest { + @Test + public void testMangling() { + assertMangle("", ""); + assertMangle("a", "a"); + assertMangle("ab", "ab"); + assertMangle("abc", "abc"); + assertMangle("a\u0008bc", "a\bbc"); + + assertMangle("$_$", "-"); + assertMangle("$_", "."); + assertMangle("_$", "."); + assertMangle("x$_$", "x-"); + assertMangle("$_$x", "-x"); + assertMangle("abc$_$abc", "abc-abc"); + assertMangle("$$_$x", "$.x"); + assertMangle("$_$$", "-"); + assertMangle("$_$$$", "-$"); + assertMangle("$", ""); + assertMangle("$$", "$"); + assertMangle("_", "."); + assertMangle("$_", "."); + + assertMangle("myProperty143", "myProperty143"); + assertMangle("$new", "new"); + assertMangle("n$ew", "new"); + assertMangle("new$", "new"); + assertMangle("my$$prop", "my$prop"); + assertMangle("dot_prop", "dot.prop"); + assertMangle("_secret", ".secret"); + assertMangle("another__prop", "another_prop"); + assertMangle("three___prop", "three_.prop"); + assertMangle("four_$__prop", "four._prop"); + assertMangle("five_$_prop", "five..prop"); + } + + private void assertMangle(String methodName, String key) { + assertEquals(Util.mangleMethodName(methodName), key); + } +}