1
0
mirror of https://github.com/essentials/Essentials.git synced 2025-08-12 09:35:26 +02:00

WIP Converters

Only Integer and Enum for now, open for comments
This commit is contained in:
snowleo
2013-01-01 22:53:03 +01:00
parent 72c5ab8fd3
commit 32c4950059
7 changed files with 176 additions and 19 deletions

View File

@@ -1,34 +1,39 @@
package net.ess3.commands;
import static net.ess3.I18n._;
import net.ess3.api.IUser;
import net.ess3.converter.EnumConverter;
import net.ess3.utils.LocationUtil;
import org.bukkit.Location;
import org.bukkit.TreeType;
import net.ess3.api.IUser;
import net.ess3.utils.LocationUtil;
public class Commandbigtree extends EssentialsCommand
{
private static enum BigTree {
REDWOOD(TreeType.TALL_REDWOOD),
TREE(TreeType.BIG_TREE),
JUNGLE(TreeType.JUNGLE);
private final TreeType bukkitType;
private BigTree(final TreeType bukkitType)
{
this.bukkitType = bukkitType;
}
public TreeType getBukkitType()
{
return bukkitType;
}
}
private final static EnumConverter<BigTree> BIGTREE_PARSER = EnumConverter.getInstance(BigTree.class);
@Override
public void run(final IUser user, final String commandLabel, final String[] args) throws Exception
{
final TreeType tree;
if (args.length > 0 && args[0].equalsIgnoreCase("redwood"))
{
tree = TreeType.TALL_REDWOOD;
}
else if (args.length > 0 && args[0].equalsIgnoreCase("tree"))
{
tree = TreeType.BIG_TREE;
}
else if (args.length > 0 && args[0].equalsIgnoreCase("jungle"))
{
tree = TreeType.JUNGLE;
}
else
{
throw new NotEnoughArgumentsException();
}
final TreeType tree = BIGTREE_PARSER.parse(args).getValue().getBukkitType();
final Location loc = LocationUtil.getTarget(user.getPlayer());
final Location safeLocation = LocationUtil.getSafeDestination(loc);

View File

@@ -0,0 +1,7 @@
package net.ess3.converter;
public interface ArgumentsParser<T>
{
ParserResult<T> parse(String... args);
}

View File

@@ -0,0 +1,57 @@
package net.ess3.converter;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import org.apache.commons.lang.Validate;
public class EnumConverter<E extends Enum<E>> implements ArgumentsParser<E>, Serializer<E>
{
private static final Map<Class, EnumConverter> converterMap = new HashMap<Class, EnumConverter>();
private final Map<String, E> enumMap = new HashMap<String, E>();
private final Map<E, String> serializedMap;
private EnumConverter(final Class<E> enumClass)
{
serializedMap = new EnumMap<E, String>(enumClass);
for (E t : enumClass.getEnumConstants())
{
enumMap.put(t.name().replaceAll("[_-]", "").toLowerCase(Locale.ENGLISH), t);
serializedMap.put(t, t.name().replace("_", "-").toLowerCase(Locale.ENGLISH));
}
}
public static <T extends Enum<T>> EnumConverter<T> getInstance(final Class<T> enumClass)
{
synchronized (converterMap)
{
EnumConverter<T> converter = converterMap.get(enumClass);
if (converter == null)
{
converter = new EnumConverter<T>(enumClass);
converterMap.put(enumClass, converter);
}
return converter;
}
}
@Override
public ParserResult<E> parse(final String... args)
{
Validate.notEmpty(args);
final E e = enumMap.get(args[0].replaceAll("[_-]", "").toLowerCase(Locale.ENGLISH));
if (e == null)
{
throw new IllegalArgumentException();
}
return new FirstEntryParserResult<E>(e, args);
}
@Override
public String serialize(final E input)
{
return serializedMap.get(input);
}
}

View File

@@ -0,0 +1,33 @@
package net.ess3.converter;
import java.util.Arrays;
class FirstEntryParserResult<T> implements ParserResult<T>
{
private final T value;
private final String[] input;
private String[] unusedInput = null;
FirstEntryParserResult(T value, String... input)
{
this.value = value;
this.input = input;
}
@Override
public T getValue()
{
return value;
}
@Override
public String[] getUnusedInput()
{
if (unusedInput == null)
{
unusedInput = Arrays.copyOfRange(input, input.length > 0 ? 1 : 0, input.length);
}
return unusedInput;
}
}

View File

@@ -0,0 +1,39 @@
package net.ess3.converter;
import org.apache.commons.lang.Validate;
public class IntegerConverter implements ArgumentsParser<Integer>, Serializer<Integer>
{
private static final IntegerConverter INSTANCE = new IntegerConverter();
private IntegerConverter()
{
}
public static IntegerConverter getInstance()
{
return INSTANCE;
}
@Override
public ParserResult<Integer> parse(final String... args)
{
Validate.notEmpty(args);
try
{
final int number = Integer.parseInt(args[0]);
return new FirstEntryParserResult<Integer>(number, args);
}
catch (NumberFormatException ex)
{
throw new IllegalArgumentException(ex);
}
}
@Override
public String serialize(final Integer input)
{
return input.toString();
}
}

View File

@@ -0,0 +1,9 @@
package net.ess3.converter;
public interface ParserResult<T>
{
T getValue();
String[] getUnusedInput();
}

View File

@@ -0,0 +1,7 @@
package net.ess3.converter;
public interface Serializer<T>
{
String serialize(T input);
}