diff options
author | Deepanshu Gupta <deepanshu@google.com> | 2015-12-21 15:46:15 -0800 |
---|---|---|
committer | Deepanshu Gupta <deepanshu@google.com> | 2015-12-22 13:01:35 -0800 |
commit | 4ba16229a40e9758db86d4fb1df5119fdcb8aa2a (patch) | |
tree | 988a015d0dc8ee0cbc1e89d783027509a4d70d6d | |
parent | a82f8fa2073c99aad5fd795c935a908fb4528a5f (diff) | |
download | data-binding-4ba16229a40e9758db86d4fb1df5119fdcb8aa2a.tar.gz |
Change from commons-lang3 to guava
Change-Id: I1a18e06af7bf2d65228f1491663b6e096a9538ed
24 files changed, 444 insertions, 134 deletions
diff --git a/compiler/build.gradle b/compiler/build.gradle index 964a8d8f..8a9e9919 100644 --- a/compiler/build.gradle +++ b/compiler/build.gradle @@ -36,7 +36,6 @@ dependencies { compile project(':dataBinding:compilerCommon') compile project(':dataBinding:baseLibrary') compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - compile 'org.apache.commons:commons-lang3:3.3.2' compile 'commons-io:commons-io:2.4' compile 'commons-codec:commons-codec:1.10' compile 'com.tunnelvisionlabs:antlr4:4.5' diff --git a/compiler/src/main/java/android/databinding/annotationprocessor/ProcessExpressions.java b/compiler/src/main/java/android/databinding/annotationprocessor/ProcessExpressions.java index 9c65f5c1..e1c447c9 100644 --- a/compiler/src/main/java/android/databinding/annotationprocessor/ProcessExpressions.java +++ b/compiler/src/main/java/android/databinding/annotationprocessor/ProcessExpressions.java @@ -16,10 +16,10 @@ package android.databinding.annotationprocessor; +import com.google.common.base.Joiner; + import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.SystemUtils; import android.databinding.BindingBuildInfo; import android.databinding.tool.CompilerChef; @@ -29,6 +29,7 @@ import android.databinding.tool.store.ResourceBundle; import android.databinding.tool.util.GenerationalClassUtil; import android.databinding.tool.util.L; import android.databinding.tool.util.Preconditions; +import android.databinding.tool.util.StringUtils; import java.io.File; import java.io.FilenameFilter; @@ -158,7 +159,7 @@ public class ProcessExpressions extends ProcessDataBinding.ProcessingStep { } if (forLibraryModule) { Set<String> classNames = compilerChef.getWrittenClassNames(); - String out = StringUtils.join(classNames, SystemUtils.LINE_SEPARATOR); + String out = Joiner.on(StringUtils.LINE_SEPARATOR).join(classNames); L.d("Writing list of classes to %s . \nList:%s", exportClassNamesTo, out); try { //noinspection ConstantConditions diff --git a/compiler/src/main/java/android/databinding/tool/ExpressionParser.java b/compiler/src/main/java/android/databinding/tool/ExpressionParser.java index 27168a63..5468c936 100644 --- a/compiler/src/main/java/android/databinding/tool/ExpressionParser.java +++ b/compiler/src/main/java/android/databinding/tool/ExpressionParser.java @@ -27,7 +27,6 @@ import org.antlr.v4.runtime.misc.Nullable; import org.antlr.v4.runtime.tree.ErrorNode; import org.antlr.v4.runtime.tree.ParseTreeListener; import org.antlr.v4.runtime.tree.TerminalNode; -import org.apache.commons.lang3.StringUtils; import android.databinding.parser.BindingExpressionLexer; import android.databinding.parser.BindingExpressionParser; diff --git a/compiler/src/main/java/android/databinding/tool/ExpressionVisitor.java b/compiler/src/main/java/android/databinding/tool/ExpressionVisitor.java index 75078901..08e67443 100644 --- a/compiler/src/main/java/android/databinding/tool/ExpressionVisitor.java +++ b/compiler/src/main/java/android/databinding/tool/ExpressionVisitor.java @@ -16,12 +16,13 @@ package android.databinding.tool; +import com.google.common.base.Objects; + import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.misc.NotNull; import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.runtime.tree.ParseTreeListener; import org.antlr.v4.runtime.tree.TerminalNode; -import org.apache.commons.lang3.ObjectUtils; import android.databinding.parser.BindingExpressionBaseVisitor; import android.databinding.parser.BindingExpressionParser; @@ -218,7 +219,7 @@ public class ExpressionVisitor extends BindingExpressionBaseVisitor<Expr> { List<Expr> args = new ArrayList<Expr>(); if (ctx.args != null) { for (ParseTree item : ctx.args.children) { - if (ObjectUtils.equals(item.getText(), ",")) { + if (Objects.equal(item.getText(), ",")) { continue; } args.add(item.accept(this)); @@ -298,7 +299,7 @@ public class ExpressionVisitor extends BindingExpressionBaseVisitor<Expr> { final List<Expr> args = new ArrayList<Expr>(); if (ctx.resourceParameters() != null) { for (ParseTree item : ctx.resourceParameters().expressionList().children) { - if (ObjectUtils.equals(item.getText(), ",")) { + if (Objects.equal(item.getText(), ",")) { continue; } args.add(item.accept(this)); diff --git a/compiler/src/main/java/android/databinding/tool/reflection/ModelClass.java b/compiler/src/main/java/android/databinding/tool/reflection/ModelClass.java index fb8e4bf6..1dd14892 100644 --- a/compiler/src/main/java/android/databinding/tool/reflection/ModelClass.java +++ b/compiler/src/main/java/android/databinding/tool/reflection/ModelClass.java @@ -15,10 +15,9 @@ */ package android.databinding.tool.reflection; -import org.apache.commons.lang3.StringUtils; - import android.databinding.tool.reflection.Callable.Type; import android.databinding.tool.util.L; +import android.databinding.tool.util.StringUtils; import java.util.ArrayList; import java.util.Arrays; diff --git a/compiler/src/main/java/android/databinding/tool/store/SetterStore.java b/compiler/src/main/java/android/databinding/tool/store/SetterStore.java index 45592c4d..ffeb06b6 100644 --- a/compiler/src/main/java/android/databinding/tool/store/SetterStore.java +++ b/compiler/src/main/java/android/databinding/tool/store/SetterStore.java @@ -15,14 +15,13 @@ */ package android.databinding.tool.store; -import org.apache.commons.lang3.StringUtils; - import android.databinding.tool.reflection.ModelAnalyzer; import android.databinding.tool.reflection.ModelClass; import android.databinding.tool.reflection.ModelMethod; import android.databinding.tool.util.GenerationalClassUtil; import android.databinding.tool.util.L; import android.databinding.tool.util.Preconditions; +import android.databinding.tool.util.StringUtils; import java.io.IOException; import java.io.Serializable; diff --git a/compiler/src/main/kotlin/android/databinding/tool/writer/BRWriter.kt b/compiler/src/main/kotlin/android/databinding/tool/writer/BRWriter.kt index 6c1290c5..261025d4 100644 --- a/compiler/src/main/kotlin/android/databinding/tool/writer/BRWriter.kt +++ b/compiler/src/main/kotlin/android/databinding/tool/writer/BRWriter.kt @@ -16,11 +16,11 @@ package android.databinding.tool.writer -import org.apache.commons.lang3.SystemUtils +import android.databinding.tool.util.StringUtils class BRWriter(properties: Set<String>, val useFinal : Boolean) { val indexedProps = properties.sorted().withIndex() - public fun write(pkg : String): String = "package $pkg;${SystemUtils.LINE_SEPARATOR}$klass" + public fun write(pkg : String): String = "package $pkg;${StringUtils.LINE_SEPARATOR}$klass" val klass: String by lazy { kcode("") { val prefix = if (useFinal) "final " else ""; @@ -32,4 +32,4 @@ class BRWriter(properties: Set<String>, val useFinal : Boolean) { } nl ("}") }.generate() } -}
\ No newline at end of file +} diff --git a/compiler/src/main/kotlin/android/databinding/tool/writer/KCode.kt b/compiler/src/main/kotlin/android/databinding/tool/writer/KCode.kt index fe961b49..2ef78732 100644 --- a/compiler/src/main/kotlin/android/databinding/tool/writer/KCode.kt +++ b/compiler/src/main/kotlin/android/databinding/tool/writer/KCode.kt @@ -13,14 +13,14 @@ package android.databinding.tool.writer -import org.apache.commons.lang3.SystemUtils +import android.databinding.tool.util.StringUtils import java.util.BitSet class KCode (private val s : String? = null){ private var sameLine = false - private val lineSeparator = SystemUtils.LINE_SEPARATOR + private val lineSeparator = StringUtils.LINE_SEPARATOR class Appendix(val glue : String, val code : KCode) @@ -167,4 +167,4 @@ fun kcode(s : String?, init : (KCode.() -> Unit)? = null) : KCode { c.init() } return c -}
\ No newline at end of file +} diff --git a/compiler/src/test/java/android/databinding/tool/expr/ExprModelTest.java b/compiler/src/test/java/android/databinding/tool/expr/ExprModelTest.java index 92b6b3fa..a9ba2e92 100644 --- a/compiler/src/test/java/android/databinding/tool/expr/ExprModelTest.java +++ b/compiler/src/test/java/android/databinding/tool/expr/ExprModelTest.java @@ -16,7 +16,6 @@ package android.databinding.tool.expr; -import org.apache.commons.lang3.ArrayUtils; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -965,7 +964,7 @@ public class ExprModelTest { i = 0; for (Expr expr : iterable) { assertTrue((i++) + ":must be expected " + expr.getUniqueKey() + "\n" + log, - ArrayUtils.contains(exprs, expr)); + Arrays.asList(exprs).contains(expr)); } } diff --git a/compiler/src/test/java/android/databinding/tool/reflection/java/JavaAnalyzer.java b/compiler/src/test/java/android/databinding/tool/reflection/java/JavaAnalyzer.java index ee2b0e5e..1b97cd9f 100644 --- a/compiler/src/test/java/android/databinding/tool/reflection/java/JavaAnalyzer.java +++ b/compiler/src/test/java/android/databinding/tool/reflection/java/JavaAnalyzer.java @@ -13,16 +13,16 @@ package android.databinding.tool.reflection.java; +import com.google.common.base.Splitter; +import com.google.common.base.Strings; + import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; -import org.apache.commons.lang3.StringUtils; import android.databinding.tool.reflection.ModelAnalyzer; import android.databinding.tool.reflection.ModelClass; import android.databinding.tool.reflection.SdkUtil; import android.databinding.tool.reflection.TypeUtil; import android.databinding.tool.util.L; -import android.databinding.tool.util.Preconditions; import java.io.File; import java.io.IOException; @@ -30,6 +30,7 @@ import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.util.HashMap; +import java.util.List; import java.util.Map; public class JavaAnalyzer extends ModelAnalyzer { @@ -145,11 +146,11 @@ public class JavaAnalyzer extends ModelAnalyzer { if (f.exists() && f.canRead()) { try { for (String line : FileUtils.readLines(f)) { - String[] keyValue = StringUtils.split(line, '='); - if (keyValue.length == 2) { - String key = keyValue[0].trim(); + List<String> keyValue = Splitter.on('=').splitToList(line); + if (keyValue.size() == 2) { + String key = keyValue.get(0).trim(); if (key.equals("sdk.dir")) { - return keyValue[1].trim(); + return keyValue.get(1).trim(); } } } @@ -163,7 +164,7 @@ public class JavaAnalyzer extends ModelAnalyzer { public static void initForTests() { String androidHome = loadAndroidHome(); - if (StringUtils.isEmpty(androidHome) || !new File(androidHome).exists()) { + if (Strings.isNullOrEmpty(androidHome) || !new File(androidHome).exists()) { throw new IllegalStateException( "you need to have ANDROID_HOME set in your environment" + " to run compiler tests"); diff --git a/compilerCommon/build.gradle b/compilerCommon/build.gradle index 3ca5feab..91ce05db 100644 --- a/compilerCommon/build.gradle +++ b/compilerCommon/build.gradle @@ -38,10 +38,10 @@ sourceSets { dependencies { testCompile 'junit:junit:4.12' compile project(':dataBinding:baseLibrary') - compile 'org.apache.commons:commons-lang3:3.3.2' compile 'com.tunnelvisionlabs:antlr4:4.5' compile 'commons-io:commons-io:2.4' compile 'com.googlecode.juniversalchardet:juniversalchardet:1.0.3' + compile 'com.google.guava:guava:17.0' } project.tasks.create(name : "generateXmlParser", type : JavaExec) { @@ -80,4 +80,4 @@ tasks['exportBuildVersions'].dependsOn('processResources') project.ext.pomName = 'Data Binding Compiler Common' project.ext.pomDesc = 'Common library that can be shared between different build tools' -enablePublishing(this, true)
\ No newline at end of file +enablePublishing(this, true) diff --git a/compilerCommon/db-compilerCommon-base.iml b/compilerCommon/db-compilerCommon-base.iml index cb081ee9..38f8122f 100644 --- a/compilerCommon/db-compilerCommon-base.iml +++ b/compilerCommon/db-compilerCommon-base.iml @@ -16,15 +16,6 @@ <orderEntry type="module-library" exported=""> <library> <CLASSES> - <root url="jar://$MODULE_DIR$/../../../prebuilts/tools/common/m2/repository/org/apache/commons/commons-lang3/3.3.2/commons-lang3-3.3.2.jar!/" /> - </CLASSES> - <JAVADOC /> - <SOURCES /> - </library> - </orderEntry> - <orderEntry type="module-library" exported=""> - <library> - <CLASSES> <root url="jar://$MODULE_DIR$/../../../prebuilts/tools/common/m2/repository/com/tunnelvisionlabs/antlr4/4.5/antlr4-4.5.jar!/" /> </CLASSES> <JAVADOC /> @@ -118,5 +109,6 @@ </SOURCES> </library> </orderEntry> + <orderEntry type="library" exported="" name="guava-tools" level="project" /> </component> </module>
\ No newline at end of file diff --git a/compilerCommon/db-compilerCommon.iml b/compilerCommon/db-compilerCommon.iml index 38101e32..3b18b8a9 100644 --- a/compilerCommon/db-compilerCommon.iml +++ b/compilerCommon/db-compilerCommon.iml @@ -14,7 +14,7 @@ <orderEntry type="inheritedJdk" /> <orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="module" module-name="db-baseLibrary" /> - <orderEntry type="library" exported="" name="commons-lang3-3.3.2" level="project" /> + <orderEntry type="library" exported="" name="Guava" level="project" /> <orderEntry type="library" exported="" name="commons-io-2.4" level="project" /> <orderEntry type="module-library" exported=""> <library name="juniversalchardet-1.0.3"> diff --git a/compilerCommon/src/main/java/android/databinding/tool/LayoutXmlProcessor.java b/compilerCommon/src/main/java/android/databinding/tool/LayoutXmlProcessor.java index 382c2654..a03b747b 100644 --- a/compilerCommon/src/main/java/android/databinding/tool/LayoutXmlProcessor.java +++ b/compilerCommon/src/main/java/android/databinding/tool/LayoutXmlProcessor.java @@ -13,14 +13,16 @@ package android.databinding.tool; +import com.google.common.escape.Escaper; + import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringEscapeUtils; import org.xml.sax.SAXException; import android.databinding.BindingBuildInfo; import android.databinding.tool.store.LayoutFileParser; import android.databinding.tool.store.ResourceBundle; import android.databinding.tool.util.Preconditions; +import android.databinding.tool.util.SourceCodeEscapers; import android.databinding.tool.writer.JavaFileWriter; import java.io.File; @@ -32,7 +34,6 @@ import java.util.List; import java.util.UUID; import javax.xml.bind.JAXBException; -import javax.xml.bind.Marshaller; import javax.xml.parsers.ParserConfigurationException; import javax.xml.xpath.XPathExpressionException; @@ -289,11 +290,12 @@ public class LayoutXmlProcessor { public void writeInfoClass(/*Nullable*/ File sdkDir, File xmlOutDir, File exportClassListTo, boolean enableDebugLogs, boolean printEncodedErrorLogs) { - final String sdkPath = sdkDir == null ? null : StringEscapeUtils.escapeJava(sdkDir.getAbsolutePath()); + Escaper javaEscaper = SourceCodeEscapers.javaCharEscaper(); + final String sdkPath = sdkDir == null ? null : javaEscaper.escape(sdkDir.getAbsolutePath()); final Class annotation = BindingBuildInfo.class; - final String layoutInfoPath = StringEscapeUtils.escapeJava(xmlOutDir.getAbsolutePath()); + final String layoutInfoPath = javaEscaper.escape(xmlOutDir.getAbsolutePath()); final String exportClassListToPath = exportClassListTo == null ? "" : - StringEscapeUtils.escapeJava(exportClassListTo.getAbsolutePath()); + javaEscaper.escape(exportClassListTo.getAbsolutePath()); String classString = "package " + RESOURCE_BUNDLE_PACKAGE + ";\n\n" + "import " + annotation.getCanonicalName() + ";\n\n" + "@" + annotation.getSimpleName() + "(buildId=\"" + mBuildId + "\", " + diff --git a/compilerCommon/src/main/java/android/databinding/tool/processing/ScopedErrorReport.java b/compilerCommon/src/main/java/android/databinding/tool/processing/ScopedErrorReport.java index dfd20397..b645b37d 100644 --- a/compilerCommon/src/main/java/android/databinding/tool/processing/ScopedErrorReport.java +++ b/compilerCommon/src/main/java/android/databinding/tool/processing/ScopedErrorReport.java @@ -16,9 +16,8 @@ package android.databinding.tool.processing; -import org.apache.commons.lang3.StringUtils; - import android.databinding.tool.store.Location; +import android.databinding.tool.util.StringUtils; import java.util.List; diff --git a/compilerCommon/src/main/java/android/databinding/tool/processing/ScopedException.java b/compilerCommon/src/main/java/android/databinding/tool/processing/ScopedException.java index f2ce2334..0f980729 100644 --- a/compilerCommon/src/main/java/android/databinding/tool/processing/ScopedException.java +++ b/compilerCommon/src/main/java/android/databinding/tool/processing/ScopedException.java @@ -16,11 +16,14 @@ package android.databinding.tool.processing; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.SystemUtils; + +import com.google.common.base.Joiner; +import com.google.common.base.Splitter; +import com.google.common.base.Strings; import android.databinding.tool.store.Location; import android.databinding.tool.util.L; +import android.databinding.tool.util.StringUtils; import java.util.ArrayList; import java.util.List; @@ -86,7 +89,7 @@ public class ScopedException extends RuntimeException { } } sb.append(ERROR_LOG_SUFFIX); - return StringUtils.join(StringUtils.split(sb.toString(), SystemUtils.LINE_SEPARATOR), " "); + return Joiner.on(' ').join(Splitter.on(StringUtils.LINE_SEPARATOR).split(sb)); } public ScopedErrorReport getScopedErrorReport() { @@ -135,7 +138,7 @@ public class ScopedException extends RuntimeException { } } return new ScopedException(message.trim(), - new ScopedErrorReport(StringUtils.isEmpty(file) ? null : file.trim(), locations)); + new ScopedErrorReport(Strings.isNullOrEmpty(file) ? null : file.trim(), locations)); } public static List<ScopedException> extractErrors(String output) { diff --git a/compilerCommon/src/main/java/android/databinding/tool/store/LayoutFileParser.java b/compilerCommon/src/main/java/android/databinding/tool/store/LayoutFileParser.java index aca6fe86..d9749b33 100644 --- a/compilerCommon/src/main/java/android/databinding/tool/store/LayoutFileParser.java +++ b/compilerCommon/src/main/java/android/databinding/tool/store/LayoutFileParser.java @@ -13,31 +13,32 @@ package android.databinding.tool.store; -import android.databinding.parser.XMLLexer; -import android.databinding.parser.XMLParser; -import android.databinding.parser.XMLParserBaseVisitor; -import android.databinding.tool.LayoutXmlProcessor; -import android.databinding.tool.processing.ErrorMessages; -import android.databinding.tool.processing.Scope; -import android.databinding.tool.processing.scopes.FileScopeProvider; -import android.databinding.tool.util.L; -import android.databinding.tool.util.ParserHelper; -import android.databinding.tool.util.Preconditions; -import android.databinding.tool.util.XmlEditor; +import com.google.common.base.Strings; import org.antlr.v4.runtime.ANTLRInputStream; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.misc.NotNull; import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringEscapeUtils; -import org.apache.commons.lang3.StringUtils; import org.mozilla.universalchardet.UniversalDetector; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; +import android.databinding.parser.XMLLexer; +import android.databinding.parser.XMLParser; +import android.databinding.parser.XMLParserBaseVisitor; +import android.databinding.tool.LayoutXmlProcessor; +import android.databinding.tool.processing.ErrorMessages; +import android.databinding.tool.processing.Scope; +import android.databinding.tool.processing.scopes.FileScopeProvider; +import android.databinding.tool.util.L; +import android.databinding.tool.util.ParserHelper; +import android.databinding.tool.util.Preconditions; +import android.databinding.tool.util.StringUtils; +import android.databinding.tool.util.XmlEditor; + import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -130,7 +131,7 @@ public class LayoutFileParser { } private static boolean isProcessedElement(String name) { - if (StringUtils.isEmpty(name)) { + if (Strings.isNullOrEmpty(name)) { return false; } if ("view".equals(name) || "include".equals(name) || name.indexOf('.') >= 0) { @@ -199,7 +200,7 @@ public class LayoutFileParser { if ("include".equals(nodeName)) { // get the layout attribute final String includeValue = attributes.get("layout"); - if (StringUtils.isEmpty(includeValue)) { + if (Strings.isNullOrEmpty(includeValue)) { L.e("%s must include a layout", parent); } if (!includeValue.startsWith(LAYOUT_PREFIX)) { @@ -270,7 +271,7 @@ public class LayoutFileParser { String viewName = elm.elmName.getText(); if ("view".equals(viewName)) { String classNode = attributeMap(elm).get("class"); - if (StringUtils.isEmpty(classNode)) { + if (Strings.isNullOrEmpty(classNode)) { L.e("No class attribute for 'view' node"); } viewName = classNode; @@ -291,9 +292,8 @@ public class LayoutFileParser { String alias = attrMap.get("alias"); Preconditions.check(StringUtils.isNotBlank(type), "Type of an import cannot be empty." + " %s in %s", imp.toStringTree(), xml); - if (StringUtils.isEmpty(alias)) { - final String[] split = StringUtils.split(type, '.'); - alias = split[split.length - 1]; + if (Strings.isNullOrEmpty(alias)) { + alias = type.substring(type.lastIndexOf('.') + 1); } bundle.addImport(alias, type, new Location(imp)); } @@ -487,7 +487,7 @@ public class LayoutFileParser { } String val = textWithQuotes.substring(start, end); if (unescapeValue) { - return StringEscapeUtils.unescapeXml(val); + return StringUtils.unescapeXml(val); } else { return val; } diff --git a/compilerCommon/src/main/java/android/databinding/tool/store/Location.java b/compilerCommon/src/main/java/android/databinding/tool/store/Location.java index e00c34a3..2dd456a6 100644 --- a/compilerCommon/src/main/java/android/databinding/tool/store/Location.java +++ b/compilerCommon/src/main/java/android/databinding/tool/store/Location.java @@ -15,11 +15,12 @@ */ package android.databinding.tool.store; + import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.Token; -import org.apache.commons.lang3.SystemUtils; import android.databinding.tool.processing.scopes.LocationScopeProvider; +import android.databinding.tool.util.StringUtils; import java.util.Collections; import java.util.List; @@ -74,7 +75,7 @@ public class Location { } else { endLine = end.getLine() - 1; // token lines start from 1 String endText = end.getText(); - int lastLineStart = endText.lastIndexOf(SystemUtils.LINE_SEPARATOR); + int lastLineStart = endText.lastIndexOf(StringUtils.LINE_SEPARATOR); String lastLine = lastLineStart < 0 ? endText : endText.substring(lastLineStart + 1); endOffset = end.getCharPositionInLine() + lastLine.length() - 1;//end is inclusive } diff --git a/compilerCommon/src/main/java/android/databinding/tool/store/ResourceBundle.java b/compilerCommon/src/main/java/android/databinding/tool/store/ResourceBundle.java index 3ae7e2d8..3c697fb6 100644 --- a/compilerCommon/src/main/java/android/databinding/tool/store/ResourceBundle.java +++ b/compilerCommon/src/main/java/android/databinding/tool/store/ResourceBundle.java @@ -13,8 +13,6 @@ package android.databinding.tool.store; -import org.apache.commons.lang3.ArrayUtils; - import android.databinding.tool.processing.ErrorMessages; import android.databinding.tool.processing.Scope; import android.databinding.tool.processing.ScopedException; @@ -829,7 +827,7 @@ public class ResourceBundle implements Serializable { if (isBinder()) { mFullClassName = mInterfaceType; } else if (mViewName.indexOf('.') == -1) { - if (ArrayUtils.contains(ANDROID_VIEW_PACKAGE_VIEWS, mViewName)) { + if (Arrays.asList(ANDROID_VIEW_PACKAGE_VIEWS).contains(mViewName)) { mFullClassName = "android.view." + mViewName; } else if("WebView".equals(mViewName)) { mFullClassName = "android.webkit." + mViewName; diff --git a/compilerCommon/src/main/java/android/databinding/tool/util/L.java b/compilerCommon/src/main/java/android/databinding/tool/util/L.java index fe888ca2..4a7af688 100644 --- a/compilerCommon/src/main/java/android/databinding/tool/util/L.java +++ b/compilerCommon/src/main/java/android/databinding/tool/util/L.java @@ -16,10 +16,11 @@ package android.databinding.tool.util; -import org.apache.commons.lang3.exception.ExceptionUtils; - import android.databinding.tool.processing.ScopedException; +import java.io.PrintWriter; +import java.io.StringWriter; + import javax.tools.Diagnostic; import javax.tools.Diagnostic.Kind; @@ -55,7 +56,7 @@ public class L { public static void d(Throwable t, String msg, Object... args) { if (sEnableDebug) { printMessage(Diagnostic.Kind.NOTE, - String.format(msg, args) + " " + ExceptionUtils.getStackTrace(t)); + String.format(msg, args) + " " + getStackTrace(t)); } } @@ -65,7 +66,7 @@ public class L { public static void w(Throwable t, String msg, Object... args) { printMessage(Kind.WARNING, - String.format(msg, args) + " " + ExceptionUtils.getStackTrace(t)); + String.format(msg, args) + " " + getStackTrace(t)); } private static void tryToThrowScoped(Throwable t, String fullMessage) { @@ -91,7 +92,7 @@ public class L { String fullMsg = String.format(msg, args); tryToThrowScoped(t, fullMsg); printMessage(Diagnostic.Kind.ERROR, - fullMsg + " " + ExceptionUtils.getStackTrace(t)); + fullMsg + " " + getStackTrace(t)); } private static void printMessage(Diagnostic.Kind kind, String message) { @@ -108,4 +109,14 @@ public class L { public static interface Client { public void printMessage(Diagnostic.Kind kind, String message); } + + private static String getStackTrace(Throwable t) { + PrintWriter pw = new PrintWriter(new StringWriter()); + try { + t.printStackTrace(pw); + } finally { + pw.close(); + } + return pw.toString(); + } } diff --git a/compilerCommon/src/main/java/android/databinding/tool/util/ParserHelper.java b/compilerCommon/src/main/java/android/databinding/tool/util/ParserHelper.java index c3740e5d..8b3a93be 100644 --- a/compilerCommon/src/main/java/android/databinding/tool/util/ParserHelper.java +++ b/compilerCommon/src/main/java/android/databinding/tool/util/ParserHelper.java @@ -16,8 +16,6 @@ package android.databinding.tool.util; -import org.apache.commons.lang3.StringUtils; - public class ParserHelper { public static String toClassName(String name) { StringBuilder builder = new StringBuilder(); diff --git a/compilerCommon/src/main/java/android/databinding/tool/util/SourceCodeEscapers.java b/compilerCommon/src/main/java/android/databinding/tool/util/SourceCodeEscapers.java new file mode 100644 index 00000000..d979b674 --- /dev/null +++ b/compilerCommon/src/main/java/android/databinding/tool/util/SourceCodeEscapers.java @@ -0,0 +1,207 @@ +/* + * Copyright (C) 2009 The Guava Authors + * + * Licensed 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 android.databinding.tool.util; + +import com.google.common.escape.ArrayBasedCharEscaper; +import com.google.common.escape.CharEscaper; +import com.google.common.escape.Escaper; + +import java.util.HashMap; +import java.util.Map; + +/** + * This file has been copied from the google internal implementation of guava. Some unused parts of + * the file have been removed. + */ + +/** + * A factory for Escaper instances used to escape strings for safe use in + * various common programming languages. + * + * @author Alex Matevossian + * @author David Beaumont + */ +public final class SourceCodeEscapers { + private SourceCodeEscapers() {} + + // For each xxxEscaper() method, please add links to external reference pages + // that are considered authoritative for the behavior of that escaper. + + // From: http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters + private static final char PRINTABLE_ASCII_MIN = 0x20; // ' ' + private static final char PRINTABLE_ASCII_MAX = 0x7E; // '~' + + private static final char[] HEX_DIGITS = "0123456789abcdef".toCharArray(); + + /** + * Returns an {@link Escaper} instance that escapes special characters in a + * string so it can safely be included in either a Java character literal or + * string literal. This is the preferred way to escape Java characters for + * use in String or character literals. + * + * <p>For more details, see <a href="http://goo.gl/NsGW7">Escape Sequences for + * Character and String Literals</a> in The Java Language Specification. + */ + public static Escaper javaCharEscaper() { + return JAVA_CHAR_ESCAPER; + } + + /** + * Returns an {@link Escaper} instance that escapes special characters in a + * string so it can safely be included in either a Java character literal or + * string literal. The behavior of this escaper is the same as that of the + * {@link #javaStringEscaperWithOctal()} except it also escapes single quotes. + * + * <p>Unlike {@link #javaCharEscaper} this escaper produces octal escape + * sequences ({@literal \}nnn) for characters with values less than 256. While + * the escaped output can be shorter than when the standard Unicode escape + * sequence ({@literal \}uxxxx) is used, the Java Language Specification + * discourages the use of octal for escaping Java strings. It is strongly + * recommended that, if possible, you use {@code javaCharEscaper()} in + * preference to this method. + * + * <p>For more details, see <a href="http://goo.gl/NsGW7">Escape Sequences for + * Character and String Literals</a> in The Java Language Specification. + */ + public static Escaper javaCharEscaperWithOctal() { + return JAVA_CHAR_ESCAPER_WITH_OCTAL; + } + + /** + * Returns an {@link Escaper} instance that escapes special characters in a + * string so it can safely be included in a Java string literal. + * + * <p><b>Note:</b> Single quotes are not escaped, so it is <b>not safe</b> to + * use this escaper for escaping character literals. + * + * <p>Unlike {@link #javaCharEscaper} this escaper produces octal escape + * sequences ({@literal \}nnn) for characters with values less than 256. While + * the escaped output can be shorter than when the standard Unicode escape + * sequence ({@literal \}uxxxx) is used, the Java Language Specification + * discourages the use of octal for escaping Java strings. It is strongly + * recommended that, if possible, you use {@code javaCharEscaper()} in + * preference to this method. + * + * <p>For more details, see <a href="http://goo.gl/NsGW7">Escape Sequences for + * Character and String Literals</a> in The Java Language Specification. + */ + public static Escaper javaStringEscaperWithOctal() { + return JAVA_STRING_ESCAPER_WITH_OCTAL; + } + + private static final Escaper JAVA_CHAR_ESCAPER; + private static final Escaper JAVA_CHAR_ESCAPER_WITH_OCTAL; + private static final Escaper JAVA_STRING_ESCAPER_WITH_OCTAL; + static { + Map<Character, String> javaMap = new HashMap<Character, String>(); + javaMap.put('\b', "\\b"); + javaMap.put('\f', "\\f"); + javaMap.put('\n', "\\n"); + javaMap.put('\r', "\\r"); + javaMap.put('\t', "\\t"); + javaMap.put('\"', "\\\""); + javaMap.put('\\', "\\\\"); + JAVA_STRING_ESCAPER_WITH_OCTAL = new JavaCharEscaperWithOctal(javaMap); + // The only difference is that the char escaper also escapes single quotes. + javaMap.put('\'', "\\'"); + JAVA_CHAR_ESCAPER = new JavaCharEscaper(javaMap); + JAVA_CHAR_ESCAPER_WITH_OCTAL = new JavaCharEscaperWithOctal(javaMap); + } + + // This escaper does not produce octal escape sequences. See: + // http://goo.gl/NsGW7 + // "Octal escapes are provided for compatibility with C, but can express + // only Unicode values \u0000 through \u00FF, so Unicode escapes are + // usually preferred." + private static class JavaCharEscaper extends ArrayBasedCharEscaper { + JavaCharEscaper(Map<Character, String> replacements) { + super(replacements, PRINTABLE_ASCII_MIN, PRINTABLE_ASCII_MAX); + } + + @Override protected char[] escapeUnsafe(char c) { + return asUnicodeHexEscape(c); + } + } + + private static class JavaCharEscaperWithOctal extends ArrayBasedCharEscaper { + JavaCharEscaperWithOctal(Map<Character, String> replacements) { + super(replacements, PRINTABLE_ASCII_MIN, PRINTABLE_ASCII_MAX); + } + + @Override protected char[] escapeUnsafe(char c) { + if (c < 0x100) { + return asOctalEscape(c); + } else { + return asUnicodeHexEscape(c); + } + } + } + + /** + * Returns an {@link Escaper} instance that replaces non-ASCII characters + * in a string with their Unicode escape sequences ({@code \\uxxxx} where + * {@code xxxx} is a hex number). Existing escape sequences won't be affected. + * + * <p>As existing escape sequences are not re-escaped, this escaper is + * idempotent. However this means that there can be no well defined inverse + * function for this escaper. + * + * <p><b>Note:</b> the returned escaper is still a {@code CharEscaper} and + * will not combine surrogate pairs into a single code point before escaping. + */ + public static Escaper javaStringUnicodeEscaper() { + return JAVA_STRING_UNICODE_ESCAPER; + } + + private static final Escaper JAVA_STRING_UNICODE_ESCAPER + = new CharEscaper() { + @Override protected char[] escape(char c) { + if (c < 0x80) { + return null; + } + return asUnicodeHexEscape(c); + } + }; + + // Helper for common case of escaping a single char. + private static char[] asUnicodeHexEscape(char c) { + // Equivalent to String.format("\\u%04x", (int) c); + char[] r = new char[6]; + r[0] = '\\'; + r[1] = 'u'; + r[5] = HEX_DIGITS[c & 0xF]; + c >>>= 4; + r[4] = HEX_DIGITS[c & 0xF]; + c >>>= 4; + r[3] = HEX_DIGITS[c & 0xF]; + c >>>= 4; + r[2] = HEX_DIGITS[c & 0xF]; + return r; + } + + // Helper for backward compatible octal escape sequences (c < 256) + private static char[] asOctalEscape(char c) { + char[] r = new char[4]; + r[0] = '\\'; + r[3] = HEX_DIGITS[c & 0x7]; + c >>>= 3; + r[2] = HEX_DIGITS[c & 0x7]; + c >>>= 3; + r[1] = HEX_DIGITS[c & 0x3]; + return r; + } +} diff --git a/compilerCommon/src/main/java/android/databinding/tool/util/StringUtils.java b/compilerCommon/src/main/java/android/databinding/tool/util/StringUtils.java new file mode 100644 index 00000000..5f535baf --- /dev/null +++ b/compilerCommon/src/main/java/android/databinding/tool/util/StringUtils.java @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed 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 android.databinding.tool.util; + +import com.google.common.base.StandardSystemProperty; +import com.google.common.base.Strings; + +import org.antlr.v4.runtime.misc.Nullable; + +public class StringUtils { + + public static final String LINE_SEPARATOR = StandardSystemProperty.LINE_SEPARATOR.value(); + /** The entity for the ampersand character */ + private static final String AMP_ENTITY = "&"; + /** The entity for the quote character */ + private static final String QUOT_ENTITY = """; + /** The entity for the apostrophe character */ + private static final String APOS_ENTITY = "'"; + /** The entity for the less than character */ + private static final String LT_ENTITY = "<"; + /** The entity for the greater than character */ + private static final String GT_ENTITY = ">"; + /** The entity for the tab character */ + private static final String TAB_ENTITY = "	"; + /** The entity for the carriage return character */ + private static final String CR_ENTITY = "
"; + /** The entity for the line feed character */ + private static final String LFEED_ENTITY = "
"; + + public static boolean isNotBlank(@Nullable CharSequence string) { + if (string == null) { + return false; + } + for (int i = 0, n = string.length(); i < n; i++) { + if (!Character.isWhitespace(string.charAt(i))) { + return true; + } + } + return false; + } + + public static String capitalize(@Nullable String string) { + if (Strings.isNullOrEmpty(string)) { + return string; + } + char ch = string.charAt(0); + if (Character.isTitleCase(ch)) { + return string; + } + return Character.toTitleCase(ch) + string.substring(1); + } + + public static String unescapeXml(String escaped) { + // TODO: unescape unicode codepoints + return escaped.replace(QUOT_ENTITY, "\"") + .replace(LT_ENTITY, "<") + .replace(GT_ENTITY, ">") + .replace(APOS_ENTITY, "'") + .replace(AMP_ENTITY, "&") + .replace(TAB_ENTITY, "\t") + .replace(CR_ENTITY, "\r") + .replace(LFEED_ENTITY, "\n"); + } + + private StringUtils() { + } + +} diff --git a/compilerCommon/src/main/java/android/databinding/tool/util/XmlEditor.java b/compilerCommon/src/main/java/android/databinding/tool/util/XmlEditor.java index f40a639f..2dce2af1 100644 --- a/compilerCommon/src/main/java/android/databinding/tool/util/XmlEditor.java +++ b/compilerCommon/src/main/java/android/databinding/tool/util/XmlEditor.java @@ -16,16 +16,14 @@ package android.databinding.tool.util; +import com.google.common.base.Joiner; +import com.google.common.xml.XmlEscapers; + import org.antlr.v4.runtime.ANTLRInputStream; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.tree.TerminalNode; import org.apache.commons.io.FileUtils; -import org.apache.commons.lang3.StringEscapeUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.SystemUtils; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; import android.databinding.parser.BindingExpressionLexer; import android.databinding.parser.BindingExpressionParser; @@ -57,15 +55,14 @@ public class XmlEditor { CommonTokenStream tokenStream = new CommonTokenStream(lexer); XMLParser parser = new XMLParser(tokenStream); XMLParser.DocumentContext expr = parser.document(); - XMLParser.ElementContext root = expr.element(); + ElementContext root = expr.element(); if (root == null || !"layout".equals(nodeName(root))) { return null; // not a binding layout } List<? extends ElementContext> childrenOfRoot = elements(root); - List<? extends XMLParser.ElementContext> dataNodes = filterNodesByName("data", - childrenOfRoot); + List<? extends ElementContext> dataNodes = filterNodesByName("data", childrenOfRoot); if (dataNodes.size() > 1) { L.e("Multiple binding data tags in %s. Expecting a maximum of one.", f.getAbsolutePath()); @@ -74,20 +71,19 @@ public class XmlEditor { ArrayList<String> lines = new ArrayList<String>(); lines.addAll(FileUtils.readLines(f, "utf-8")); - for (android.databinding.parser.XMLParser.ElementContext it : dataNodes) { + for (ElementContext it : dataNodes) { replace(lines, toPosition(it.getStart()), toEndPosition(it.getStop()), ""); } - List<? extends XMLParser.ElementContext> layoutNodes = + List<? extends ElementContext> layoutNodes = excludeNodesByName("data", childrenOfRoot); if (layoutNodes.size() != 1) { L.e("Only one layout element and one data element are allowed. %s has %d", f.getAbsolutePath(), layoutNodes.size()); } - final XMLParser.ElementContext layoutNode = layoutNodes.get(0); + final ElementContext layoutNode = layoutNodes.get(0); - ArrayList<Pair<String, android.databinding.parser.XMLParser.ElementContext>> noTag = - new ArrayList<Pair<String, ElementContext>>(); + ArrayList<TagAndContext> noTag = new ArrayList<TagAndContext>(); recurseReplace(layoutNode, lines, noTag, newTag, 0); @@ -97,38 +93,36 @@ public class XmlEditor { replace(lines, rootStartTag, rootEndTag, ""); // Remove the </layout> - ImmutablePair<Position, Position> endLayoutPositions = findTerminalPositions(root, lines); + PositionPair endLayoutPositions = findTerminalPositions(root, lines); replace(lines, endLayoutPositions.left, endLayoutPositions.right, ""); StringBuilder rootAttributes = new StringBuilder(); for (AttributeContext attr : attributes(root)) { rootAttributes.append(' ').append(attr.getText()); } - Pair<String, XMLParser.ElementContext> noTagRoot = null; - for (Pair<String, XMLParser.ElementContext> pair : noTag) { - if (pair.getRight() == layoutNode) { - noTagRoot = pair; + TagAndContext noTagRoot = null; + for (TagAndContext tagAndContext : noTag) { + if (tagAndContext.getContext() == layoutNode) { + noTagRoot = tagAndContext; break; } } if (noTagRoot != null) { - ImmutablePair<String, XMLParser.ElementContext> - newRootTag = new ImmutablePair<String, ElementContext>( - noTagRoot.getLeft() + rootAttributes.toString(), layoutNode); + TagAndContext newRootTag = new TagAndContext( + noTagRoot.getTag() + rootAttributes.toString(), layoutNode); int index = noTag.indexOf(noTagRoot); noTag.set(index, newRootTag); } else { - ImmutablePair<String, XMLParser.ElementContext> newRootTag = - new ImmutablePair<String, ElementContext>(rootAttributes.toString(), layoutNode); + TagAndContext newRootTag = + new TagAndContext(rootAttributes.toString(), layoutNode); noTag.add(newRootTag); } //noinspection NullableProblems - Collections.sort(noTag, new Comparator<Pair<String, XMLParser.ElementContext>>() { + Collections.sort(noTag, new Comparator<TagAndContext>() { @Override - public int compare(Pair<String, XMLParser.ElementContext> o1, - Pair<String, XMLParser.ElementContext> o2) { - Position start1 = toPosition(o1.getRight().getStart()); - Position start2 = toPosition(o2.getRight().getStart()); + public int compare(TagAndContext o1, TagAndContext o2) { + Position start1 = toPosition(o1.getContext().getStart()); + Position start2 = toPosition(o2.getContext().getStart()); int lineCmp = start2.line - start1.line; if (lineCmp != 0) { return lineCmp; @@ -136,9 +130,9 @@ public class XmlEditor { return start2.charIndex - start1.charIndex; } }); - for (Pair<String, android.databinding.parser.XMLParser.ElementContext> it : noTag) { - XMLParser.ElementContext element = it.getRight(); - String tag = it.getLeft(); + for (TagAndContext it : noTag) { + ElementContext element = it.getContext(); + String tag = it.getTag(); Position endTagPosition = endTagPosition(element); fixPosition(lines, endTagPosition); String line = lines.get(endTagPosition.line); @@ -146,7 +140,7 @@ public class XmlEditor { line.substring(endTagPosition.charIndex); lines.set(endTagPosition.line, newLine); } - return StringUtils.join(lines, SystemUtils.LINE_SEPARATOR); + return Joiner.on(StringUtils.LINE_SEPARATOR).join(lines); } private static <T extends XMLParser.ElementContext> List<T> @@ -180,11 +174,11 @@ public class XmlEditor { token.getCharPositionInLine() + token.getText().length()); } - public static String nodeName(XMLParser.ElementContext elementContext) { + public static String nodeName(ElementContext elementContext) { return elementContext.elmName.getText(); } - public static List<? extends AttributeContext> attributes(XMLParser.ElementContext elementContext) { + public static List<? extends AttributeContext> attributes(ElementContext elementContext) { if (elementContext.attribute() == null) return new ArrayList<AttributeContext>(); else { @@ -192,8 +186,8 @@ public class XmlEditor { } } - public static List<? extends AttributeContext> expressionAttributes ( - XMLParser.ElementContext elementContext) { + public static List<? extends AttributeContext> expressionAttributes( + ElementContext elementContext) { List<AttributeContext> result = new ArrayList<AttributeContext>(); for (AttributeContext input : attributes(elementContext)) { String attrName = input.attrName.getText(); @@ -207,7 +201,7 @@ public class XmlEditor { return result; } - private static Position endTagPosition(XMLParser.ElementContext context) { + private static Position endTagPosition(ElementContext context) { if (context.content() == null) { // no content, so just choose the start of the "/>" Position endTag = toPosition(context.getStop()); @@ -226,8 +220,7 @@ public class XmlEditor { } } - public static List<? extends android.databinding.parser.XMLParser.ElementContext> elements( - XMLParser.ElementContext context) { + public static List<? extends ElementContext> elements(ElementContext context) { if (context.content() != null && context.content().element() != null) { return context.content().element(); } @@ -269,7 +262,7 @@ public class XmlEditor { return line.substring(0, start) + newText + line.substring(end); } - public static boolean hasExpressionAttributes(XMLParser.ElementContext context) { + public static boolean hasExpressionAttributes(ElementContext context) { List<? extends AttributeContext> expressions = expressionAttributes(context); int size = expressions.size(); if (size == 0) { @@ -284,8 +277,8 @@ public class XmlEditor { } } - private static int recurseReplace(XMLParser.ElementContext node, ArrayList<String> lines, - ArrayList<Pair<String, XMLParser.ElementContext>> noTag, + private static int recurseReplace(ElementContext node, ArrayList<String> lines, + ArrayList<TagAndContext> noTag, String newTag, int bindingIndex) { int nextBindingIndex = bindingIndex; boolean isMerge = "merge".equals(nodeName(node)); @@ -310,7 +303,7 @@ public class XmlEditor { } } if (tag.length() != 0) { - noTag.add(new ImmutablePair<String, ElementContext>(tag, node)); + noTag.add(new TagAndContext(tag, node)); } } @@ -320,7 +313,7 @@ public class XmlEditor { } else { nextTag = null; } - for (XMLParser.ElementContext it : elements(node)) { + for (ElementContext it : elements(node)) { nextBindingIndex = recurseReplace(it, lines, noTag, nextTag, nextBindingIndex); } return nextBindingIndex; @@ -332,8 +325,7 @@ public class XmlEditor { if (!escapedText.startsWith("@{") || !escapedText.endsWith("}")) { return null; } - String text = StringEscapeUtils - .unescapeXml(escapedText.substring(2, escapedText.length() - 1)); + String text = StringUtils.unescapeXml(escapedText.substring(2, escapedText.length() - 1)); ANTLRInputStream inputStream = new ANTLRInputStream(text); BindingExpressionLexer lexer = new BindingExpressionLexer(inputStream); CommonTokenStream tokenStream = new CommonTokenStream(lexer); @@ -352,12 +344,12 @@ public class XmlEditor { if (doubleQuote != null) { String quotedStr = doubleQuote.getText(); String unquoted = quotedStr.substring(1, quotedStr.length() - 1); - return StringEscapeUtils.escapeXml10(unquoted); + return XmlEscapers.xmlAttributeEscaper().escape(unquoted); } else { String quotedStr = stringLiteral.SingleQuoteString().getText(); String unquoted = quotedStr.substring(1, quotedStr.length() - 1); String unescaped = unquoted.replace("\"", "\\\"").replace("\\`", "`"); - return StringEscapeUtils.escapeXml10(unescaped); + return XmlEscapers.xmlAttributeEscaper().escape(unescaped); } } } @@ -366,8 +358,8 @@ public class XmlEditor { return null; } - private static ImmutablePair<Position, Position> findTerminalPositions( - XMLParser.ElementContext node, ArrayList<String> lines) { + private static PositionPair findTerminalPositions(ElementContext node, + ArrayList<String> lines) { Position endPosition = toEndPosition(node.getStop()); Position startPosition = toPosition(node.getStop()); int index; @@ -378,7 +370,7 @@ public class XmlEditor { startPosition.line++; startPosition.charIndex = index; //noinspection unchecked - return new ImmutablePair<Position, Position>(startPosition, endPosition); + return new PositionPair(startPosition, endPosition); } private static String replaceWithSpaces(String line, int start, int end) { @@ -407,4 +399,31 @@ public class XmlEditor { } } + private static class TagAndContext { + private final String mTag; + private final ElementContext mElementContext; + + private TagAndContext(String tag, ElementContext elementContext) { + mTag = tag; + mElementContext = elementContext; + } + + private ElementContext getContext() { + return mElementContext; + } + + private String getTag() { + return mTag; + } + } + + private static class PositionPair { + private final Position left; + private final Position right; + + private PositionPair(Position left, Position right) { + this.left = left; + this.right = right; + } + } } |