Initial commit

This commit is contained in:
2016-08-27 16:18:28 +03:00
commit 1b16a1d67e
29 changed files with 1374 additions and 0 deletions

View File

@@ -0,0 +1,33 @@
package eu.mikroskeem.utils.bannerparser;
public class IntegerFromString {
public static String valueOf(int value){
for (IntegerFromStringEnum anEnum : IntegerFromStringEnum.values()) {
if(value == anEnum.getValue()){
return anEnum.toString();
}
}
return null;
}
private enum IntegerFromStringEnum {
ONE(1),
TWO(2),
THREE(3),
FOUR(4),
FIVE(5),
SIX(6),
SEVEN(7),
EIGHT(8),
NINE(9),
ZERO(0);
private int value;
IntegerFromStringEnum(int value) {
this.value = value;
}
public int getValue(){
return value;
}
}
}

View File

@@ -0,0 +1,21 @@
package eu.mikroskeem.utils.bannerparser;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLDecoder;
import java.util.LinkedHashMap;
import java.util.Map;
public class ParseQuery {
public static Map<String, String> splitQuery(URL url) throws UnsupportedEncodingException {
Map<String, String> query_pairs = new LinkedHashMap<>();
String query = url.getQuery();
String[] pairs = query.split("&");
for (String pair : pairs) {
int idx = pair.indexOf("=");
query_pairs.put(URLDecoder.decode(pair.substring(0, idx), "UTF-8"), URLDecoder.decode(pair.substring(idx + 1), "UTF-8"));
}
return query_pairs;
}
}

View File

@@ -0,0 +1,10 @@
package eu.mikroskeem.utils.bannerparser.parsers;
import org.bukkit.block.banner.Pattern;
import java.net.URL;
import java.util.ArrayList;
public interface Parser {
ArrayList<Pattern> fromUrl(URL url);
}

View File

@@ -0,0 +1,29 @@
package eu.mikroskeem.utils.bannerparser.parsers;
import eu.mikroskeem.utils.bannerparser.parsers.needcoolshoes.NeedCoolShoesParser;
import eu.mikroskeem.utils.bannerparser.parsers.planetminecraft.PlanetMinecraftParser;
import org.bukkit.block.banner.Pattern;
import java.net.URL;
import java.util.ArrayList;
public class Parsers {
public static Parser getParser(URL url){
String host = url.getHost();
if(host.contains("planetminecraft.com")){
return new PlanetMinecraftParser();
} else if (host.contains("needcoolshoes.com")){
return new NeedCoolShoesParser();
}
return null;
}
public static ArrayList<Pattern> parse(URL url){
Parser parser = getParser(url);
if(parser != null){
return parser.fromUrl(url);
} else {
return null;
}
}
}

View File

@@ -0,0 +1,38 @@
package eu.mikroskeem.utils.bannerparser.parsers.needcoolshoes;
import org.bukkit.DyeColor;
import static org.bukkit.DyeColor.*;
class ColorParser {
static DyeColor valueOf(String a){
return ColorEnum.valueOf(a).getColor();
}
@SuppressWarnings("unused")
private enum ColorEnum {
a(BLACK),
b(RED),
c(GREEN),
d(BROWN),
e(BLUE),
f(PURPLE),
g(CYAN),
h(SILVER),
i(GRAY),
j(PINK),
k(LIME),
l(YELLOW),
m(LIGHT_BLUE),
n(MAGENTA),
o(ORANGE),
p(WHITE);
private DyeColor color;
ColorEnum(DyeColor color) {
this.color = color;
}
public DyeColor getColor() {
return color;
}
}
}

View File

