
android.databinding.tool.processing.ScopedException Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of compilerCommon Show documentation
Show all versions of compilerCommon Show documentation
Common library that can be shared between different build tools
/*
* 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.processing;
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;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* An exception that contains scope information.
*/
public class ScopedException extends RuntimeException {
public static final String ERROR_LOG_PREFIX = "****/ data binding error ****";
public static final String ERROR_LOG_SUFFIX = "****\\ data binding error ****";
public static final String MSG_KEY = "msg:";
public static final String LOCATION_KEY = "loc:";
public static final String FILE_KEY = "file:";
private static boolean sEncodeOutput = false;
private ScopedErrorReport mScopedErrorReport;
private String mScopeLog;
public ScopedException(String message, Object... args) {
super(message == null ? "unknown data binding exception" :
args.length == 0 ? message : String.format(message, args));
mScopedErrorReport = Scope.createReport();
mScopeLog = L.isDebugEnabled() ? Scope.produceScopeLog() : null;
}
ScopedException(String message, ScopedErrorReport scopedErrorReport) {
super(message);
mScopedErrorReport = scopedErrorReport;
}
public String getBareMessage() {
return super.getMessage();
}
@Override
public String getMessage() {
return sEncodeOutput ? createEncodedMessage() : createHumanReadableMessage();
}
public String createHumanReadableMessage() {
ScopedErrorReport scopedError = getScopedErrorReport();
StringBuilder sb = new StringBuilder();
sb.append(super.getMessage()).append("\n")
.append("file://").append(scopedError.getFilePath());
if (scopedError.getLocations() != null && scopedError.getLocations().size() > 0) {
sb.append(" Line:");
sb.append(scopedError.getLocations().get(0).startLine);
}
sb.append("\n");
return sb.toString();
}
private String createEncodedMessage() {
ScopedErrorReport scopedError = getScopedErrorReport();
StringBuilder sb = new StringBuilder();
sb.append(ERROR_LOG_PREFIX)
.append(MSG_KEY).append(super.getMessage()).append("\n")
.append(FILE_KEY).append(scopedError.getFilePath()).append("\n");
if (scopedError.getLocations() != null) {
for (Location location : scopedError.getLocations()) {
sb.append(LOCATION_KEY).append(location.toUserReadableString()).append("\n");
}
}
sb.append(ERROR_LOG_SUFFIX);
return Joiner.on(' ').join(Splitter.on(StringUtils.LINE_SEPARATOR).split(sb));
}
public ScopedErrorReport getScopedErrorReport() {
return mScopedErrorReport;
}
public boolean isValid() {
return mScopedErrorReport.isValid();
}
public static ScopedException createFromOutput(String output) {
String message = "";
String file = "";
List locations = new ArrayList();
int msgStart = output.indexOf(MSG_KEY);
if (msgStart < 0) {
message = output;
} else {
int fileStart = output.indexOf(FILE_KEY, msgStart + MSG_KEY.length());
if (fileStart < 0) {
message = output;
} else {
message = output.substring(msgStart + MSG_KEY.length(), fileStart);
int locStart = output.indexOf(LOCATION_KEY, fileStart + FILE_KEY.length());
if (locStart < 0) {
file = output.substring(fileStart + FILE_KEY.length());
} else {
file = output.substring(fileStart + FILE_KEY.length(), locStart);
int nextLoc = 0;
while(nextLoc >= 0) {
nextLoc = output.indexOf(LOCATION_KEY, locStart + LOCATION_KEY.length());
Location loc;
if (nextLoc < 0) {
loc = Location.fromUserReadableString(
output.substring(locStart + LOCATION_KEY.length()));
} else {
loc = Location.fromUserReadableString(
output.substring(locStart + LOCATION_KEY.length(), nextLoc));
}
if (loc != null && loc.isValid()) {
locations.add(loc);
}
locStart = nextLoc;
}
}
}
}
return new ScopedException(message.trim(),
new ScopedErrorReport(Strings.isNullOrEmpty(file) ? null : file.trim(), locations));
}
public static List extractErrors(String output) {
List errors = new ArrayList();
int index = output.indexOf(ERROR_LOG_PREFIX);
final int limit = output.length();
while (index >= 0 && index < limit) {
int end = output.indexOf(ERROR_LOG_SUFFIX, index + ERROR_LOG_PREFIX.length());
if (end == -1) {
errors.add(createFromOutput(output.substring(index + ERROR_LOG_PREFIX.length())));
break;
} else {
errors.add(createFromOutput(output.substring(index + ERROR_LOG_PREFIX.length(),
end)));
index = output.indexOf(ERROR_LOG_PREFIX, end + ERROR_LOG_SUFFIX.length());
}
}
return errors;
}
public static void encodeOutput(boolean encodeOutput) {
sEncodeOutput = encodeOutput;
}
public static boolean issEncodeOutput() {
return sEncodeOutput;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy