/*
* Copyright 2015 the original author or authors.
* @https://github.com/scouter-project/scouter
*
* 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 scouter.util;
public class StrMatch {
public enum COMP {
EQU, STR, STR_MID, STR_END, MID, MID_MID, MID_END, END, ANY
}
protected COMP comp = COMP.EQU;
protected String start, end, mid, mid2;
protected String pattern;
public boolean equals(Object obj) {
if (obj instanceof StrMatch) {
return this.pattern.equals(((StrMatch) obj).pattern);
}
return false;
}
public int hashCode() {
return pattern.hashCode();
}
public StrMatch(String pattern) {
this('*', pattern);
}
private final String any1, any2;
public StrMatch(char CHAR, String pattern) {
this.pattern = pattern;
this.any1 = new String(new char[] { CHAR });
this.any2 = new String(new char[] { CHAR, CHAR });
if (any1.equals(pattern) || any2.equals(pattern)) {
comp = COMP.ANY;
return;
}
int length = pattern.length();
if (length < 2) {
comp = COMP.EQU;
mid = pattern;
return;
}
boolean anyStart = pattern.charAt(0) == CHAR;
boolean anyEnd = pattern.charAt(length - 1) == CHAR;
int x = pattern.indexOf(CHAR, 1);
boolean anyMid = x > 0 && x < (length - 1);
if (anyMid) {
if (anyStart && anyEnd) {
comp = COMP.MID_MID;
mid = pattern.substring(1, x);
mid2 = pattern.substring(x + 1, length - 1);
} else if (anyStart) {
comp = COMP.MID_END;
mid = pattern.substring(1, x);
end = pattern.substring(x + 1);
} else if (anyEnd) {
comp = COMP.STR_MID;
start = pattern.substring(0, x);
mid = pattern.substring(x + 1, length - 1);
} else {
comp = COMP.STR_END;
start = pattern.substring(0, x);
end = pattern.substring(x + 1);
}
} else {
if (anyStart && anyEnd) {
comp = COMP.MID;
mid = pattern.substring(1, length - 1);
} else if (anyStart) {
comp = COMP.END;
end = pattern.substring(1);
} else if (anyEnd) {
comp = COMP.STR;
start = pattern.substring(0, length - 1);
} else {
comp = COMP.EQU;
mid = pattern;
}
}
}
public boolean include(String target) {
if (target == null || target.length() == 0)
return false;
switch (comp) {
case ANY:
return true;
case EQU:
return target.equals(mid);
case STR:
return target.startsWith(start);
case STR_MID:
return target.startsWith(start) && target.indexOf(mid) >= 0;
case STR_END:
return target.startsWith(start) && target.endsWith(end);
case MID:
return target.indexOf(mid) >= 0;
case MID_MID:
int x = target.indexOf(mid);
if (x < 0)
return false;
return target.indexOf(mid2, x + mid.length()) >= 0;
case MID_END:
return target.indexOf(mid) >= 0 && target.endsWith(end);
case END:
return target.endsWith(end);
default:
return false;
}
}
public String toString() {
return pattern;
}
public String getPattern() {
return pattern;
}
public COMP getComp() {
return comp;
}
public static void main(String[] args) {
StrMatch sc = new StrMatch("**");
System.out.println(sc.pattern);
}
}