@@ -0,0 +1,47 @@
package eu.mikroskeem.utils.bannerparser.parsers.needcoolshoes;
import eu.mikroskeem.utils.bannerparser.parsers.Parser;
import org.bukkit.DyeColor;
import org.bukkit.block.banner.Pattern;
import org.bukkit.block.banner.PatternType;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class NeedCoolShoesParser implements Parser {
/*
* See http://www.needcoolshoes.com/banner
*/
public ArrayList<Pattern> fromUrl(URL url){
try {
String bannerData = url.getQuery().split("\\?=")[0].substring(1);
return parse(bannerData);
} catch (ArrayIndexOutOfBoundsException e){
return null;
}
}
private ArrayList<Pattern> parse(String whole){
ArrayList<Pattern> patterns = new ArrayList<>();
List<String> propertyList = Arrays.asList(whole.split("(?<=\\G..)"));
propertyList.forEach(property->{
DyeColor color = parseColor(property.charAt(0));
PatternType patternType = parsePattern(property.charAt(1));
patterns.add(new Pattern(color, patternType));
});
return patterns;
}
private PatternType parsePattern(char part){
String partStr = String.valueOf(part);
return PatternParser.valueOf(partStr);
}
private DyeColor parseColor(char part){
String partStr = String.valueOf(part);
return ColorParser.valueOf(partStr);
}
}

View File

@@ -0,0 +1,73 @@
package eu.mikroskeem.utils.bannerparser.parsers.needcoolshoes;
import org.bukkit.block.banner.PatternType;
import static org.bukkit.block.banner.PatternType.*;
class PatternParser {
static PatternType valueOf(String a) {
return PatternEnum.valueOf(a).getPattern();
}
@SuppressWarnings("unused")
private enum PatternEnum {
a(BASE),
e(BRICKS),
j(CROSS),
z(STRAIGHT_CROSS),
p(GRADIENT),
K(GRADIENT_UP),
q(HALF_HORIZONTAL_MIRROR),
L(HALF_VERTICAL),
H(HALF_VERTICAL_MIRROR),
M(HALF_HORIZONTAL),
E(STRIPE_TOP),
f(STRIPE_BOTTOM),
s(STRIPE_LEFT),
y(STRIPE_RIGHT),
r(DIAGONAL_LEFT),
J(DIAGONAL_RIGHT_MIRROR),
I(DIAGONAL_LEFT_MIRROR),
x(DIAGONAL_RIGHT),
m(STRIPE_DOWNLEFT),
n(STRIPE_DOWNRIGHT),
l(STRIPE_MIDDLE),
w(STRIPE_CENTER),
C(SQUARE_TOP_LEFT),
b(SQUARE_BOTTOM_LEFT),
D(SQUARE_TOP_RIGHT),
d(SQUARE_BOTTOM_RIGHT),
F(TRIANGLE_TOP),
g(TRIANGLE_BOTTOM),
v(RHOMBUS_MIDDLE),
t(CIRCLE_MIDDLE),
h(TRIANGLES_BOTTOM),
G(TRIANGLES_TOP),
B(STRIPE_SMALL),
c(BORDER),
i(CURLY_BORDER),
o(FLOWER),
k(CREEPER),
A(SKULL),
u(MOJANG);
private PatternType type;
PatternEnum(PatternType type) {
this.type = type;
}
public PatternType getPattern() {
return type;
}
}
}

View File

@@ -0,0 +1,46 @@
package eu.mikroskeem.utils.bannerparser.parsers.planetminecraft;
import eu.mikroskeem.utils.bannerparser.IntegerFromString;
import org.bukkit.DyeColor;
import static org.bukkit.DyeColor.*;
class ColorParser {
static DyeColor valueOf(String a){
try {
/* Test for integer value first */
String name = IntegerFromString.valueOf(Integer.valueOf(a));
return ColorEnum.valueOf(name).getColor();
} catch (NumberFormatException e){
/* Return by string identifier */
return ColorEnum.valueOf(a).getColor();
}
}
@SuppressWarnings("unused")
private enum ColorEnum {
g(WHITE),
EIGHT(SILVER),
NINE(GRAY),
ONE(BLACK),
c(YELLOW),
f(ORANGE),
TWO(RED),
FOUR(BROWN),
b(LIME),
THREE(GREEN),
d(LIGHT_BLUE),
SEVEN(CYAN),
FIVE(BLUE),
a(PINK),
e(MAGENTA),
SIX(PURPLE);
private DyeColor color;
ColorEnum(DyeColor color) {
this.color = color;
}
public DyeColor getColor() {
return color;
}
}
}

