From: Robert Varga Date: Mon, 2 Mar 2020 12:58:50 +0000 (+0100) Subject: Fix YANG snippet escaping X-Git-Tag: v4.0.12~1 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=mdsal.git;a=commitdiff_plain;h=62d1bb7f2cf0c96ce34ca181462132dc95555daf Fix YANG snippet escaping This is the non-javadoc path for module generation, where we are failing to escape potential unicode references. Add the proper callout and also optimize it to be a faster no-op when not applicable, properly documenting what is going on. JIRA: MDSAL-529 Change-Id: Ib21ed4f15555d49aaa7eb3dac61043c4b2e90451 Signed-off-by: Robert Varga --- diff --git a/binding/mdsal-binding-generator-util/src/main/java/org/opendaylight/mdsal/binding/model/util/BindingGeneratorUtil.java b/binding/mdsal-binding-generator-util/src/main/java/org/opendaylight/mdsal/binding/model/util/BindingGeneratorUtil.java index 563e58e360..15b733a063 100644 --- a/binding/mdsal-binding-generator-util/src/main/java/org/opendaylight/mdsal/binding/model/util/BindingGeneratorUtil.java +++ b/binding/mdsal-binding-generator-util/src/main/java/org/opendaylight/mdsal/binding/model/util/BindingGeneratorUtil.java @@ -410,7 +410,28 @@ public final class BindingGeneratorUtil { return description; } + @Deprecated public static String replaceAllIllegalChars(final CharSequence stringBuilder) { + return defangUnicodeEscapes(stringBuilder); + } + + /** + * Escape potential unicode references so that the resulting string is safe to put into a {@code .java} file. This + * processing is required to ensure this text we want to append does not end up with eligible backslashes. See + * Java Language Specification + * for more information. + * + * @param str Input string + * @return A string with all backslashes made ineligible + */ + public static String replaceAllIllegalChars(final String str) { + final int backslash = str.indexOf('\\'); + return backslash == -1 ? str : defangUnicodeEscapes(str); + } + + private static String defangUnicodeEscapes(final CharSequence stringBuilder) { + // TODO: we should be able to receive the first offset from the non-deprecated method and perform a manual + // check for eligibility and escape -- that would be faster I think. final String ret = UNICODE_CHAR_PATTERN.matcher(stringBuilder).replaceAll("\\\\\\\\u"); return ret.isEmpty() ? "" : ret; } diff --git a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/BaseTemplate.xtend b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/BaseTemplate.xtend index 6b2bd49146..71005ca2ac 100644 --- a/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/BaseTemplate.xtend +++ b/binding/mdsal-binding-java-api-generator/src/main/java/org/opendaylight/mdsal/binding/java/api/generator/BaseTemplate.xtend @@ -31,6 +31,7 @@ import org.opendaylight.mdsal.binding.model.api.Type import org.opendaylight.mdsal.binding.model.api.TypeMember import org.opendaylight.mdsal.binding.model.api.YangSourceDefinition.Single import org.opendaylight.mdsal.binding.model.api.YangSourceDefinition.Multiple +import org.opendaylight.mdsal.binding.model.util.BindingGeneratorUtil import org.opendaylight.mdsal.binding.model.util.TypeConstants import org.opendaylight.mdsal.binding.model.util.Types import org.opendaylight.mdsal.binding.spec.naming.BindingMapping @@ -285,7 +286,7 @@ abstract class BaseTemplate extends JavaFileTemplate { def private static void appendYangSnippet(StringBuilder sb, ModuleEffectiveStatement module, DeclaredStatement stmt) { for (String str : YANG_FORMATTER.toYangTextSnippet(module, stmt)) { - sb.append(encodeAngleBrackets(encodeJavadocSymbols(str))) + sb.append(BindingGeneratorUtil.replaceAllIllegalChars(encodeAngleBrackets(encodeJavadocSymbols(str)))) } } diff --git a/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/test/CompilationTest.java b/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/test/CompilationTest.java index a62dc5ad4d..16aa921b6d 100644 --- a/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/test/CompilationTest.java +++ b/binding/mdsal-binding-java-api-generator/src/test/java/org/opendaylight/mdsal/binding/java/api/generator/test/CompilationTest.java @@ -681,6 +681,15 @@ public class CompilationTest extends BaseCompilationTest { CompilationTestUtils.cleanUp(sourcesOutputDir, compiledOutputDir); } + @Test + public void testMdsal529() throws Exception { + final File sourcesOutputDir = CompilationTestUtils.generatorOutput("mdsal529"); + final File compiledOutputDir = CompilationTestUtils.compilerOutput("mdsal529"); + generateTestSources("/compilation/mdsal529", sourcesOutputDir); + CompilationTestUtils.testCompilation(sourcesOutputDir, compiledOutputDir); + CompilationTestUtils.cleanUp(sourcesOutputDir, compiledOutputDir); + } + private static void testReturnTypeIdentityref(final Class clazz, final String methodName, final String returnTypeStr) throws NoSuchMethodException { Method method = clazz.getMethod(methodName); diff --git a/binding/mdsal-binding-java-api-generator/src/test/resources/compilation/mdsal529/foo.yang b/binding/mdsal-binding-java-api-generator/src/test/resources/compilation/mdsal529/foo.yang new file mode 100644 index 0000000000..e6cbfbfbd5 --- /dev/null +++ b/binding/mdsal-binding-java-api-generator/src/test/resources/compilation/mdsal529/foo.yang @@ -0,0 +1,25 @@ +module foo { + namespace foo; + prefix foo; + + leaf foo { + type string; + default "\\u@\\h\\M% "; + } + + leaf bar { + type string; + default "\\uu"; + } + + leaf baz { + type string; + default "\\a\\uu"; + } + + leaf xyzzy { + type string; + default '\uuuaaa'; + } +} +