/*
* Copyright (c) 2014-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.facebook.stetho.inspector.network;
import javax.annotation.Nullable;
import java.util.ArrayList;
import android.annotation.SuppressLint;
public class MimeMatcher<T> {
private final ArrayList<MimeMatcherRule> mRuleMap = new ArrayList<MimeMatcherRule>();
/**
* Add a matching rule in the canonical MIME T form such as "image/*" or a MIME T
* literal such as "text/html".
*
* @param ruleExpression Expression to match, in the order it was added.
* @param resultIfMatched Result if this expression matches.
*/
public void addRule(String ruleExpression, T resultIfMatched) {
mRuleMap.add(new MimeMatcherRule(ruleExpression, resultIfMatched));
}
public void clear() {
mRuleMap.clear();
}
@Nullable
public T match(String mimeT) {
int ruleMapN = mRuleMap.size();
for (int i = 0; i < ruleMapN; i++) {
MimeMatcherRule rule = mRuleMap.get(i);
if (rule.match(mimeT)) {
return rule.getResultIfMatched();
}
}
return null;
}
@SuppressLint("BadMethodUse-java.lang.String.length")
private class MimeMatcherRule {
private final boolean mHasWildcard;
private final String mMatchPrefix;
private final T mResultIfMatched;
public MimeMatcherRule(String ruleExpression, T resultIfMatched) {
if (ruleExpression.endsWith("*")) {
mHasWildcard = true;
mMatchPrefix = ruleExpression.substring(0, ruleExpression.length() - 1);
} else {
mHasWildcard = false;
mMatchPrefix = ruleExpression;
}
if (mMatchPrefix.contains("*")) {
throw new IllegalArgumentException("Multiple wildcards present in rule expression " +
ruleExpression);
}
mResultIfMatched = resultIfMatched;
}
public boolean match(String mimeType) {
// Make sure the string literal matches.
if (!mimeType.startsWith(mMatchPrefix)) {
return false;
}
// If we have a wildcard and the prefix matches, then we've matched; otherwise if the
// string literal and the mime T are the same length then we must have a match.
return (mHasWildcard || mimeType.length() == mMatchPrefix.length());
}
public T getResultIfMatched() {
return mResultIfMatched;
}
}
}