summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDeepanshu Gupta <deepanshu@google.com>2015-12-21 15:46:15 -0800
committerDeepanshu Gupta <deepanshu@google.com>2015-12-22 13:01:35 -0800
commit4ba16229a40e9758db86d4fb1df5119fdcb8aa2a (patch)
tree988a015d0dc8ee0cbc1e89d783027509a4d70d6d
parenta82f8fa2073c99aad5fd795c935a908fb4528a5f (diff)
downloaddata-binding-4ba16229a40e9758db86d4fb1df5119fdcb8aa2a.tar.gz
Change from commons-lang3 to guava
Change-Id: I1a18e06af7bf2d65228f1491663b6e096a9538ed
-rw-r--r--compiler/build.gradle1
-rw-r--r--compiler/src/main/java/android/databinding/annotationprocessor/ProcessExpressions.java7
-rw-r--r--compiler/src/main/java/android/databinding/tool/ExpressionParser.java1
-rw-r--r--compiler/src/main/java/android/databinding/tool/ExpressionVisitor.java7
-rw-r--r--compiler/src/main/java/android/databinding/tool/reflection/ModelClass.java3
-rw-r--r--compiler/src/main/java/android/databinding/tool/store/SetterStore.java3
-rw-r--r--compiler/src/main/kotlin/android/databinding/tool/writer/BRWriter.kt6
-rw-r--r--compiler/src/main/kotlin/android/databinding/tool/writer/KCode.kt6
-rw-r--r--compiler/src/test/java/android/databinding/tool/expr/ExprModelTest.java3
-rw-r--r--compiler/src/test/java/android/databinding/tool/reflection/java/JavaAnalyzer.java17
-rw-r--r--compilerCommon/build.gradle4
-rw-r--r--compilerCommon/db-compilerCommon-base.iml10
-rw-r--r--compilerCommon/db-compilerCommon.iml2
-rw-r--r--compilerCommon/src/main/java/android/databinding/tool/LayoutXmlProcessor.java12
-rw-r--r--compilerCommon/src/main/java/android/databinding/tool/processing/ScopedErrorReport.java3
-rw-r--r--compilerCommon/src/main/java/android/databinding/tool/processing/ScopedException.java11
-rw-r--r--compilerCommon/src/main/java/android/databinding/tool/store/LayoutFileParser.java40
-rw-r--r--compilerCommon/src/main/java/android/databinding/tool/store/Location.java5
-rw-r--r--compilerCommon/src/main/java/android/databinding/tool/store/ResourceBundle.java4
-rw-r--r--compilerCommon/src/main/java/android/databinding/tool/util/L.java21
-rw-r--r--compilerCommon/src/main/java/android/databinding/tool/util/ParserHelper.java2
-rw-r--r--compilerCommon/src/main/java/android/databinding/tool/util/SourceCodeEscapers.java207
-rw-r--r--compilerCommon/src/main/java/android/databinding/tool/util/StringUtils.java82
-rw-r--r--compilerCommon/src/main/java/android/databinding/tool/util/XmlEditor.java121
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 = "&amp;";
+ /** The entity for the quote character */
+ private static final String QUOT_ENTITY = "&quot;";
+ /** The entity for the apostrophe character */
+ private static final String APOS_ENTITY = "&apos;";
+ /** The entity for the less than character */
+ private static final String LT_ENTITY = "&lt;";
+ /** The entity for the greater than character */
+ private static final String GT_ENTITY = "&gt;";
+ /** The entity for the tab character */
+ private static final String TAB_ENTITY = "&#x9;";
+ /** The entity for the carriage return character */
+ private static final String CR_ENTITY = "&#xD;";
+ /** The entity for the line feed character */
+ private static final String LFEED_ENTITY = "&#xA;";
+
+ 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;
+ }
+ }
}