View File

@@ -0,0 +1,76 @@
package eu.mikroskeem.utils.bannerparser.parsers.planetminecraft;
import eu.mikroskeem.utils.bannerparser.IntegerFromString;
import org.bukkit.block.banner.PatternType;
import static org.bukkit.block.banner.PatternType.*;
class PatternParser {
static PatternType valueOf(String a) {
try {
/* Test for integer value first */
String name = IntegerFromString.valueOf(Integer.valueOf(a));
return PatternEnum.valueOf(name).getPattern();
} catch (NumberFormatException e){
/* Return by string identifier */
return PatternEnum.valueOf(a).getPattern();
}
}
@SuppressWarnings("unused")
private enum PatternEnum {
o(STRIPE_BOTTOM),
v(STRIPE_TOP),
s(STRIPE_LEFT),
u(STRIPE_RIGHT),
t(STRIPE_MIDDLE),
p(STRIPE_CENTER),
r(STRIPE_DOWNRIGHT),
q(STRIPE_DOWNLEFT),
SEVEN(CROSS),
i(STRIPE_SMALL),
n(STRAIGHT_CROSS),
a(DIAGONAL_RIGHT_MIRROR),
NINE(DIAGONAL_LEFT),
A(DIAGONAL_LEFT_MIRROR),
B(DIAGONAL_RIGHT),
e(HALF_VERTICAL),
E(HALF_VERTICAL_MIRROR),
d(HALF_HORIZONTAL),
D(HALF_HORIZONTAL_MIRROR),
j(SQUARE_BOTTOM_LEFT),
k(SQUARE_BOTTOM_RIGHT),
l(SQUARE_TOP_LEFT),
m(SQUARE_TOP_RIGHT),
y(TRIANGLE_BOTTOM),
z(TRIANGLE_TOP),
w(TRIANGLES_BOTTOM),
x(TRIANGLES_TOP),
FIVE(CIRCLE_MIDDLE),
g(RHOMBUS_MIDDLE),
THREE(BORDER),
EIGHT(CURLY_BORDER),
FOUR(BRICKS),
SIX(CREEPER),
h(SKULL),
b(FLOWER),
f(MOJANG),
c(GRADIENT),
C(GRADIENT_UP);
private PatternType type;
PatternEnum(PatternType type) {
this.type = type;
}
public PatternType getPattern() {
return type;
}
}
}

View File

@@ -0,0 +1,51 @@
package eu.mikroskeem.utils.bannerparser.parsers.planetminecraft;
import eu.mikroskeem.utils.bannerparser.parsers.Parser;
import eu.mikroskeem.utils.bannerparser.ParseQuery;
import org.bukkit.DyeColor;
import org.bukkit.block.banner.Pattern;
import org.bukkit.block.banner.PatternType;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class PlanetMinecraftParser implements Parser {
/*
* See http://www.planetminecraft.com/banner/
*/
public ArrayList<Pattern> fromUrl(URL url){
try {
String bannerData = ParseQuery.splitQuery(url).getOrDefault("b", "");
return parse(bannerData);
} catch (UnsupportedEncodingException e){
return null;
}
}
private ArrayList<Pattern> parse(String whole){
ArrayList<Pattern> patterns = new ArrayList<>();
/* Get base color */
patterns.add(new Pattern(parseColor(whole.charAt(0)), PatternType.BASE));
/* Iterate over all others */
List<String> propertyList = Arrays.asList(whole.substring(1).split("(?<=\\G..)"));
propertyList.forEach(property->{
DyeColor color = parseColor(property.charAt(0));
PatternType patternType = parsePattern(property.charAt(1));
patterns.add(new Pattern(color, patternType));
});
return patterns;
}
private PatternType parsePattern(char part){
String partStr = String.valueOf(part);
return PatternParser.valueOf(partStr);
}
private DyeColor parseColor(char part){
String partStr = String.valueOf(part);
return ColorParser.valueOf(partStr);
}
}

