package org.jetbrains.android.logcat; import com.android.ddmlib.Log; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.text.StringUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; /** * @author Eugene.Kudelevsky */ class ConfiguredFilter { private static final Logger LOG = Logger.getInstance("#org.jetbrains.android.logcat.ConfiguredFilter"); private final String myName; private final Pattern myMessagePattern; private final Pattern myTagPattern; private final Pattern myPkgNamePattern; private final String myPid; private final Log.LogLevel myLogLevel; private ConfiguredFilter(@NotNull String name, @Nullable Pattern messagePattern, @Nullable Pattern tagPattern, @Nullable Pattern pkgNamePattern, @Nullable String pid, @Nullable Log.LogLevel logLevel) { myName = name; myMessagePattern = messagePattern; myTagPattern = tagPattern; myPkgNamePattern = pkgNamePattern; myPid = pid; myLogLevel = logLevel; } public boolean isApplicable(String message, String tag, String pkg, String pid, Log.LogLevel logLevel) { if (myMessagePattern != null && (message == null || !myMessagePattern.matcher(message).find())) { return false; } if (myTagPattern != null && (tag == null || !myTagPattern.matcher(tag).find())) { return false; } if (myPkgNamePattern != null && (pkg == null || !myPkgNamePattern.matcher(pkg).find())) { return false; } if (myPid != null && myPid.length() > 0 && !myPid.equals(pid)) { return false; } if (myLogLevel != null && (logLevel == null || logLevel.getPriority() < myLogLevel.getPriority())) { return false; } return true; } @NotNull public String getName() { return myName; } @Nullable public static ConfiguredFilter compile(@Nullable AndroidConfiguredLogFilters.MyFilterEntry entry, @NotNull String name) { if (entry == null) { return null; } Pattern logMessagePattern = compilePattern(entry.getLogMessagePattern()); Pattern logTagPattern = compilePattern(entry.getLogTagPattern()); Pattern pkgNamePattern = compilePattern(entry.getPackageNamePattern()); final String pid = entry.getPid(); Log.LogLevel logLevel = null; final String logLevelStr = entry.getLogLevel(); if (logLevelStr != null && logLevelStr.length() > 0) { logLevel = Log.LogLevel.getByString(logLevelStr); } return new ConfiguredFilter(name, logMessagePattern, logTagPattern, pkgNamePattern, pid, logLevel); } private static Pattern compilePattern(String pattern) { Pattern p = null; if (StringUtil.isNotEmpty(pattern)) { try { p = Pattern.compile(pattern, AndroidConfiguredLogFilters.getPatternCompileFlags(pattern)); } catch (PatternSyntaxException e) { /** This shouldn't happen if the pattern was entered through the UI in which case the {@link org.jetbrains.android.logcat.EditLogFilterDialog#doValidate()} captures and reports the issue to the user. */ LOG.info(e); } } return p; } }