View File

@@ -0,0 +1,80 @@
package eu.mikroskeem.utils.test.bannerparser;
import eu.mikroskeem.utils.bannerparser.parsers.Parsers;
import eu.mikroskeem.utils.bannerparser.parsers.needcoolshoes.NeedCoolShoesParser;
import eu.mikroskeem.utils.bannerparser.parsers.planetminecraft.PlanetMinecraftParser;
import org.bukkit.DyeColor;
import org.bukkit.block.banner.Pattern;
import org.bukkit.block.banner.PatternType;
import org.junit.Assert;
import org.junit.Test;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
public class ParserTest {
@Test
public void testParserSelector() throws MalformedURLException {
URL url = new URL("http://www.planetminecraft.com/banner/?b=g2feC");
URL url1 = new URL("http://www.needcoolshoes.com/banner?=pabunK");
URL url2 = new URL("http://example.com");
Assert.assertEquals(Parsers.getParser(url).getClass(), PlanetMinecraftParser.class);
Assert.assertEquals(Parsers.getParser(url1).getClass(), NeedCoolShoesParser.class);
Assert.assertNull(Parsers.getParser(url2));
}
@Test
public void testPMCParser() throws MalformedURLException {
URL url = new URL("http://www.planetminecraft.com/banner/?b=g1Aca");
ArrayList<Pattern> matchPattern = new ArrayList<Pattern>(){{
add(new Pattern(DyeColor.WHITE, PatternType.BASE));
add(new Pattern(DyeColor.BLACK, PatternType.DIAGONAL_LEFT_MIRROR));
add(new Pattern(DyeColor.YELLOW, PatternType.DIAGONAL_RIGHT_MIRROR));
}};
ArrayList<Pattern> parsed = Parsers.parse(url);
for (int i = 0; i < parsed.size(); i++) {
Assert.assertEquals(matchPattern.get(i), parsed.get(i));
}
}
@Test
public void testNCSParser() throws MalformedURLException {
URL url = new URL("http://www.needcoolshoes.com/banner?=paaIlJ");
ArrayList<Pattern> matchPattern = new ArrayList<Pattern>(){{
add(new Pattern(DyeColor.WHITE, PatternType.BASE));
add(new Pattern(DyeColor.BLACK, PatternType.DIAGONAL_LEFT_MIRROR));
add(new Pattern(DyeColor.YELLOW, PatternType.DIAGONAL_RIGHT_MIRROR));
}};
ArrayList<Pattern> parsed = Parsers.parse(url);
for (int i = 0; i < parsed.size(); i++) {
Assert.assertEquals(matchPattern.get(i), parsed.get(i));
}
}
@Test
public void testDiagonals() throws MalformedURLException {
URL url = new URL("http://www.planetminecraft.com/banner/?b=gcAbBda29");
URL url1 = new URL("http://www.needcoolshoes.com/banner?=palIkxmJbr");
ArrayList<Pattern> matchPattern = new ArrayList<Pattern>(){{
add(new Pattern(DyeColor.WHITE, PatternType.BASE));
add(new Pattern(DyeColor.YELLOW, PatternType.DIAGONAL_LEFT_MIRROR));
add(new Pattern(DyeColor.LIME, PatternType.DIAGONAL_RIGHT));
add(new Pattern(DyeColor.LIGHT_BLUE, PatternType.DIAGONAL_RIGHT_MIRROR));
add(new Pattern(DyeColor.RED, PatternType.DIAGONAL_LEFT));
}};
ArrayList<Pattern> parsed = Parsers.parse(url);
for (int i = 0; i < parsed.size(); i++) {
Assert.assertTrue(parsed.get(i).equals(matchPattern.get(i)));
}
ArrayList<Pattern> parsed1 = Parsers.parse(url1);
for (int i = 0; i < parsed1.size(); i++) {
Assert.assertTrue(parsed1.get(i).equals(matchPattern.get(i)));
}
}
}