This commit is contained in:
boy0001 2015-09-11 20:09:22 +10:00
parent 37a8861fa0
commit c386f33df8
380 changed files with 43490 additions and 33913 deletions

3
.gitignore vendored
View File

@ -6,4 +6,5 @@
/target/PlotSquared-Uber.jar /target/PlotSquared-Uber.jar
/target/maven-archiver /target/maven-archiver
*.project *.project
*.classpath *.classpath
/target/

View File

@ -5,7 +5,8 @@ import java.util.Map;
/** /**
* Represents a source of configurable options and settings * Represents a source of configurable options and settings
*/ */
public interface Configuration extends ConfigurationSection { public interface Configuration extends ConfigurationSection
{
/** /**
* Sets the default value of the given path as provided. * Sets the default value of the given path as provided.
* <p> * <p>
@ -20,7 +21,8 @@ public interface Configuration extends ConfigurationSection {
* @param value Value to set the default to. * @param value Value to set the default to.
* @throws IllegalArgumentException Thrown if path is null. * @throws IllegalArgumentException Thrown if path is null.
*/ */
public void addDefault(String path, Object value); @Override
public void addDefault(final String path, final Object value);
/** /**
* Sets the default values of the given paths as provided. * Sets the default values of the given paths as provided.
@ -32,7 +34,7 @@ public interface Configuration extends ConfigurationSection {
* @param defaults A map of Path->Values to add to defaults. * @param defaults A map of Path->Values to add to defaults.
* @throws IllegalArgumentException Thrown if defaults is null. * @throws IllegalArgumentException Thrown if defaults is null.
*/ */
public void addDefaults(Map<String, Object> defaults); public void addDefaults(final Map<String, Object> defaults);
/** /**
* Sets the default values of the given paths as provided. * Sets the default values of the given paths as provided.
@ -49,7 +51,7 @@ public interface Configuration extends ConfigurationSection {
* @param defaults A configuration holding a list of defaults to copy. * @param defaults A configuration holding a list of defaults to copy.
* @throws IllegalArgumentException Thrown if defaults is null or this. * @throws IllegalArgumentException Thrown if defaults is null or this.
*/ */
public void addDefaults(Configuration defaults); public void addDefaults(final Configuration defaults);
/** /**
* Sets the source of all default values for this {@link Configuration}. * Sets the source of all default values for this {@link Configuration}.
@ -60,7 +62,7 @@ public interface Configuration extends ConfigurationSection {
* @param defaults New source of default values for this configuration. * @param defaults New source of default values for this configuration.
* @throws IllegalArgumentException Thrown if defaults is null or this. * @throws IllegalArgumentException Thrown if defaults is null or this.
*/ */
public void setDefaults(Configuration defaults); public void setDefaults(final Configuration defaults);
/** /**
* Gets the source {@link Configuration} for this configuration. * Gets the source {@link Configuration} for this configuration.

View File

@ -4,12 +4,14 @@ package com.intellectualcrafters.configuration;
* Various settings for controlling the input and output of a {@link * Various settings for controlling the input and output of a {@link
* Configuration} * Configuration}
*/ */
public class ConfigurationOptions { public class ConfigurationOptions
{
private char pathSeparator = '.'; private char pathSeparator = '.';
private boolean copyDefaults = false; private boolean copyDefaults = false;
private final Configuration configuration; private final Configuration configuration;
protected ConfigurationOptions(Configuration configuration) { protected ConfigurationOptions(final Configuration configuration)
{
this.configuration = configuration; this.configuration = configuration;
} }
@ -18,7 +20,8 @@ public class ConfigurationOptions {
* *
* @return Parent configuration * @return Parent configuration
*/ */
public Configuration configuration() { public Configuration configuration()
{
return configuration; return configuration;
} }
@ -31,7 +34,8 @@ public class ConfigurationOptions {
* *
* @return Path separator * @return Path separator
*/ */
public char pathSeparator() { public char pathSeparator()
{
return pathSeparator; return pathSeparator;
} }
@ -45,8 +49,9 @@ public class ConfigurationOptions {
* @param value Path separator * @param value Path separator
* @return This object, for chaining * @return This object, for chaining
*/ */
public ConfigurationOptions pathSeparator(char value) { public ConfigurationOptions pathSeparator(final char value)
this.pathSeparator = value; {
pathSeparator = value;
return this; return this;
} }
@ -64,7 +69,8 @@ public class ConfigurationOptions {
* *
* @return Whether or not defaults are directly copied * @return Whether or not defaults are directly copied
*/ */
public boolean copyDefaults() { public boolean copyDefaults()
{
return copyDefaults; return copyDefaults;
} }
@ -83,8 +89,9 @@ public class ConfigurationOptions {
* @param value Whether or not defaults are directly copied * @param value Whether or not defaults are directly copied
* @return This object, for chaining * @return This object, for chaining
*/ */
public ConfigurationOptions copyDefaults(boolean value) { public ConfigurationOptions copyDefaults(final boolean value)
this.copyDefaults = value; {
copyDefaults = value;
return this; return this;
} }
} }

View File

@ -7,7 +7,8 @@ import java.util.Set;
/** /**
* Represents a section of a {@link Configuration} * Represents a section of a {@link Configuration}
*/ */
public interface ConfigurationSection { public interface ConfigurationSection
{
/** /**
* Gets a set containing all keys in this section. * Gets a set containing all keys in this section.
* <p> * <p>
@ -22,7 +23,7 @@ public interface ConfigurationSection {
* list. * list.
* @return Set of keys contained within this ConfigurationSection. * @return Set of keys contained within this ConfigurationSection.
*/ */
public Set<String> getKeys(boolean deep); public Set<String> getKeys(final boolean deep);
/** /**
* Gets a Map containing all keys and their values for this section. * Gets a Map containing all keys and their values for this section.
@ -38,7 +39,7 @@ public interface ConfigurationSection {
* list. * list.
* @return Map of keys and values of this section. * @return Map of keys and values of this section.
*/ */
public Map<String, Object> getValues(boolean deep); public Map<String, Object> getValues(final boolean deep);
/** /**
* Checks if this {@link ConfigurationSection} contains the given path. * Checks if this {@link ConfigurationSection} contains the given path.
@ -51,7 +52,7 @@ public interface ConfigurationSection {
* default or being set. * default or being set.
* @throws IllegalArgumentException Thrown when path is null. * @throws IllegalArgumentException Thrown when path is null.
*/ */
public boolean contains(String path); public boolean contains(final String path);
/** /**
* Checks if this {@link ConfigurationSection} has a value set for the * Checks if this {@link ConfigurationSection} has a value set for the
@ -65,7 +66,7 @@ public interface ConfigurationSection {
* having a default. * having a default.
* @throws IllegalArgumentException Thrown when path is null. * @throws IllegalArgumentException Thrown when path is null.
*/ */
public boolean isSet(String path); public boolean isSet(final String path);
/** /**
* Gets the path of this {@link ConfigurationSection} from its root {@link * Gets the path of this {@link ConfigurationSection} from its root {@link
@ -132,7 +133,7 @@ public interface ConfigurationSection {
* @param path Path of the Object to get. * @param path Path of the Object to get.
* @return Requested Object. * @return Requested Object.
*/ */
public Object get(String path); public Object get(final String path);
/** /**
* Gets the requested Object by path, returning a default value if not * Gets the requested Object by path, returning a default value if not
@ -146,7 +147,7 @@ public interface ConfigurationSection {
* @param def The default value to return if the path is not found. * @param def The default value to return if the path is not found.
* @return Requested Object. * @return Requested Object.
*/ */
public Object get(String path, Object def); public Object get(final String path, final Object def);
/** /**
* Sets the specified path to the given value. * Sets the specified path to the given value.
@ -162,7 +163,7 @@ public interface ConfigurationSection {
* @param path Path of the object to set. * @param path Path of the object to set.
* @param value New value to set the path to. * @param value New value to set the path to.
*/ */
public void set(String path, Object value); public void set(final String path, final Object value);
/** /**
* Creates an empty {@link ConfigurationSection} at the specified path. * Creates an empty {@link ConfigurationSection} at the specified path.
@ -174,7 +175,7 @@ public interface ConfigurationSection {
* @param path Path to create the section at. * @param path Path to create the section at.
* @return Newly created section * @return Newly created section
*/ */
public ConfigurationSection createSection(String path); public ConfigurationSection createSection(final String path);
/** /**
* Creates a {@link ConfigurationSection} at the specified path, with * Creates a {@link ConfigurationSection} at the specified path, with
@ -188,7 +189,7 @@ public interface ConfigurationSection {
* @param map The values to used. * @param map The values to used.
* @return Newly created section * @return Newly created section
*/ */
public ConfigurationSection createSection(String path, Map<?, ?> map); public ConfigurationSection createSection(final String path, final Map<?, ?> map);
// Primitives // Primitives
/** /**
@ -201,7 +202,7 @@ public interface ConfigurationSection {
* @param path Path of the String to get. * @param path Path of the String to get.
* @return Requested String. * @return Requested String.
*/ */
public String getString(String path); public String getString(final String path);
/** /**
* Gets the requested String by path, returning a default value if not * Gets the requested String by path, returning a default value if not
@ -216,7 +217,7 @@ public interface ConfigurationSection {
* not a String. * not a String.
* @return Requested String. * @return Requested String.
*/ */
public String getString(String path, String def); public String getString(final String path, final String def);
/** /**
* Checks if the specified path is a String. * Checks if the specified path is a String.
@ -229,7 +230,7 @@ public interface ConfigurationSection {
* @param path Path of the String to check. * @param path Path of the String to check.
* @return Whether or not the specified path is a String. * @return Whether or not the specified path is a String.
*/ */
public boolean isString(String path); public boolean isString(final String path);
/** /**
* Gets the requested int by path. * Gets the requested int by path.
@ -241,7 +242,7 @@ public interface ConfigurationSection {
* @param path Path of the int to get. * @param path Path of the int to get.
* @return Requested int. * @return Requested int.
*/ */
public int getInt(String path); public int getInt(final String path);
/** /**
* Gets the requested int by path, returning a default value if not found. * Gets the requested int by path, returning a default value if not found.
@ -255,7 +256,7 @@ public interface ConfigurationSection {
* not an int. * not an int.
* @return Requested int. * @return Requested int.
*/ */
public int getInt(String path, int def); public int getInt(final String path, final int def);
/** /**
* Checks if the specified path is an int. * Checks if the specified path is an int.
@ -268,7 +269,7 @@ public interface ConfigurationSection {
* @param path Path of the int to check. * @param path Path of the int to check.
* @return Whether or not the specified path is an int. * @return Whether or not the specified path is an int.
*/ */
public boolean isInt(String path); public boolean isInt(final String path);
/** /**
* Gets the requested boolean by path. * Gets the requested boolean by path.
@ -280,7 +281,7 @@ public interface ConfigurationSection {
* @param path Path of the boolean to get. * @param path Path of the boolean to get.
* @return Requested boolean. * @return Requested boolean.
*/ */
public boolean getBoolean(String path); public boolean getBoolean(final String path);
/** /**
* Gets the requested boolean by path, returning a default value if not * Gets the requested boolean by path, returning a default value if not
@ -295,7 +296,7 @@ public interface ConfigurationSection {
* not a boolean. * not a boolean.
* @return Requested boolean. * @return Requested boolean.
*/ */
public boolean getBoolean(String path, boolean def); public boolean getBoolean(final String path, final boolean def);
/** /**
* Checks if the specified path is a boolean. * Checks if the specified path is a boolean.
@ -308,7 +309,7 @@ public interface ConfigurationSection {
* @param path Path of the boolean to check. * @param path Path of the boolean to check.
* @return Whether or not the specified path is a boolean. * @return Whether or not the specified path is a boolean.
*/ */
public boolean isBoolean(String path); public boolean isBoolean(final String path);
/** /**
* Gets the requested double by path. * Gets the requested double by path.
@ -320,7 +321,7 @@ public interface ConfigurationSection {
* @param path Path of the double to get. * @param path Path of the double to get.
* @return Requested double. * @return Requested double.
*/ */
public double getDouble(String path); public double getDouble(final String path);
/** /**
* Gets the requested double by path, returning a default value if not * Gets the requested double by path, returning a default value if not
@ -335,7 +336,7 @@ public interface ConfigurationSection {
* not a double. * not a double.
* @return Requested double. * @return Requested double.
*/ */
public double getDouble(String path, double def); public double getDouble(final String path, final double def);
/** /**
* Checks if the specified path is a double. * Checks if the specified path is a double.
@ -348,7 +349,7 @@ public interface ConfigurationSection {
* @param path Path of the double to check. * @param path Path of the double to check.
* @return Whether or not the specified path is a double. * @return Whether or not the specified path is a double.
*/ */
public boolean isDouble(String path); public boolean isDouble(final String path);
/** /**
* Gets the requested long by path. * Gets the requested long by path.
@ -360,7 +361,7 @@ public interface ConfigurationSection {
* @param path Path of the long to get. * @param path Path of the long to get.
* @return Requested long. * @return Requested long.
*/ */
public long getLong(String path); public long getLong(final String path);
/** /**
* Gets the requested long by path, returning a default value if not * Gets the requested long by path, returning a default value if not
@ -375,7 +376,7 @@ public interface ConfigurationSection {
* not a long. * not a long.
* @return Requested long. * @return Requested long.
*/ */
public long getLong(String path, long def); public long getLong(final String path, final long def);
/** /**
* Checks if the specified path is a long. * Checks if the specified path is a long.
@ -388,7 +389,7 @@ public interface ConfigurationSection {
* @param path Path of the long to check. * @param path Path of the long to check.
* @return Whether or not the specified path is a long. * @return Whether or not the specified path is a long.
*/ */
public boolean isLong(String path); public boolean isLong(final String path);
// Java // Java
/** /**
@ -401,7 +402,7 @@ public interface ConfigurationSection {
* @param path Path of the List to get. * @param path Path of the List to get.
* @return Requested List. * @return Requested List.
*/ */
public List<?> getList(String path); public List<?> getList(final String path);
/** /**
* Gets the requested List by path, returning a default value if not * Gets the requested List by path, returning a default value if not
@ -416,7 +417,7 @@ public interface ConfigurationSection {
* not a List. * not a List.
* @return Requested List. * @return Requested List.
*/ */
public List<?> getList(String path, List<?> def); public List<?> getList(final String path, final List<?> def);
/** /**
* Checks if the specified path is a List. * Checks if the specified path is a List.
@ -429,7 +430,7 @@ public interface ConfigurationSection {
* @param path Path of the List to check. * @param path Path of the List to check.
* @return Whether or not the specified path is a List. * @return Whether or not the specified path is a List.
*/ */
public boolean isList(String path); public boolean isList(final String path);
/** /**
* Gets the requested List of String by path. * Gets the requested List of String by path.
@ -444,7 +445,7 @@ public interface ConfigurationSection {
* @param path Path of the List to get. * @param path Path of the List to get.
* @return Requested List of String. * @return Requested List of String.
*/ */
public List<String> getStringList(String path); public List<String> getStringList(final String path);
/** /**
* Gets the requested List of Integer by path. * Gets the requested List of Integer by path.
@ -459,7 +460,7 @@ public interface ConfigurationSection {
* @param path Path of the List to get. * @param path Path of the List to get.
* @return Requested List of Integer. * @return Requested List of Integer.
*/ */
public List<Integer> getIntegerList(String path); public List<Integer> getIntegerList(final String path);
/** /**
* Gets the requested List of Boolean by path. * Gets the requested List of Boolean by path.
@ -474,7 +475,7 @@ public interface ConfigurationSection {
* @param path Path of the List to get. * @param path Path of the List to get.
* @return Requested List of Boolean. * @return Requested List of Boolean.
*/ */
public List<Boolean> getBooleanList(String path); public List<Boolean> getBooleanList(final String path);
/** /**
* Gets the requested List of Double by path. * Gets the requested List of Double by path.
@ -489,7 +490,7 @@ public interface ConfigurationSection {
* @param path Path of the List to get. * @param path Path of the List to get.
* @return Requested List of Double. * @return Requested List of Double.
*/ */
public List<Double> getDoubleList(String path); public List<Double> getDoubleList(final String path);
/** /**
* Gets the requested List of Float by path. * Gets the requested List of Float by path.
@ -504,7 +505,7 @@ public interface ConfigurationSection {
* @param path Path of the List to get. * @param path Path of the List to get.
* @return Requested List of Float. * @return Requested List of Float.
*/ */
public List<Float> getFloatList(String path); public List<Float> getFloatList(final String path);
/** /**
* Gets the requested List of Long by path. * Gets the requested List of Long by path.
@ -519,7 +520,7 @@ public interface ConfigurationSection {
* @param path Path of the List to get. * @param path Path of the List to get.
* @return Requested List of Long. * @return Requested List of Long.
*/ */
public List<Long> getLongList(String path); public List<Long> getLongList(final String path);
/** /**
* Gets the requested List of Byte by path. * Gets the requested List of Byte by path.
@ -534,7 +535,7 @@ public interface ConfigurationSection {
* @param path Path of the List to get. * @param path Path of the List to get.
* @return Requested List of Byte. * @return Requested List of Byte.
*/ */
public List<Byte> getByteList(String path); public List<Byte> getByteList(final String path);
/** /**
* Gets the requested List of Character by path. * Gets the requested List of Character by path.
@ -549,7 +550,7 @@ public interface ConfigurationSection {
* @param path Path of the List to get. * @param path Path of the List to get.
* @return Requested List of Character. * @return Requested List of Character.
*/ */
public List<Character> getCharacterList(String path); public List<Character> getCharacterList(final String path);
/** /**
* Gets the requested List of Short by path. * Gets the requested List of Short by path.
@ -564,7 +565,7 @@ public interface ConfigurationSection {
* @param path Path of the List to get. * @param path Path of the List to get.
* @return Requested List of Short. * @return Requested List of Short.
*/ */
public List<Short> getShortList(String path); public List<Short> getShortList(final String path);
/** /**
* Gets the requested List of Maps by path. * Gets the requested List of Maps by path.
@ -579,7 +580,7 @@ public interface ConfigurationSection {
* @param path Path of the List to get. * @param path Path of the List to get.
* @return Requested List of Maps. * @return Requested List of Maps.
*/ */
public List<Map<?, ?>> getMapList(String path); public List<Map<?, ?>> getMapList(final String path);
/** /**
* Gets the requested ConfigurationSection by path. * Gets the requested ConfigurationSection by path.
@ -592,7 +593,7 @@ public interface ConfigurationSection {
* @param path Path of the ConfigurationSection to get. * @param path Path of the ConfigurationSection to get.
* @return Requested ConfigurationSection. * @return Requested ConfigurationSection.
*/ */
public ConfigurationSection getConfigurationSection(String path); public ConfigurationSection getConfigurationSection(final String path);
/** /**
* Checks if the specified path is a ConfigurationSection. * Checks if the specified path is a ConfigurationSection.
@ -606,7 +607,7 @@ public interface ConfigurationSection {
* @param path Path of the ConfigurationSection to check. * @param path Path of the ConfigurationSection to check.
* @return Whether or not the specified path is a ConfigurationSection. * @return Whether or not the specified path is a ConfigurationSection.
*/ */
public boolean isConfigurationSection(String path); public boolean isConfigurationSection(final String path);
/** /**
* Gets the equivalent {@link ConfigurationSection} from the default * Gets the equivalent {@link ConfigurationSection} from the default
@ -638,5 +639,5 @@ public interface ConfigurationSection {
* @param value Value to set the default to. * @param value Value to set the default to.
* @throws IllegalArgumentException Thrown if path is null. * @throws IllegalArgumentException Thrown if path is null.
*/ */
public void addDefault(String path, Object value); public void addDefault(final String path, final Object value);
} }

View File

@ -4,13 +4,15 @@ package com.intellectualcrafters.configuration;
* Exception thrown when attempting to load an invalid {@link Configuration} * Exception thrown when attempting to load an invalid {@link Configuration}
*/ */
@SuppressWarnings("serial") @SuppressWarnings("serial")
public class InvalidConfigurationException extends Exception { public class InvalidConfigurationException extends Exception
{
/** /**
* Creates a new instance of InvalidConfigurationException without a * Creates a new instance of InvalidConfigurationException without a
* message or cause. * message or cause.
*/ */
public InvalidConfigurationException() {} public InvalidConfigurationException()
{}
/** /**
* Constructs an instance of InvalidConfigurationException with the * Constructs an instance of InvalidConfigurationException with the
@ -18,7 +20,8 @@ public class InvalidConfigurationException extends Exception {
* *
* @param msg The details of the exception. * @param msg The details of the exception.
*/ */
public InvalidConfigurationException(String msg) { public InvalidConfigurationException(final String msg)
{
super(msg); super(msg);
} }
@ -28,7 +31,8 @@ public class InvalidConfigurationException extends Exception {
* *
* @param cause The cause of the exception. * @param cause The cause of the exception.
*/ */
public InvalidConfigurationException(Throwable cause) { public InvalidConfigurationException(final Throwable cause)
{
super(cause); super(cause);
} }
@ -39,7 +43,8 @@ public class InvalidConfigurationException extends Exception {
* @param cause The cause of the exception. * @param cause The cause of the exception.
* @param msg The details of the exception. * @param msg The details of the exception.
*/ */
public InvalidConfigurationException(String msg, Throwable cause) { public InvalidConfigurationException(final String msg, final Throwable cause)
{
super(msg, cause); super(msg, cause);
} }
} }

View File

@ -7,14 +7,16 @@ import java.util.Map;
* from any source, and stores all values in memory only. * from any source, and stores all values in memory only.
* This is useful for temporary Configurations for providing defaults. * This is useful for temporary Configurations for providing defaults.
*/ */
public class MemoryConfiguration extends MemorySection implements Configuration { public class MemoryConfiguration extends MemorySection implements Configuration
{
protected Configuration defaults; protected Configuration defaults;
protected MemoryConfigurationOptions options; protected MemoryConfigurationOptions options;
/** /**
* Creates an empty {@link MemoryConfiguration} with no default values. * Creates an empty {@link MemoryConfiguration} with no default values.
*/ */
public MemoryConfiguration() {} public MemoryConfiguration()
{}
/** /**
* Creates an empty {@link MemoryConfiguration} using the specified {@link * Creates an empty {@link MemoryConfiguration} using the specified {@link
@ -23,51 +25,67 @@ public class MemoryConfiguration extends MemorySection implements Configuration
* @param defaults Default value provider * @param defaults Default value provider
* @throws IllegalArgumentException Thrown if defaults is null * @throws IllegalArgumentException Thrown if defaults is null
*/ */
public MemoryConfiguration(Configuration defaults) { public MemoryConfiguration(final Configuration defaults)
{
this.defaults = defaults; this.defaults = defaults;
} }
@Override @Override
public void addDefault(String path, Object value) { public void addDefault(final String path, final Object value)
if (path == null) throw new NullPointerException("Path may not be null"); {
if (defaults == null) { if (path == null) { throw new NullPointerException("Path may not be null"); }
if (defaults == null)
{
defaults = new MemoryConfiguration(); defaults = new MemoryConfiguration();
} }
defaults.set(path, value); defaults.set(path, value);
} }
public void addDefaults(Map<String, Object> defaults) { @Override
if (defaults == null) throw new NullPointerException("Defaults may not be null"); public void addDefaults(final Map<String, Object> defaults)
{
if (defaults == null) { throw new NullPointerException("Defaults may not be null"); }
for (Map.Entry<String, Object> entry : defaults.entrySet()) { for (final Map.Entry<String, Object> entry : defaults.entrySet())
{
addDefault(entry.getKey(), entry.getValue()); addDefault(entry.getKey(), entry.getValue());
} }
} }
public void addDefaults(Configuration defaults) { @Override
if (defaults == null) throw new NullPointerException("Defaults may not be null"); public void addDefaults(final Configuration defaults)
{
if (defaults == null) { throw new NullPointerException("Defaults may not be null"); }
addDefaults(defaults.getValues(true)); addDefaults(defaults.getValues(true));
} }
public void setDefaults(Configuration defaults) { @Override
if (defaults == null) throw new NullPointerException("Defaults may not be null"); public void setDefaults(final Configuration defaults)
{
if (defaults == null) { throw new NullPointerException("Defaults may not be null"); }
this.defaults = defaults; this.defaults = defaults;
} }
public Configuration getDefaults() { @Override
public Configuration getDefaults()
{
return defaults; return defaults;
} }
@Override @Override
public ConfigurationSection getParent() { public ConfigurationSection getParent()
{
return null; return null;
} }
public MemoryConfigurationOptions options() { @Override
if (options == null) { public MemoryConfigurationOptions options()
{
if (options == null)
{
options = new MemoryConfigurationOptions(this); options = new MemoryConfigurationOptions(this);
} }

View File

@ -4,24 +4,29 @@ package com.intellectualcrafters.configuration;
* Various settings for controlling the input and output of a {@link * Various settings for controlling the input and output of a {@link
* MemoryConfiguration} * MemoryConfiguration}
*/ */
public class MemoryConfigurationOptions extends ConfigurationOptions { public class MemoryConfigurationOptions extends ConfigurationOptions
protected MemoryConfigurationOptions(MemoryConfiguration configuration) { {
protected MemoryConfigurationOptions(final MemoryConfiguration configuration)
{
super(configuration); super(configuration);
} }
@Override @Override
public MemoryConfiguration configuration() { public MemoryConfiguration configuration()
{
return (MemoryConfiguration) super.configuration(); return (MemoryConfiguration) super.configuration();
} }
@Override @Override
public MemoryConfigurationOptions copyDefaults(boolean value) { public MemoryConfigurationOptions copyDefaults(final boolean value)
{
super.copyDefaults(value); super.copyDefaults(value);
return this; return this;
} }
@Override @Override
public MemoryConfigurationOptions pathSeparator(char value) { public MemoryConfigurationOptions pathSeparator(final char value)
{
super.pathSeparator(value); super.pathSeparator(value);
return this; return this;
} }

View File

@ -24,7 +24,8 @@ import com.intellectualcrafters.configuration.MemoryConfiguration;
* This is a base class for all File based implementations of {@link * This is a base class for all File based implementations of {@link
* Configuration} * Configuration}
*/ */
public abstract class FileConfiguration extends MemoryConfiguration { public abstract class FileConfiguration extends MemoryConfiguration
{
/** /**
* This value specified that the system default encoding should be * This value specified that the system default encoding should be
* completely ignored, as it cannot handle the ASCII character set, or it * completely ignored, as it cannot handle the ASCII character set, or it
@ -49,7 +50,8 @@ public abstract class FileConfiguration extends MemoryConfiguration {
*/ */
@Deprecated @Deprecated
public static final boolean SYSTEM_UTF; public static final boolean SYSTEM_UTF;
static { static
{
final byte[] testBytes = Base64Coder.decode("ICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4NCg=="); final byte[] testBytes = Base64Coder.decode("ICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4NCg==");
final String testString = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\r\n"; final String testString = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\r\n";
final Charset defaultCharset = Charset.defaultCharset(); final Charset defaultCharset = Charset.defaultCharset();
@ -63,7 +65,8 @@ public abstract class FileConfiguration extends MemoryConfiguration {
/** /**
* Creates an empty {@link FileConfiguration} with no default values. * Creates an empty {@link FileConfiguration} with no default values.
*/ */
public FileConfiguration() { public FileConfiguration()
{
super(); super();
} }
@ -73,7 +76,8 @@ public abstract class FileConfiguration extends MemoryConfiguration {
* *
* @param defaults Default value provider * @param defaults Default value provider
*/ */
public FileConfiguration(Configuration defaults) { public FileConfiguration(final Configuration defaults)
{
super(defaults); super(defaults);
} }
@ -92,17 +96,21 @@ public abstract class FileConfiguration extends MemoryConfiguration {
* any reason. * any reason.
* @throws IllegalArgumentException Thrown when file is null. * @throws IllegalArgumentException Thrown when file is null.
*/ */
public void save(File file) throws IOException { public void save(final File file) throws IOException
if (file == null) throw new NullPointerException("File cannot be null"); {
if (file == null) { throw new NullPointerException("File cannot be null"); }
file.getParentFile().mkdirs(); file.getParentFile().mkdirs();
String data = saveToString(); final String data = saveToString();
Writer writer = new OutputStreamWriter(new FileOutputStream(file), UTF8_OVERRIDE && !UTF_BIG ? StandardCharsets.UTF_8 : Charset.defaultCharset()); final Writer writer = new OutputStreamWriter(new FileOutputStream(file), UTF8_OVERRIDE && !UTF_BIG ? StandardCharsets.UTF_8 : Charset.defaultCharset());
try { try
{
writer.write(data); writer.write(data);
} finally { }
finally
{
writer.close(); writer.close();
} }
} }
@ -122,8 +130,9 @@ public abstract class FileConfiguration extends MemoryConfiguration {
* any reason. * any reason.
* @throws IllegalArgumentException Thrown when file is null. * @throws IllegalArgumentException Thrown when file is null.
*/ */
public void save(String file) throws IOException { public void save(final String file) throws IOException
if (file == null) throw new NullPointerException("File cannot be null"); {
if (file == null) { throw new NullPointerException("File cannot be null"); }
save(new File(file)); save(new File(file));
} }
@ -157,8 +166,9 @@ public abstract class FileConfiguration extends MemoryConfiguration {
* a valid Configuration. * a valid Configuration.
* @throws IllegalArgumentException Thrown when file is null. * @throws IllegalArgumentException Thrown when file is null.
*/ */
public void load(File file) throws IOException, InvalidConfigurationException { public void load(final File file) throws IOException, InvalidConfigurationException
if (file == null) throw new NullPointerException("File cannot be null"); {
if (file == null) { throw new NullPointerException("File cannot be null"); }
final FileInputStream stream = new FileInputStream(file); final FileInputStream stream = new FileInputStream(file);
@ -184,8 +194,9 @@ public abstract class FileConfiguration extends MemoryConfiguration {
* @see #load(Reader) * @see #load(Reader)
*/ */
@Deprecated @Deprecated
public void load(InputStream stream) throws IOException, InvalidConfigurationException { public void load(final InputStream stream) throws IOException, InvalidConfigurationException
if (stream == null) throw new NullPointerException("Stream cannot be null"); {
if (stream == null) { throw new NullPointerException("Stream cannot be null"); }
load(new InputStreamReader(stream, UTF8_OVERRIDE ? StandardCharsets.UTF_8 : Charset.defaultCharset())); load(new InputStreamReader(stream, UTF8_OVERRIDE ? StandardCharsets.UTF_8 : Charset.defaultCharset()));
} }
@ -203,19 +214,24 @@ public abstract class FileConfiguration extends MemoryConfiguration {
* represent a valid Configuration * represent a valid Configuration
* @throws IllegalArgumentException thrown when reader is null * @throws IllegalArgumentException thrown when reader is null
*/ */
public void load(Reader reader) throws IOException, InvalidConfigurationException { public void load(final Reader reader) throws IOException, InvalidConfigurationException
BufferedReader input = reader instanceof BufferedReader ? (BufferedReader) reader : new BufferedReader(reader); {
final BufferedReader input = reader instanceof BufferedReader ? (BufferedReader) reader : new BufferedReader(reader);
StringBuilder builder = new StringBuilder(); final StringBuilder builder = new StringBuilder();
try { try
{
String line; String line;
while ((line = input.readLine()) != null) { while ((line = input.readLine()) != null)
{
builder.append(line); builder.append(line);
builder.append('\n'); builder.append('\n');
} }
} finally { }
finally
{
input.close(); input.close();
} }
@ -240,8 +256,9 @@ public abstract class FileConfiguration extends MemoryConfiguration {
* a valid Configuration. * a valid Configuration.
* @throws IllegalArgumentException Thrown when file is null. * @throws IllegalArgumentException Thrown when file is null.
*/ */
public void load(String file) throws IOException, InvalidConfigurationException { public void load(final String file) throws IOException, InvalidConfigurationException
if (file == null) throw new NullPointerException("File cannot be null"); {
if (file == null) { throw new NullPointerException("File cannot be null"); }
load(new File(file)); load(new File(file));
} }
@ -261,7 +278,7 @@ public abstract class FileConfiguration extends MemoryConfiguration {
* invalid. * invalid.
* @throws IllegalArgumentException Thrown if contents is null. * @throws IllegalArgumentException Thrown if contents is null.
*/ */
public abstract void loadFromString(String contents) throws InvalidConfigurationException; public abstract void loadFromString(final String contents) throws InvalidConfigurationException;
/** /**
* Compiles the header for this {@link FileConfiguration} and returns the * Compiles the header for this {@link FileConfiguration} and returns the
@ -276,11 +293,13 @@ public abstract class FileConfiguration extends MemoryConfiguration {
protected abstract String buildHeader(); protected abstract String buildHeader();
@Override @Override
public FileConfigurationOptions options() { public FileConfigurationOptions options()
if (options == null) { {
if (options == null)
{
options = new FileConfigurationOptions(this); options = new FileConfigurationOptions(this);
} }
return (FileConfigurationOptions) options; return (FileConfigurationOptions) options;
} }
} }

View File

@ -7,27 +7,32 @@ import com.intellectualcrafters.configuration.MemoryConfigurationOptions;
* Various settings for controlling the input and output of a {@link * Various settings for controlling the input and output of a {@link
* FileConfiguration} * FileConfiguration}
*/ */
public class FileConfigurationOptions extends MemoryConfigurationOptions { public class FileConfigurationOptions extends MemoryConfigurationOptions
{
private String header = null; private String header = null;
private boolean copyHeader = true; private boolean copyHeader = true;
protected FileConfigurationOptions(MemoryConfiguration configuration) { protected FileConfigurationOptions(final MemoryConfiguration configuration)
{
super(configuration); super(configuration);
} }
@Override @Override
public FileConfiguration configuration() { public FileConfiguration configuration()
{
return (FileConfiguration) super.configuration(); return (FileConfiguration) super.configuration();
} }
@Override @Override
public FileConfigurationOptions copyDefaults(boolean value) { public FileConfigurationOptions copyDefaults(final boolean value)
{
super.copyDefaults(value); super.copyDefaults(value);
return this; return this;
} }
@Override @Override
public FileConfigurationOptions pathSeparator(char value) { public FileConfigurationOptions pathSeparator(final char value)
{
super.pathSeparator(value); super.pathSeparator(value);
return this; return this;
} }
@ -46,7 +51,8 @@ public class FileConfigurationOptions extends MemoryConfigurationOptions {
* *
* @return Header * @return Header
*/ */
public String header() { public String header()
{
return header; return header;
} }
@ -65,8 +71,9 @@ public class FileConfigurationOptions extends MemoryConfigurationOptions {
* @param value New header * @param value New header
* @return This object, for chaining * @return This object, for chaining
*/ */
public FileConfigurationOptions header(String value) { public FileConfigurationOptions header(final String value)
this.header = value; {
header = value;
return this; return this;
} }
@ -88,7 +95,8 @@ public class FileConfigurationOptions extends MemoryConfigurationOptions {
* *
* @return Whether or not to copy the header * @return Whether or not to copy the header
*/ */
public boolean copyHeader() { public boolean copyHeader()
{
return copyHeader; return copyHeader;
} }
@ -111,7 +119,8 @@ public class FileConfigurationOptions extends MemoryConfigurationOptions {
* @param value Whether or not to copy the header * @param value Whether or not to copy the header
* @return This object, for chaining * @return This object, for chaining
*/ */
public FileConfigurationOptions copyHeader(boolean value) { public FileConfigurationOptions copyHeader(final boolean value)
{
copyHeader = value; copyHeader = value;
return this; return this;

View File

@ -22,7 +22,8 @@ import com.intellectualcrafters.plot.PS;
* An implementation of {@link Configuration} which saves all files in Yaml. * An implementation of {@link Configuration} which saves all files in Yaml.
* Note that this implementation is not synchronized. * Note that this implementation is not synchronized.
*/ */
public class YamlConfiguration extends FileConfiguration { public class YamlConfiguration extends FileConfiguration
{
protected static final String COMMENT_PREFIX = "# "; protected static final String COMMENT_PREFIX = "# ";
protected static final String BLANK_CONFIG = "{}\n"; protected static final String BLANK_CONFIG = "{}\n";
private final DumperOptions yamlOptions = new DumperOptions(); private final DumperOptions yamlOptions = new DumperOptions();
@ -30,16 +31,18 @@ public class YamlConfiguration extends FileConfiguration {
private final Yaml yaml = new Yaml(new YamlConstructor(), yamlRepresenter, yamlOptions); private final Yaml yaml = new Yaml(new YamlConstructor(), yamlRepresenter, yamlOptions);
@Override @Override
public String saveToString() { public String saveToString()
{
yamlOptions.setIndent(options().indent()); yamlOptions.setIndent(options().indent());
yamlOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); yamlOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
yamlOptions.setAllowUnicode(SYSTEM_UTF); yamlOptions.setAllowUnicode(SYSTEM_UTF);
yamlRepresenter.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); yamlRepresenter.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
String header = buildHeader(); final String header = buildHeader();
String dump = yaml.dump(getValues(false)); String dump = yaml.dump(getValues(false));
if (dump.equals(BLANK_CONFIG)) { if (dump.equals(BLANK_CONFIG))
{
dump = ""; dump = "";
} }
@ -47,63 +50,85 @@ public class YamlConfiguration extends FileConfiguration {
} }
@Override @Override
public void loadFromString(String contents) throws InvalidConfigurationException { public void loadFromString(final String contents) throws InvalidConfigurationException
if (contents == null) throw new NullPointerException("Contents cannot be null"); {
if (contents == null) { throw new NullPointerException("Contents cannot be null"); }
Map<?, ?> input; Map<?, ?> input;
try { try
{
input = (Map<?, ?>) yaml.load(contents); input = (Map<?, ?>) yaml.load(contents);
} catch (YAMLException e) { }
catch (final YAMLException e)
{
throw new InvalidConfigurationException(e); throw new InvalidConfigurationException(e);
} catch (ClassCastException e) { }
catch (final ClassCastException e)
{
throw new InvalidConfigurationException("Top level is not a Map."); throw new InvalidConfigurationException("Top level is not a Map.");
} }
String header = parseHeader(contents); final String header = parseHeader(contents);
if (header.length() > 0) { if (header.length() > 0)
{
options().header(header); options().header(header);
} }
if (input != null) { if (input != null)
{
convertMapsToSections(input, this); convertMapsToSections(input, this);
} }
} }
protected void convertMapsToSections(Map<?, ?> input, ConfigurationSection section) { protected void convertMapsToSections(final Map<?, ?> input, final ConfigurationSection section)
for (Map.Entry<?, ?> entry : input.entrySet()) { {
String key = entry.getKey().toString(); for (final Map.Entry<?, ?> entry : input.entrySet())
Object value = entry.getValue(); {
final String key = entry.getKey().toString();
final Object value = entry.getValue();
if (value instanceof Map) { if (value instanceof Map)
{
convertMapsToSections((Map<?, ?>) value, section.createSection(key)); convertMapsToSections((Map<?, ?>) value, section.createSection(key));
} else { }
else
{
section.set(key, value); section.set(key, value);
} }
} }
} }
protected String parseHeader(String input) { protected String parseHeader(final String input)
String[] lines = input.split("\r?\n", -1); {
StringBuilder result = new StringBuilder(); final String[] lines = input.split("\r?\n", -1);
final StringBuilder result = new StringBuilder();
boolean readingHeader = true; boolean readingHeader = true;
boolean foundHeader = false; boolean foundHeader = false;
for (int i = 0; (i < lines.length) && (readingHeader); i++) { for (int i = 0; (i < lines.length) && (readingHeader); i++)
String line = lines[i]; {
final String line = lines[i];
if (line.startsWith(COMMENT_PREFIX)) { if (line.startsWith(COMMENT_PREFIX))
if (i > 0) { {
if (i > 0)
{
result.append("\n"); result.append("\n");
} }
if (line.length() > COMMENT_PREFIX.length()) { if (line.length() > COMMENT_PREFIX.length())
{
result.append(line.substring(COMMENT_PREFIX.length())); result.append(line.substring(COMMENT_PREFIX.length()));
} }
foundHeader = true; foundHeader = true;
} else if ((foundHeader) && (line.length() == 0)) { }
else if ((foundHeader) && (line.length() == 0))
{
result.append("\n"); result.append("\n");
} else if (foundHeader) { }
else if (foundHeader)
{
readingHeader = false; readingHeader = false;
} }
} }
@ -112,34 +137,35 @@ public class YamlConfiguration extends FileConfiguration {
} }
@Override @Override
protected String buildHeader() { protected String buildHeader()
String header = options().header(); {
final String header = options().header();
if (options().copyHeader()) { if (options().copyHeader())
Configuration def = getDefaults(); {
final Configuration def = getDefaults();
if ((def != null) && (def instanceof FileConfiguration)) { if ((def != null) && (def instanceof FileConfiguration))
FileConfiguration filedefaults = (FileConfiguration) def; {
String defaultsHeader = filedefaults.buildHeader(); final FileConfiguration filedefaults = (FileConfiguration) def;
final String defaultsHeader = filedefaults.buildHeader();
if ((defaultsHeader != null) && (defaultsHeader.length() > 0)) { if ((defaultsHeader != null) && (defaultsHeader.length() > 0)) { return defaultsHeader; }
return defaultsHeader;
}
} }
} }
if (header == null) { if (header == null) { return ""; }
return "";
}
StringBuilder builder = new StringBuilder(); final StringBuilder builder = new StringBuilder();
String[] lines = header.split("\r?\n", -1); final String[] lines = header.split("\r?\n", -1);
boolean startedHeader = false; boolean startedHeader = false;
for (int i = lines.length - 1; i >= 0; i--) { for (int i = lines.length - 1; i >= 0; i--)
{
builder.insert(0, "\n"); builder.insert(0, "\n");
if ((startedHeader) || (lines[i].length() != 0)) { if ((startedHeader) || (lines[i].length() != 0))
{
builder.insert(0, lines[i]); builder.insert(0, lines[i]);
builder.insert(0, COMMENT_PREFIX); builder.insert(0, COMMENT_PREFIX);
startedHeader = true; startedHeader = true;
@ -150,8 +176,10 @@ public class YamlConfiguration extends FileConfiguration {
} }
@Override @Override
public YamlConfigurationOptions options() { public YamlConfigurationOptions options()
if (options == null) { {
if (options == null)
{
options = new YamlConfigurationOptions(this); options = new YamlConfigurationOptions(this);
} }
@ -171,28 +199,36 @@ public class YamlConfiguration extends FileConfiguration {
* @return Resulting configuration * @return Resulting configuration
* @throws IllegalArgumentException Thrown if file is null * @throws IllegalArgumentException Thrown if file is null
*/ */
public static YamlConfiguration loadConfiguration(File file) { public static YamlConfiguration loadConfiguration(final File file)
if (file == null) throw new NullPointerException("File cannot be null"); {
if (file == null) { throw new NullPointerException("File cannot be null"); }
YamlConfiguration config = new YamlConfiguration(); final YamlConfiguration config = new YamlConfiguration();
try { try
{
config.load(file); config.load(file);
} catch (Exception ex) { }
try { catch (final Exception ex)
String path = file.getAbsolutePath() + "_broken"; {
try
{
file.getAbsolutePath();
File dest = new File(file.getAbsolutePath() + "_broken"); File dest = new File(file.getAbsolutePath() + "_broken");
int i = 0; int i = 0;
while (dest.exists()) { while (dest.exists())
{
dest = new File(file.getAbsolutePath() + "_broken_" + i++); dest = new File(file.getAbsolutePath() + "_broken_" + i++);
} }
Files.copy( file.toPath(), dest.toPath() , StandardCopyOption.REPLACE_EXISTING); Files.copy(file.toPath(), dest.toPath(), StandardCopyOption.REPLACE_EXISTING);
PS.debug("&dCould not read: &7" + file); PS.debug("&dCould not read: &7" + file);
PS.debug("&drenamed to: &7" + dest.getName()); PS.debug("&drenamed to: &7" + dest.getName());
PS.debug("&c============ Full stacktrace ============"); PS.debug("&c============ Full stacktrace ============");
ex.printStackTrace(); ex.printStackTrace();
PS.debug("&c========================================="); PS.debug("&c=========================================");
} catch (IOException e) { }
catch (final IOException e)
{
e.printStackTrace(); e.printStackTrace();
} }
} }
@ -215,17 +251,23 @@ public class YamlConfiguration extends FileConfiguration {
* @see #loadConfiguration(Reader) * @see #loadConfiguration(Reader)
*/ */
@Deprecated @Deprecated
public static YamlConfiguration loadConfiguration(InputStream stream) { public static YamlConfiguration loadConfiguration(final InputStream stream)
if (stream == null) throw new NullPointerException("Stream cannot be null"); {
if (stream == null) { throw new NullPointerException("Stream cannot be null"); }
YamlConfiguration config = new YamlConfiguration(); final YamlConfiguration config = new YamlConfiguration();
try { try
{
config.load(stream); config.load(stream);
} catch (IOException ex) { }
catch (final IOException ex)
{
PS.debug("Cannot load configuration from stream"); PS.debug("Cannot load configuration from stream");
ex.printStackTrace(); ex.printStackTrace();
} catch (InvalidConfigurationException ex) { }
catch (final InvalidConfigurationException ex)
{
ex.printStackTrace(); ex.printStackTrace();
PS.debug("Cannot load configuration from stream"); PS.debug("Cannot load configuration from stream");
} }
@ -233,7 +275,6 @@ public class YamlConfiguration extends FileConfiguration {
return config; return config;
} }
/** /**
* Creates a new {@link YamlConfiguration}, loading from the given reader. * Creates a new {@link YamlConfiguration}, loading from the given reader.
* <p> * <p>
@ -245,17 +286,23 @@ public class YamlConfiguration extends FileConfiguration {
* @return resulting configuration * @return resulting configuration
* @throws IllegalArgumentException Thrown if stream is null * @throws IllegalArgumentException Thrown if stream is null
*/ */
public static YamlConfiguration loadConfiguration(Reader reader) { public static YamlConfiguration loadConfiguration(final Reader reader)
if (reader == null) throw new NullPointerException("Reader cannot be null"); {
if (reader == null) { throw new NullPointerException("Reader cannot be null"); }
YamlConfiguration config = new YamlConfiguration(); final YamlConfiguration config = new YamlConfiguration();
try { try
{
config.load(reader); config.load(reader);
} catch (IOException ex) { }
catch (final IOException ex)
{
PS.debug("Cannot load configuration from stream"); PS.debug("Cannot load configuration from stream");
ex.printStackTrace(); ex.printStackTrace();
} catch (InvalidConfigurationException ex) { }
catch (final InvalidConfigurationException ex)
{
PS.debug("Cannot load configuration from stream"); PS.debug("Cannot load configuration from stream");
ex.printStackTrace(); ex.printStackTrace();
} }

View File

@ -4,38 +4,45 @@ package com.intellectualcrafters.configuration.file;
* Various settings for controlling the input and output of a {@link * Various settings for controlling the input and output of a {@link
* YamlConfiguration} * YamlConfiguration}
*/ */
public class YamlConfigurationOptions extends FileConfigurationOptions { public class YamlConfigurationOptions extends FileConfigurationOptions
{
private int indent = 2; private int indent = 2;
protected YamlConfigurationOptions(YamlConfiguration configuration) { protected YamlConfigurationOptions(final YamlConfiguration configuration)
{
super(configuration); super(configuration);
} }
@Override @Override
public YamlConfiguration configuration() { public YamlConfiguration configuration()
{
return (YamlConfiguration) super.configuration(); return (YamlConfiguration) super.configuration();
} }
@Override @Override
public YamlConfigurationOptions copyDefaults(boolean value) { public YamlConfigurationOptions copyDefaults(final boolean value)
{
super.copyDefaults(value); super.copyDefaults(value);
return this; return this;
} }
@Override @Override
public YamlConfigurationOptions pathSeparator(char value) { public YamlConfigurationOptions pathSeparator(final char value)
{
super.pathSeparator(value); super.pathSeparator(value);
return this; return this;
} }
@Override @Override
public YamlConfigurationOptions header(String value) { public YamlConfigurationOptions header(final String value)
{
super.header(value); super.header(value);
return this; return this;
} }
@Override @Override
public YamlConfigurationOptions copyHeader(boolean value) { public YamlConfigurationOptions copyHeader(final boolean value)
{
super.copyHeader(value); super.copyHeader(value);
return this; return this;
} }
@ -47,7 +54,8 @@ public class YamlConfigurationOptions extends FileConfigurationOptions {
* *
* @return How much to indent by * @return How much to indent by
*/ */
public int indent() { public int indent()
{
return indent; return indent;
} }
@ -59,11 +67,12 @@ public class YamlConfigurationOptions extends FileConfigurationOptions {
* @param value New indent * @param value New indent
* @return This object, for chaining * @return This object, for chaining
*/ */
public YamlConfigurationOptions indent(int value) { public YamlConfigurationOptions indent(final int value)
if (value < 2) throw new IllegalArgumentException("Indent must be at least 2 characters"); {
if (value > 9) throw new IllegalArgumentException("Indent cannot be greater than 9 characters"); if (value < 2) { throw new IllegalArgumentException("Indent must be at least 2 characters"); }
if (value > 9) { throw new IllegalArgumentException("Indent cannot be greater than 9 characters"); }
this.indent = value; indent = value;
return this; return this;
} }
} }

View File

@ -10,30 +10,37 @@ import org.yaml.snakeyaml.nodes.Tag;
import com.intellectualcrafters.configuration.serialization.ConfigurationSerialization; import com.intellectualcrafters.configuration.serialization.ConfigurationSerialization;
public class YamlConstructor extends SafeConstructor { public class YamlConstructor extends SafeConstructor
{
public YamlConstructor() { public YamlConstructor()
this.yamlConstructors.put(Tag.MAP, new ConstructCustomObject()); {
yamlConstructors.put(Tag.MAP, new ConstructCustomObject());
} }
private class ConstructCustomObject extends ConstructYamlMap { private class ConstructCustomObject extends ConstructYamlMap
{
@Override @Override
public Object construct(Node node) { public Object construct(final Node node)
if (node.isTwoStepsConstruction()) { {
throw new YAMLException("Unexpected referential mapping structure. Node: " + node); if (node.isTwoStepsConstruction()) { throw new YAMLException("Unexpected referential mapping structure. Node: " + node); }
}
Map<?, ?> raw = (Map<?, ?>) super.construct(node); final Map<?, ?> raw = (Map<?, ?>) super.construct(node);
if (raw.containsKey(ConfigurationSerialization.SERIALIZED_TYPE_KEY)) { if (raw.containsKey(ConfigurationSerialization.SERIALIZED_TYPE_KEY))
Map<String, Object> typed = new LinkedHashMap<String, Object>(raw.size()); {
for (Map.Entry<?, ?> entry : raw.entrySet()) { final Map<String, Object> typed = new LinkedHashMap<String, Object>(raw.size());
for (final Map.Entry<?, ?> entry : raw.entrySet())
{
typed.put(entry.getKey().toString(), entry.getValue()); typed.put(entry.getKey().toString(), entry.getValue());
} }
try { try
{
return ConfigurationSerialization.deserializeObject(typed); return ConfigurationSerialization.deserializeObject(typed);
} catch (IllegalArgumentException ex) { }
catch (final IllegalArgumentException ex)
{
throw new YAMLException("Could not deserialize object", ex); throw new YAMLException("Could not deserialize object", ex);
} }
} }
@ -42,7 +49,8 @@ public class YamlConstructor extends SafeConstructor {
} }
@Override @Override
public void construct2ndStep(Node node, Object object) { public void construct2ndStep(final Node node, final Object object)
{
throw new YAMLException("Unexpected referential mapping structure. Node: " + node); throw new YAMLException("Unexpected referential mapping structure. Node: " + node);
} }
} }

View File

@ -10,25 +10,31 @@ import com.intellectualcrafters.configuration.ConfigurationSection;
import com.intellectualcrafters.configuration.serialization.ConfigurationSerializable; import com.intellectualcrafters.configuration.serialization.ConfigurationSerializable;
import com.intellectualcrafters.configuration.serialization.ConfigurationSerialization; import com.intellectualcrafters.configuration.serialization.ConfigurationSerialization;
public class YamlRepresenter extends Representer { public class YamlRepresenter extends Representer
{
public YamlRepresenter() { public YamlRepresenter()
this.multiRepresenters.put(ConfigurationSection.class, new RepresentConfigurationSection()); {
this.multiRepresenters.put(ConfigurationSerializable.class, new RepresentConfigurationSerializable()); multiRepresenters.put(ConfigurationSection.class, new RepresentConfigurationSection());
multiRepresenters.put(ConfigurationSerializable.class, new RepresentConfigurationSerializable());
} }
private class RepresentConfigurationSection extends RepresentMap { private class RepresentConfigurationSection extends RepresentMap
{
@Override @Override
public Node representData(Object data) { public Node representData(final Object data)
{
return super.representData(((ConfigurationSection) data).getValues(false)); return super.representData(((ConfigurationSection) data).getValues(false));
} }
} }
private class RepresentConfigurationSerializable extends RepresentMap { private class RepresentConfigurationSerializable extends RepresentMap
{
@Override @Override
public Node representData(Object data) { public Node representData(final Object data)
ConfigurationSerializable serializable = (ConfigurationSerializable) data; {
Map<String, Object> values = new LinkedHashMap<String, Object>(); final ConfigurationSerializable serializable = (ConfigurationSerializable) data;
final Map<String, Object> values = new LinkedHashMap<String, Object>();
values.put(ConfigurationSerialization.SERIALIZED_TYPE_KEY, ConfigurationSerialization.getAlias(serializable.getClass())); values.put(ConfigurationSerialization.SERIALIZED_TYPE_KEY, ConfigurationSerialization.getAlias(serializable.getClass()));
values.putAll(serializable.serialize()); values.putAll(serializable.serialize());

View File

@ -21,7 +21,8 @@ import java.util.Map;
* @see DelegateDeserialization * @see DelegateDeserialization
* @see SerializableAs * @see SerializableAs
*/ */
public interface ConfigurationSerializable { public interface ConfigurationSerializable
{
/** /**
* Creates a Map representation of this class. * Creates a Map representation of this class.

View File

@ -14,103 +14,130 @@ import com.intellectualcrafters.configuration.Configuration;
/** /**
* Utility class for storing and retrieving classes for {@link Configuration}. * Utility class for storing and retrieving classes for {@link Configuration}.
*/ */
public class ConfigurationSerialization { public class ConfigurationSerialization
{
public static final String SERIALIZED_TYPE_KEY = "=="; public static final String SERIALIZED_TYPE_KEY = "==";
private final Class<? extends ConfigurationSerializable> clazz; private final Class<? extends ConfigurationSerializable> clazz;
private static Map<String, Class<? extends ConfigurationSerializable>> aliases = new HashMap<String, Class<? extends ConfigurationSerializable>>(); private static Map<String, Class<? extends ConfigurationSerializable>> aliases = new HashMap<String, Class<? extends ConfigurationSerializable>>();
protected ConfigurationSerialization(Class<? extends ConfigurationSerializable> clazz) { protected ConfigurationSerialization(final Class<? extends ConfigurationSerializable> clazz)
{
this.clazz = clazz; this.clazz = clazz;
} }
protected Method getMethod(String name, boolean isStatic) { protected Method getMethod(final String name, final boolean isStatic)
try { {
Method method = clazz.getDeclaredMethod(name, Map.class); try
{
final Method method = clazz.getDeclaredMethod(name, Map.class);
if (!ConfigurationSerializable.class.isAssignableFrom(method.getReturnType())) { if (!ConfigurationSerializable.class.isAssignableFrom(method.getReturnType())) { return null; }
return null; if (Modifier.isStatic(method.getModifiers()) != isStatic) { return null; }
}
if (Modifier.isStatic(method.getModifiers()) != isStatic) {
return null;
}
return method; return method;
} catch (NoSuchMethodException ex) { }
catch (final NoSuchMethodException ex)
{
return null; return null;
} catch (SecurityException ex) { }
catch (final SecurityException ex)
{
return null; return null;
} }
} }
protected Constructor<? extends ConfigurationSerializable> getConstructor() { protected Constructor<? extends ConfigurationSerializable> getConstructor()
try { {
try
{
return clazz.getConstructor(Map.class); return clazz.getConstructor(Map.class);
} catch (NoSuchMethodException ex) { }
catch (final NoSuchMethodException ex)
{
return null; return null;
} catch (SecurityException ex) { }
catch (final SecurityException ex)
{
return null; return null;
} }
} }
protected ConfigurationSerializable deserializeViaMethod(Method method, Map<String, ?> args) { protected ConfigurationSerializable deserializeViaMethod(final Method method, final Map<String, ?> args)
try { {
ConfigurationSerializable result = (ConfigurationSerializable) method.invoke(null, args); try
{
final ConfigurationSerializable result = (ConfigurationSerializable) method.invoke(null, args);
if (result == null) { if (result == null)
Logger.getLogger(ConfigurationSerialization.class.getName()).log(Level.SEVERE, "Could not call method '" + method.toString() + "' of " + clazz + " for deserialization: method returned null"); {
} else { Logger.getLogger(ConfigurationSerialization.class.getName()).log(Level.SEVERE,
"Could not call method '" + method.toString() + "' of " + clazz + " for deserialization: method returned null");
}
else
{
return result; return result;
} }
} catch (Throwable ex) { }
catch (final Throwable ex)
{
Logger.getLogger(ConfigurationSerialization.class.getName()).log( Logger.getLogger(ConfigurationSerialization.class.getName()).log(
Level.SEVERE, Level.SEVERE,
"Could not call method '" + method.toString() + "' of " + clazz + " for deserialization", "Could not call method '" + method.toString() + "' of " + clazz + " for deserialization",
ex instanceof InvocationTargetException ? ex.getCause() : ex); ex instanceof InvocationTargetException ? ex.getCause() : ex);
} }
return null; return null;
} }
protected ConfigurationSerializable deserializeViaCtor(Constructor<? extends ConfigurationSerializable> ctor, Map<String, ?> args) { protected ConfigurationSerializable deserializeViaCtor(final Constructor<? extends ConfigurationSerializable> ctor, final Map<String, ?> args)
try { {
try
{
return ctor.newInstance(args); return ctor.newInstance(args);
} catch (Throwable ex) { }
catch (final Throwable ex)
{
Logger.getLogger(ConfigurationSerialization.class.getName()).log( Logger.getLogger(ConfigurationSerialization.class.getName()).log(
Level.SEVERE, Level.SEVERE,
"Could not call constructor '" + ctor.toString() + "' of " + clazz + " for deserialization", "Could not call constructor '" + ctor.toString() + "' of " + clazz + " for deserialization",
ex instanceof InvocationTargetException ? ex.getCause() : ex); ex instanceof InvocationTargetException ? ex.getCause() : ex);
} }
return null; return null;
} }
public ConfigurationSerializable deserialize(Map<String, ?> args) { public ConfigurationSerializable deserialize(final Map<String, ?> args)
if (args == null) { {
throw new NullPointerException("Args must not be null"); if (args == null) { throw new NullPointerException("Args must not be null"); }
}
ConfigurationSerializable result = null; ConfigurationSerializable result = null;
Method method = null; Method method = null;
if (result == null) { if (result == null)
{
method = getMethod("deserialize", true); method = getMethod("deserialize", true);
if (method != null) { if (method != null)
{
result = deserializeViaMethod(method, args); result = deserializeViaMethod(method, args);
} }
} }
if (result == null) { if (result == null)
{
method = getMethod("valueOf", true); method = getMethod("valueOf", true);
if (method != null) { if (method != null)
{
result = deserializeViaMethod(method, args); result = deserializeViaMethod(method, args);
} }
} }
if (result == null) { if (result == null)
Constructor<? extends ConfigurationSerializable> constructor = getConstructor(); {
final Constructor<? extends ConfigurationSerializable> constructor = getConstructor();
if (constructor != null) { if (constructor != null)
{
result = deserializeViaCtor(constructor, args); result = deserializeViaCtor(constructor, args);
} }
} }
@ -133,7 +160,8 @@ public class ConfigurationSerialization {
* @param clazz Class to deserialize into * @param clazz Class to deserialize into
* @return New instance of the specified class * @return New instance of the specified class
*/ */
public static ConfigurationSerializable deserializeObject(Map<String, ?> args, Class<? extends ConfigurationSerializable> clazz) { public static ConfigurationSerializable deserializeObject(final Map<String, ?> args, final Class<? extends ConfigurationSerializable> clazz)
{
return new ConfigurationSerialization(clazz).deserialize(args); return new ConfigurationSerialization(clazz).deserialize(args);
} }
@ -151,25 +179,28 @@ public class ConfigurationSerialization {
* @param args Arguments for deserialization * @param args Arguments for deserialization
* @return New instance of the specified class * @return New instance of the specified class
*/ */
public static ConfigurationSerializable deserializeObject(Map<String, ?> args) { public static ConfigurationSerializable deserializeObject(final Map<String, ?> args)
{
Class<? extends ConfigurationSerializable> clazz = null; Class<? extends ConfigurationSerializable> clazz = null;
if (args.containsKey(SERIALIZED_TYPE_KEY)) { if (args.containsKey(SERIALIZED_TYPE_KEY))
try { {
String alias = (String) args.get(SERIALIZED_TYPE_KEY); try
{
final String alias = (String) args.get(SERIALIZED_TYPE_KEY);
if (alias == null) { if (alias == null) { throw new IllegalArgumentException("Cannot have null alias"); }
throw new IllegalArgumentException("Cannot have null alias");
}
clazz = getClassByAlias(alias); clazz = getClassByAlias(alias);
if (clazz == null) { if (clazz == null) { throw new IllegalArgumentException("Specified class does not exist ('" + alias + "')"); }
throw new IllegalArgumentException("Specified class does not exist ('" + alias + "')"); }
} catch (final ClassCastException ex)
} catch (ClassCastException ex) { {
ex.fillInStackTrace(); ex.fillInStackTrace();
throw ex; throw ex;
} }
} else { }
else
{
throw new IllegalArgumentException("Args doesn't contain type key ('" + SERIALIZED_TYPE_KEY + "')"); throw new IllegalArgumentException("Args doesn't contain type key ('" + SERIALIZED_TYPE_KEY + "')");
} }
@ -182,10 +213,12 @@ public class ConfigurationSerialization {
* *
* @param clazz Class to register * @param clazz Class to register
*/ */
public static void registerClass(Class<? extends ConfigurationSerializable> clazz) { public static void registerClass(final Class<? extends ConfigurationSerializable> clazz)
DelegateDeserialization delegate = clazz.getAnnotation(DelegateDeserialization.class); {
final DelegateDeserialization delegate = clazz.getAnnotation(DelegateDeserialization.class);
if (delegate == null) { if (delegate == null)
{
registerClass(clazz, getAlias(clazz)); registerClass(clazz, getAlias(clazz));
registerClass(clazz, clazz.getName()); registerClass(clazz, clazz.getName());
} }
@ -199,7 +232,8 @@ public class ConfigurationSerialization {
* @param alias Alias to register as * @param alias Alias to register as
* @see SerializableAs * @see SerializableAs
*/ */
public static void registerClass(Class<? extends ConfigurationSerializable> clazz, String alias) { public static void registerClass(final Class<? extends ConfigurationSerializable> clazz, final String alias)
{
aliases.put(alias, clazz); aliases.put(alias, clazz);
} }
@ -208,7 +242,8 @@ public class ConfigurationSerialization {
* *
* @param alias Alias to unregister * @param alias Alias to unregister
*/ */
public static void unregisterClass(String alias) { public static void unregisterClass(final String alias)
{
aliases.remove(alias); aliases.remove(alias);
} }
@ -218,9 +253,10 @@ public class ConfigurationSerialization {
* *
* @param clazz Class to unregister * @param clazz Class to unregister
*/ */
public static void unregisterClass(Class<? extends ConfigurationSerializable> clazz) { public static void unregisterClass(final Class<? extends ConfigurationSerializable> clazz)
while (aliases.values().remove(clazz)) { {
} while (aliases.values().remove(clazz))
{}
} }
/** /**
@ -230,7 +266,8 @@ public class ConfigurationSerialization {
* @param alias Alias of the serializable * @param alias Alias of the serializable
* @return Registered class, or null if not found * @return Registered class, or null if not found
*/ */
public static Class<? extends ConfigurationSerializable> getClassByAlias(String alias) { public static Class<? extends ConfigurationSerializable> getClassByAlias(final String alias)
{
return aliases.get(alias); return aliases.get(alias);
} }
@ -241,23 +278,27 @@ public class ConfigurationSerialization {
* @param clazz Class to get alias for * @param clazz Class to get alias for
* @return Alias to use for the class * @return Alias to use for the class
*/ */
public static String getAlias(Class<? extends ConfigurationSerializable> clazz) { public static String getAlias(final Class<? extends ConfigurationSerializable> clazz)
{
DelegateDeserialization delegate = clazz.getAnnotation(DelegateDeserialization.class); DelegateDeserialization delegate = clazz.getAnnotation(DelegateDeserialization.class);
if (delegate != null) { if (delegate != null)
if ((delegate.value() == null) || (delegate.value() == clazz)) { {
if ((delegate.value() == null) || (delegate.value() == clazz))
{
delegate = null; delegate = null;
} else { }
else
{
return getAlias(delegate.value()); return getAlias(delegate.value());
} }
} }
if (delegate == null) { if (delegate == null)
SerializableAs alias = clazz.getAnnotation(SerializableAs.class); {
final SerializableAs alias = clazz.getAnnotation(SerializableAs.class);
if ((alias != null) && (alias.value() != null)) { if ((alias != null) && (alias.value() != null)) { return alias.value(); }
return alias.value();
}
} }
return clazz.getName(); return clazz.getName();

View File

@ -11,7 +11,8 @@ import java.lang.annotation.Target;
*/ */
@Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE) @Target(ElementType.TYPE)
public @interface DelegateDeserialization { public @interface DelegateDeserialization
{
/** /**
* Which class should be used as a delegate for this classes * Which class should be used as a delegate for this classes
* deserialization * deserialization

View File

@ -21,7 +21,8 @@ import java.lang.annotation.Target;
*/ */
@Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE) @Target(ElementType.TYPE)
public @interface SerializableAs { public @interface SerializableAs
{
/** /**
* This is the name your class will be stored and retrieved as. * This is the name your class will be stored and retrieved as.
* <p> * <p>

View File

@ -3,7 +3,8 @@ package com.intellectualcrafters.jnbt;
/** /**
* The {@code TAG_Byte_Array} tag. * The {@code TAG_Byte_Array} tag.
*/ */
public final class ByteArrayTag extends Tag { public final class ByteArrayTag extends Tag
{
private final byte[] value; private final byte[] value;
/** /**
@ -11,7 +12,8 @@ public final class ByteArrayTag extends Tag {
* *
* @param value the value of the tag * @param value the value of the tag
*/ */
public ByteArrayTag(final byte[] value) { public ByteArrayTag(final byte[] value)
{
super(); super();
this.value = value; this.value = value;
} }
@ -22,30 +24,36 @@ public final class ByteArrayTag extends Tag {
* @param name the name of the tag * @param name the name of the tag
* @param value the value of the tag * @param value the value of the tag
*/ */
public ByteArrayTag(final String name, final byte[] value) { public ByteArrayTag(final String name, final byte[] value)
{
super(name); super(name);
this.value = value; this.value = value;
} }
@Override @Override
public byte[] getValue() { public byte[] getValue()
return this.value; {
return value;
} }
@Override @Override
public String toString() { public String toString()
{
final StringBuilder hex = new StringBuilder(); final StringBuilder hex = new StringBuilder();
for (final byte b : this.value) { for (final byte b : value)
{
final String hexDigits = Integer.toHexString(b).toUpperCase(); final String hexDigits = Integer.toHexString(b).toUpperCase();
if (hexDigits.length() == 1) { if (hexDigits.length() == 1)
{
hex.append("0"); hex.append("0");
} }
hex.append(hexDigits).append(" "); hex.append(hexDigits).append(" ");
} }
final String name = getName(); final String name = getName();
String append = ""; String append = "";
if ((name != null) && !name.equals("")) { if ((name != null) && !name.equals(""))
append = "(\"" + this.getName() + "\")"; {
append = "(\"" + getName() + "\")";
} }
return "TAG_Byte_Array" + append + ": " + hex; return "TAG_Byte_Array" + append + ": " + hex;
} }

View File

@ -3,7 +3,8 @@ package com.intellectualcrafters.jnbt;
/** /**
* The {@code TAG_Byte} tag. * The {@code TAG_Byte} tag.
*/ */
public final class ByteTag extends Tag { public final class ByteTag extends Tag
{
private final byte value; private final byte value;
/** /**
@ -11,7 +12,8 @@ public final class ByteTag extends Tag {
* *
* @param value the value of the tag * @param value the value of the tag
*/ */
public ByteTag(final byte value) { public ByteTag(final byte value)
{
super(); super();
this.value = value; this.value = value;
} }
@ -22,23 +24,27 @@ public final class ByteTag extends Tag {
* @param name the name of the tag * @param name the name of the tag
* @param value the value of the tag * @param value the value of the tag
*/ */
public ByteTag(final String name, final byte value) { public ByteTag(final String name, final byte value)
{
super(name); super(name);
this.value = value; this.value = value;
} }
@Override @Override
public Byte getValue() { public Byte getValue()
return this.value; {
return value;
} }
@Override @Override
public String toString() { public String toString()
{
final String name = getName(); final String name = getName();
String append = ""; String append = "";
if ((name != null) && !name.equals("")) { if ((name != null) && !name.equals(""))
append = "(\"" + this.getName() + "\")"; {
append = "(\"" + getName() + "\")";
} }
return "TAG_Byte" + append + ": " + this.value; return "TAG_Byte" + append + ": " + value;
} }
} }

View File

@ -8,7 +8,8 @@ import java.util.Map;
/** /**
* The {@code TAG_Compound} tag. * The {@code TAG_Compound} tag.
*/ */
public final class CompoundTag extends Tag { public final class CompoundTag extends Tag
{
private final Map<String, Tag> value; private final Map<String, Tag> value;
/** /**
@ -16,7 +17,8 @@ public final class CompoundTag extends Tag {
* *
* @param value the value of the tag * @param value the value of the tag
*/ */
public CompoundTag(final Map<String, Tag> value) { public CompoundTag(final Map<String, Tag> value)
{
super(); super();
this.value = Collections.unmodifiableMap(value); this.value = Collections.unmodifiableMap(value);
} }
@ -27,7 +29,8 @@ public final class CompoundTag extends Tag {
* @param name the name of the tag * @param name the name of the tag
* @param value the value of the tag * @param value the value of the tag
*/ */
public CompoundTag(final String name, final Map<String, Tag> value) { public CompoundTag(final String name, final Map<String, Tag> value)
{
super(name); super(name);
this.value = Collections.unmodifiableMap(value); this.value = Collections.unmodifiableMap(value);
} }
@ -39,13 +42,15 @@ public final class CompoundTag extends Tag {
* *
* @return true if the tag contains the given key * @return true if the tag contains the given key
*/ */
public boolean containsKey(final String key) { public boolean containsKey(final String key)
return this.value.containsKey(key); {
return value.containsKey(key);
} }
@Override @Override
public Map<String, Tag> getValue() { public Map<String, Tag> getValue()
return this.value; {
return value;
} }
/** /**
@ -55,7 +60,8 @@ public final class CompoundTag extends Tag {
* *
* @return the new compound tag * @return the new compound tag
*/ */
public CompoundTag setValue(final Map<String, Tag> value) { public CompoundTag setValue(final Map<String, Tag> value)
{
return new CompoundTag(getName(), value); return new CompoundTag(getName(), value);
} }
@ -64,8 +70,9 @@ public final class CompoundTag extends Tag {
* *
* @return the builder * @return the builder
*/ */
public CompoundTagBuilder createBuilder() { public CompoundTagBuilder createBuilder()
return new CompoundTagBuilder(new HashMap<String, Tag>(this.value)); {
return new CompoundTagBuilder(new HashMap<String, Tag>(value));
} }
/** /**
@ -76,11 +83,15 @@ public final class CompoundTag extends Tag {
* *
* @return a byte array * @return a byte array
*/ */
public byte[] getByteArray(final String key) { public byte[] getByteArray(final String key)
final Tag tag = this.value.get(key); {
if (tag instanceof ByteArrayTag) { final Tag tag = value.get(key);
if (tag instanceof ByteArrayTag)
{
return ((ByteArrayTag) tag).getValue(); return ((ByteArrayTag) tag).getValue();
} else { }
else
{
return new byte[0]; return new byte[0];
} }
} }
@ -93,11 +104,15 @@ public final class CompoundTag extends Tag {
* *
* @return a byte * @return a byte
*/ */
public byte getByte(final String key) { public byte getByte(final String key)
final Tag tag = this.value.get(key); {
if (tag instanceof ByteTag) { final Tag tag = value.get(key);
if (tag instanceof ByteTag)
{
return ((ByteTag) tag).getValue(); return ((ByteTag) tag).getValue();
} else { }
else
{
return (byte) 0; return (byte) 0;
} }
} }
@ -110,11 +125,15 @@ public final class CompoundTag extends Tag {
* *
* @return a double * @return a double
*/ */
public double getDouble(final String key) { public double getDouble(final String key)
final Tag tag = this.value.get(key); {
if (tag instanceof DoubleTag) { final Tag tag = value.get(key);
if (tag instanceof DoubleTag)
{
return ((DoubleTag) tag).getValue(); return ((DoubleTag) tag).getValue();
} else { }
else
{
return 0; return 0;
} }
} }
@ -127,21 +146,35 @@ public final class CompoundTag extends Tag {
* *
* @return a double * @return a double
*/ */
public double asDouble(final String key) { public double asDouble(final String key)
final Tag tag = this.value.get(key); {
if (tag instanceof ByteTag) { final Tag tag = value.get(key);
if (tag instanceof ByteTag)
{
return ((ByteTag) tag).getValue(); return ((ByteTag) tag).getValue();
} else if (tag instanceof ShortTag) { }
else if (tag instanceof ShortTag)
{
return ((ShortTag) tag).getValue(); return ((ShortTag) tag).getValue();
} else if (tag instanceof IntTag) { }
else if (tag instanceof IntTag)
{
return ((IntTag) tag).getValue(); return ((IntTag) tag).getValue();
} else if (tag instanceof LongTag) { }
else if (tag instanceof LongTag)
{
return ((LongTag) tag).getValue(); return ((LongTag) tag).getValue();
} else if (tag instanceof FloatTag) { }
else if (tag instanceof FloatTag)
{
return ((FloatTag) tag).getValue(); return ((FloatTag) tag).getValue();
} else if (tag instanceof DoubleTag) { }
else if (tag instanceof DoubleTag)
{
return ((DoubleTag) tag).getValue(); return ((DoubleTag) tag).getValue();
} else { }
else
{
return 0; return 0;
} }
} }
@ -154,11 +187,15 @@ public final class CompoundTag extends Tag {
* *
* @return a float * @return a float
*/ */
public float getFloat(final String key) { public float getFloat(final String key)
final Tag tag = this.value.get(key); {
if (tag instanceof FloatTag) { final Tag tag = value.get(key);
if (tag instanceof FloatTag)
{
return ((FloatTag) tag).getValue(); return ((FloatTag) tag).getValue();
} else { }
else
{
return 0; return 0;
} }
} }
@ -171,11 +208,15 @@ public final class CompoundTag extends Tag {
* *
* @return an int array * @return an int array
*/ */
public int[] getIntArray(final String key) { public int[] getIntArray(final String key)
final Tag tag = this.value.get(key); {
if (tag instanceof IntArrayTag) { final Tag tag = value.get(key);
if (tag instanceof IntArrayTag)
{
return ((IntArrayTag) tag).getValue(); return ((IntArrayTag) tag).getValue();
} else { }
else
{
return new int[0]; return new int[0];
} }
} }
@ -188,11 +229,15 @@ public final class CompoundTag extends Tag {
* *
* @return an int * @return an int
*/ */
public int getInt(final String key) { public int getInt(final String key)
final Tag tag = this.value.get(key); {
if (tag instanceof IntTag) { final Tag tag = value.get(key);
if (tag instanceof IntTag)
{
return ((IntTag) tag).getValue(); return ((IntTag) tag).getValue();
} else { }
else
{
return 0; return 0;
} }
} }
@ -205,21 +250,35 @@ public final class CompoundTag extends Tag {
* *
* @return an int * @return an int
*/ */
public int asInt(final String key) { public int asInt(final String key)
final Tag tag = this.value.get(key); {
if (tag instanceof ByteTag) { final Tag tag = value.get(key);
if (tag instanceof ByteTag)
{
return ((ByteTag) tag).getValue(); return ((ByteTag) tag).getValue();
} else if (tag instanceof ShortTag) { }
else if (tag instanceof ShortTag)
{
return ((ShortTag) tag).getValue(); return ((ShortTag) tag).getValue();
} else if (tag instanceof IntTag) { }
else if (tag instanceof IntTag)
{
return ((IntTag) tag).getValue(); return ((IntTag) tag).getValue();
} else if (tag instanceof LongTag) { }
else if (tag instanceof LongTag)
{
return ((LongTag) tag).getValue().intValue(); return ((LongTag) tag).getValue().intValue();
} else if (tag instanceof FloatTag) { }
else if (tag instanceof FloatTag)
{
return ((FloatTag) tag).getValue().intValue(); return ((FloatTag) tag).getValue().intValue();
} else if (tag instanceof DoubleTag) { }
else if (tag instanceof DoubleTag)
{
return ((DoubleTag) tag).getValue().intValue(); return ((DoubleTag) tag).getValue().intValue();
} else { }
else
{
return 0; return 0;
} }
} }
@ -232,11 +291,15 @@ public final class CompoundTag extends Tag {
* *
* @return a list of tags * @return a list of tags
*/ */
public List<Tag> getList(final String key) { public List<Tag> getList(final String key)
final Tag tag = this.value.get(key); {
if (tag instanceof ListTag) { final Tag tag = value.get(key);
if (tag instanceof ListTag)
{
return ((ListTag) tag).getValue(); return ((ListTag) tag).getValue();
} else { }
else
{
return Collections.emptyList(); return Collections.emptyList();
} }
} }
@ -249,11 +312,15 @@ public final class CompoundTag extends Tag {
* *
* @return a tag list instance * @return a tag list instance
*/ */
public ListTag getListTag(final String key) { public ListTag getListTag(final String key)
final Tag tag = this.value.get(key); {
if (tag instanceof ListTag) { final Tag tag = value.get(key);
if (tag instanceof ListTag)
{
return (ListTag) tag; return (ListTag) tag;
} else { }
else
{
return new ListTag(key, StringTag.class, Collections.<Tag> emptyList()); return new ListTag(key, StringTag.class, Collections.<Tag> emptyList());
} }
} }
@ -270,16 +337,23 @@ public final class CompoundTag extends Tag {
* @return a list of tags * @return a list of tags
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public <T extends Tag> List<T> getList(final String key, final Class<T> listType) { public <T extends Tag> List<T> getList(final String key, final Class<T> listType)
final Tag tag = this.value.get(key); {
if (tag instanceof ListTag) { final Tag tag = value.get(key);
if (tag instanceof ListTag)
{
final ListTag listTag = (ListTag) tag; final ListTag listTag = (ListTag) tag;
if (listTag.getType().equals(listType)) { if (listTag.getType().equals(listType))
{
return (List<T>) listTag.getValue(); return (List<T>) listTag.getValue();
} else { }
else
{
return Collections.emptyList(); return Collections.emptyList();
} }
} else { }
else
{
return Collections.emptyList(); return Collections.emptyList();
} }
} }
@ -292,11 +366,15 @@ public final class CompoundTag extends Tag {
* *
* @return a long * @return a long
*/ */
public long getLong(final String key) { public long getLong(final String key)
final Tag tag = this.value.get(key); {
if (tag instanceof LongTag) { final Tag tag = value.get(key);
if (tag instanceof LongTag)
{
return ((LongTag) tag).getValue(); return ((LongTag) tag).getValue();
} else { }
else
{
return 0L; return 0L;
} }
} }
@ -309,21 +387,35 @@ public final class CompoundTag extends Tag {
* *
* @return a long * @return a long
*/ */
public long asLong(final String key) { public long asLong(final String key)
final Tag tag = this.value.get(key); {
if (tag instanceof ByteTag) { final Tag tag = value.get(key);
if (tag instanceof ByteTag)
{
return ((ByteTag) tag).getValue(); return ((ByteTag) tag).getValue();
} else if (tag instanceof ShortTag) { }
else if (tag instanceof ShortTag)
{
return ((ShortTag) tag).getValue(); return ((ShortTag) tag).getValue();
} else if (tag instanceof IntTag) { }
else if (tag instanceof IntTag)
{
return ((IntTag) tag).getValue(); return ((IntTag) tag).getValue();
} else if (tag instanceof LongTag) { }
else if (tag instanceof LongTag)
{
return ((LongTag) tag).getValue(); return ((LongTag) tag).getValue();
} else if (tag instanceof FloatTag) { }
else if (tag instanceof FloatTag)
{
return ((FloatTag) tag).getValue().longValue(); return ((FloatTag) tag).getValue().longValue();
} else if (tag instanceof DoubleTag) { }
else if (tag instanceof DoubleTag)
{
return ((DoubleTag) tag).getValue().longValue(); return ((DoubleTag) tag).getValue().longValue();
} else { }
else
{
return 0L; return 0L;
} }
} }
@ -336,11 +428,15 @@ public final class CompoundTag extends Tag {
* *
* @return a short * @return a short
*/ */
public short getShort(final String key) { public short getShort(final String key)
final Tag tag = this.value.get(key); {
if (tag instanceof ShortTag) { final Tag tag = value.get(key);
if (tag instanceof ShortTag)
{
return ((ShortTag) tag).getValue(); return ((ShortTag) tag).getValue();
} else { }
else
{
return 0; return 0;
} }
} }
@ -353,25 +449,32 @@ public final class CompoundTag extends Tag {
* *
* @return a string * @return a string
*/ */
public String getString(final String key) { public String getString(final String key)
final Tag tag = this.value.get(key); {
if (tag instanceof StringTag) { final Tag tag = value.get(key);
if (tag instanceof StringTag)
{
return ((StringTag) tag).getValue(); return ((StringTag) tag).getValue();
} else { }
else
{
return ""; return "";
} }
} }
@Override @Override
public String toString() { public String toString()
{
final String name = getName(); final String name = getName();
String append = ""; String append = "";
if ((name != null) && !name.equals("")) { if ((name != null) && !name.equals(""))
append = "(\"" + this.getName() + "\")"; {
append = "(\"" + getName() + "\")";
} }
final StringBuilder bldr = new StringBuilder(); final StringBuilder bldr = new StringBuilder();
bldr.append("TAG_Compound").append(append).append(": ").append(this.value.size()).append(" entries\r\n{\r\n"); bldr.append("TAG_Compound").append(append).append(": ").append(value.size()).append(" entries\r\n{\r\n");
for (final Map.Entry<String, Tag> entry : this.value.entrySet()) { for (final Map.Entry<String, Tag> entry : value.entrySet())
{
bldr.append(" ").append(entry.getValue().toString().replaceAll("\r\n", "\r\n ")).append("\r\n"); bldr.append(" ").append(entry.getValue().toString().replaceAll("\r\n", "\r\n ")).append("\r\n");
} }
bldr.append("}"); bldr.append("}");

View File

@ -8,14 +8,16 @@ import java.util.Map;
/** /**
* Helps create compound tags. * Helps create compound tags.
*/ */
public class CompoundTagBuilder { public class CompoundTagBuilder
{
private final Map<String, Tag> entries; private final Map<String, Tag> entries;
/** /**
* Create a new instance. * Create a new instance.
*/ */
CompoundTagBuilder() { CompoundTagBuilder()
this.entries = new HashMap<String, Tag>(); {
entries = new HashMap<String, Tag>();
} }
/** /**
@ -23,9 +25,10 @@ public class CompoundTagBuilder {
* *
* @param value the value * @param value the value
*/ */
CompoundTagBuilder(final Map<String, Tag> value) { CompoundTagBuilder(final Map<String, Tag> value)
{
checkNotNull(value); checkNotNull(value);
this.entries = value; entries = value;
} }
/** /**
@ -33,7 +36,8 @@ public class CompoundTagBuilder {
* *
* @return a new builder * @return a new builder
*/ */
public static CompoundTagBuilder create() { public static CompoundTagBuilder create()
{
return new CompoundTagBuilder(); return new CompoundTagBuilder();
} }
@ -45,10 +49,11 @@ public class CompoundTagBuilder {
* *
* @return this object * @return this object
*/ */
public CompoundTagBuilder put(final String key, final Tag value) { public CompoundTagBuilder put(final String key, final Tag value)
{
checkNotNull(key); checkNotNull(key);
checkNotNull(value); checkNotNull(value);
this.entries.put(key, value); entries.put(key, value);
return this; return this;
} }
@ -60,7 +65,8 @@ public class CompoundTagBuilder {
* *
* @return this object * @return this object
*/ */
public CompoundTagBuilder putByteArray(final String key, final byte[] value) { public CompoundTagBuilder putByteArray(final String key, final byte[] value)
{
return put(key, new ByteArrayTag(key, value)); return put(key, new ByteArrayTag(key, value));
} }
@ -72,7 +78,8 @@ public class CompoundTagBuilder {
* *
* @return this object * @return this object
*/ */
public CompoundTagBuilder putByte(final String key, final byte value) { public CompoundTagBuilder putByte(final String key, final byte value)
{
return put(key, new ByteTag(key, value)); return put(key, new ByteTag(key, value));
} }
@ -84,7 +91,8 @@ public class CompoundTagBuilder {
* *
* @return this object * @return this object
*/ */
public CompoundTagBuilder putDouble(final String key, final double value) { public CompoundTagBuilder putDouble(final String key, final double value)
{
return put(key, new DoubleTag(key, value)); return put(key, new DoubleTag(key, value));
} }
@ -96,7 +104,8 @@ public class CompoundTagBuilder {
* *
* @return this object * @return this object
*/ */
public CompoundTagBuilder putFloat(final String key, final float value) { public CompoundTagBuilder putFloat(final String key, final float value)
{
return put(key, new FloatTag(key, value)); return put(key, new FloatTag(key, value));
} }
@ -108,7 +117,8 @@ public class CompoundTagBuilder {
* *
* @return this object * @return this object
*/ */
public CompoundTagBuilder putIntArray(final String key, final int[] value) { public CompoundTagBuilder putIntArray(final String key, final int[] value)
{
return put(key, new IntArrayTag(key, value)); return put(key, new IntArrayTag(key, value));
} }
@ -120,7 +130,8 @@ public class CompoundTagBuilder {
* *
* @return this object * @return this object
*/ */
public CompoundTagBuilder putInt(final String key, final int value) { public CompoundTagBuilder putInt(final String key, final int value)
{
return put(key, new IntTag(key, value)); return put(key, new IntTag(key, value));
} }
@ -132,7 +143,8 @@ public class CompoundTagBuilder {
* *
* @return this object * @return this object
*/ */
public CompoundTagBuilder putLong(final String key, final long value) { public CompoundTagBuilder putLong(final String key, final long value)
{
return put(key, new LongTag(key, value)); return put(key, new LongTag(key, value));
} }
@ -144,7 +156,8 @@ public class CompoundTagBuilder {
* *
* @return this object * @return this object
*/ */
public CompoundTagBuilder putShort(final String key, final short value) { public CompoundTagBuilder putShort(final String key, final short value)
{
return put(key, new ShortTag(key, value)); return put(key, new ShortTag(key, value));
} }
@ -156,7 +169,8 @@ public class CompoundTagBuilder {
* *
* @return this object * @return this object
*/ */
public CompoundTagBuilder putString(final String key, final String value) { public CompoundTagBuilder putString(final String key, final String value)
{
return put(key, new StringTag(key, value)); return put(key, new StringTag(key, value));
} }
@ -167,9 +181,11 @@ public class CompoundTagBuilder {
* *
* @return this object * @return this object
*/ */
public CompoundTagBuilder putAll(final Map<String, ? extends Tag> value) { public CompoundTagBuilder putAll(final Map<String, ? extends Tag> value)
{
checkNotNull(value); checkNotNull(value);
for (final Map.Entry<String, ? extends Tag> entry : value.entrySet()) { for (final Map.Entry<String, ? extends Tag> entry : value.entrySet())
{
put(entry.getKey(), entry.getValue()); put(entry.getKey(), entry.getValue());
} }
return this; return this;
@ -180,8 +196,9 @@ public class CompoundTagBuilder {
* *
* @return the new compound tag * @return the new compound tag
*/ */
public CompoundTag build() { public CompoundTag build()
return new CompoundTag(new HashMap<String, Tag>(this.entries)); {
return new CompoundTag(new HashMap<String, Tag>(entries));
} }
/** /**
@ -191,7 +208,8 @@ public class CompoundTagBuilder {
* *
* @return the created compound tag * @return the created compound tag
*/ */
public CompoundTag build(final String name) { public CompoundTag build(final String name)
return new CompoundTag(name, new HashMap<String, Tag>(this.entries)); {
return new CompoundTag(name, new HashMap<String, Tag>(entries));
} }
} }

View File

@ -3,7 +3,8 @@ package com.intellectualcrafters.jnbt;
/** /**
* The {@code TAG_Double} tag. * The {@code TAG_Double} tag.
*/ */
public final class DoubleTag extends Tag { public final class DoubleTag extends Tag
{
private final double value; private final double value;
/** /**
@ -11,7 +12,8 @@ public final class DoubleTag extends Tag {
* *
* @param value the value of the tag * @param value the value of the tag
*/ */
public DoubleTag(final double value) { public DoubleTag(final double value)
{
super(); super();
this.value = value; this.value = value;
} }
@ -22,23 +24,27 @@ public final class DoubleTag extends Tag {
* @param name the name of the tag * @param name the name of the tag
* @param value the value of the tag * @param value the value of the tag
*/ */
public DoubleTag(final String name, final double value) { public DoubleTag(final String name, final double value)
{
super(name); super(name);
this.value = value; this.value = value;
} }
@Override @Override
public Double getValue() { public Double getValue()
return this.value; {
return value;
} }
@Override @Override
public String toString() { public String toString()
{
final String name = getName(); final String name = getName();
String append = ""; String append = "";
if ((name != null) && !name.equals("")) { if ((name != null) && !name.equals(""))
append = "(\"" + this.getName() + "\")"; {
append = "(\"" + getName() + "\")";
} }
return "TAG_Double" + append + ": " + this.value; return "TAG_Double" + append + ": " + value;
} }
} }

View File

@ -3,21 +3,25 @@ package com.intellectualcrafters.jnbt;
/** /**
* The {@code TAG_End} tag. * The {@code TAG_End} tag.
*/ */
public final class EndTag extends Tag { public final class EndTag extends Tag
{
/** /**
* Creates the tag. * Creates the tag.
*/ */
public EndTag() { public EndTag()
{
super(); super();
} }
@Override @Override
public Object getValue() { public Object getValue()
{
return null; return null;
} }
@Override @Override
public String toString() { public String toString()
{
return "TAG_End"; return "TAG_End";
} }
} }

View File

@ -3,7 +3,8 @@ package com.intellectualcrafters.jnbt;
/** /**
* The {@code TAG_Float} tag. * The {@code TAG_Float} tag.
*/ */
public final class FloatTag extends Tag { public final class FloatTag extends Tag
{
private final float value; private final float value;
/** /**
@ -11,7 +12,8 @@ public final class FloatTag extends Tag {
* *
* @param value the value of the tag * @param value the value of the tag
*/ */
public FloatTag(final float value) { public FloatTag(final float value)
{
super(); super();
this.value = value; this.value = value;
} }
@ -22,23 +24,27 @@ public final class FloatTag extends Tag {
* @param name the name of the tag * @param name the name of the tag
* @param value the value of the tag * @param value the value of the tag
*/ */
public FloatTag(final String name, final float value) { public FloatTag(final String name, final float value)
{
super(name); super(name);
this.value = value; this.value = value;
} }
@Override @Override
public Float getValue() { public Float getValue()
return this.value; {
return value;
} }
@Override @Override
public String toString() { public String toString()
{
final String name = getName(); final String name = getName();
String append = ""; String append = "";
if ((name != null) && !name.equals("")) { if ((name != null) && !name.equals(""))
append = "(\"" + this.getName() + "\")"; {
append = "(\"" + getName() + "\")";
} }
return "TAG_Float" + append + ": " + this.value; return "TAG_Float" + append + ": " + value;
} }
} }

View File

@ -5,7 +5,8 @@ import static com.google.common.base.Preconditions.checkNotNull;
/** /**
* The {@code TAG_Int_Array} tag. * The {@code TAG_Int_Array} tag.
*/ */
public final class IntArrayTag extends Tag { public final class IntArrayTag extends Tag
{
private final int[] value; private final int[] value;
/** /**
@ -13,7 +14,8 @@ public final class IntArrayTag extends Tag {
* *
* @param value the value of the tag * @param value the value of the tag
*/ */
public IntArrayTag(final int[] value) { public IntArrayTag(final int[] value)
{
super(); super();
checkNotNull(value); checkNotNull(value);
this.value = value; this.value = value;
@ -25,31 +27,37 @@ public final class IntArrayTag extends Tag {
* @param name the name of the tag * @param name the name of the tag
* @param value the value of the tag * @param value the value of the tag
*/ */
public IntArrayTag(final String name, final int[] value) { public IntArrayTag(final String name, final int[] value)
{
super(name); super(name);
checkNotNull(value); checkNotNull(value);
this.value = value; this.value = value;
} }
@Override @Override
public int[] getValue() { public int[] getValue()
return this.value; {
return value;
} }
@Override @Override
public String toString() { public String toString()
{
final StringBuilder hex = new StringBuilder(); final StringBuilder hex = new StringBuilder();
for (final int b : this.value) { for (final int b : value)
{
final String hexDigits = Integer.toHexString(b).toUpperCase(); final String hexDigits = Integer.toHexString(b).toUpperCase();
if (hexDigits.length() == 1) { if (hexDigits.length() == 1)
{
hex.append("0"); hex.append("0");
} }
hex.append(hexDigits).append(" "); hex.append(hexDigits).append(" ");
} }
final String name = getName(); final String name = getName();
String append = ""; String append = "";
if ((name != null) && !name.equals("")) { if ((name != null) && !name.equals(""))
append = "(\"" + this.getName() + "\")"; {
append = "(\"" + getName() + "\")";
} }
return "TAG_Int_Array" + append + ": " + hex; return "TAG_Int_Array" + append + ": " + hex;
} }

View File

@ -3,7 +3,8 @@ package com.intellectualcrafters.jnbt;
/** /**
* The {@code TAG_Int} tag. * The {@code TAG_Int} tag.
*/ */
public final class IntTag extends Tag { public final class IntTag extends Tag
{
private final int value; private final int value;
/** /**
@ -11,7 +12,8 @@ public final class IntTag extends Tag {
* *
* @param value the value of the tag * @param value the value of the tag
*/ */
public IntTag(final int value) { public IntTag(final int value)
{
super(); super();
this.value = value; this.value = value;
} }
@ -22,23 +24,27 @@ public final class IntTag extends Tag {
* @param name the name of the tag * @param name the name of the tag
* @param value the value of the tag * @param value the value of the tag
*/ */
public IntTag(final String name, final int value) { public IntTag(final String name, final int value)
{
super(name); super(name);
this.value = value; this.value = value;
} }
@Override @Override
public Integer getValue() { public Integer getValue()
return this.value; {
return value;
} }
@Override @Override
public String toString() { public String toString()
{
final String name = getName(); final String name = getName();
String append = ""; String append = "";
if ((name != null) && !name.equals("")) { if ((name != null) && !name.equals(""))
append = "(\"" + this.getName() + "\")"; {
append = "(\"" + getName() + "\")";
} }
return "TAG_Int" + append + ": " + this.value; return "TAG_Int" + append + ": " + value;
} }
} }

View File

@ -6,11 +6,11 @@ import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.NoSuchElementException; import java.util.NoSuchElementException;
/** /**
* The {@code TAG_List} tag. * The {@code TAG_List} tag.
*/ */
public final class ListTag extends Tag { public final class ListTag extends Tag
{
private final Class<? extends Tag> type; private final Class<? extends Tag> type;
private final List<Tag> value; private final List<Tag> value;
@ -20,7 +20,8 @@ public final class ListTag extends Tag {
* @param type the type of tag * @param type the type of tag
* @param value the value of the tag * @param value the value of the tag
*/ */
public ListTag(final Class<? extends Tag> type, final List<? extends Tag> value) { public ListTag(final Class<? extends Tag> type, final List<? extends Tag> value)
{
super(); super();
checkNotNull(value); checkNotNull(value);
this.type = type; this.type = type;
@ -34,7 +35,8 @@ public final class ListTag extends Tag {
* @param type the type of tag * @param type the type of tag
* @param value the value of the tag * @param value the value of the tag
*/ */
public ListTag(final String name, final Class<? extends Tag> type, final List<? extends Tag> value) { public ListTag(final String name, final Class<? extends Tag> type, final List<? extends Tag> value)
{
super(name); super(name);
checkNotNull(value); checkNotNull(value);
this.type = type; this.type = type;
@ -46,13 +48,15 @@ public final class ListTag extends Tag {
* *
* @return The type of item in this list. * @return The type of item in this list.
*/ */
public Class<? extends Tag> getType() { public Class<? extends Tag> getType()
return this.type; {
return type;
} }
@Override @Override
public List<Tag> getValue() { public List<Tag> getValue()
return this.value; {
return value;
} }
/** /**
@ -62,7 +66,8 @@ public final class ListTag extends Tag {
* *
* @return a new list tag * @return a new list tag
*/ */
public ListTag setValue(final List<Tag> list) { public ListTag setValue(final List<Tag> list)
{
return new ListTag(getName(), getType(), list); return new ListTag(getName(), getType(), list);
} }
@ -73,10 +78,14 @@ public final class ListTag extends Tag {
* *
* @return the tag or null * @return the tag or null
*/ */
public Tag getIfExists(final int index) { public Tag getIfExists(final int index)
try { {
return this.value.get(index); try
} catch (final NoSuchElementException e) { {
return value.get(index);
}
catch (final NoSuchElementException e)
{
return null; return null;
} }
} }
@ -89,11 +98,15 @@ public final class ListTag extends Tag {
* *
* @return a byte array * @return a byte array
*/ */
public byte[] getByteArray(final int index) { public byte[] getByteArray(final int index)
{
final Tag tag = getIfExists(index); final Tag tag = getIfExists(index);
if (tag instanceof ByteArrayTag) { if (tag instanceof ByteArrayTag)
{
return ((ByteArrayTag) tag).getValue(); return ((ByteArrayTag) tag).getValue();
} else { }
else
{
return new byte[0]; return new byte[0];
} }
} }
@ -106,11 +119,15 @@ public final class ListTag extends Tag {
* *
* @return a byte * @return a byte
*/ */
public byte getByte(final int index) { public byte getByte(final int index)
{
final Tag tag = getIfExists(index); final Tag tag = getIfExists(index);
if (tag instanceof ByteTag) { if (tag instanceof ByteTag)
{
return ((ByteTag) tag).getValue(); return ((ByteTag) tag).getValue();
} else { }
else
{
return (byte) 0; return (byte) 0;
} }
} }
@ -123,11 +140,15 @@ public final class ListTag extends Tag {
* *
* @return a double * @return a double
*/ */
public double getDouble(final int index) { public double getDouble(final int index)
{
final Tag tag = getIfExists(index); final Tag tag = getIfExists(index);
if (tag instanceof DoubleTag) { if (tag instanceof DoubleTag)
{
return ((DoubleTag) tag).getValue(); return ((DoubleTag) tag).getValue();
} else { }
else
{
return 0; return 0;
} }
} }
@ -140,21 +161,35 @@ public final class ListTag extends Tag {
* *
* @return a double * @return a double
*/ */
public double asDouble(final int index) { public double asDouble(final int index)
{
final Tag tag = getIfExists(index); final Tag tag = getIfExists(index);
if (tag instanceof ByteTag) { if (tag instanceof ByteTag)
{
return ((ByteTag) tag).getValue(); return ((ByteTag) tag).getValue();
} else if (tag instanceof ShortTag) { }
else if (tag instanceof ShortTag)
{
return ((ShortTag) tag).getValue(); return ((ShortTag) tag).getValue();
} else if (tag instanceof IntTag) { }
else if (tag instanceof IntTag)
{
return ((IntTag) tag).getValue(); return ((IntTag) tag).getValue();
} else if (tag instanceof LongTag) { }
else if (tag instanceof LongTag)
{
return ((LongTag) tag).getValue(); return ((LongTag) tag).getValue();
} else if (tag instanceof FloatTag) { }
else if (tag instanceof FloatTag)
{
return ((FloatTag) tag).getValue(); return ((FloatTag) tag).getValue();
} else if (tag instanceof DoubleTag) { }
else if (tag instanceof DoubleTag)
{
return ((DoubleTag) tag).getValue(); return ((DoubleTag) tag).getValue();
} else { }
else
{
return 0; return 0;
} }
} }
@ -167,11 +202,15 @@ public final class ListTag extends Tag {
* *
* @return a float * @return a float
*/ */
public float getFloat(final int index) { public float getFloat(final int index)
{
final Tag tag = getIfExists(index); final Tag tag = getIfExists(index);
if (tag instanceof FloatTag) { if (tag instanceof FloatTag)
{
return ((FloatTag) tag).getValue(); return ((FloatTag) tag).getValue();
} else { }
else
{
return 0; return 0;
} }
} }
@ -184,11 +223,15 @@ public final class ListTag extends Tag {
* *
* @return an int array * @return an int array
*/ */
public int[] getIntArray(final int index) { public int[] getIntArray(final int index)
{
final Tag tag = getIfExists(index); final Tag tag = getIfExists(index);
if (tag instanceof IntArrayTag) { if (tag instanceof IntArrayTag)
{
return ((IntArrayTag) tag).getValue(); return ((IntArrayTag) tag).getValue();
} else { }
else
{
return new int[0]; return new int[0];
} }
} }
@ -201,11 +244,15 @@ public final class ListTag extends Tag {
* *
* @return an int * @return an int
*/ */
public int getInt(final int index) { public int getInt(final int index)
{
final Tag tag = getIfExists(index); final Tag tag = getIfExists(index);
if (tag instanceof IntTag) { if (tag instanceof IntTag)
{
return ((IntTag) tag).getValue(); return ((IntTag) tag).getValue();
} else { }
else
{
return 0; return 0;
} }
} }
@ -218,21 +265,35 @@ public final class ListTag extends Tag {
* *
* @return an int * @return an int
*/ */
public int asInt(final int index) { public int asInt(final int index)
{
final Tag tag = getIfExists(index); final Tag tag = getIfExists(index);
if (tag instanceof ByteTag) { if (tag instanceof ByteTag)
{
return ((ByteTag) tag).getValue(); return ((ByteTag) tag).getValue();
} else if (tag instanceof ShortTag) { }
else if (tag instanceof ShortTag)
{
return ((ShortTag) tag).getValue(); return ((ShortTag) tag).getValue();
} else if (tag instanceof IntTag) { }
else if (tag instanceof IntTag)
{
return ((IntTag) tag).getValue(); return ((IntTag) tag).getValue();
} else if (tag instanceof LongTag) { }
else if (tag instanceof LongTag)
{
return ((LongTag) tag).getValue().intValue(); return ((LongTag) tag).getValue().intValue();
} else if (tag instanceof FloatTag) { }
else if (tag instanceof FloatTag)
{
return ((FloatTag) tag).getValue().intValue(); return ((FloatTag) tag).getValue().intValue();
} else if (tag instanceof DoubleTag) { }
else if (tag instanceof DoubleTag)
{
return ((DoubleTag) tag).getValue().intValue(); return ((DoubleTag) tag).getValue().intValue();
} else { }
else
{
return 0; return 0;
} }
} }
@ -245,11 +306,15 @@ public final class ListTag extends Tag {
* *
* @return a list of tags * @return a list of tags
*/ */
public List<Tag> getList(final int index) { public List<Tag> getList(final int index)
{
final Tag tag = getIfExists(index); final Tag tag = getIfExists(index);
if (tag instanceof ListTag) { if (tag instanceof ListTag)
{
return ((ListTag) tag).getValue(); return ((ListTag) tag).getValue();
} else { }
else
{
return Collections.emptyList(); return Collections.emptyList();
} }
} }
@ -262,11 +327,15 @@ public final class ListTag extends Tag {
* *
* @return a tag list instance * @return a tag list instance
*/ */
public ListTag getListTag(final int index) { public ListTag getListTag(final int index)
{
final Tag tag = getIfExists(index); final Tag tag = getIfExists(index);
if (tag instanceof ListTag) { if (tag instanceof ListTag)
{
return (ListTag) tag; return (ListTag) tag;
} else { }
else
{
return new ListTag(StringTag.class, Collections.<Tag> emptyList()); return new ListTag(StringTag.class, Collections.<Tag> emptyList());
} }
} }
@ -283,16 +352,23 @@ public final class ListTag extends Tag {
* @return a list of tags * @return a list of tags
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public <T extends Tag> List<T> getList(final int index, final Class<T> listType) { public <T extends Tag> List<T> getList(final int index, final Class<T> listType)
{
final Tag tag = getIfExists(index); final Tag tag = getIfExists(index);
if (tag instanceof ListTag) { if (tag instanceof ListTag)
{
final ListTag listTag = (ListTag) tag; final ListTag listTag = (ListTag) tag;
if (listTag.getType().equals(listType)) { if (listTag.getType().equals(listType))
{
return (List<T>) listTag.getValue(); return (List<T>) listTag.getValue();
} else { }
else
{
return Collections.emptyList(); return Collections.emptyList();
} }
} else { }
else
{
return Collections.emptyList(); return Collections.emptyList();
} }
} }
@ -305,11 +381,15 @@ public final class ListTag extends Tag {
* *
* @return a long * @return a long
*/ */
public long getLong(final int index) { public long getLong(final int index)
{
final Tag tag = getIfExists(index); final Tag tag = getIfExists(index);
if (tag instanceof LongTag) { if (tag instanceof LongTag)
{
return ((LongTag) tag).getValue(); return ((LongTag) tag).getValue();
} else { }
else
{
return 0L; return 0L;
} }
} }
@ -322,21 +402,35 @@ public final class ListTag extends Tag {
* *
* @return a long * @return a long
*/ */
public long asLong(final int index) { public long asLong(final int index)
{
final Tag tag = getIfExists(index); final Tag tag = getIfExists(index);
if (tag instanceof ByteTag) { if (tag instanceof ByteTag)
{
return ((ByteTag) tag).getValue(); return ((ByteTag) tag).getValue();
} else if (tag instanceof ShortTag) { }
else if (tag instanceof ShortTag)
{
return ((ShortTag) tag).getValue(); return ((ShortTag) tag).getValue();
} else if (tag instanceof IntTag) { }
else if (tag instanceof IntTag)
{
return ((IntTag) tag).getValue(); return ((IntTag) tag).getValue();
} else if (tag instanceof LongTag) { }
else if (tag instanceof LongTag)
{
return ((LongTag) tag).getValue(); return ((LongTag) tag).getValue();
} else if (tag instanceof FloatTag) { }
else if (tag instanceof FloatTag)
{
return ((FloatTag) tag).getValue().longValue(); return ((FloatTag) tag).getValue().longValue();
} else if (tag instanceof DoubleTag) { }
else if (tag instanceof DoubleTag)
{
return ((DoubleTag) tag).getValue().longValue(); return ((DoubleTag) tag).getValue().longValue();
} else { }
else
{
return 0; return 0;
} }
} }
@ -349,11 +443,15 @@ public final class ListTag extends Tag {
* *
* @return a short * @return a short
*/ */
public short getShort(final int index) { public short getShort(final int index)
{
final Tag tag = getIfExists(index); final Tag tag = getIfExists(index);
if (tag instanceof ShortTag) { if (tag instanceof ShortTag)
{
return ((ShortTag) tag).getValue(); return ((ShortTag) tag).getValue();
} else { }
else
{
return 0; return 0;
} }
} }
@ -366,25 +464,32 @@ public final class ListTag extends Tag {
* *
* @return a string * @return a string
*/ */
public String getString(final int index) { public String getString(final int index)
{
final Tag tag = getIfExists(index); final Tag tag = getIfExists(index);
if (tag instanceof StringTag) { if (tag instanceof StringTag)
{
return ((StringTag) tag).getValue(); return ((StringTag) tag).getValue();
} else { }
else
{
return ""; return "";
} }
} }
@Override @Override
public String toString() { public String toString()
{
final String name = getName(); final String name = getName();
String append = ""; String append = "";
if ((name != null) && !name.equals("")) { if ((name != null) && !name.equals(""))
append = "(\"" + this.getName() + "\")"; {
append = "(\"" + getName() + "\")";
} }
final StringBuilder bldr = new StringBuilder(); final StringBuilder bldr = new StringBuilder();
bldr.append("TAG_List").append(append).append(": ").append(this.value.size()).append(" entries of type ").append(NBTUtils.getTypeName(this.type)).append("\r\n{\r\n"); bldr.append("TAG_List").append(append).append(": ").append(value.size()).append(" entries of type ").append(NBTUtils.getTypeName(type)).append("\r\n{\r\n");
for (final Tag t : this.value) { for (final Tag t : value)
{
bldr.append(" ").append(t.toString().replaceAll("\r\n", "\r\n ")).append("\r\n"); bldr.append(" ").append(t.toString().replaceAll("\r\n", "\r\n ")).append("\r\n");
} }
bldr.append("}"); bldr.append("}");

View File

@ -10,7 +10,8 @@ import java.util.List;
/** /**
* Helps create list tags. * Helps create list tags.
*/ */
public class ListTagBuilder { public class ListTagBuilder
{
private final Class<? extends Tag> type; private final Class<? extends Tag> type;
private final List<Tag> entries; private final List<Tag> entries;
@ -19,42 +20,42 @@ public class ListTagBuilder {
* *
* @param type of tag contained in this list * @param type of tag contained in this list
*/ */
ListTagBuilder(final Class<? extends Tag> type) { ListTagBuilder(final Class<? extends Tag> type)
{
checkNotNull(type); checkNotNull(type);
this.type = type; this.type = type;
this.entries = new ArrayList<Tag>(); entries = new ArrayList<Tag>();
} }
/** /**
* Create a new builder instance. * Create a new builder instance.
* *
* @param type * @param type
* *
* @return a new builder * @return a new builder
*/ */
public static ListTagBuilder create(final Class<? extends Tag> type) { public static ListTagBuilder create(final Class<? extends Tag> type)
{
return new ListTagBuilder(type); return new ListTagBuilder(type);
} }
/** /**
* Create a new builder instance. * Create a new builder instance.
* *
* @param entries * @param entries
* @param <T> * @param <T>
* *
* @return a new builder * @return a new builder
*/ */
@SafeVarargs @SafeVarargs
public static <T extends Tag> ListTagBuilder createWith(final T... entries) { public static <T extends Tag> ListTagBuilder createWith(final T... entries)
{
checkNotNull(entries); checkNotNull(entries);
if (entries.length == 0) { if (entries.length == 0) { throw new IllegalArgumentException("This method needs an array of at least one entry"); }
throw new IllegalArgumentException("This method needs an array of at least one entry");
}
final Class<? extends Tag> type = entries[0].getClass(); final Class<? extends Tag> type = entries[0].getClass();
for (int i = 1; i < entries.length; i++) { for (int i = 1; i < entries.length; i++)
if (!type.isInstance(entries[i])) { {
throw new IllegalArgumentException("An array of different tag types was provided"); if (!type.isInstance(entries[i])) { throw new IllegalArgumentException("An array of different tag types was provided"); }
}
} }
final ListTagBuilder builder = new ListTagBuilder(type); final ListTagBuilder builder = new ListTagBuilder(type);
builder.addAll(Arrays.asList(entries)); builder.addAll(Arrays.asList(entries));
@ -68,12 +69,11 @@ public class ListTagBuilder {
* *
* @return this object * @return this object
*/ */
public ListTagBuilder add(final Tag value) { public ListTagBuilder add(final Tag value)
{
checkNotNull(value); checkNotNull(value);
if (!this.type.isInstance(value)) { if (!type.isInstance(value)) { throw new IllegalArgumentException(value.getClass().getCanonicalName() + " is not of expected type " + type.getCanonicalName()); }
throw new IllegalArgumentException(value.getClass().getCanonicalName() + " is not of expected type " + this.type.getCanonicalName()); entries.add(value);
}
this.entries.add(value);
return this; return this;
} }
@ -84,9 +84,11 @@ public class ListTagBuilder {
* *
* @return this object * @return this object
*/ */
public ListTagBuilder addAll(final Collection<? extends Tag> value) { public ListTagBuilder addAll(final Collection<? extends Tag> value)
{
checkNotNull(value); checkNotNull(value);
for (final Tag v : value) { for (final Tag v : value)
{
add(v); add(v);
} }
return this; return this;
@ -97,8 +99,9 @@ public class ListTagBuilder {
* *
* @return the new list tag * @return the new list tag
*/ */
public ListTag build() { public ListTag build()
return new ListTag(this.type, new ArrayList<Tag>(this.entries)); {
return new ListTag(type, new ArrayList<Tag>(entries));
} }
/** /**
@ -108,7 +111,8 @@ public class ListTagBuilder {
* *
* @return the created list tag * @return the created list tag
*/ */
public ListTag build(final String name) { public ListTag build(final String name)
return new ListTag(name, this.type, new ArrayList<Tag>(this.entries)); {
return new ListTag(name, type, new ArrayList<Tag>(entries));
} }
} }

View File

@ -3,7 +3,8 @@ package com.intellectualcrafters.jnbt;
/** /**
* The {@code TAG_Long} tag. * The {@code TAG_Long} tag.
*/ */
public final class LongTag extends Tag { public final class LongTag extends Tag
{
private final long value; private final long value;
/** /**
@ -11,7 +12,8 @@ public final class LongTag extends Tag {
* *
* @param value the value of the tag * @param value the value of the tag
*/ */
public LongTag(final long value) { public LongTag(final long value)
{
super(); super();
this.value = value; this.value = value;
} }
@ -22,23 +24,27 @@ public final class LongTag extends Tag {
* @param name the name of the tag * @param name the name of the tag
* @param value the value of the tag * @param value the value of the tag
*/ */
public LongTag(final String name, final long value) { public LongTag(final String name, final long value)
{
super(name); super(name);
this.value = value; this.value = value;
} }
@Override @Override
public Long getValue() { public Long getValue()
return this.value; {
return value;
} }
@Override @Override
public String toString() { public String toString()
{
final String name = getName(); final String name = getName();
String append = ""; String append = "";
if ((name != null) && !name.equals("")) { if ((name != null) && !name.equals(""))
append = "(\"" + this.getName() + "\")"; {
append = "(\"" + getName() + "\")";
} }
return "TAG_Long" + append + ": " + this.value; return "TAG_Long" + append + ": " + value;
} }
} }

View File

@ -25,15 +25,17 @@ import java.nio.charset.Charset;
/** /**
* A class which holds constant values. * A class which holds constant values.
*/ */
public final class NBTConstants { public final class NBTConstants
{
public static final Charset CHARSET = Charset.forName("UTF-8"); public static final Charset CHARSET = Charset.forName("UTF-8");
public static final int TYPE_END = 0, TYPE_BYTE = 1, TYPE_SHORT = 2, TYPE_INT = 3, TYPE_LONG = 4, TYPE_FLOAT = 5, TYPE_DOUBLE = 6, TYPE_BYTE_ARRAY = 7, TYPE_STRING = 8, TYPE_LIST = 9, TYPE_COMPOUND = 10, TYPE_INT_ARRAY = 11; public static final int TYPE_END = 0, TYPE_BYTE = 1, TYPE_SHORT = 2, TYPE_INT = 3, TYPE_LONG = 4, TYPE_FLOAT = 5, TYPE_DOUBLE = 6, TYPE_BYTE_ARRAY = 7, TYPE_STRING = 8, TYPE_LIST = 9,
TYPE_COMPOUND = 10, TYPE_INT_ARRAY = 11;
/** /**
* Default private constructor. * Default private constructor.
*/ */
private NBTConstants() { private NBTConstants()
} {}
/** /**
* Convert a type ID to its corresponding {@link Tag} class. * Convert a type ID to its corresponding {@link Tag} class.
@ -44,8 +46,10 @@ public final class NBTConstants {
* *
* @throws IllegalArgumentException thrown if the tag ID is not valid * @throws IllegalArgumentException thrown if the tag ID is not valid
*/ */
public static Class<? extends Tag> getClassFromType(final int id) { public static Class<? extends Tag> getClassFromType(final int id)
switch (id) { {
switch (id)
{
case TYPE_END: case TYPE_END:
return EndTag.class; return EndTag.class;
case TYPE_BYTE: case TYPE_BYTE:

View File

@ -14,11 +14,12 @@ import java.util.Map;
* subclasses of the {@code Tag} object. The NBT format was created by Markus Persson, and the specification * subclasses of the {@code Tag} object. The NBT format was created by Markus Persson, and the specification
* may be found at @linktourl http://www.minecraft.net/docs/NBT.txt"> http://www.minecraft.net/docs/NBT.txt. * may be found at @linktourl http://www.minecraft.net/docs/NBT.txt"> http://www.minecraft.net/docs/NBT.txt.
*/ */
public final class NBTInputStream implements Closeable { public final class NBTInputStream implements Closeable
{
private final DataInputStream is; private final DataInputStream is;
private int count; private int count;
/** /**
* Creates a new {@code NBTInputStream}, which will source its data from the specified input stream. * Creates a new {@code NBTInputStream}, which will source its data from the specified input stream.
* *
@ -26,7 +27,8 @@ public final class NBTInputStream implements Closeable {
* *
* @throws IOException if an I/O error occurs * @throws IOException if an I/O error occurs
*/ */
public NBTInputStream(final InputStream is) throws IOException { public NBTInputStream(final InputStream is) throws IOException
{
this.is = new DataInputStream(is); this.is = new DataInputStream(is);
} }
@ -37,10 +39,11 @@ public final class NBTInputStream implements Closeable {
* *
* @throws IOException if an I/O error occurs. * @throws IOException if an I/O error occurs.
*/ */
public Tag readTag() throws IOException { public Tag readTag() throws IOException
{
return readTag(0, Integer.MAX_VALUE); return readTag(0, Integer.MAX_VALUE);
} }
/** /**
* Reads an NBT tag from the stream. * Reads an NBT tag from the stream.
* *
@ -48,7 +51,8 @@ public final class NBTInputStream implements Closeable {
* *
* @throws IOException if an I/O error occurs. * @throws IOException if an I/O error occurs.
*/ */
public Tag readTag(int maxDepth) throws IOException { public Tag readTag(final int maxDepth) throws IOException
{
return readTag(0, maxDepth); return readTag(0, maxDepth);
} }
@ -61,16 +65,20 @@ public final class NBTInputStream implements Closeable {
* *
* @throws IOException if an I/O error occurs. * @throws IOException if an I/O error occurs.
*/ */
private Tag readTag(final int depth, int maxDepth) throws IOException { private Tag readTag(final int depth, final int maxDepth) throws IOException
if ((count++) > maxDepth) throw new IOException("Exceeds max depth: " + count); {
final int type = this.is.readByte() & 0xFF; if ((count++) > maxDepth) { throw new IOException("Exceeds max depth: " + count); }
final int type = is.readByte() & 0xFF;
String name; String name;
if (type != NBTConstants.TYPE_END) { if (type != NBTConstants.TYPE_END)
final int nameLength = this.is.readShort() & 0xFFFF; {
final int nameLength = is.readShort() & 0xFFFF;
final byte[] nameBytes = new byte[nameLength]; final byte[] nameBytes = new byte[nameLength];
this.is.readFully(nameBytes); is.readFully(nameBytes);
name = new String(nameBytes, NBTConstants.CHARSET); name = new String(nameBytes, NBTConstants.CHARSET);
} else { }
else
{
name = ""; name = "";
} }
return readTagPayload(type, name, depth, maxDepth); return readTagPayload(type, name, depth, maxDepth);
@ -87,84 +95,96 @@ public final class NBTInputStream implements Closeable {
* *
* @throws IOException if an I/O error occurs. * @throws IOException if an I/O error occurs.
*/ */
private Tag readTagPayload(final int type, final String name, final int depth, int maxDepth) throws IOException { private Tag readTagPayload(final int type, final String name, final int depth, final int maxDepth) throws IOException
if ((count++) > maxDepth) throw new IOException("Exceeds max depth: " + count); {
if ((count++) > maxDepth) { throw new IOException("Exceeds max depth: " + count); }
count++; count++;
switch (type) { switch (type)
{
case NBTConstants.TYPE_END: case NBTConstants.TYPE_END:
if (depth == 0) { if (depth == 0)
{
throw new IOException("TAG_End found without a TAG_Compound/TAG_List tag preceding it."); throw new IOException("TAG_End found without a TAG_Compound/TAG_List tag preceding it.");
} else { }
else
{
return new EndTag(); return new EndTag();
} }
case NBTConstants.TYPE_BYTE: case NBTConstants.TYPE_BYTE:
return new ByteTag(name, this.is.readByte()); return new ByteTag(name, is.readByte());
case NBTConstants.TYPE_SHORT: case NBTConstants.TYPE_SHORT:
return new ShortTag(name, this.is.readShort()); return new ShortTag(name, is.readShort());
case NBTConstants.TYPE_INT: case NBTConstants.TYPE_INT:
return new IntTag(name, this.is.readInt()); return new IntTag(name, is.readInt());
case NBTConstants.TYPE_LONG: case NBTConstants.TYPE_LONG:
return new LongTag(name, this.is.readLong()); return new LongTag(name, is.readLong());
case NBTConstants.TYPE_FLOAT: case NBTConstants.TYPE_FLOAT:
return new FloatTag(name, this.is.readFloat()); return new FloatTag(name, is.readFloat());
case NBTConstants.TYPE_DOUBLE: case NBTConstants.TYPE_DOUBLE:
return new DoubleTag(name, this.is.readDouble()); return new DoubleTag(name, is.readDouble());
case NBTConstants.TYPE_BYTE_ARRAY: case NBTConstants.TYPE_BYTE_ARRAY:
int length = this.is.readInt(); int length = is.readInt();
// Max depth // Max depth
if ((count += length) > maxDepth) throw new IOException("Exceeds max depth: " + count); if ((count += length) > maxDepth) { throw new IOException("Exceeds max depth: " + count);
// //
}
byte[] bytes = new byte[length]; byte[] bytes = new byte[length];
this.is.readFully(bytes); is.readFully(bytes);
return new ByteArrayTag(name, bytes); return new ByteArrayTag(name, bytes);
case NBTConstants.TYPE_STRING: case NBTConstants.TYPE_STRING:
length = this.is.readShort(); length = is.readShort();
// Max depth // Max depth
if ((count += length) > maxDepth) throw new IOException("Exceeds max depth: " + count); if ((count += length) > maxDepth) { throw new IOException("Exceeds max depth: " + count);
// //
}
bytes = new byte[length]; bytes = new byte[length];
this.is.readFully(bytes); is.readFully(bytes);
return new StringTag(name, new String(bytes, NBTConstants.CHARSET)); return new StringTag(name, new String(bytes, NBTConstants.CHARSET));
case NBTConstants.TYPE_LIST: case NBTConstants.TYPE_LIST:
final int childType = this.is.readByte(); final int childType = is.readByte();
length = this.is.readInt(); length = is.readInt();
// Max depth // Max depth
if ((count += length) > maxDepth) throw new IOException("Exceeds max depth: " + count); if ((count += length) > maxDepth) { throw new IOException("Exceeds max depth: " + count);
// //
}
final List<Tag> tagList = new ArrayList<Tag>(); final List<Tag> tagList = new ArrayList<Tag>();
for (int i = 0; i < length; ++i) { for (int i = 0; i < length; ++i)
{
final Tag tag = readTagPayload(childType, "", depth + 1, maxDepth); final Tag tag = readTagPayload(childType, "", depth + 1, maxDepth);
if (tag instanceof EndTag) { if (tag instanceof EndTag) { throw new IOException("TAG_End not permitted in a list."); }
throw new IOException("TAG_End not permitted in a list.");
}
tagList.add(tag); tagList.add(tag);
} }
return new ListTag(name, NBTUtils.getTypeClass(childType), tagList); return new ListTag(name, NBTUtils.getTypeClass(childType), tagList);
case NBTConstants.TYPE_COMPOUND: case NBTConstants.TYPE_COMPOUND:
final Map<String, Tag> tagMap = new HashMap<String, Tag>(); final Map<String, Tag> tagMap = new HashMap<String, Tag>();
while (true) { while (true)
{
final Tag tag = readTag(depth + 1, maxDepth); final Tag tag = readTag(depth + 1, maxDepth);
if (tag instanceof EndTag) { if (tag instanceof EndTag)
{
break; break;
} else { }
else
{
tagMap.put(tag.getName(), tag); tagMap.put(tag.getName(), tag);
} }
} }
return new CompoundTag(name, tagMap); return new CompoundTag(name, tagMap);
case NBTConstants.TYPE_INT_ARRAY: case NBTConstants.TYPE_INT_ARRAY:
length = this.is.readInt(); length = is.readInt();
// Max depth // Max depth
if ((count += length) > maxDepth) throw new IOException("Exceeds max depth: " + count); if ((count += length) > maxDepth) { throw new IOException("Exceeds max depth: " + count); }
// //
final int[] data = new int[length]; final int[] data = new int[length];
for (int i = 0; i < length; i++) { for (int i = 0; i < length; i++)
data[i] = this.is.readInt(); {
data[i] = is.readInt();
} }
return new IntArrayTag(name, data); return new IntArrayTag(name, data);
default: default:
@ -173,7 +193,8 @@ public final class NBTInputStream implements Closeable {
} }
@Override @Override
public void close() throws IOException { public void close() throws IOException
this.is.close(); {
is.close();
} }
} }

View File

@ -29,13 +29,14 @@ import java.util.List;
/** /**
* <p> This class writes <strong>NBT</strong>, or <strong>Named Binary Tag</strong> <code>Tag</code> objects to an * <p> This class writes <strong>NBT</strong>, or <strong>Named Binary Tag</strong> <code>Tag</code> objects to an
* underlying <code>OutputStream</code>. </p> <p> The NBT format was created by Markus Persson, and the * underlying <code>OutputStream</code>. </p> <p> The NBT format was created by Markus Persson, and the
* specification may be found at * specification may be found at
* @linktourl http://www.minecraft.net/docs/NBT.txt * @linktourl http://www.minecraft.net/docs/NBT.txt
* </p> * </p>
* *
* @author Graham Edgecombe * @author Graham Edgecombe
*/ */
public final class NBTOutputStream implements Closeable { public final class NBTOutputStream implements Closeable
{
/** /**
* The output stream. * The output stream.
*/ */
@ -48,7 +49,8 @@ public final class NBTOutputStream implements Closeable {
* *
* @throws IOException if an I/O error occurs. * @throws IOException if an I/O error occurs.
*/ */
public NBTOutputStream(final OutputStream os) throws IOException { public NBTOutputStream(final OutputStream os) throws IOException
{
this.os = new DataOutputStream(os); this.os = new DataOutputStream(os);
} }
@ -59,16 +61,15 @@ public final class NBTOutputStream implements Closeable {
* *
* @throws IOException if an I/O error occurs. * @throws IOException if an I/O error occurs.
*/ */
public void writeTag(final Tag tag) throws IOException { public void writeTag(final Tag tag) throws IOException
{
final int type = NBTUtils.getTypeCode(tag.getClass()); final int type = NBTUtils.getTypeCode(tag.getClass());
final String name = tag.getName(); final String name = tag.getName();
final byte[] nameBytes = name.getBytes(NBTConstants.CHARSET); final byte[] nameBytes = name.getBytes(NBTConstants.CHARSET);
this.os.writeByte(type); os.writeByte(type);
this.os.writeShort(nameBytes.length); os.writeShort(nameBytes.length);
this.os.write(nameBytes); os.write(nameBytes);
if (type == NBTConstants.TYPE_END) { if (type == NBTConstants.TYPE_END) { throw new IOException("Named TAG_End not permitted."); }
throw new IOException("Named TAG_End not permitted.");
}
writeTagPayload(tag); writeTagPayload(tag);
} }
@ -79,9 +80,11 @@ public final class NBTOutputStream implements Closeable {
* *
* @throws IOException if an I/O error occurs. * @throws IOException if an I/O error occurs.
*/ */
private void writeTagPayload(final Tag tag) throws IOException { private void writeTagPayload(final Tag tag) throws IOException
{
final int type = NBTUtils.getTypeCode(tag.getClass()); final int type = NBTUtils.getTypeCode(tag.getClass());
switch (type) { switch (type)
{
case NBTConstants.TYPE_END: case NBTConstants.TYPE_END:
writeEndTagPayload((EndTag) tag); writeEndTagPayload((EndTag) tag);
break; break;
@ -130,8 +133,9 @@ public final class NBTOutputStream implements Closeable {
* *
* @throws IOException if an I/O error occurs. * @throws IOException if an I/O error occurs.
*/ */
private void writeByteTagPayload(final ByteTag tag) throws IOException { private void writeByteTagPayload(final ByteTag tag) throws IOException
this.os.writeByte(tag.getValue()); {
os.writeByte(tag.getValue());
} }
/** /**
@ -141,10 +145,11 @@ public final class NBTOutputStream implements Closeable {
* *
* @throws IOException if an I/O error occurs. * @throws IOException if an I/O error occurs.
*/ */
private void writeByteArrayTagPayload(final ByteArrayTag tag) throws IOException { private void writeByteArrayTagPayload(final ByteArrayTag tag) throws IOException
{
final byte[] bytes = tag.getValue(); final byte[] bytes = tag.getValue();
this.os.writeInt(bytes.length); os.writeInt(bytes.length);
this.os.write(bytes); os.write(bytes);
} }
/** /**
@ -154,11 +159,13 @@ public final class NBTOutputStream implements Closeable {
* *
* @throws IOException if an I/O error occurs. * @throws IOException if an I/O error occurs.
*/ */
private void writeCompoundTagPayload(final CompoundTag tag) throws IOException { private void writeCompoundTagPayload(final CompoundTag tag) throws IOException
for (final Tag childTag : tag.getValue().values()) { {
for (final Tag childTag : tag.getValue().values())
{
writeTag(childTag); writeTag(childTag);
} }
this.os.writeByte((byte) 0); // end tag - better way? os.writeByte((byte) 0); // end tag - better way?
} }
/** /**
@ -168,13 +175,15 @@ public final class NBTOutputStream implements Closeable {
* *
* @throws IOException if an I/O error occurs. * @throws IOException if an I/O error occurs.
*/ */
private void writeListTagPayload(final ListTag tag) throws IOException { private void writeListTagPayload(final ListTag tag) throws IOException
{
final Class<? extends Tag> clazz = tag.getType(); final Class<? extends Tag> clazz = tag.getType();
final List<Tag> tags = tag.getValue(); final List<Tag> tags = tag.getValue();
final int size = tags.size(); final int size = tags.size();
this.os.writeByte(NBTUtils.getTypeCode(clazz)); os.writeByte(NBTUtils.getTypeCode(clazz));
this.os.writeInt(size); os.writeInt(size);
for (final Tag tag1 : tags) { for (final Tag tag1 : tags)
{
writeTagPayload(tag1); writeTagPayload(tag1);
} }
} }
@ -186,10 +195,11 @@ public final class NBTOutputStream implements Closeable {
* *
* @throws IOException if an I/O error occurs. * @throws IOException if an I/O error occurs.
*/ */
private void writeStringTagPayload(final StringTag tag) throws IOException { private void writeStringTagPayload(final StringTag tag) throws IOException
{
final byte[] bytes = tag.getValue().getBytes(NBTConstants.CHARSET); final byte[] bytes = tag.getValue().getBytes(NBTConstants.CHARSET);
this.os.writeShort(bytes.length); os.writeShort(bytes.length);
this.os.write(bytes); os.write(bytes);
} }
/** /**
@ -199,8 +209,9 @@ public final class NBTOutputStream implements Closeable {
* *
* @throws IOException if an I/O error occurs. * @throws IOException if an I/O error occurs.
*/ */
private void writeDoubleTagPayload(final DoubleTag tag) throws IOException { private void writeDoubleTagPayload(final DoubleTag tag) throws IOException
this.os.writeDouble(tag.getValue()); {
os.writeDouble(tag.getValue());
} }
/** /**
@ -210,8 +221,9 @@ public final class NBTOutputStream implements Closeable {
* *
* @throws IOException if an I/O error occurs. * @throws IOException if an I/O error occurs.
*/ */
private void writeFloatTagPayload(final FloatTag tag) throws IOException { private void writeFloatTagPayload(final FloatTag tag) throws IOException
this.os.writeFloat(tag.getValue()); {
os.writeFloat(tag.getValue());
} }
/** /**
@ -221,8 +233,9 @@ public final class NBTOutputStream implements Closeable {
* *
* @throws IOException if an I/O error occurs. * @throws IOException if an I/O error occurs.
*/ */
private void writeLongTagPayload(final LongTag tag) throws IOException { private void writeLongTagPayload(final LongTag tag) throws IOException
this.os.writeLong(tag.getValue()); {
os.writeLong(tag.getValue());
} }
/** /**
@ -232,8 +245,9 @@ public final class NBTOutputStream implements Closeable {
* *
* @throws IOException if an I/O error occurs. * @throws IOException if an I/O error occurs.
*/ */
private void writeIntTagPayload(final IntTag tag) throws IOException { private void writeIntTagPayload(final IntTag tag) throws IOException
this.os.writeInt(tag.getValue()); {
os.writeInt(tag.getValue());
} }
/** /**
@ -243,8 +257,9 @@ public final class NBTOutputStream implements Closeable {
* *
* @throws IOException if an I/O error occurs. * @throws IOException if an I/O error occurs.
*/ */
private void writeShortTagPayload(final ShortTag tag) throws IOException { private void writeShortTagPayload(final ShortTag tag) throws IOException
this.os.writeShort(tag.getValue()); {
os.writeShort(tag.getValue());
} }
/** /**
@ -254,28 +269,33 @@ public final class NBTOutputStream implements Closeable {
* *
* @throws IOException if an I/O error occurs. * @throws IOException if an I/O error occurs.
*/ */
private void writeEndTagPayload(final EndTag tag) { private void writeEndTagPayload(final EndTag tag)
{
/* empty */ /* empty */
} }
private void writeIntArrayTagPayload(final IntArrayTag tag) throws IOException { private void writeIntArrayTagPayload(final IntArrayTag tag) throws IOException
{
final int[] data = tag.getValue(); final int[] data = tag.getValue();
this.os.writeInt(data.length); os.writeInt(data.length);
for (final int element : data) { for (final int element : data)
this.os.writeInt(element); {
os.writeInt(element);
} }
} }
@Override @Override
public void close() throws IOException { public void close() throws IOException
this.os.close(); {
os.close();
} }
/** /**
* Flush output * Flush output
* @throws IOException * @throws IOException
*/ */
public void flush() throws IOException { public void flush() throws IOException
this.os.flush(); {
os.flush();
} }
} }

View File

@ -5,12 +5,13 @@ import java.util.Map;
/** /**
* A class which contains NBT-related utility methods. * A class which contains NBT-related utility methods.
*/ */
public final class NBTUtils { public final class NBTUtils
{
/** /**
* Default private constructor. * Default private constructor.
*/ */
private NBTUtils() { private NBTUtils()
} {}
/** /**
* Gets the type name of a tag. * Gets the type name of a tag.
@ -19,32 +20,58 @@ public final class NBTUtils {
* *
* @return The type name. * @return The type name.
*/ */
public static String getTypeName(final Class<? extends Tag> clazz) { public static String getTypeName(final Class<? extends Tag> clazz)
if (clazz.equals(ByteArrayTag.class)) { {
if (clazz.equals(ByteArrayTag.class))
{
return "TAG_Byte_Array"; return "TAG_Byte_Array";
} else if (clazz.equals(ByteTag.class)) { }
else if (clazz.equals(ByteTag.class))
{
return "TAG_Byte"; return "TAG_Byte";
} else if (clazz.equals(CompoundTag.class)) { }
else if (clazz.equals(CompoundTag.class))
{
return "TAG_Compound"; return "TAG_Compound";
} else if (clazz.equals(DoubleTag.class)) { }
else if (clazz.equals(DoubleTag.class))
{
return "TAG_Double"; return "TAG_Double";
} else if (clazz.equals(EndTag.class)) { }
else if (clazz.equals(EndTag.class))
{
return "TAG_End"; return "TAG_End";
} else if (clazz.equals(FloatTag.class)) { }
else if (clazz.equals(FloatTag.class))
{
return "TAG_Float"; return "TAG_Float";
} else if (clazz.equals(IntTag.class)) { }
else if (clazz.equals(IntTag.class))
{
return "TAG_Int"; return "TAG_Int";
} else if (clazz.equals(ListTag.class)) { }
else if (clazz.equals(ListTag.class))
{
return "TAG_List"; return "TAG_List";
} else if (clazz.equals(LongTag.class)) { }
else if (clazz.equals(LongTag.class))
{
return "TAG_Long"; return "TAG_Long";
} else if (clazz.equals(ShortTag.class)) { }
else if (clazz.equals(ShortTag.class))
{
return "TAG_Short"; return "TAG_Short";
} else if (clazz.equals(StringTag.class)) { }
else if (clazz.equals(StringTag.class))
{
return "TAG_String"; return "TAG_String";
} else if (clazz.equals(IntArrayTag.class)) { }
else if (clazz.equals(IntArrayTag.class))
{
return "TAG_Int_Array"; return "TAG_Int_Array";
} else { }
else
{
throw new IllegalArgumentException("Invalid tag classs (" + clazz.getName() + ")."); throw new IllegalArgumentException("Invalid tag classs (" + clazz.getName() + ").");
} }
} }
@ -58,32 +85,58 @@ public final class NBTUtils {
* *
* @throws IllegalArgumentException if the tag class is invalid. * @throws IllegalArgumentException if the tag class is invalid.
*/ */
public static int getTypeCode(final Class<? extends Tag> clazz) { public static int getTypeCode(final Class<? extends Tag> clazz)
if (clazz.equals(ByteArrayTag.class)) { {
if (clazz.equals(ByteArrayTag.class))
{
return NBTConstants.TYPE_BYTE_ARRAY; return NBTConstants.TYPE_BYTE_ARRAY;
} else if (clazz.equals(ByteTag.class)) { }
else if (clazz.equals(ByteTag.class))
{
return NBTConstants.TYPE_BYTE; return NBTConstants.TYPE_BYTE;
} else if (clazz.equals(CompoundTag.class)) { }
else if (clazz.equals(CompoundTag.class))
{
return NBTConstants.TYPE_COMPOUND; return NBTConstants.TYPE_COMPOUND;
} else if (clazz.equals(DoubleTag.class)) { }
else if (clazz.equals(DoubleTag.class))
{
return NBTConstants.TYPE_DOUBLE; return NBTConstants.TYPE_DOUBLE;
} else if (clazz.equals(EndTag.class)) { }
else if (clazz.equals(EndTag.class))
{
return NBTConstants.TYPE_END; return NBTConstants.TYPE_END;
} else if (clazz.equals(FloatTag.class)) { }
else if (clazz.equals(FloatTag.class))
{
return NBTConstants.TYPE_FLOAT; return NBTConstants.TYPE_FLOAT;
} else if (clazz.equals(IntTag.class)) { }
else if (clazz.equals(IntTag.class))
{
return NBTConstants.TYPE_INT; return NBTConstants.TYPE_INT;
} else if (clazz.equals(ListTag.class)) { }
else if (clazz.equals(ListTag.class))
{
return NBTConstants.TYPE_LIST; return NBTConstants.TYPE_LIST;
} else if (clazz.equals(LongTag.class)) { }
else if (clazz.equals(LongTag.class))
{
return NBTConstants.TYPE_LONG; return NBTConstants.TYPE_LONG;
} else if (clazz.equals(ShortTag.class)) { }
else if (clazz.equals(ShortTag.class))
{
return NBTConstants.TYPE_SHORT; return NBTConstants.TYPE_SHORT;
} else if (clazz.equals(StringTag.class)) { }
else if (clazz.equals(StringTag.class))
{
return NBTConstants.TYPE_STRING; return NBTConstants.TYPE_STRING;
} else if (clazz.equals(IntArrayTag.class)) { }
else if (clazz.equals(IntArrayTag.class))
{
return NBTConstants.TYPE_INT_ARRAY; return NBTConstants.TYPE_INT_ARRAY;
} else { }
else
{
throw new IllegalArgumentException("Invalid tag classs (" + clazz.getName() + ")."); throw new IllegalArgumentException("Invalid tag classs (" + clazz.getName() + ").");
} }
} }
@ -97,8 +150,10 @@ public final class NBTUtils {
* *
* @throws IllegalArgumentException if the tag type is invalid. * @throws IllegalArgumentException if the tag type is invalid.
*/ */
public static Class<? extends Tag> getTypeClass(final int type) { public static Class<? extends Tag> getTypeClass(final int type)
switch (type) { {
switch (type)
{
case NBTConstants.TYPE_END: case NBTConstants.TYPE_END:
return EndTag.class; return EndTag.class;
case NBTConstants.TYPE_BYTE: case NBTConstants.TYPE_BYTE:
@ -138,14 +193,11 @@ public final class NBTUtils {
* *
* @return child tag * @return child tag
*/ */
public static <T extends Tag> T getChildTag(final Map<String, Tag> items, final String key, final Class<T> expected) throws IllegalArgumentException { public static <T extends Tag> T getChildTag(final Map<String, Tag> items, final String key, final Class<T> expected) throws IllegalArgumentException
if (!items.containsKey(key)) { {
throw new IllegalArgumentException("Missing a \"" + key + "\" tag"); if (!items.containsKey(key)) { throw new IllegalArgumentException("Missing a \"" + key + "\" tag"); }
}
final Tag tag = items.get(key); final Tag tag = items.get(key);
if (!expected.isInstance(tag)) { if (!expected.isInstance(tag)) { throw new IllegalArgumentException(key + " tag is not of tag type " + expected.getName()); }
throw new IllegalArgumentException(key + " tag is not of tag type " + expected.getName());
}
return expected.cast(tag); return expected.cast(tag);
} }
} }

View File

@ -23,7 +23,8 @@ package com.intellectualcrafters.jnbt;
/** /**
* The {@code TAG_Short} tag. * The {@code TAG_Short} tag.
*/ */
public final class ShortTag extends Tag { public final class ShortTag extends Tag
{
private final short value; private final short value;
/** /**
@ -31,7 +32,8 @@ public final class ShortTag extends Tag {
* *
* @param value the value of the tag * @param value the value of the tag
*/ */
public ShortTag(final short value) { public ShortTag(final short value)
{
super(); super();
this.value = value; this.value = value;
} }
@ -42,23 +44,27 @@ public final class ShortTag extends Tag {
* @param name the name of the tag * @param name the name of the tag
* @param value the value of the tag * @param value the value of the tag
*/ */
public ShortTag(final String name, final short value) { public ShortTag(final String name, final short value)
{
super(name); super(name);
this.value = value; this.value = value;
} }
@Override @Override
public Short getValue() { public Short getValue()
return this.value; {
return value;
} }
@Override @Override
public String toString() { public String toString()
{
final String name = getName(); final String name = getName();
String append = ""; String append = "";
if ((name != null) && !name.equals("")) { if ((name != null) && !name.equals(""))
append = "(\"" + this.getName() + "\")"; {
append = "(\"" + getName() + "\")";
} }
return "TAG_Short" + append + ": " + this.value; return "TAG_Short" + append + ": " + value;
} }
} }

View File

@ -5,7 +5,8 @@ import static com.google.common.base.Preconditions.checkNotNull;
/** /**
* The {@code TAG_String} tag. * The {@code TAG_String} tag.
*/ */
public final class StringTag extends Tag { public final class StringTag extends Tag
{
private final String value; private final String value;
/** /**
@ -13,7 +14,8 @@ public final class StringTag extends Tag {
* *
* @param value the value of the tag * @param value the value of the tag
*/ */
public StringTag(final String value) { public StringTag(final String value)
{
super(); super();
checkNotNull(value); checkNotNull(value);
this.value = value; this.value = value;
@ -25,24 +27,28 @@ public final class StringTag extends Tag {
* @param name the name of the tag * @param name the name of the tag
* @param value the value of the tag * @param value the value of the tag
*/ */
public StringTag(final String name, final String value) { public StringTag(final String name, final String value)
{
super(name); super(name);
checkNotNull(value); checkNotNull(value);
this.value = value; this.value = value;
} }
@Override @Override
public String getValue() { public String getValue()
return this.value; {
return value;
} }
@Override @Override
public String toString() { public String toString()
{
final String name = getName(); final String name = getName();
String append = ""; String append = "";
if ((name != null) && !name.equals("")) { if ((name != null) && !name.equals(""))
append = "(\"" + this.getName() + "\")"; {
append = "(\"" + getName() + "\")";
} }
return "TAG_String" + append + ": " + this.value; return "TAG_String" + append + ": " + value;
} }
} }

View File

@ -23,13 +23,15 @@ package com.intellectualcrafters.jnbt;
/** /**
* Represents a NBT tag. * Represents a NBT tag.
*/ */
public abstract class Tag { public abstract class Tag
{
private final String name; private final String name;
/** /**
* Create a new tag with an empty name. * Create a new tag with an empty name.
*/ */
Tag() { Tag()
{
this(""); this("");
} }
@ -38,8 +40,10 @@ public abstract class Tag {
* *
* @param name the name * @param name the name
*/ */
Tag(String name) { Tag(String name)
if (name == null) { {
if (name == null)
{
name = ""; name = "";
} }
this.name = name; this.name = name;
@ -50,8 +54,9 @@ public abstract class Tag {
* *
* @return the name of this tag * @return the name of this tag
*/ */
public final String getName() { public final String getName()
return this.name; {
return name;
} }
/** /**

View File

@ -4,20 +4,21 @@ package com.intellectualcrafters.json;
* This provides static methods to convert comma delimited text into a JSONArray, and to covert a JSONArray into comma * This provides static methods to convert comma delimited text into a JSONArray, and to covert a JSONArray into comma
* delimited text. Comma delimited text is a very popular format for data interchange. It is understood by most * delimited text. Comma delimited text is a very popular format for data interchange. It is understood by most
* database, spreadsheet, and organizer programs. * database, spreadsheet, and organizer programs.
* *
* Each row of text represents a row in a table or a data record. Each row ends with a NEWLINE character. Each row * Each row of text represents a row in a table or a data record. Each row ends with a NEWLINE character. Each row
* contains one or more values. Values are separated by commas. A value can contain any character except for comma, * contains one or more values. Values are separated by commas. A value can contain any character except for comma,
* unless is is wrapped in single quotes or double quotes. * unless is is wrapped in single quotes or double quotes.
* *
* The first row usually contains the names of the columns. * The first row usually contains the names of the columns.
* *
* A comma delimited list can be converted into a JSONArray of JSONObjects. The names for the elements in the * A comma delimited list can be converted into a JSONArray of JSONObjects. The names for the elements in the
* JSONObjects can be taken from the names in the first row. * JSONObjects can be taken from the names in the first row.
* *
* @author JSON.org * @author JSON.org
* @version 2014-05-03 * @version 2014-05-03
*/ */
public class CDL { public class CDL
{
/** /**
* Get the next value. The value can be wrapped in quotes. The value can be empty. * Get the next value. The value can be wrapped in quotes. The value can be empty.
* *
@ -27,28 +28,32 @@ public class CDL {
* *
* @throws JSONException if the quoted string is badly formed. * @throws JSONException if the quoted string is badly formed.
*/ */
private static String getValue(final JSONTokener x) throws JSONException { private static String getValue(final JSONTokener x) throws JSONException
{
char c; char c;
char q; char q;
StringBuffer sb; StringBuffer sb;
do { do
{
c = x.next(); c = x.next();
} while ((c == ' ') || (c == '\t')); }
switch (c) { while ((c == ' ') || (c == '\t'));
switch (c)
{
case 0: case 0:
return null; return null;
case '"': case '"':
case '\'': case '\'':
q = c; q = c;
sb = new StringBuffer(); sb = new StringBuffer();
for (;;) { for (;;)
{
c = x.next(); c = x.next();
if (c == q) { if (c == q)
{
break; break;
} }
if ((c == 0) || (c == '\n') || (c == '\r')) { if ((c == 0) || (c == '\n') || (c == '\r')) { throw x.syntaxError("Missing close quote '" + q + "'."); }
throw x.syntaxError("Missing close quote '" + q + "'.");
}
sb.append(c); sb.append(c);
} }
return sb.toString(); return sb.toString();
@ -70,23 +75,24 @@ public class CDL {
* *
* @throws JSONException * @throws JSONException
*/ */
public static JSONArray rowToJSONArray(final JSONTokener x) throws JSONException { public static JSONArray rowToJSONArray(final JSONTokener x) throws JSONException
{
final JSONArray ja = new JSONArray(); final JSONArray ja = new JSONArray();
for (;;) { for (;;)
{
final String value = getValue(x); final String value = getValue(x);
char c = x.next(); char c = x.next();
if ((value == null) || ((ja.length() == 0) && (value.length() == 0) && (c != ','))) { if ((value == null) || ((ja.length() == 0) && (value.length() == 0) && (c != ','))) { return null; }
return null;
}
ja.put(value); ja.put(value);
for (;;) { for (;;)
if (c == ',') { {
if (c == ',')
{
break; break;
} }
if (c != ' ') { if (c != ' ')
if ((c == '\n') || (c == '\r') || (c == 0)) { {
return ja; if ((c == '\n') || (c == '\r') || (c == 0)) { return ja; }
}
throw x.syntaxError("Bad character '" + c + "' (" + (int) c + ")."); throw x.syntaxError("Bad character '" + c + "' (" + (int) c + ").");
} }
c = x.next(); c = x.next();
@ -106,7 +112,8 @@ public class CDL {
* *
* @throws JSONException * @throws JSONException
*/ */
public static JSONObject rowToJSONObject(final JSONArray names, final JSONTokener x) throws JSONException { public static JSONObject rowToJSONObject(final JSONArray names, final JSONTokener x) throws JSONException
{
final JSONArray ja = rowToJSONArray(x); final JSONArray ja = rowToJSONArray(x);
return ja != null ? ja.toJSONObject(names) : null; return ja != null ? ja.toJSONObject(names) : null;
} }
@ -119,26 +126,35 @@ public class CDL {
* *
* @return A string ending in NEWLINE. * @return A string ending in NEWLINE.
*/ */
public static String rowToString(final JSONArray ja) { public static String rowToString(final JSONArray ja)
{
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
for (int i = 0; i < ja.length(); i += 1) { for (int i = 0; i < ja.length(); i += 1)
if (i > 0) { {
if (i > 0)
{
sb.append(','); sb.append(',');
} }
final Object object = ja.opt(i); final Object object = ja.opt(i);
if (object != null) { if (object != null)
{
final String string = object.toString(); final String string = object.toString();
if ((string.length() > 0) && ((string.indexOf(',') >= 0) || (string.indexOf('\n') >= 0) || (string.indexOf('\r') >= 0) || (string.indexOf(0) >= 0) || (string.charAt(0) == '"'))) { if ((string.length() > 0) && ((string.indexOf(',') >= 0) || (string.indexOf('\n') >= 0) || (string.indexOf('\r') >= 0) || (string.indexOf(0) >= 0) || (string.charAt(0) == '"')))
{
sb.append('"'); sb.append('"');
final int length = string.length(); final int length = string.length();
for (int j = 0; j < length; j += 1) { for (int j = 0; j < length; j += 1)
{
final char c = string.charAt(j); final char c = string.charAt(j);
if ((c >= ' ') && (c != '"')) { if ((c >= ' ') && (c != '"'))
{
sb.append(c); sb.append(c);
} }
} }
sb.append('"'); sb.append('"');
} else { }
else
{
sb.append(string); sb.append(string);
} }
} }
@ -156,7 +172,8 @@ public class CDL {
* *
* @throws JSONException * @throws JSONException
*/ */
public static JSONArray toJSONArray(final String string) throws JSONException { public static JSONArray toJSONArray(final String string) throws JSONException
{
return toJSONArray(new JSONTokener(string)); return toJSONArray(new JSONTokener(string));
} }
@ -169,7 +186,8 @@ public class CDL {
* *
* @throws JSONException * @throws JSONException
*/ */
public static JSONArray toJSONArray(final JSONTokener x) throws JSONException { public static JSONArray toJSONArray(final JSONTokener x) throws JSONException
{
return toJSONArray(rowToJSONArray(x), x); return toJSONArray(rowToJSONArray(x), x);
} }
@ -184,7 +202,8 @@ public class CDL {
* *
* @throws JSONException * @throws JSONException
*/ */
public static JSONArray toJSONArray(final JSONArray names, final String string) throws JSONException { public static JSONArray toJSONArray(final JSONArray names, final String string) throws JSONException
{
return toJSONArray(names, new JSONTokener(string)); return toJSONArray(names, new JSONTokener(string));
} }
@ -199,21 +218,20 @@ public class CDL {
* *
* @throws JSONException * @throws JSONException
*/ */
public static JSONArray toJSONArray(final JSONArray names, final JSONTokener x) throws JSONException { public static JSONArray toJSONArray(final JSONArray names, final JSONTokener x) throws JSONException
if ((names == null) || (names.length() == 0)) { {
return null; if ((names == null) || (names.length() == 0)) { return null; }
}
final JSONArray ja = new JSONArray(); final JSONArray ja = new JSONArray();
for (;;) { for (;;)
{
final JSONObject jo = rowToJSONObject(names, x); final JSONObject jo = rowToJSONObject(names, x);
if (jo == null) { if (jo == null)
{
break; break;
} }
ja.put(jo); ja.put(jo);
} }
if (ja.length() == 0) { if (ja.length() == 0) { return null; }
return null;
}
return ja; return ja;
} }
@ -227,13 +245,13 @@ public class CDL {
* *
* @throws JSONException * @throws JSONException
*/ */
public static String toString(final JSONArray ja) throws JSONException { public static String toString(final JSONArray ja) throws JSONException
{
final JSONObject jo = ja.optJSONObject(0); final JSONObject jo = ja.optJSONObject(0);
if (jo != null) { if (jo != null)
{
final JSONArray names = jo.names(); final JSONArray names = jo.names();
if (names != null) { if (names != null) { return rowToString(names) + toString(names, ja); }
return rowToString(names) + toString(names, ja);
}
} }
return null; return null;
} }
@ -249,14 +267,15 @@ public class CDL {
* *
* @throws JSONException * @throws JSONException
*/ */
public static String toString(final JSONArray names, final JSONArray ja) throws JSONException { public static String toString(final JSONArray names, final JSONArray ja) throws JSONException
if ((names == null) || (names.length() == 0)) { {
return null; if ((names == null) || (names.length() == 0)) { return null; }
}
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
for (int i = 0; i < ja.length(); i += 1) { for (int i = 0; i < ja.length(); i += 1)
{
final JSONObject jo = ja.optJSONObject(i); final JSONObject jo = ja.optJSONObject(i);
if (jo != null) { if (jo != null)
{
sb.append(rowToString(jo.toJSONArray(names))); sb.append(rowToString(jo.toJSONArray(names)));
} }
} }

View File

@ -27,7 +27,8 @@ package com.intellectualcrafters.json;
* @author JSON.org * @author JSON.org
* @version 2014-05-03 * @version 2014-05-03
*/ */
public class Cookie { public class Cookie
{
/** /**
* Produce a copy of a string in which the characters '+', '%', '=', ';' and control characters are replaced with * Produce a copy of a string in which the characters '+', '%', '=', ';' and control characters are replaced with
* "%hh". This is a gentle form of URL encoding, attempting to cause as little distortion to the string as possible. * "%hh". This is a gentle form of URL encoding, attempting to cause as little distortion to the string as possible.
@ -39,18 +40,23 @@ public class Cookie {
* *
* @return The escaped result. * @return The escaped result.
*/ */
public static String escape(final String string) { public static String escape(final String string)
{
char c; char c;
final String s = string.trim(); final String s = string.trim();
final int length = s.length(); final int length = s.length();
final StringBuilder sb = new StringBuilder(length); final StringBuilder sb = new StringBuilder(length);
for (int i = 0; i < length; i += 1) { for (int i = 0; i < length; i += 1)
{
c = s.charAt(i); c = s.charAt(i);
if ((c < ' ') || (c == '+') || (c == '%') || (c == '=') || (c == ';')) { if ((c < ' ') || (c == '+') || (c == '%') || (c == '=') || (c == ';'))
{
sb.append('%'); sb.append('%');
sb.append(Character.forDigit((char) ((c >>> 4) & 0x0f), 16)); sb.append(Character.forDigit((char) ((c >>> 4) & 0x0f), 16));
sb.append(Character.forDigit((char) (c & 0x0f), 16)); sb.append(Character.forDigit((char) (c & 0x0f), 16));
} else { }
else
{
sb.append(c); sb.append(c);
} }
} }
@ -71,7 +77,8 @@ public class Cookie {
* *
* @throws JSONException * @throws JSONException
*/ */
public static JSONObject toJSONObject(final String string) throws JSONException { public static JSONObject toJSONObject(final String string) throws JSONException
{
String name; String name;
final JSONObject jo = new JSONObject(); final JSONObject jo = new JSONObject();
Object value; Object value;
@ -80,15 +87,22 @@ public class Cookie {
x.next('='); x.next('=');
jo.put("value", x.nextTo(';')); jo.put("value", x.nextTo(';'));
x.next(); x.next();
while (x.more()) { while (x.more())
{
name = unescape(x.nextTo("=;")); name = unescape(x.nextTo("=;"));
if (x.next() != '=') { if (x.next() != '=')
if (name.equals("secure")) { {
if (name.equals("secure"))
{
value = Boolean.TRUE; value = Boolean.TRUE;
} else { }
else
{
throw x.syntaxError("Missing '=' in cookie parameter."); throw x.syntaxError("Missing '=' in cookie parameter.");
} }
} else { }
else
{
value = unescape(x.nextTo(';')); value = unescape(x.nextTo(';'));
x.next(); x.next();
} }
@ -108,24 +122,29 @@ public class Cookie {
* *
* @throws JSONException * @throws JSONException
*/ */
public static String toString(final JSONObject jo) throws JSONException { public static String toString(final JSONObject jo) throws JSONException
{
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
sb.append(escape(jo.getString("name"))); sb.append(escape(jo.getString("name")));
sb.append("="); sb.append("=");
sb.append(escape(jo.getString("value"))); sb.append(escape(jo.getString("value")));
if (jo.has("expires")) { if (jo.has("expires"))
{
sb.append(";expires="); sb.append(";expires=");
sb.append(jo.getString("expires")); sb.append(jo.getString("expires"));
} }
if (jo.has("domain")) { if (jo.has("domain"))
{
sb.append(";domain="); sb.append(";domain=");
sb.append(escape(jo.getString("domain"))); sb.append(escape(jo.getString("domain")));
} }
if (jo.has("path")) { if (jo.has("path"))
{
sb.append(";path="); sb.append(";path=");
sb.append(escape(jo.getString("path"))); sb.append(escape(jo.getString("path")));
} }
if (jo.optBoolean("secure")) { if (jo.optBoolean("secure"))
{
sb.append(";secure"); sb.append(";secure");
} }
return sb.toString(); return sb.toString();
@ -139,17 +158,23 @@ public class Cookie {
* *
* @return The unescaped string. * @return The unescaped string.
*/ */
public static String unescape(final String string) { public static String unescape(final String string)
{
final int length = string.length(); final int length = string.length();
final StringBuilder sb = new StringBuilder(length); final StringBuilder sb = new StringBuilder(length);
for (int i = 0; i < length; ++i) { for (int i = 0; i < length; ++i)
{
char c = string.charAt(i); char c = string.charAt(i);
if (c == '+') { if (c == '+')
{
c = ' '; c = ' ';
} else if ((c == '%') && ((i + 2) < length)) { }
else if ((c == '%') && ((i + 2) < length))
{
final int d = JSONTokener.dehexchar(string.charAt(i + 1)); final int d = JSONTokener.dehexchar(string.charAt(i + 1));
final int e = JSONTokener.dehexchar(string.charAt(i + 2)); final int e = JSONTokener.dehexchar(string.charAt(i + 2));
if ((d >= 0) && (e >= 0)) { if ((d >= 0) && (e >= 0))
{
c = (char) ((d * 16) + e); c = (char) ((d * 16) + e);
i += 2; i += 2;
} }

View File

@ -8,12 +8,13 @@ import java.util.Iterator;
* @author JSON.org * @author JSON.org
* @version 2014-05-03 * @version 2014-05-03
*/ */
public class CookieList { public class CookieList
{
/** /**
* Convert a cookie list into a JSONObject. A cookie list is a sequence of name/value pairs. The names are separated * Convert a cookie list into a JSONObject. A cookie list is a sequence of name/value pairs. The names are separated
* from the values by '='. The pairs are separated by ';'. The names and the values will be unescaped, possibly * from the values by '='. The pairs are separated by ';'. The names and the values will be unescaped, possibly
* converting '+' and '%' sequences. * converting '+' and '%' sequences.
* *
* To add a cookie to a cooklist, cookielistJSONObject.put(cookieJSONObject.getString("name"), * To add a cookie to a cooklist, cookielistJSONObject.put(cookieJSONObject.getString("name"),
* cookieJSONObject.getString("value")); * cookieJSONObject.getString("value"));
* *
@ -23,10 +24,12 @@ public class CookieList {
* *
* @throws JSONException * @throws JSONException
*/ */
public static JSONObject toJSONObject(final String string) throws JSONException { public static JSONObject toJSONObject(final String string) throws JSONException
{
final JSONObject jo = new JSONObject(); final JSONObject jo = new JSONObject();
final JSONTokener x = new JSONTokener(string); final JSONTokener x = new JSONTokener(string);
while (x.more()) { while (x.more())
{
final String name = Cookie.unescape(x.nextTo('=')); final String name = Cookie.unescape(x.nextTo('='));
x.next('='); x.next('=');
jo.put(name, Cookie.unescape(x.nextTo(';'))); jo.put(name, Cookie.unescape(x.nextTo(';')));
@ -46,15 +49,19 @@ public class CookieList {
* *
* @throws JSONException * @throws JSONException
*/ */
public static String toString(final JSONObject jo) throws JSONException { public static String toString(final JSONObject jo) throws JSONException
{
boolean b = false; boolean b = false;
final Iterator<String> keys = jo.keys(); final Iterator<String> keys = jo.keys();
String string; String string;
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
while (keys.hasNext()) { while (keys.hasNext())
{
string = keys.next(); string = keys.next();
if (!jo.isNull(string)) { if (!jo.isNull(string))
if (b) { {
if (b)
{
sb.append(';'); sb.append(';');
} }
sb.append(Cookie.escape(string)); sb.append(Cookie.escape(string));

View File

@ -28,31 +28,37 @@ import java.util.Iterator;
* @author JSON.org * @author JSON.org
* @version 2014-05-03 * @version 2014-05-03
*/ */
public class HTTP { public class HTTP
{
/** /**
* Carriage return/line feed. * Carriage return/line feed.
*/ */
public static final String CRLF = "\r\n"; public static final String CRLF = "\r\n";
public static JSONObject toJSONObject(final String string) throws JSONException { public static JSONObject toJSONObject(final String string) throws JSONException
{
final JSONObject jo = new JSONObject(); final JSONObject jo = new JSONObject();
final HTTPTokener x = new HTTPTokener(string); final HTTPTokener x = new HTTPTokener(string);
String token; String token;
token = x.nextToken(); token = x.nextToken();
if (token.toUpperCase().startsWith("HTTP")) { if (token.toUpperCase().startsWith("HTTP"))
{
// Response // Response
jo.put("HTTP-Version", token); jo.put("HTTP-Version", token);
jo.put("Status-Code", x.nextToken()); jo.put("Status-Code", x.nextToken());
jo.put("Reason-Phrase", x.nextTo('\0')); jo.put("Reason-Phrase", x.nextTo('\0'));
x.next(); x.next();
} else { }
else
{
// Request // Request
jo.put("Method", token); jo.put("Method", token);
jo.put("Request-URI", x.nextToken()); jo.put("Request-URI", x.nextToken());
jo.put("HTTP-Version", x.nextToken()); jo.put("HTTP-Version", x.nextToken());
} }
// Fields // Fields
while (x.more()) { while (x.more())
{
final String name = x.nextTo(':'); final String name = x.nextTo(':');
x.next(':'); x.next(':');
jo.put(name, x.nextTo('\0')); jo.put(name, x.nextTo('\0'));
@ -63,8 +69,8 @@ public class HTTP {
/** /**
* Convert a JSONObject into an HTTP header. A request header must contain * Convert a JSONObject into an HTTP header. A request header must contain
* *
* *
* <pre> * <pre>
* { * {
* Method: "POST" (for example), * Method: "POST" (for example),
@ -72,10 +78,10 @@ public class HTTP {
* "HTTP-Version": "HTTP/1.1" (for example) * "HTTP-Version": "HTTP/1.1" (for example)
* } * }
* </pre> * </pre>
* *
* A response header must contain * A response header must contain
* *
* *
* <pre> * <pre>
* { * {
* "HTTP-Version": "HTTP/1.1" (for example), * "HTTP-Version": "HTTP/1.1" (for example),
@ -83,7 +89,7 @@ public class HTTP {
* "Reason-Phrase": "OK" (for example) * "Reason-Phrase": "OK" (for example)
* } * }
* </pre> * </pre>
* *
* Any other members of the JSONObject will be output as HTTP fields. The result will end with two CRLF pairs. * Any other members of the JSONObject will be output as HTTP fields. The result will end with two CRLF pairs.
* *
* @param jo A JSONObject * @param jo A JSONObject
@ -92,17 +98,21 @@ public class HTTP {
* *
* @throws JSONException if the object does not contain enough information. * @throws JSONException if the object does not contain enough information.
*/ */
public static String toString(final JSONObject jo) throws JSONException { public static String toString(final JSONObject jo) throws JSONException
{
final Iterator<String> keys = jo.keys(); final Iterator<String> keys = jo.keys();
String string; String string;
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
if (jo.has("Status-Code") && jo.has("Reason-Phrase")) { if (jo.has("Status-Code") && jo.has("Reason-Phrase"))
{
sb.append(jo.getString("HTTP-Version")); sb.append(jo.getString("HTTP-Version"));
sb.append(' '); sb.append(' ');
sb.append(jo.getString("Status-Code")); sb.append(jo.getString("Status-Code"));
sb.append(' '); sb.append(' ');
sb.append(jo.getString("Reason-Phrase")); sb.append(jo.getString("Reason-Phrase"));
} else if (jo.has("Method") && jo.has("Request-URI")) { }
else if (jo.has("Method") && jo.has("Request-URI"))
{
sb.append(jo.getString("Method")); sb.append(jo.getString("Method"));
sb.append(' '); sb.append(' ');
sb.append('"'); sb.append('"');
@ -110,13 +120,17 @@ public class HTTP {
sb.append('"'); sb.append('"');
sb.append(' '); sb.append(' ');
sb.append(jo.getString("HTTP-Version")); sb.append(jo.getString("HTTP-Version"));
} else { }
else
{
throw new JSONException("Not enough material for an HTTP header."); throw new JSONException("Not enough material for an HTTP header.");
} }
sb.append(CRLF); sb.append(CRLF);
while (keys.hasNext()) { while (keys.hasNext())
{
string = keys.next(); string = keys.next();
if (!"HTTP-Version".equals(string) && !"Status-Code".equals(string) && !"Reason-Phrase".equals(string) && !"Method".equals(string) && !"Request-URI".equals(string) && !jo.isNull(string)) { if (!"HTTP-Version".equals(string) && !"Status-Code".equals(string) && !"Reason-Phrase".equals(string) && !"Method".equals(string) && !"Request-URI".equals(string) && !jo.isNull(string))
{
sb.append(string); sb.append(string);
sb.append(": "); sb.append(": ");
sb.append(jo.getString(string)); sb.append(jo.getString(string));

View File

@ -6,13 +6,15 @@ package com.intellectualcrafters.json;
* @author JSON.org * @author JSON.org
* @version 2014-05-03 * @version 2014-05-03
*/ */
public class HTTPTokener extends JSONTokener { public class HTTPTokener extends JSONTokener
{
/** /**
* Construct an HTTPTokener from a string. * Construct an HTTPTokener from a string.
* *
* @param string A source string. * @param string A source string.
*/ */
public HTTPTokener(final String string) { public HTTPTokener(final String string)
{
super(string); super(string);
} }
@ -23,30 +25,30 @@ public class HTTPTokener extends JSONTokener {
* *
* @throws JSONException * @throws JSONException
*/ */
public String nextToken() throws JSONException { public String nextToken() throws JSONException
{
char c; char c;
char q; char q;
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
do { do
{
c = next(); c = next();
} while (Character.isWhitespace(c)); }
if ((c == '"') || (c == '\'')) { while (Character.isWhitespace(c));
if ((c == '"') || (c == '\''))
{
q = c; q = c;
for (;;) { for (;;)
{
c = next(); c = next();
if (c < ' ') { if (c < ' ') { throw syntaxError("Unterminated string."); }
throw syntaxError("Unterminated string."); if (c == q) { return sb.toString(); }
}
if (c == q) {
return sb.toString();
}
sb.append(c); sb.append(c);
} }
} }
for (;;) { for (;;)
if ((c == 0) || Character.isWhitespace(c)) { {
return sb.toString(); if ((c == 0) || Character.isWhitespace(c)) { return sb.toString(); }
}
sb.append(c); sb.append(c);
c = next(); c = next();
} }

View File

@ -34,16 +34,16 @@ import java.util.Map;
* accessing the values by index, and <code>put</code> methods for adding or replacing values. The values can be any of * accessing the values by index, and <code>put</code> methods for adding or replacing values. The values can be any of
* these types: <code>Boolean</code>, <code>JSONArray</code>, <code>JSONObject</code>, <code>Number</code>, * these types: <code>Boolean</code>, <code>JSONArray</code>, <code>JSONObject</code>, <code>Number</code>,
* <code>String</code>, or the <code>JSONObject.NULL object</code>. * <code>String</code>, or the <code>JSONObject.NULL object</code>.
* *
* The constructor can convert a JSON text into a Java object. The <code>toString</code> method converts to JSON text. * The constructor can convert a JSON text into a Java object. The <code>toString</code> method converts to JSON text.
* *
* A <code>get</code> method returns a value if one can be found, and throws an exception if one cannot be found. An * A <code>get</code> method returns a value if one can be found, and throws an exception if one cannot be found. An
* <code>opt</code> method returns a default value instead of throwing an exception, and so is useful for obtaining * <code>opt</code> method returns a default value instead of throwing an exception, and so is useful for obtaining
* optional values. * optional values.
* *
* The generic <code>get()</code> and <code>opt()</code> methods return an object which you can cast or query for type. * The generic <code>get()</code> and <code>opt()</code> methods return an object which you can cast or query for type.
* There are also typed <code>get</code> and <code>opt</code> methods that do type checking and type coercion for you. * There are also typed <code>get</code> and <code>opt</code> methods that do type checking and type coercion for you.
* *
* The texts produced by the <code>toString</code> methods strictly conform to JSON syntax rules. The constructors are * The texts produced by the <code>toString</code> methods strictly conform to JSON syntax rules. The constructors are
* more forgiving in the texts they will accept: <ul> <li>An extra <code>,</code>&nbsp;<small>(comma)</small> may appear * more forgiving in the texts they will accept: <ul> <li>An extra <code>,</code>&nbsp;<small>(comma)</small> may appear
* just before the closing bracket.</li> <li>The <code>null</code> value will be inserted when there is <code>,</code> * just before the closing bracket.</li> <li>The <code>null</code> value will be inserted when there is <code>,</code>
@ -56,7 +56,8 @@ import java.util.Map;
* @author JSON.org * @author JSON.org
* @version 2014-05-03 * @version 2014-05-03
*/ */
public class JSONArray { public class JSONArray
{
/** /**
* The arrayList where the JSONArray's properties are kept. * The arrayList where the JSONArray's properties are kept.
*/ */
@ -65,8 +66,9 @@ public class JSONArray {
/** /**
* Construct an empty JSONArray. * Construct an empty JSONArray.
*/ */
public JSONArray() { public JSONArray()
this.myArrayList = new ArrayList<Object>(); {
myArrayList = new ArrayList<Object>();
} }
/** /**
@ -76,26 +78,29 @@ public class JSONArray {
* *
* @throws JSONException If there is a syntax error. * @throws JSONException If there is a syntax error.
*/ */
public JSONArray(final JSONTokener x) throws JSONException { public JSONArray(final JSONTokener x) throws JSONException
{
this(); this();
if (x.nextClean() != '[') { if (x.nextClean() != '[') { throw x.syntaxError("A JSONArray text must start with '['"); }
throw x.syntaxError("A JSONArray text must start with '['"); if (x.nextClean() != ']')
} {
if (x.nextClean() != ']') {
x.back(); x.back();
for (;;) { for (;;)
if (x.nextClean() == ',') { {
if (x.nextClean() == ',')
{
x.back(); x.back();
this.myArrayList.add(JSONObject.NULL); myArrayList.add(JSONObject.NULL);
} else {
x.back();
this.myArrayList.add(x.nextValue());
} }
switch (x.nextClean()) { else
{
x.back();
myArrayList.add(x.nextValue());
}
switch (x.nextClean())
{
case ',': case ',':
if (x.nextClean() == ']') { if (x.nextClean() == ']') { return; }
return;
}
x.back(); x.back();
break; break;
case ']': case ']':
@ -115,7 +120,8 @@ public class JSONArray {
* *
* @throws JSONException If there is a syntax error. * @throws JSONException If there is a syntax error.
*/ */
public JSONArray(final String source) throws JSONException { public JSONArray(final String source) throws JSONException
{
this(new JSONTokener(source)); this(new JSONTokener(source));
} }
@ -124,11 +130,14 @@ public class JSONArray {
* *
* @param collection A Collection. * @param collection A Collection.
*/ */
public JSONArray(final Collection<Object> collection) { public JSONArray(final Collection<Object> collection)
this.myArrayList = new ArrayList<Object>(); {
if (collection != null) { myArrayList = new ArrayList<Object>();
for (final Object aCollection : collection) { if (collection != null)
this.myArrayList.add(JSONObject.wrap(aCollection)); {
for (final Object aCollection : collection)
{
myArrayList.add(JSONObject.wrap(aCollection));
} }
} }
} }
@ -138,14 +147,19 @@ public class JSONArray {
* *
* @throws JSONException If not an array. * @throws JSONException If not an array.
*/ */
public JSONArray(final Object array) throws JSONException { public JSONArray(final Object array) throws JSONException
{
this(); this();
if (array.getClass().isArray()) { if (array.getClass().isArray())
{
final int length = Array.getLength(array); final int length = Array.getLength(array);
for (int i = 0; i < length; i += 1) { for (int i = 0; i < length; i += 1)
{
this.put(JSONObject.wrap(Array.get(array, i))); this.put(JSONObject.wrap(Array.get(array, i)));
} }
} else { }
else
{
throw new JSONException("JSONArray initial value should be a string or collection or array."); throw new JSONException("JSONArray initial value should be a string or collection or array.");
} }
} }
@ -159,11 +173,10 @@ public class JSONArray {
* *
* @throws JSONException If there is no value for the index. * @throws JSONException If there is no value for the index.
*/ */
public Object get(final int index) throws JSONException { public Object get(final int index) throws JSONException
final Object object = this.opt(index); {
if (object == null) { final Object object = opt(index);
throw new JSONException("JSONArray[" + index + "] not found."); if (object == null) { throw new JSONException("JSONArray[" + index + "] not found."); }
}
return object; return object;
} }
@ -176,13 +189,14 @@ public class JSONArray {
* *
* @throws JSONException If there is no value for the index or if the value is not convertible to boolean. * @throws JSONException If there is no value for the index or if the value is not convertible to boolean.
*/ */
public boolean getBoolean(final int index) throws JSONException { public boolean getBoolean(final int index) throws JSONException
final Object object = this.get(index); {
if (object.equals(Boolean.FALSE) || ((object instanceof String) && ((String) object).equalsIgnoreCase("false"))) { final Object object = get(index);
if (object.equals(Boolean.FALSE) || ((object instanceof String) && ((String) object).equalsIgnoreCase("false")))
{
return false; return false;
} else if (object.equals(Boolean.TRUE) || ((object instanceof String) && ((String) object).equalsIgnoreCase("true"))) {
return true;
} }
else if (object.equals(Boolean.TRUE) || ((object instanceof String) && ((String) object).equalsIgnoreCase("true"))) { return true; }
throw new JSONException("JSONArray[" + index + "] is not a boolean."); throw new JSONException("JSONArray[" + index + "] is not a boolean.");
} }
@ -195,11 +209,15 @@ public class JSONArray {
* *
* @throws JSONException If the key is not found or if the value cannot be converted to a number. * @throws JSONException If the key is not found or if the value cannot be converted to a number.
*/ */
public double getDouble(final int index) throws JSONException { public double getDouble(final int index) throws JSONException
final Object object = this.get(index); {
try { final Object object = get(index);
try
{
return object instanceof Number ? ((Number) object).doubleValue() : Double.parseDouble((String) object); return object instanceof Number ? ((Number) object).doubleValue() : Double.parseDouble((String) object);
} catch (final Exception e) { }
catch (final Exception e)
{
throw new JSONException("JSONArray[" + index + "] is not a number."); throw new JSONException("JSONArray[" + index + "] is not a number.");
} }
} }
@ -213,11 +231,15 @@ public class JSONArray {
* *
* @throws JSONException If the key is not found or if the value is not a number. * @throws JSONException If the key is not found or if the value is not a number.
*/ */
public int getInt(final int index) throws JSONException { public int getInt(final int index) throws JSONException
final Object object = this.get(index); {
try { final Object object = get(index);
try
{
return object instanceof Number ? ((Number) object).intValue() : Integer.parseInt((String) object); return object instanceof Number ? ((Number) object).intValue() : Integer.parseInt((String) object);
} catch (final Exception e) { }
catch (final Exception e)
{
throw new JSONException("JSONArray[" + index + "] is not a number."); throw new JSONException("JSONArray[" + index + "] is not a number.");
} }
} }
@ -231,11 +253,10 @@ public class JSONArray {
* *
* @throws JSONException If there is no value for the index. or if the value is not a JSONArray * @throws JSONException If there is no value for the index. or if the value is not a JSONArray
*/ */
public JSONArray getJSONArray(final int index) throws JSONException { public JSONArray getJSONArray(final int index) throws JSONException
final Object object = this.get(index); {
if (object instanceof JSONArray) { final Object object = get(index);
return (JSONArray) object; if (object instanceof JSONArray) { return (JSONArray) object; }
}
throw new JSONException("JSONArray[" + index + "] is not a JSONArray."); throw new JSONException("JSONArray[" + index + "] is not a JSONArray.");
} }
@ -248,11 +269,10 @@ public class JSONArray {
* *
* @throws JSONException If there is no value for the index or if the value is not a JSONObject * @throws JSONException If there is no value for the index or if the value is not a JSONObject
*/ */
public JSONObject getJSONObject(final int index) throws JSONException { public JSONObject getJSONObject(final int index) throws JSONException
final Object object = this.get(index); {
if (object instanceof JSONObject) { final Object object = get(index);
return (JSONObject) object; if (object instanceof JSONObject) { return (JSONObject) object; }
}
throw new JSONException("JSONArray[" + index + "] is not a JSONObject."); throw new JSONException("JSONArray[" + index + "] is not a JSONObject.");
} }
@ -265,11 +285,15 @@ public class JSONArray {
* *
* @throws JSONException If the key is not found or if the value cannot be converted to a number. * @throws JSONException If the key is not found or if the value cannot be converted to a number.
*/ */
public long getLong(final int index) throws JSONException { public long getLong(final int index) throws JSONException
final Object object = this.get(index); {
try { final Object object = get(index);
try
{
return object instanceof Number ? ((Number) object).longValue() : Long.parseLong((String) object); return object instanceof Number ? ((Number) object).longValue() : Long.parseLong((String) object);
} catch (final Exception e) { }
catch (final Exception e)
{
throw new JSONException("JSONArray[" + index + "] is not a number."); throw new JSONException("JSONArray[" + index + "] is not a number.");
} }
} }
@ -283,11 +307,10 @@ public class JSONArray {
* *
* @throws JSONException If there is no string value for the index. * @throws JSONException If there is no string value for the index.
*/ */
public String getString(final int index) throws JSONException { public String getString(final int index) throws JSONException
final Object object = this.get(index); {
if (object instanceof String) { final Object object = get(index);
return (String) object; if (object instanceof String) { return (String) object; }
}
throw new JSONException("JSONArray[" + index + "] not a string."); throw new JSONException("JSONArray[" + index + "] not a string.");
} }
@ -298,8 +321,9 @@ public class JSONArray {
* *
* @return true if the value at the index is null, or if there is no value. * @return true if the value at the index is null, or if there is no value.
*/ */
public boolean isNull(final int index) { public boolean isNull(final int index)
return JSONObject.NULL.equals(this.opt(index)); {
return JSONObject.NULL.equals(opt(index));
} }
/** /**
@ -312,14 +336,17 @@ public class JSONArray {
* *
* @throws JSONException If the array contains an invalid number. * @throws JSONException If the array contains an invalid number.
*/ */
public String join(final String separator) throws JSONException { public String join(final String separator) throws JSONException
final int len = this.length(); {
final int len = length();
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
for (int i = 0; i < len; i += 1) { for (int i = 0; i < len; i += 1)
if (i > 0) { {
if (i > 0)
{
sb.append(separator); sb.append(separator);
} }
sb.append(JSONObject.valueToString(this.myArrayList.get(i))); sb.append(JSONObject.valueToString(myArrayList.get(i)));
} }
return sb.toString(); return sb.toString();
} }
@ -329,8 +356,9 @@ public class JSONArray {
* *
* @return The length (or size). * @return The length (or size).
*/ */
public int length() { public int length()
return this.myArrayList.size(); {
return myArrayList.size();
} }
/** /**
@ -340,8 +368,9 @@ public class JSONArray {
* *
* @return An object value, or null if there is no object at that index. * @return An object value, or null if there is no object at that index.
*/ */
public Object opt(final int index) { public Object opt(final int index)
return ((index < 0) || (index >= this.length())) ? null : this.myArrayList.get(index); {
return ((index < 0) || (index >= length())) ? null : myArrayList.get(index);
} }
/** /**
@ -352,7 +381,8 @@ public class JSONArray {
* *
* @return The truth. * @return The truth.
*/ */
public boolean optBoolean(final int index) { public boolean optBoolean(final int index)
{
return this.optBoolean(index, false); return this.optBoolean(index, false);
} }
@ -365,10 +395,14 @@ public class JSONArray {
* *
* @return The truth. * @return The truth.
*/ */
public boolean optBoolean(final int index, final boolean defaultValue) { public boolean optBoolean(final int index, final boolean defaultValue)
try { {
return this.getBoolean(index); try
} catch (final Exception e) { {
return getBoolean(index);
}
catch (final Exception e)
{
return defaultValue; return defaultValue;
} }
} }
@ -381,7 +415,8 @@ public class JSONArray {
* *
* @return The value. * @return The value.
*/ */
public double optDouble(final int index) { public double optDouble(final int index)
{
return this.optDouble(index, Double.NaN); return this.optDouble(index, Double.NaN);
} }
@ -394,10 +429,14 @@ public class JSONArray {
* *
* @return The value. * @return The value.
*/ */
public double optDouble(final int index, final double defaultValue) { public double optDouble(final int index, final double defaultValue)
try { {
return this.getDouble(index); try
} catch (final Exception e) { {
return getDouble(index);
}
catch (final Exception e)
{
return defaultValue; return defaultValue;
} }
} }
@ -410,7 +449,8 @@ public class JSONArray {
* *
* @return The value. * @return The value.
*/ */
public int optInt(final int index) { public int optInt(final int index)
{
return this.optInt(index, 0); return this.optInt(index, 0);
} }
@ -423,10 +463,14 @@ public class JSONArray {
* *
* @return The value. * @return The value.
*/ */
public int optInt(final int index, final int defaultValue) { public int optInt(final int index, final int defaultValue)
try { {
return this.getInt(index); try
} catch (final Exception e) { {
return getInt(index);
}
catch (final Exception e)
{
return defaultValue; return defaultValue;
} }
} }
@ -438,8 +482,9 @@ public class JSONArray {
* *
* @return A JSONArray value, or null if the index has no value, or if the value is not a JSONArray. * @return A JSONArray value, or null if the index has no value, or if the value is not a JSONArray.
*/ */
public JSONArray optJSONArray(final int index) { public JSONArray optJSONArray(final int index)
final Object o = this.opt(index); {
final Object o = opt(index);
return o instanceof JSONArray ? (JSONArray) o : null; return o instanceof JSONArray ? (JSONArray) o : null;
} }
@ -451,8 +496,9 @@ public class JSONArray {
* *
* @return A JSONObject value. * @return A JSONObject value.
*/ */
public JSONObject optJSONObject(final int index) { public JSONObject optJSONObject(final int index)
final Object o = this.opt(index); {
final Object o = opt(index);
return o instanceof JSONObject ? (JSONObject) o : null; return o instanceof JSONObject ? (JSONObject) o : null;
} }
@ -464,7 +510,8 @@ public class JSONArray {
* *
* @return The value. * @return The value.
*/ */
public long optLong(final int index) { public long optLong(final int index)
{
return this.optLong(index, 0); return this.optLong(index, 0);
} }
@ -477,10 +524,14 @@ public class JSONArray {
* *
* @return The value. * @return The value.
*/ */
public long optLong(final int index, final long defaultValue) { public long optLong(final int index, final long defaultValue)
try { {
return this.getLong(index); try
} catch (final Exception e) { {
return getLong(index);
}
catch (final Exception e)
{
return defaultValue; return defaultValue;
} }
} }
@ -493,7 +544,8 @@ public class JSONArray {
* *
* @return A String value. * @return A String value.
*/ */
public String optString(final int index) { public String optString(final int index)
{
return this.optString(index, ""); return this.optString(index, "");
} }
@ -505,8 +557,9 @@ public class JSONArray {
* *
* @return A String value. * @return A String value.
*/ */
public String optString(final int index, final String defaultValue) { public String optString(final int index, final String defaultValue)
final Object object = this.opt(index); {
final Object object = opt(index);
return JSONObject.NULL.equals(object) ? defaultValue : object.toString(); return JSONObject.NULL.equals(object) ? defaultValue : object.toString();
} }
@ -517,7 +570,8 @@ public class JSONArray {
* *
* @return this. * @return this.
*/ */
public JSONArray put(final boolean value) { public JSONArray put(final boolean value)
{
this.put(value ? Boolean.TRUE : Boolean.FALSE); this.put(value ? Boolean.TRUE : Boolean.FALSE);
return this; return this;
} }
@ -529,7 +583,8 @@ public class JSONArray {
* *
* @return this. * @return this.
*/ */
public JSONArray put(final Collection<Object> value) { public JSONArray put(final Collection<Object> value)
{
this.put(new JSONArray(value)); this.put(new JSONArray(value));
return this; return this;
} }
@ -543,7 +598,8 @@ public class JSONArray {
* *
* @throws JSONException if the value is not finite. * @throws JSONException if the value is not finite.
*/ */
public JSONArray put(final double value) throws JSONException { public JSONArray put(final double value) throws JSONException
{
final Double d = value; final Double d = value;
JSONObject.testValidity(d); JSONObject.testValidity(d);
this.put(d); this.put(d);
@ -557,7 +613,8 @@ public class JSONArray {
* *
* @return this. * @return this.
*/ */
public JSONArray put(final int value) { public JSONArray put(final int value)
{
this.put(new Integer(value)); this.put(new Integer(value));
return this; return this;
} }
@ -569,7 +626,8 @@ public class JSONArray {
* *
* @return this. * @return this.
*/ */
public JSONArray put(final long value) { public JSONArray put(final long value)
{
this.put(new Long(value)); this.put(new Long(value));
return this; return this;
} }
@ -581,7 +639,8 @@ public class JSONArray {
* *
* @return this. * @return this.
*/ */
public JSONArray put(final Map<String, Object> value) { public JSONArray put(final Map<String, Object> value)
{
this.put(new JSONObject(value)); this.put(new JSONObject(value));
return this; return this;
} }
@ -594,8 +653,9 @@ public class JSONArray {
* *
* @return this. * @return this.
*/ */
public JSONArray put(final Object value) { public JSONArray put(final Object value)
this.myArrayList.add(value); {
myArrayList.add(value);
return this; return this;
} }
@ -610,7 +670,8 @@ public class JSONArray {
* *
* @throws JSONException If the index is negative. * @throws JSONException If the index is negative.
*/ */
public JSONArray put(final int index, final boolean value) throws JSONException { public JSONArray put(final int index, final boolean value) throws JSONException
{
this.put(index, value ? Boolean.TRUE : Boolean.FALSE); this.put(index, value ? Boolean.TRUE : Boolean.FALSE);
return this; return this;
} }
@ -625,7 +686,8 @@ public class JSONArray {
* *
* @throws JSONException If the index is negative or if the value is not finite. * @throws JSONException If the index is negative or if the value is not finite.
*/ */
public JSONArray put(final int index, final Collection<Object> value) throws JSONException { public JSONArray put(final int index, final Collection<Object> value) throws JSONException
{
this.put(index, new JSONArray(value)); this.put(index, new JSONArray(value));
return this; return this;
} }
@ -641,7 +703,8 @@ public class JSONArray {
* *
* @throws JSONException If the index is negative or if the value is not finite. * @throws JSONException If the index is negative or if the value is not finite.
*/ */
public JSONArray put(final int index, final double value) throws JSONException { public JSONArray put(final int index, final double value) throws JSONException
{
this.put(index, new Double(value)); this.put(index, new Double(value));
return this; return this;
} }
@ -657,7 +720,8 @@ public class JSONArray {
* *
* @throws JSONException If the index is negative. * @throws JSONException If the index is negative.
*/ */
public JSONArray put(final int index, final int value) throws JSONException { public JSONArray put(final int index, final int value) throws JSONException
{
this.put(index, new Integer(value)); this.put(index, new Integer(value));
return this; return this;
} }
@ -673,7 +737,8 @@ public class JSONArray {
* *
* @throws JSONException If the index is negative. * @throws JSONException If the index is negative.
*/ */
public JSONArray put(final int index, final long value) throws JSONException { public JSONArray put(final int index, final long value) throws JSONException
{
this.put(index, new Long(value)); this.put(index, new Long(value));
return this; return this;
} }
@ -688,7 +753,8 @@ public class JSONArray {
* *
* @throws JSONException If the index is negative or if the the value is an invalid number. * @throws JSONException If the index is negative or if the the value is an invalid number.
*/ */
public JSONArray put(final int index, final Map<String, Object> value) throws JSONException { public JSONArray put(final int index, final Map<String, Object> value) throws JSONException
{
this.put(index, new JSONObject(value)); this.put(index, new JSONObject(value));
return this; return this;
} }
@ -705,15 +771,18 @@ public class JSONArray {
* *
* @throws JSONException If the index is negative or if the the value is an invalid number. * @throws JSONException If the index is negative or if the the value is an invalid number.
*/ */
public JSONArray put(final int index, final Object value) throws JSONException { public JSONArray put(final int index, final Object value) throws JSONException
{
JSONObject.testValidity(value); JSONObject.testValidity(value);
if (index < 0) { if (index < 0) { throw new JSONException("JSONArray[" + index + "] not found."); }
throw new JSONException("JSONArray[" + index + "] not found."); if (index < length())
{
myArrayList.set(index, value);
} }
if (index < this.length()) { else
this.myArrayList.set(index, value); {
} else { while (index != length())
while (index != this.length()) { {
this.put(JSONObject.NULL); this.put(JSONObject.NULL);
} }
this.put(value); this.put(value);
@ -728,8 +797,9 @@ public class JSONArray {
* *
* @return The value that was associated with the index, or null if there was no value. * @return The value that was associated with the index, or null if there was no value.
*/ */
public Object remove(final int index) { public Object remove(final int index)
return (index >= 0) && (index < this.length()) ? this.myArrayList.remove(index) : null; {
return (index >= 0) && (index < length()) ? myArrayList.remove(index) : null;
} }
/** /**
@ -739,28 +809,24 @@ public class JSONArray {
* *
* @return true if they are equal * @return true if they are equal
*/ */
public boolean similar(final Object other) { public boolean similar(final Object other)
if (!(other instanceof JSONArray)) { {
return false; if (!(other instanceof JSONArray)) { return false; }
} final int len = length();
final int len = this.length(); if (len != ((JSONArray) other).length()) { return false; }
if (len != ((JSONArray) other).length()) { for (int i = 0; i < len; i += 1)
return false; {
} final Object valueThis = get(i);
for (int i = 0; i < len; i += 1) {
final Object valueThis = this.get(i);
final Object valueOther = ((JSONArray) other).get(i); final Object valueOther = ((JSONArray) other).get(i);
if (valueThis instanceof JSONObject) { if (valueThis instanceof JSONObject)
if (!((JSONObject) valueThis).similar(valueOther)) { {
return false; if (!((JSONObject) valueThis).similar(valueOther)) { return false; }
}
} else if (valueThis instanceof JSONArray) {
if (!((JSONArray) valueThis).similar(valueOther)) {
return false;
}
} else if (!valueThis.equals(valueOther)) {
return false;
} }
else if (valueThis instanceof JSONArray)
{
if (!((JSONArray) valueThis).similar(valueOther)) { return false; }
}
else if (!valueThis.equals(valueOther)) { return false; }
} }
return true; return true;
} }
@ -774,13 +840,13 @@ public class JSONArray {
* *
* @throws JSONException If any of the names are null. * @throws JSONException If any of the names are null.
*/ */
public JSONObject toJSONObject(final JSONArray names) throws JSONException { public JSONObject toJSONObject(final JSONArray names) throws JSONException
if ((names == null) || (names.length() == 0) || (this.length() == 0)) { {
return null; if ((names == null) || (names.length() == 0) || (length() == 0)) { return null; }
}
final JSONObject jo = new JSONObject(); final JSONObject jo = new JSONObject();
for (int i = 0; i < names.length(); i += 1) { for (int i = 0; i < names.length(); i += 1)
jo.put(names.getString(i), this.opt(i)); {
jo.put(names.getString(i), opt(i));
} }
return jo; return jo;
} }
@ -789,16 +855,20 @@ public class JSONArray {
* Make a JSON text of this JSONArray. For compactness, no unnecessary whitespace is added. If it is not possible to * Make a JSON text of this JSONArray. For compactness, no unnecessary whitespace is added. If it is not possible to
* produce a syntactically correct JSON text then null will be returned instead. This could occur if the array * produce a syntactically correct JSON text then null will be returned instead. This could occur if the array
* contains an invalid number. * contains an invalid number.
* *
* Warning: This method assumes that the data structure is acyclical. * Warning: This method assumes that the data structure is acyclical.
* *
* @return a printable, displayable, transmittable representation of the array. * @return a printable, displayable, transmittable representation of the array.
*/ */
@Override @Override
public String toString() { public String toString()
try { {
try
{
return this.toString(0); return this.toString(0);
} catch (final Exception e) { }
catch (final Exception e)
{
return null; return null;
} }
} }
@ -815,29 +885,32 @@ public class JSONArray {
* *
* @throws JSONException * @throws JSONException
*/ */
public String toString(final int indentFactor) throws JSONException { public String toString(final int indentFactor) throws JSONException
{
final StringWriter sw = new StringWriter(); final StringWriter sw = new StringWriter();
synchronized (sw.getBuffer()) { synchronized (sw.getBuffer())
{
return this.write(sw, indentFactor, 0).toString(); return this.write(sw, indentFactor, 0).toString();
} }
} }
/** /**
* Write the contents of the JSONArray as JSON text to a writer. For compactness, no whitespace is added. * Write the contents of the JSONArray as JSON text to a writer. For compactness, no whitespace is added.
* *
* Warning: This method assumes that the data structure is acyclical. * Warning: This method assumes that the data structure is acyclical.
* *
* @return The writer. * @return The writer.
* *
* @throws JSONException * @throws JSONException
*/ */
public Writer write(final Writer writer) throws JSONException { public Writer write(final Writer writer) throws JSONException
{
return this.write(writer, 0, 0); return this.write(writer, 0, 0);
} }
/** /**
* Write the contents of the JSONArray as JSON text to a writer. For compactness, no whitespace is added. * Write the contents of the JSONArray as JSON text to a writer. For compactness, no whitespace is added.
* *
* Warning: This method assumes that the data structure is acyclical. * Warning: This method assumes that the data structure is acyclical.
* *
* @param indentFactor The number of spaces to add to each level of indentation. * @param indentFactor The number of spaces to add to each level of indentation.
@ -847,34 +920,45 @@ public class JSONArray {
* *
* @throws JSONException * @throws JSONException
*/ */
Writer write(final Writer writer, final int indentFactor, final int indent) throws JSONException { Writer write(final Writer writer, final int indentFactor, final int indent) throws JSONException
try { {
try
{
boolean commanate = false; boolean commanate = false;
final int length = this.length(); final int length = length();
writer.write('['); writer.write('[');
if (length == 1) { if (length == 1)
JSONObject.writeValue(writer, this.myArrayList.get(0), indentFactor, indent); {
} else if (length != 0) { JSONObject.writeValue(writer, myArrayList.get(0), indentFactor, indent);
}
else if (length != 0)
{
final int newindent = indent + indentFactor; final int newindent = indent + indentFactor;
for (int i = 0; i < length; i += 1) { for (int i = 0; i < length; i += 1)
if (commanate) { {
if (commanate)
{
writer.write(','); writer.write(',');
} }
if (indentFactor > 0) { if (indentFactor > 0)
{
writer.write('\n'); writer.write('\n');
} }
JSONObject.indent(writer, newindent); JSONObject.indent(writer, newindent);
JSONObject.writeValue(writer, this.myArrayList.get(i), indentFactor, newindent); JSONObject.writeValue(writer, myArrayList.get(i), indentFactor, newindent);
commanate = true; commanate = true;
} }
if (indentFactor > 0) { if (indentFactor > 0)
{
writer.write('\n'); writer.write('\n');
} }
JSONObject.indent(writer, indent); JSONObject.indent(writer, indent);
} }
writer.write(']'); writer.write(']');
return writer; return writer;
} catch (final IOException e) { }
catch (final IOException e)
{
throw new JSONException(e); throw new JSONException(e);
} }
} }

View File

@ -6,7 +6,8 @@ package com.intellectualcrafters.json;
* @author JSON.org * @author JSON.org
* @version 2014-05-03 * @version 2014-05-03
*/ */
public class JSONException extends RuntimeException { public class JSONException extends RuntimeException
{
private static final long serialVersionUID = 0; private static final long serialVersionUID = 0;
private Throwable cause; private Throwable cause;
@ -15,7 +16,8 @@ public class JSONException extends RuntimeException {
* *
* @param message Detail about the reason for the exception. * @param message Detail about the reason for the exception.
*/ */
public JSONException(final String message) { public JSONException(final String message)
{
super(message); super(message);
} }
@ -24,7 +26,8 @@ public class JSONException extends RuntimeException {
* *
* @param cause The cause. * @param cause The cause.
*/ */
public JSONException(final Throwable cause) { public JSONException(final Throwable cause)
{
super(cause.getMessage()); super(cause.getMessage());
this.cause = cause; this.cause = cause;
} }
@ -35,7 +38,8 @@ public class JSONException extends RuntimeException {
* @return the cause of this exception or null if the cause is nonexistent or unknown. * @return the cause of this exception or null if the cause is nonexistent or unknown.
*/ */
@Override @Override
public Throwable getCause() { public Throwable getCause()
return this.cause; {
return cause;
} }
} }

View File

@ -9,7 +9,8 @@ import java.util.Iterator;
* @author JSON.org * @author JSON.org
* @version 2014-05-03 * @version 2014-05-03
*/ */
public class JSONML { public class JSONML
{
/** /**
* Parse XML values and store them in a JSONArray. * Parse XML values and store them in a JSONArray.
* *
@ -21,7 +22,8 @@ public class JSONML {
* *
* @throws JSONException * @throws JSONException
*/ */
private static Object parse(final XMLTokener x, final boolean arrayForm, final JSONArray ja) throws JSONException { private static Object parse(final XMLTokener x, final boolean arrayForm, final JSONArray ja) throws JSONException
{
String attribute; String attribute;
char c; char c;
String closeTag = null; String closeTag = null;
@ -35,149 +37,188 @@ public class JSONML {
// <![ ... ]]> // <![ ... ]]>
// <! ... > // <! ... >
// <? ... ?> // <? ... ?>
while (true) { while (true)
if (!x.more()) { {
throw x.syntaxError("Bad XML"); if (!x.more()) { throw x.syntaxError("Bad XML"); }
}
token = x.nextContent(); token = x.nextContent();
if (token == XML.LT) { if (token == XML.LT)
{
token = x.nextToken(); token = x.nextToken();
if (token instanceof Character) { if (token instanceof Character)
if (token == XML.SLASH) { {
if (token == XML.SLASH)
{
// Close tag </ // Close tag </
token = x.nextToken(); token = x.nextToken();
if (!(token instanceof String)) { if (!(token instanceof String)) { throw new JSONException("Expected a closing name instead of '" + token + "'."); }
throw new JSONException("Expected a closing name instead of '" + token + "'."); if (x.nextToken() != XML.GT) { throw x.syntaxError("Misshaped close tag"); }
}
if (x.nextToken() != XML.GT) {
throw x.syntaxError("Misshaped close tag");
}
return token; return token;
} else if (token == XML.BANG) { }
else if (token == XML.BANG)
{
// <! // <!
c = x.next(); c = x.next();
if (c == '-') { if (c == '-')
if (x.next() == '-') { {
if (x.next() == '-')
{
x.skipPast("-->"); x.skipPast("-->");
} else { }
else
{
x.back(); x.back();
} }
} else if (c == '[') { }
else if (c == '[')
{
token = x.nextToken(); token = x.nextToken();
if (token.equals("CDATA") && (x.next() == '[')) { if (token.equals("CDATA") && (x.next() == '['))
if (ja != null) { {
if (ja != null)
{
ja.put(x.nextCDATA()); ja.put(x.nextCDATA());
} }
} else { }
else
{
throw x.syntaxError("Expected 'CDATA['"); throw x.syntaxError("Expected 'CDATA['");
} }
} else { }
else
{
i = 1; i = 1;
do { do
{
token = x.nextMeta(); token = x.nextMeta();
if (token == null) { if (token == null)
{
throw x.syntaxError("Missing '>' after '<!'."); throw x.syntaxError("Missing '>' after '<!'.");
} else if (token == XML.LT) { }
else if (token == XML.LT)
{
i += 1; i += 1;
} else if (token == XML.GT) { }
else if (token == XML.GT)
{
i -= 1; i -= 1;
} }
} while (i > 0); }
while (i > 0);
} }
} else if (token == XML.QUEST) { }
else if (token == XML.QUEST)
{
// <? // <?
x.skipPast("?>"); x.skipPast("?>");
} else { }
else
{
throw x.syntaxError("Misshaped tag"); throw x.syntaxError("Misshaped tag");
} }
// Open tag < // Open tag <
} else { }
if (!(token instanceof String)) { else
throw x.syntaxError("Bad tagName '" + token + "'."); {
} if (!(token instanceof String)) { throw x.syntaxError("Bad tagName '" + token + "'."); }
tagName = (String) token; tagName = (String) token;
newja = new JSONArray(); newja = new JSONArray();
newjo = new JSONObject(); newjo = new JSONObject();
if (arrayForm) { if (arrayForm)
{
newja.put(tagName); newja.put(tagName);
if (ja != null) { if (ja != null)
{
ja.put(newja); ja.put(newja);
} }
} else { }
else
{
newjo.put("tagName", tagName); newjo.put("tagName", tagName);
if (ja != null) { if (ja != null)
{
ja.put(newjo); ja.put(newjo);
} }
} }
token = null; token = null;
for (;;) { for (;;)
if (token == null) { {
if (token == null)
{
token = x.nextToken(); token = x.nextToken();
} }
if (token == null) { if (token == null) { throw x.syntaxError("Misshaped tag"); }
throw x.syntaxError("Misshaped tag"); if (!(token instanceof String))
} {
if (!(token instanceof String)) {
break; break;
} }
// attribute = value // attribute = value
attribute = (String) token; attribute = (String) token;
if (!arrayForm && ("tagName".equals(attribute) || "childNode".equals(attribute))) { if (!arrayForm && ("tagName".equals(attribute) || "childNode".equals(attribute))) { throw x.syntaxError("Reserved attribute."); }
throw x.syntaxError("Reserved attribute.");
}
token = x.nextToken(); token = x.nextToken();
if (token == XML.EQ) { if (token == XML.EQ)
{
token = x.nextToken(); token = x.nextToken();
if (!(token instanceof String)) { if (!(token instanceof String)) { throw x.syntaxError("Missing value"); }
throw x.syntaxError("Missing value");
}
newjo.accumulate(attribute, XML.stringToValue((String) token)); newjo.accumulate(attribute, XML.stringToValue((String) token));
token = null; token = null;
} else { }
else
{
newjo.accumulate(attribute, ""); newjo.accumulate(attribute, "");
} }
} }
if (arrayForm && (newjo.length() > 0)) { if (arrayForm && (newjo.length() > 0))
{
newja.put(newjo); newja.put(newjo);
} }
// Empty tag <.../> // Empty tag <.../>
if (token == XML.SLASH) { if (token == XML.SLASH)
if (x.nextToken() != XML.GT) { {
throw x.syntaxError("Misshaped tag"); if (x.nextToken() != XML.GT) { throw x.syntaxError("Misshaped tag"); }
} if (ja == null)
if (ja == null) { {
if (arrayForm) { if (arrayForm)
{
return newja; return newja;
} else { }
else
{
return newjo; return newjo;
} }
} }
// Content, between <...> and </...> // Content, between <...> and </...>
} else { }
if (token != XML.GT) { else
throw x.syntaxError("Misshaped tag"); {
} if (token != XML.GT) { throw x.syntaxError("Misshaped tag"); }
closeTag = (String) parse(x, arrayForm, newja); closeTag = (String) parse(x, arrayForm, newja);
if (closeTag != null) { if (closeTag != null)
if (!closeTag.equals(tagName)) { {
throw x.syntaxError("Mismatched '" + tagName + "' and '" + closeTag + "'"); if (!closeTag.equals(tagName)) { throw x.syntaxError("Mismatched '" + tagName + "' and '" + closeTag + "'"); }
}
tagName = null; tagName = null;
if (!arrayForm && (newja.length() > 0)) { if (!arrayForm && (newja.length() > 0))
{
newjo.put("childNodes", newja); newjo.put("childNodes", newja);
} }
if (ja == null) { if (ja == null)
if (arrayForm) { {
if (arrayForm)
{
return newja; return newja;
} else { }
else
{
return newjo; return newjo;
} }
} }
} }
} }
} }
} else { }
if (ja != null) { else
{
if (ja != null)
{
ja.put(token instanceof String ? XML.stringToValue((String) token) : token); ja.put(token instanceof String ? XML.stringToValue((String) token) : token);
} }
} }
@ -195,7 +236,8 @@ public class JSONML {
* *
* @throws JSONException * @throws JSONException
*/ */
public static JSONArray toJSONArray(final String string) throws JSONException { public static JSONArray toJSONArray(final String string) throws JSONException
{
return toJSONArray(new XMLTokener(string)); return toJSONArray(new XMLTokener(string));
} }
@ -212,7 +254,8 @@ public class JSONML {
* *
* @throws JSONException * @throws JSONException
*/ */
public static JSONArray toJSONArray(final XMLTokener x) throws JSONException { public static JSONArray toJSONArray(final XMLTokener x) throws JSONException
{
return (JSONArray) parse(x, true, null); return (JSONArray) parse(x, true, null);
} }
@ -221,7 +264,7 @@ public class JSONML {
* XML tag is represented as a JSONObject with a "tagName" property. If the tag has attributes, then the attributes * XML tag is represented as a JSONObject with a "tagName" property. If the tag has attributes, then the attributes
* will be in the JSONObject as properties. If the tag contains children, the object will have a "childNodes" * will be in the JSONObject as properties. If the tag contains children, the object will have a "childNodes"
* property which will be an array of strings and JsonML JSONObjects. * property which will be an array of strings and JsonML JSONObjects.
* *
* Comments, prologs, DTDs, and <code>&lt;[ [ ]]></code> are ignored. * Comments, prologs, DTDs, and <code>&lt;[ [ ]]></code> are ignored.
* *
* @param x An XMLTokener of the XML source text. * @param x An XMLTokener of the XML source text.
@ -230,7 +273,8 @@ public class JSONML {
* *
* @throws JSONException * @throws JSONException
*/ */
public static JSONObject toJSONObject(final XMLTokener x) throws JSONException { public static JSONObject toJSONObject(final XMLTokener x) throws JSONException
{
return (JSONObject) parse(x, false, null); return (JSONObject) parse(x, false, null);
} }
@ -239,7 +283,7 @@ public class JSONML {
* XML tag is represented as a JSONObject with a "tagName" property. If the tag has attributes, then the attributes * XML tag is represented as a JSONObject with a "tagName" property. If the tag has attributes, then the attributes
* will be in the JSONObject as properties. If the tag contains children, the object will have a "childNodes" * will be in the JSONObject as properties. If the tag contains children, the object will have a "childNodes"
* property which will be an array of strings and JsonML JSONObjects. * property which will be an array of strings and JsonML JSONObjects.
* *
* Comments, prologs, DTDs, and <code>&lt;[ [ ]]></code> are ignored. * Comments, prologs, DTDs, and <code>&lt;[ [ ]]></code> are ignored.
* *
* @param string The XML source text. * @param string The XML source text.
@ -248,7 +292,8 @@ public class JSONML {
* *
* @throws JSONException * @throws JSONException
*/ */
public static JSONObject toJSONObject(final String string) throws JSONException { public static JSONObject toJSONObject(final String string) throws JSONException
{
return toJSONObject(new XMLTokener(string)); return toJSONObject(new XMLTokener(string));
} }
@ -261,7 +306,8 @@ public class JSONML {
* *
* @throws JSONException * @throws JSONException
*/ */
public static String toString(final JSONArray ja) throws JSONException { public static String toString(final JSONArray ja) throws JSONException
{
int i; int i;
JSONObject jo; JSONObject jo;
String key; String key;
@ -278,16 +324,19 @@ public class JSONML {
sb.append('<'); sb.append('<');
sb.append(tagName); sb.append(tagName);
object = ja.opt(1); object = ja.opt(1);
if (object instanceof JSONObject) { if (object instanceof JSONObject)
{
i = 2; i = 2;
jo = (JSONObject) object; jo = (JSONObject) object;
// Emit the attributes // Emit the attributes
keys = jo.keys(); keys = jo.keys();
while (keys.hasNext()) { while (keys.hasNext())
{
key = keys.next(); key = keys.next();
XML.noSpace(key); XML.noSpace(key);
value = jo.optString(key); value = jo.optString(key);
if (value != null) { if (value != null)
{
sb.append(' '); sb.append(' ');
sb.append(XML.escape(key)); sb.append(XML.escape(key));
sb.append('='); sb.append('=');
@ -296,29 +345,42 @@ public class JSONML {
sb.append('"'); sb.append('"');
} }
} }
} else { }
else
{
i = 1; i = 1;
} }
// Emit content in body // Emit content in body
length = ja.length(); length = ja.length();
if (i >= length) { if (i >= length)
{
sb.append('/'); sb.append('/');
sb.append('>'); sb.append('>');
} else { }
else
{
sb.append('>'); sb.append('>');
do { do
{
object = ja.get(i); object = ja.get(i);
i += 1; i += 1;
if (object != null) { if (object != null)
if (object instanceof String) { {
if (object instanceof String)
{
sb.append(XML.escape(object.toString())); sb.append(XML.escape(object.toString()));
} else if (object instanceof JSONObject) { }
else if (object instanceof JSONObject)
{
sb.append(toString((JSONObject) object)); sb.append(toString((JSONObject) object));
} else if (object instanceof JSONArray) { }
else if (object instanceof JSONArray)
{
sb.append(toString((JSONArray) object)); sb.append(toString((JSONArray) object));
} }
} }
} while (i < length); }
while (i < length);
sb.append('<'); sb.append('<');
sb.append('/'); sb.append('/');
sb.append(tagName); sb.append(tagName);
@ -338,7 +400,8 @@ public class JSONML {
* *
* @throws JSONException * @throws JSONException
*/ */
public static String toString(final JSONObject jo) throws JSONException { public static String toString(final JSONObject jo) throws JSONException
{
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
int i; int i;
JSONArray ja; JSONArray ja;
@ -350,21 +413,22 @@ public class JSONML {
String value; String value;
// Emit <tagName // Emit <tagName
tagName = jo.optString("tagName"); tagName = jo.optString("tagName");
if (tagName == null) { if (tagName == null) { return XML.escape(jo.toString()); }
return XML.escape(jo.toString());
}
XML.noSpace(tagName); XML.noSpace(tagName);
tagName = XML.escape(tagName); tagName = XML.escape(tagName);
sb.append('<'); sb.append('<');
sb.append(tagName); sb.append(tagName);
// Emit the attributes // Emit the attributes
keys = jo.keys(); keys = jo.keys();
while (keys.hasNext()) { while (keys.hasNext())
{
key = keys.next(); key = keys.next();
if (!"tagName".equals(key) && !"childNodes".equals(key)) { if (!"tagName".equals(key) && !"childNodes".equals(key))
{
XML.noSpace(key); XML.noSpace(key);
value = jo.optString(key); value = jo.optString(key);
if (value != null) { if (value != null)
{
sb.append(' '); sb.append(' ');
sb.append(XML.escape(key)); sb.append(XML.escape(key));
sb.append('='); sb.append('=');
@ -376,22 +440,34 @@ public class JSONML {
} }
// Emit content in body // Emit content in body
ja = jo.optJSONArray("childNodes"); ja = jo.optJSONArray("childNodes");
if (ja == null) { if (ja == null)
{
sb.append('/'); sb.append('/');
sb.append('>'); sb.append('>');
} else { }
else
{
sb.append('>'); sb.append('>');
length = ja.length(); length = ja.length();
for (i = 0; i < length; i += 1) { for (i = 0; i < length; i += 1)
{
object = ja.get(i); object = ja.get(i);
if (object != null) { if (object != null)
if (object instanceof String) { {
if (object instanceof String)
{
sb.append(XML.escape(object.toString())); sb.append(XML.escape(object.toString()));
} else if (object instanceof JSONObject) { }
else if (object instanceof JSONObject)
{
sb.append(toString((JSONObject) object)); sb.append(toString((JSONObject) object));
} else if (object instanceof JSONArray) { }
else if (object instanceof JSONArray)
{
sb.append(toString((JSONArray) object)); sb.append(toString((JSONArray) object));
} else { }
else
{
sb.append(object.toString()); sb.append(object.toString());
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -6,7 +6,8 @@ package com.intellectualcrafters.json;
* <code>JSONWriter.value(</code>Object<code>)</code>. The <code>toJSONString</code> method will be used instead of the * <code>JSONWriter.value(</code>Object<code>)</code>. The <code>toJSONString</code> method will be used instead of the
* default behavior of using the Object's <code>toString()</code> method and quoting the result. * default behavior of using the Object's <code>toString()</code> method and quoting the result.
*/ */
public interface JSONString { public interface JSONString
{
/** /**
* The <code>toJSONString</code> method allows a class to produce its own JSON serialization. * The <code>toJSONString</code> method allows a class to produce its own JSON serialization.
* *

View File

@ -6,38 +6,40 @@ import java.io.StringWriter;
* JSONStringer provides a quick and convenient way of producing JSON text. The texts produced strictly conform to JSON * JSONStringer provides a quick and convenient way of producing JSON text. The texts produced strictly conform to JSON
* syntax rules. No whitespace is added, so the results are ready for transmission or storage. Each instance of * syntax rules. No whitespace is added, so the results are ready for transmission or storage. Each instance of
* JSONStringer can produce one JSON text. * JSONStringer can produce one JSON text.
* *
* A JSONStringer instance provides a <code>value</code> method for appending values to the text, and a <code>key</code> * A JSONStringer instance provides a <code>value</code> method for appending values to the text, and a <code>key</code>
* method for adding keys before values in objects. There are <code>array</code> and <code>endArray</code> methods that * method for adding keys before values in objects. There are <code>array</code> and <code>endArray</code> methods that
* make and bound array values, and <code>object</code> and <code>endObject</code> methods which make and bound object * make and bound array values, and <code>object</code> and <code>endObject</code> methods which make and bound object
* values. All of these methods return the JSONWriter instance, permitting cascade style. For example, * values. All of these methods return the JSONWriter instance, permitting cascade style. For example,
* *
* *
* <pre> * <pre>
* myString = new JSONStringer().object().key(&quot;JSON&quot;).value(&quot;Hello, * myString = new JSONStringer().object().key(&quot;JSON&quot;).value(&quot;Hello,
* World!&quot;).endObject().toString(); * World!&quot;).endObject().toString();
* </pre> * </pre>
* *
* which produces the string * which produces the string
* *
* *
* <pre> * <pre>
* {"JSON":"Hello, World!"} * {"JSON":"Hello, World!"}
* </pre> * </pre>
* *
* The first method called must be <code>array</code> or <code>object</code>. There are no methods for adding commas or * The first method called must be <code>array</code> or <code>object</code>. There are no methods for adding commas or
* colons. JSONStringer adds them for you. Objects and arrays can be nested up to 20 levels deep. * colons. JSONStringer adds them for you. Objects and arrays can be nested up to 20 levels deep.
* *
* This can sometimes be easier than using a JSONObject to build a string. * This can sometimes be easier than using a JSONObject to build a string.
* *
* @author JSON.org * @author JSON.org
* @version 2008-09-18 * @version 2008-09-18
*/ */
public class JSONStringer extends JSONWriter { public class JSONStringer extends JSONWriter
{
/** /**
* Make a fresh JSONStringer. It can be used to build one JSON text. * Make a fresh JSONStringer. It can be used to build one JSON text.
*/ */
public JSONStringer() { public JSONStringer()
{
super(new StringWriter()); super(new StringWriter());
} }
@ -49,7 +51,8 @@ public class JSONStringer extends JSONWriter {
* @return The JSON text. * @return The JSON text.
*/ */
@Override @Override
public String toString() { public String toString()
return this.mode == 'd' ? this.writer.toString() : null; {
return mode == 'd' ? writer.toString() : null;
} }
} }

View File

@ -14,7 +14,8 @@ import java.io.StringReader;
* @author JSON.org * @author JSON.org
* @version 2014-05-03 * @version 2014-05-03
*/ */
public class JSONTokener { public class JSONTokener
{
private final Reader reader; private final Reader reader;
private long character; private long character;
private boolean eof; private boolean eof;
@ -28,14 +29,15 @@ public class JSONTokener {
* *
* @param reader A reader. * @param reader A reader.
*/ */
public JSONTokener(final Reader reader) { public JSONTokener(final Reader reader)
{
this.reader = reader.markSupported() ? reader : new BufferedReader(reader); this.reader = reader.markSupported() ? reader : new BufferedReader(reader);
this.eof = false; eof = false;
this.usePrevious = false; usePrevious = false;
this.previous = 0; previous = 0;
this.index = 0; index = 0;
this.character = 1; character = 1;
this.line = 1; line = 1;
} }
/** /**
@ -43,7 +45,8 @@ public class JSONTokener {
* *
* @param inputStream The source. * @param inputStream The source.
*/ */
public JSONTokener(final InputStream inputStream) throws JSONException { public JSONTokener(final InputStream inputStream) throws JSONException
{
this(new InputStreamReader(inputStream)); this(new InputStreamReader(inputStream));
} }
@ -52,7 +55,8 @@ public class JSONTokener {
* *
* @param s A source string. * @param s A source string.
*/ */
public JSONTokener(final String s) { public JSONTokener(final String s)
{
this(new StringReader(s)); this(new StringReader(s));
} }
@ -63,16 +67,11 @@ public class JSONTokener {
* *
* @return An int between 0 and 15, or -1 if c was not a hex digit. * @return An int between 0 and 15, or -1 if c was not a hex digit.
*/ */
public static int dehexchar(final char c) { public static int dehexchar(final char c)
if ((c >= '0') && (c <= '9')) { {
return c - '0'; if ((c >= '0') && (c <= '9')) { return c - '0'; }
} if ((c >= 'A') && (c <= 'F')) { return c - ('A' - 10); }
if ((c >= 'A') && (c <= 'F')) { if ((c >= 'a') && (c <= 'f')) { return c - ('a' - 10); }
return c - ('A' - 10);
}
if ((c >= 'a') && (c <= 'f')) {
return c - ('a' - 10);
}
return -1; return -1;
} }
@ -80,18 +79,18 @@ public class JSONTokener {
* Back up one character. This provides a sort of lookahead capability, so that you can test for a digit or letter * Back up one character. This provides a sort of lookahead capability, so that you can test for a digit or letter
* before attempting to parse the next number or identifier. * before attempting to parse the next number or identifier.
*/ */
public void back() throws JSONException { public void back() throws JSONException
if (this.usePrevious || (this.index <= 0)) { {
throw new JSONException("Stepping back two steps is not supported"); if (usePrevious || (index <= 0)) { throw new JSONException("Stepping back two steps is not supported"); }
} index -= 1;
this.index -= 1; character -= 1;
this.character -= 1; usePrevious = true;
this.usePrevious = true; eof = false;
this.eof = false;
} }
public boolean end() { public boolean end()
return this.eof && !this.usePrevious; {
return eof && !usePrevious;
} }
/** /**
@ -99,12 +98,11 @@ public class JSONTokener {
* *
* @return true if not yet at the end of the source. * @return true if not yet at the end of the source.
*/ */
public boolean more() throws JSONException { public boolean more() throws JSONException
{
this.next(); this.next();
if (this.end()) { if (end()) { return false; }
return false; back();
}
this.back();
return true; return true;
} }
@ -113,34 +111,47 @@ public class JSONTokener {
* *
* @return The next character, or 0 if past the end of the source string. * @return The next character, or 0 if past the end of the source string.
*/ */
public char next() throws JSONException { public char next() throws JSONException
{
int c; int c;
if (this.usePrevious) { if (usePrevious)
this.usePrevious = false; {
c = this.previous; usePrevious = false;
} else { c = previous;
try { }
c = this.reader.read(); else
} catch (final IOException exception) { {
try
{
c = reader.read();
}
catch (final IOException exception)
{
throw new JSONException(exception); throw new JSONException(exception);
} }
if (c <= 0) { // End of stream if (c <= 0)
this.eof = true; { // End of stream
eof = true;
c = 0; c = 0;
} }
} }
this.index += 1; index += 1;
if (this.previous == '\r') { if (previous == '\r')
this.line += 1; {
this.character = c == '\n' ? 0 : 1; line += 1;
} else if (c == '\n') { character = c == '\n' ? 0 : 1;
this.line += 1;
this.character = 0;
} else {
this.character += 1;
} }
this.previous = (char) c; else if (c == '\n')
return this.previous; {
line += 1;
character = 0;
}
else
{
character += 1;
}
previous = (char) c;
return previous;
} }
/** /**
@ -152,11 +163,10 @@ public class JSONTokener {
* *
* @throws JSONException if the character does not match. * @throws JSONException if the character does not match.
*/ */
public char next(final char c) throws JSONException { public char next(final char c) throws JSONException
{
final char n = this.next(); final char n = this.next();
if (n != c) { if (n != c) { throw syntaxError("Expected '" + c + "' and instead saw '" + n + "'"); }
throw this.syntaxError("Expected '" + c + "' and instead saw '" + n + "'");
}
return n; return n;
} }
@ -169,17 +179,15 @@ public class JSONTokener {
* *
* @throws JSONException Substring bounds error if there are not n characters remaining in the source string. * @throws JSONException Substring bounds error if there are not n characters remaining in the source string.
*/ */
public String next(final int n) throws JSONException { public String next(final int n) throws JSONException
if (n == 0) { {
return ""; if (n == 0) { return ""; }
}
final char[] chars = new char[n]; final char[] chars = new char[n];
int pos = 0; int pos = 0;
while (pos < n) { while (pos < n)
{
chars[pos] = this.next(); chars[pos] = this.next();
if (this.end()) { if (end()) { throw syntaxError("Substring bounds error"); }
throw this.syntaxError("Substring bounds error");
}
pos += 1; pos += 1;
} }
return new String(chars); return new String(chars);
@ -192,12 +200,12 @@ public class JSONTokener {
* *
* @throws JSONException * @throws JSONException
*/ */
public char nextClean() throws JSONException { public char nextClean() throws JSONException
for (;;) { {
for (;;)
{
final char c = this.next(); final char c = this.next();
if ((c == 0) || (c > ' ')) { if ((c == 0) || (c > ' ')) { return c; }
return c;
}
} }
} }
@ -212,19 +220,23 @@ public class JSONTokener {
* *
* @throws JSONException Unterminated string. * @throws JSONException Unterminated string.
*/ */
public String nextString(final char quote) throws JSONException { public String nextString(final char quote) throws JSONException
{
char c; char c;
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
for (;;) { for (;;)
{
c = this.next(); c = this.next();
switch (c) { switch (c)
{
case 0: case 0:
case '\n': case '\n':
case '\r': case '\r':
throw this.syntaxError("Unterminated string"); throw syntaxError("Unterminated string");
case '\\': case '\\':
c = this.next(); c = this.next();
switch (c) { switch (c)
{
case 'b': case 'b':
sb.append('\b'); sb.append('\b');
break; break;
@ -250,13 +262,11 @@ public class JSONTokener {
sb.append(c); sb.append(c);
break; break;
default: default:
throw this.syntaxError("Illegal escape."); throw syntaxError("Illegal escape.");
} }
break; break;
default: default:
if (c == quote) { if (c == quote) { return sb.toString(); }
return sb.toString();
}
sb.append(c); sb.append(c);
} }
} }
@ -269,13 +279,17 @@ public class JSONTokener {
* *
* @return A string. * @return A string.
*/ */
public String nextTo(final char delimiter) throws JSONException { public String nextTo(final char delimiter) throws JSONException
{
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
for (;;) { for (;;)
{
final char c = this.next(); final char c = this.next();
if ((c == delimiter) || (c == 0) || (c == '\n') || (c == '\r')) { if ((c == delimiter) || (c == 0) || (c == '\n') || (c == '\r'))
if (c != 0) { {
this.back(); if (c != 0)
{
back();
} }
return sb.toString().trim(); return sb.toString().trim();
} }
@ -291,14 +305,18 @@ public class JSONTokener {
* *
* @return A string, trimmed. * @return A string, trimmed.
*/ */
public String nextTo(final String delimiters) throws JSONException { public String nextTo(final String delimiters) throws JSONException
{
char c; char c;
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
for (;;) { for (;;)
{
c = this.next(); c = this.next();
if ((delimiters.indexOf(c) >= 0) || (c == 0) || (c == '\n') || (c == '\r')) { if ((delimiters.indexOf(c) >= 0) || (c == 0) || (c == '\n') || (c == '\r'))
if (c != 0) { {
this.back(); if (c != 0)
{
back();
} }
return sb.toString().trim(); return sb.toString().trim();
} }
@ -314,18 +332,20 @@ public class JSONTokener {
* *
* @throws JSONException If syntax error. * @throws JSONException If syntax error.
*/ */
public Object nextValue() throws JSONException { public Object nextValue() throws JSONException
char c = this.nextClean(); {
char c = nextClean();
String string; String string;
switch (c) { switch (c)
{
case '"': case '"':
case '\'': case '\'':
return this.nextString(c); return nextString(c);
case '{': case '{':
this.back(); back();
return new JSONObject(this); return new JSONObject(this);
case '[': case '[':
this.back(); back();
return new JSONArray(this); return new JSONArray(this);
} }
/* /*
@ -336,15 +356,14 @@ public class JSONTokener {
* formatting character. * formatting character.
*/ */
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
while ((c >= ' ') && (",:]}/\\\"[{;=#".indexOf(c) < 0)) { while ((c >= ' ') && (",:]}/\\\"[{;=#".indexOf(c) < 0))
{
sb.append(c); sb.append(c);
c = this.next(); c = this.next();
} }
this.back(); back();
string = sb.toString().trim(); string = sb.toString().trim();
if ("".equals(string)) { if ("".equals(string)) { throw syntaxError("Missing value"); }
throw this.syntaxError("Missing value");
}
return JSONObject.stringToValue(string); return JSONObject.stringToValue(string);
} }
@ -356,27 +375,34 @@ public class JSONTokener {
* *
* @return The requested character, or zero if the requested character is not found. * @return The requested character, or zero if the requested character is not found.
*/ */
public char skipTo(final char to) throws JSONException { public char skipTo(final char to) throws JSONException
{
char c; char c;
try { try
final long startIndex = this.index; {
final long startCharacter = this.character; final long startIndex = index;
final long startLine = this.line; final long startCharacter = character;
this.reader.mark(1000000); final long startLine = line;
do { reader.mark(1000000);
do
{
c = this.next(); c = this.next();
if (c == 0) { if (c == 0)
this.reader.reset(); {
this.index = startIndex; reader.reset();
this.character = startCharacter; index = startIndex;
this.line = startLine; character = startCharacter;
line = startLine;
return c; return c;
} }
} while (c != to); }
} catch (final IOException exception) { while (c != to);
}
catch (final IOException exception)
{
throw new JSONException(exception); throw new JSONException(exception);
} }
this.back(); back();
return c; return c;
} }
@ -387,8 +413,9 @@ public class JSONTokener {
* *
* @return A JSONException object, suitable for throwing * @return A JSONException object, suitable for throwing
*/ */
public JSONException syntaxError(final String message) { public JSONException syntaxError(final String message)
return new JSONException(message + this.toString()); {
return new JSONException(message + toString());
} }
/** /**
@ -397,7 +424,8 @@ public class JSONTokener {
* @return " at {index} [character {character} line {line}]" * @return " at {index} [character {character} line {line}]"
*/ */
@Override @Override
public String toString() { public String toString()
return " at " + this.index + " [character " + this.character + " line " + this.line + "]"; {
return " at " + index + " [character " + character + " line " + line + "]";
} }
} }

View File

@ -7,33 +7,34 @@ import java.io.Writer;
* JSONWriter provides a quick and convenient way of producing JSON text. The texts produced strictly conform to JSON * JSONWriter provides a quick and convenient way of producing JSON text. The texts produced strictly conform to JSON
* syntax rules. No whitespace is added, so the results are ready for transmission or storage. Each instance of * syntax rules. No whitespace is added, so the results are ready for transmission or storage. Each instance of
* JSONWriter can produce one JSON text. * JSONWriter can produce one JSON text.
* *
* A JSONWriter instance provides a <code>value</code> method for appending values to the text, and a <code>key</code> * A JSONWriter instance provides a <code>value</code> method for appending values to the text, and a <code>key</code>
* method for adding keys before values in objects. There are <code>array</code> and <code>endArray</code> methods that * method for adding keys before values in objects. There are <code>array</code> and <code>endArray</code> methods that
* make and bound array values, and <code>object</code> and <code>endObject</code> methods which make and bound object * make and bound array values, and <code>object</code> and <code>endObject</code> methods which make and bound object
* values. All of these methods return the JSONWriter instance, permitting a cascade style. For example, * values. All of these methods return the JSONWriter instance, permitting a cascade style. For example,
* *
* *
* <pre> * <pre>
* new JSONWriter(myWriter).object().key(&quot;JSON&quot;).value(&quot;Hello, World!&quot;).endObject(); * new JSONWriter(myWriter).object().key(&quot;JSON&quot;).value(&quot;Hello, World!&quot;).endObject();
* </pre> * </pre>
* *
* which writes * which writes
* *
* *
* <pre> * <pre>
* {"JSON":"Hello, World!"} * {"JSON":"Hello, World!"}
* </pre> * </pre>
* *
* The first method called must be <code>array</code> or <code>object</code>. There are no methods for adding commas or * The first method called must be <code>array</code> or <code>object</code>. There are no methods for adding commas or
* colons. JSONWriter adds them for you. Objects and arrays can be nested up to 20 levels deep. * colons. JSONWriter adds them for you. Objects and arrays can be nested up to 20 levels deep.
* *
* This can sometimes be easier than using a JSONObject to build a string. * This can sometimes be easier than using a JSONObject to build a string.
* *
* @author JSON.org * @author JSON.org
* @version 2011-11-24 * @version 2011-11-24
*/ */
public class JSONWriter { public class JSONWriter
{
private static final int maxdepth = 200; private static final int maxdepth = 200;
/** /**
* The writer that will receive the output. * The writer that will receive the output.
@ -59,12 +60,13 @@ public class JSONWriter {
/** /**
* Make a fresh JSONWriter. It can be used to build one JSON text. * Make a fresh JSONWriter. It can be used to build one JSON text.
*/ */
public JSONWriter(final Writer w) { public JSONWriter(final Writer w)
this.comma = false; {
this.mode = 'i'; comma = false;
this.stack = new JSONObject[maxdepth]; mode = 'i';
this.top = 0; stack = new JSONObject[maxdepth];
this.writer = w; top = 0;
writer = w;
} }
/** /**
@ -76,23 +78,28 @@ public class JSONWriter {
* *
* @throws JSONException If the value is out of sequence. * @throws JSONException If the value is out of sequence.
*/ */
private JSONWriter append(final String string) throws JSONException { private JSONWriter append(final String string) throws JSONException
if (string == null) { {
throw new JSONException("Null pointer"); if (string == null) { throw new JSONException("Null pointer"); }
} if ((mode == 'o') || (mode == 'a'))
if ((this.mode == 'o') || (this.mode == 'a')) { {
try { try
if (this.comma && (this.mode == 'a')) { {
this.writer.write(','); if (comma && (mode == 'a'))
{
writer.write(',');
} }
this.writer.write(string); writer.write(string);
} catch (final IOException e) { }
catch (final IOException e)
{
throw new JSONException(e); throw new JSONException(e);
} }
if (this.mode == 'o') { if (mode == 'o')
this.mode = 'k'; {
mode = 'k';
} }
this.comma = true; comma = true;
return this; return this;
} }
throw new JSONException("Value out of sequence."); throw new JSONException("Value out of sequence.");
@ -107,11 +114,13 @@ public class JSONWriter {
* @throws JSONException If the nesting is too deep, or if the object is started in the wrong place (for example as * @throws JSONException If the nesting is too deep, or if the object is started in the wrong place (for example as
* a key or after the end of the outermost array or object). * a key or after the end of the outermost array or object).
*/ */
public JSONWriter array() throws JSONException { public JSONWriter array() throws JSONException
if ((this.mode == 'i') || (this.mode == 'o') || (this.mode == 'a')) { {
this.push(null); if ((mode == 'i') || (mode == 'o') || (mode == 'a'))
this.append("["); {
this.comma = false; push(null);
append("[");
comma = false;
return this; return this;
} }
throw new JSONException("Misplaced array."); throw new JSONException("Misplaced array.");
@ -127,17 +136,19 @@ public class JSONWriter {
* *
* @throws JSONException If unbalanced. * @throws JSONException If unbalanced.
*/ */
private JSONWriter end(final char mode, final char c) throws JSONException { private JSONWriter end(final char mode, final char c) throws JSONException
if (this.mode != mode) { {
throw new JSONException(mode == 'a' ? "Misplaced endArray." : "Misplaced endObject."); if (this.mode != mode) { throw new JSONException(mode == 'a' ? "Misplaced endArray." : "Misplaced endObject."); }
pop(mode);
try
{
writer.write(c);
} }
this.pop(mode); catch (final IOException e)
try { {
this.writer.write(c);
} catch (final IOException e) {
throw new JSONException(e); throw new JSONException(e);
} }
this.comma = true; comma = true;
return this; return this;
} }
@ -148,8 +159,9 @@ public class JSONWriter {
* *
* @throws JSONException If incorrectly nested. * @throws JSONException If incorrectly nested.
*/ */
public JSONWriter endArray() throws JSONException { public JSONWriter endArray() throws JSONException
return this.end('a', ']'); {
return end('a', ']');
} }
/** /**
@ -159,8 +171,9 @@ public class JSONWriter {
* *
* @throws JSONException If incorrectly nested. * @throws JSONException If incorrectly nested.
*/ */
public JSONWriter endObject() throws JSONException { public JSONWriter endObject() throws JSONException
return this.end('k', '}'); {
return end('k', '}');
} }
/** /**
@ -174,22 +187,26 @@ public class JSONWriter {
* @throws JSONException If the key is out of place. For example, keys do not belong in arrays or if the key is * @throws JSONException If the key is out of place. For example, keys do not belong in arrays or if the key is
* null. * null.
*/ */
public JSONWriter key(final String string) throws JSONException { public JSONWriter key(final String string) throws JSONException
if (string == null) { {
throw new JSONException("Null key."); if (string == null) { throw new JSONException("Null key."); }
} if (mode == 'k')
if (this.mode == 'k') { {
try { try
this.stack[this.top - 1].putOnce(string, Boolean.TRUE); {
if (this.comma) { stack[top - 1].putOnce(string, Boolean.TRUE);
this.writer.write(','); if (comma)
{
writer.write(',');
} }
this.writer.write(JSONObject.quote(string)); writer.write(JSONObject.quote(string));
this.writer.write(':'); writer.write(':');
this.comma = false; comma = false;
this.mode = 'o'; mode = 'o';
return this; return this;
} catch (final IOException e) { }
catch (final IOException e)
{
throw new JSONException(e); throw new JSONException(e);
} }
} }
@ -205,14 +222,17 @@ public class JSONWriter {
* @throws JSONException If the nesting is too deep, or if the object is started in the wrong place (for example as * @throws JSONException If the nesting is too deep, or if the object is started in the wrong place (for example as
* a key or after the end of the outermost array or object). * a key or after the end of the outermost array or object).
*/ */
public JSONWriter object() throws JSONException { public JSONWriter object() throws JSONException
if (this.mode == 'i') { {
this.mode = 'o'; if (mode == 'i')
{
mode = 'o';
} }
if ((this.mode == 'o') || (this.mode == 'a')) { if ((mode == 'o') || (mode == 'a'))
this.append("{"); {
this.push(new JSONObject()); append("{");
this.comma = false; push(new JSONObject());
comma = false;
return this; return this;
} }
throw new JSONException("Misplaced object."); throw new JSONException("Misplaced object.");
@ -225,16 +245,13 @@ public class JSONWriter {
* *
* @throws JSONException If nesting is wrong. * @throws JSONException If nesting is wrong.
*/ */
private void pop(final char c) throws JSONException { private void pop(final char c) throws JSONException
if (this.top <= 0) { {
throw new JSONException("Nesting error."); if (top <= 0) { throw new JSONException("Nesting error."); }
} final char m = stack[top - 1] == null ? 'a' : 'k';
final char m = this.stack[this.top - 1] == null ? 'a' : 'k'; if (m != c) { throw new JSONException("Nesting error."); }
if (m != c) { top -= 1;
throw new JSONException("Nesting error."); mode = top == 0 ? 'd' : stack[top - 1] == null ? 'a' : 'k';
}
this.top -= 1;
this.mode = this.top == 0 ? 'd' : this.stack[this.top - 1] == null ? 'a' : 'k';
} }
/** /**
@ -244,13 +261,12 @@ public class JSONWriter {
* *
* @throws JSONException If nesting is too deep. * @throws JSONException If nesting is too deep.
*/ */
private void push(final JSONObject jo) throws JSONException { private void push(final JSONObject jo) throws JSONException
if (this.top >= maxdepth) { {
throw new JSONException("Nesting too deep."); if (top >= maxdepth) { throw new JSONException("Nesting too deep."); }
} stack[top] = jo;
this.stack[this.top] = jo; mode = jo == null ? 'a' : 'k';
this.mode = jo == null ? 'a' : 'k'; top += 1;
this.top += 1;
} }
/** /**
@ -262,8 +278,9 @@ public class JSONWriter {
* *
* @throws JSONException * @throws JSONException
*/ */
public JSONWriter value(final boolean b) throws JSONException { public JSONWriter value(final boolean b) throws JSONException
return this.append(b ? "true" : "false"); {
return append(b ? "true" : "false");
} }
/** /**
@ -275,7 +292,8 @@ public class JSONWriter {
* *
* @throws JSONException If the number is not finite. * @throws JSONException If the number is not finite.
*/ */
public JSONWriter value(final double d) throws JSONException { public JSONWriter value(final double d) throws JSONException
{
return this.value(new Double(d)); return this.value(new Double(d));
} }
@ -288,8 +306,9 @@ public class JSONWriter {
* *
* @throws JSONException * @throws JSONException
*/ */
public JSONWriter value(final long l) throws JSONException { public JSONWriter value(final long l) throws JSONException
return this.append(Long.toString(l)); {
return append(Long.toString(l));
} }
/** /**
@ -302,7 +321,8 @@ public class JSONWriter {
* *
* @throws JSONException If the value is out of sequence. * @throws JSONException If the value is out of sequence.
*/ */
public JSONWriter value(final Object object) throws JSONException { public JSONWriter value(final Object object) throws JSONException
return this.append(JSONObject.valueToString(object)); {
return append(JSONObject.valueToString(object));
} }
} }

View File

@ -5,28 +5,29 @@ package com.intellectualcrafters.json;
* byte. The last byte of a character never has the MSB reset. Every byte that is not the last byte has the MSB set. Kim * byte. The last byte of a character never has the MSB reset. Every byte that is not the last byte has the MSB set. Kim
* stands for "Keep it minimal". A Unicode character is never longer than 3 bytes. Every byte contributes 7 bits to the * stands for "Keep it minimal". A Unicode character is never longer than 3 bytes. Every byte contributes 7 bits to the
* character. ASCII is unmodified. * character. ASCII is unmodified.
* *
* Kim UTF-8 one byte U+007F U+007F two bytes U+3FFF U+07FF three bytes U+10FFF U+FFFF four bytes U+10FFFF * Kim UTF-8 one byte U+007F U+007F two bytes U+3FFF U+07FF three bytes U+10FFF U+FFFF four bytes U+10FFFF
* *
* Characters in the ranges U+0800..U+3FFF and U+10000..U+10FFFF will be one byte smaller when encoded in Kim compared * Characters in the ranges U+0800..U+3FFF and U+10000..U+10FFFF will be one byte smaller when encoded in Kim compared
* to UTF-8. * to UTF-8.
* *
* Kim is beneficial when using scripts such as Old South Arabian, Aramaic, Avestan, Balinese, Batak, Bopomofo, * Kim is beneficial when using scripts such as Old South Arabian, Aramaic, Avestan, Balinese, Batak, Bopomofo,
* Buginese, Buhid, Carian, Cherokee, Coptic, Cyrillic, Deseret, Egyptian Hieroglyphs, Ethiopic, Georgian, Glagolitic, * Buginese, Buhid, Carian, Cherokee, Coptic, Cyrillic, Deseret, Egyptian Hieroglyphs, Ethiopic, Georgian, Glagolitic,
* Gothic, Hangul Jamo, Hanunoo, Hiragana, Kanbun, Kaithi, Kannada, Katakana, Kharoshthi, Khmer, Lao, Lepcha, Limbu, * Gothic, Hangul Jamo, Hanunoo, Hiragana, Kanbun, Kaithi, Kannada, Katakana, Kharoshthi, Khmer, Lao, Lepcha, Limbu,
* Lycian, Lydian, Malayalam, Mandaic, Meroitic, Miao, Mongolian, Myanmar, New Tai Lue, Ol Chiki, Old Turkic, Oriya, * Lycian, Lydian, Malayalam, Mandaic, Meroitic, Miao, Mongolian, Myanmar, New Tai Lue, Ol Chiki, Old Turkic, Oriya,
* Osmanya, Pahlavi, Parthian, Phags-Pa, Phoenician, Samaritan, Sharada, Sinhala, Sora Sompeng, Tagalog, Tagbanwa, * Osmanya, Pahlavi, Parthian, Phags-Pa, Phoenician, Samaritan, Sharada, Sinhala, Sora Sompeng, Tagalog, Tagbanwa,
* Takri, Tai Le, Tai Tham, Tamil, Telugu, Thai, Tibetan, Tifinagh, UCAS. * Takri, Tai Le, Tai Tham, Tamil, Telugu, Thai, Tibetan, Tifinagh, UCAS.
* *
* A kim object can be constructed from an ordinary UTF-16 string, or from a byte array. A kim object can produce a * A kim object can be constructed from an ordinary UTF-16 string, or from a byte array. A kim object can produce a
* UTF-16 string. * UTF-16 string.
* *
* As with UTF-8, it is possible to detect character boundaries within a byte sequence. UTF-8 is one of the world's * As with UTF-8, it is possible to detect character boundaries within a byte sequence. UTF-8 is one of the world's
* great inventions. While Kim is more efficient, it is not clear that it is worth the expense of transition. * great inventions. While Kim is more efficient, it is not clear that it is worth the expense of transition.
* *
* @version 2013-04-18 * @version 2013-04-18
*/ */
public class Kim { public class Kim
{
/** /**
* The number of bytes in the kim. The number of bytes can be as much as three times the number of characters. * The number of bytes in the kim. The number of bytes can be as much as three times the number of characters.
*/ */
@ -51,23 +52,26 @@ public class Kim {
* @param from The index of the first byte. * @param from The index of the first byte.
* @param thru The index of the last byte plus one. * @param thru The index of the last byte plus one.
*/ */
public Kim(final byte[] bytes, final int from, final int thru) { public Kim(final byte[] bytes, final int from, final int thru)
{
// As the bytes are copied into the new kim, a hashcode is computed // As the bytes are copied into the new kim, a hashcode is computed
// using a // using a
// modified Fletcher code. // modified Fletcher code.
int sum = 1; int sum = 1;
int value; int value;
this.hashcode = 0; hashcode = 0;
this.length = thru - from; length = thru - from;
if (this.length > 0) { if (length > 0)
this.bytes = new byte[this.length]; {
for (int at = 0; at < this.length; at += 1) { this.bytes = new byte[length];
for (int at = 0; at < length; at += 1)
{
value = bytes[at + from] & 0xFF; value = bytes[at + from] & 0xFF;
sum += value; sum += value;
this.hashcode += sum; hashcode += sum;
this.bytes[at] = (byte) value; this.bytes[at] = (byte) value;
} }
this.hashcode += sum << 16; hashcode += sum << 16;
} }
} }
@ -77,7 +81,8 @@ public class Kim {
* @param bytes The byte array. * @param bytes The byte array.
* @param length The number of bytes. * @param length The number of bytes.
*/ */
public Kim(final byte[] bytes, final int length) { public Kim(final byte[] bytes, final int length)
{
this(bytes, 0, length); this(bytes, 0, length);
} }
@ -88,7 +93,8 @@ public class Kim {
* @param from The point at which to take bytes. * @param from The point at which to take bytes.
* @param thru The point at which to stop taking bytes. * @param thru The point at which to stop taking bytes.
*/ */
public Kim(final Kim kim, final int from, final int thru) { public Kim(final Kim kim, final int from, final int thru)
{
this(kim.bytes, from, thru); this(kim.bytes, from, thru);
} }
@ -99,78 +105,92 @@ public class Kim {
* *
* @throws JSONException if surrogate pair mismatch. * @throws JSONException if surrogate pair mismatch.
*/ */
public Kim(final String string) throws JSONException { public Kim(final String string) throws JSONException
{
final int stringLength = string.length(); final int stringLength = string.length();
this.hashcode = 0; hashcode = 0;
this.length = 0; length = 0;
// First pass: Determine the length of the kim, allowing for the UTF-16 // First pass: Determine the length of the kim, allowing for the UTF-16
// to UTF-32 conversion, and then the UTF-32 to Kim conversion. // to UTF-32 conversion, and then the UTF-32 to Kim conversion.
if (stringLength > 0) { if (stringLength > 0)
for (int i = 0; i < stringLength; i += 1) { {
for (int i = 0; i < stringLength; i += 1)
{
final int c = string.charAt(i); final int c = string.charAt(i);
if (c <= 0x7F) { if (c <= 0x7F)
this.length += 1; {
} else if (c <= 0x3FFF) { length += 1;
this.length += 2; }
} else { else if (c <= 0x3FFF)
if ((c >= 0xD800) && (c <= 0xDFFF)) { {
length += 2;
}
else
{
if ((c >= 0xD800) && (c <= 0xDFFF))
{
i += 1; i += 1;
final int d = string.charAt(i); final int d = string.charAt(i);
if ((c > 0xDBFF) || (d < 0xDC00) || (d > 0xDFFF)) { if ((c > 0xDBFF) || (d < 0xDC00) || (d > 0xDFFF)) { throw new JSONException("Bad UTF16"); }
throw new JSONException("Bad UTF16");
}
} }
this.length += 3; length += 3;
} }
} }
// Second pass: Allocate a byte array and fill that array with the // Second pass: Allocate a byte array and fill that array with the
// conversion // conversion
// while computing the hashcode. // while computing the hashcode.
this.bytes = new byte[this.length]; bytes = new byte[length];
int at = 0; int at = 0;
int b; int b;
int sum = 1; int sum = 1;
for (int i = 0; i < stringLength; i += 1) { for (int i = 0; i < stringLength; i += 1)
{
int character = string.charAt(i); int character = string.charAt(i);
if (character <= 0x7F) { if (character <= 0x7F)
this.bytes[at] = (byte) character; {
bytes[at] = (byte) character;
sum += character; sum += character;
this.hashcode += sum; hashcode += sum;
at += 1; at += 1;
} else if (character <= 0x3FFF) { }
else if (character <= 0x3FFF)
{
b = 0x80 | (character >>> 7); b = 0x80 | (character >>> 7);
this.bytes[at] = (byte) b; bytes[at] = (byte) b;
sum += b; sum += b;
this.hashcode += sum; hashcode += sum;
at += 1; at += 1;
b = character & 0x7F; b = character & 0x7F;
this.bytes[at] = (byte) b; bytes[at] = (byte) b;
sum += b; sum += b;
this.hashcode += sum; hashcode += sum;
at += 1; at += 1;
} else { }
if ((character >= 0xD800) && (character <= 0xDBFF)) { else
{
if ((character >= 0xD800) && (character <= 0xDBFF))
{
i += 1; i += 1;
character = (((character & 0x3FF) << 10) | (string.charAt(i) & 0x3FF)) + 65536; character = (((character & 0x3FF) << 10) | (string.charAt(i) & 0x3FF)) + 65536;
} }
b = 0x80 | (character >>> 14); b = 0x80 | (character >>> 14);
this.bytes[at] = (byte) b; bytes[at] = (byte) b;
sum += b; sum += b;
this.hashcode += sum; hashcode += sum;
at += 1; at += 1;
b = 0x80 | ((character >>> 7) & 0xFF); b = 0x80 | ((character >>> 7) & 0xFF);
this.bytes[at] = (byte) b; bytes[at] = (byte) b;
sum += b; sum += b;
this.hashcode += sum; hashcode += sum;
at += 1; at += 1;
b = character & 0x7F; b = character & 0x7F;
this.bytes[at] = (byte) b; bytes[at] = (byte) b;
sum += b; sum += b;
this.hashcode += sum; hashcode += sum;
at += 1; at += 1;
} }
} }
this.hashcode += sum << 16; hashcode += sum << 16;
} }
} }
@ -183,10 +203,9 @@ public class Kim {
* *
* @throws JSONException if the character is not representable in a kim. * @throws JSONException if the character is not representable in a kim.
*/ */
public static int characterSize(final int character) throws JSONException { public static int characterSize(final int character) throws JSONException
if ((character < 0) || (character > 0x10FFFF)) { {
throw new JSONException("Bad character " + character); if ((character < 0) || (character > 0x10FFFF)) { throw new JSONException("Bad character " + character); }
}
return character <= 0x7F ? 1 : character <= 0x3FFF ? 2 : 3; return character <= 0x7F ? 1 : character <= 0x3FFF ? 2 : 3;
} }
@ -199,24 +218,22 @@ public class Kim {
* @throws JSONException if at does not point to a valid character. * @throws JSONException if at does not point to a valid character.
* @return a Unicode character between 0 and 0x10FFFF. * @return a Unicode character between 0 and 0x10FFFF.
*/ */
public int characterAt(final int at) throws JSONException { public int characterAt(final int at) throws JSONException
{
final int c = get(at); final int c = get(at);
if ((c & 0x80) == 0) { if ((c & 0x80) == 0) { return c; }
return c;
}
int character; int character;
final int c1 = get(at + 1); final int c1 = get(at + 1);
if ((c1 & 0x80) == 0) { if ((c1 & 0x80) == 0)
{
character = ((c & 0x7F) << 7) | c1; character = ((c & 0x7F) << 7) | c1;
if (character > 0x7F) { if (character > 0x7F) { return character; }
return character; }
} else
} else { {
final int c2 = get(at + 2); final int c2 = get(at + 2);
character = ((c & 0x7F) << 14) | ((c1 & 0x7F) << 7) | c2; character = ((c & 0x7F) << 14) | ((c1 & 0x7F) << 7) | c2;
if (((c2 & 0x80) == 0) && (character > 0x3FFF) && (character <= 0x10FFFF) && ((character < 0xD800) || (character > 0xDFFF))) { if (((c2 & 0x80) == 0) && (character > 0x3FFF) && (character <= 0x10FFFF) && ((character < 0xD800) || (character > 0xDFFF))) { return character; }
return character;
}
} }
throw new JSONException("Bad character at " + at); throw new JSONException("Bad character at " + at);
} }
@ -229,9 +246,10 @@ public class Kim {
* *
* @return The position immediately after the copy. * @return The position immediately after the copy.
*/ */
public int copy(final byte[] bytes, final int at) { public int copy(final byte[] bytes, final int at)
System.arraycopy(this.bytes, 0, bytes, at, this.length); {
return at + this.length; System.arraycopy(this.bytes, 0, bytes, at, length);
return at + length;
} }
/** /**
@ -242,18 +260,13 @@ public class Kim {
* @return true if this and obj are both kim objects containing identical byte sequences. * @return true if this and obj are both kim objects containing identical byte sequences.
*/ */
@Override @Override
public boolean equals(final Object obj) { public boolean equals(final Object obj)
if (!(obj instanceof Kim)) { {
return false; if (!(obj instanceof Kim)) { return false; }
}
final Kim that = (Kim) obj; final Kim that = (Kim) obj;
if (this == that) { if (this == that) { return true; }
return true; if (hashcode != that.hashcode) { return false; }
} return java.util.Arrays.equals(bytes, that.bytes);
if (this.hashcode != that.hashcode) {
return false;
}
return java.util.Arrays.equals(this.bytes, that.bytes);
} }
/** /**
@ -265,19 +278,19 @@ public class Kim {
* *
* @throws JSONException if there is no byte at that position. * @throws JSONException if there is no byte at that position.
*/ */
public int get(final int at) throws JSONException { public int get(final int at) throws JSONException
if ((at < 0) || (at > this.length)) { {
throw new JSONException("Bad character at " + at); if ((at < 0) || (at > length)) { throw new JSONException("Bad character at " + at); }
} return (bytes[at]) & 0xFF;
return (this.bytes[at]) & 0xFF;
} }
/** /**
* Returns a hash code value for the kim. * Returns a hash code value for the kim.
*/ */
@Override @Override
public int hashCode() { public int hashCode()
return this.hashcode; {
return hashcode;
} }
/** /**
@ -289,25 +302,31 @@ public class Kim {
* @throws JSONException if the kim is not valid. * @throws JSONException if the kim is not valid.
*/ */
@Override @Override
public String toString() throws JSONException { public String toString() throws JSONException
if (this.string == null) { {
if (string == null)
{
int c; int c;
int length = 0; int length = 0;
final char chars[] = new char[this.length]; final char chars[] = new char[this.length];
for (int at = 0; at < this.length; at += characterSize(c)) { for (int at = 0; at < this.length; at += characterSize(c))
c = this.characterAt(at); {
if (c < 0x10000) { c = characterAt(at);
if (c < 0x10000)
{
chars[length] = (char) c; chars[length] = (char) c;
length += 1; length += 1;
} else { }
else
{
chars[length] = (char) (0xD800 | ((c - 0x10000) >>> 10)); chars[length] = (char) (0xD800 | ((c - 0x10000) >>> 10));
length += 1; length += 1;
chars[length] = (char) (0xDC00 | (c & 0x03FF)); chars[length] = (char) (0xDC00 | (c & 0x03FF));
length += 1; length += 1;
} }
} }
this.string = new String(chars, 0, length); string = new String(chars, 0, length);
} }
return this.string; return string;
} }
} }

View File

@ -30,7 +30,8 @@ import java.util.Properties;
* @author JSON.org * @author JSON.org
* @version 2014-05-03 * @version 2014-05-03
*/ */
public class Property { public class Property
{
/** /**
* Converts a property file object into a JSONObject. The property file object is a table of name value pairs. * Converts a property file object into a JSONObject. The property file object is a table of name value pairs.
* *
@ -40,11 +41,14 @@ public class Property {
* *
* @throws JSONException * @throws JSONException
*/ */
public static JSONObject toJSONObject(final java.util.Properties properties) throws JSONException { public static JSONObject toJSONObject(final java.util.Properties properties) throws JSONException
{
final JSONObject jo = new JSONObject(); final JSONObject jo = new JSONObject();
if ((properties != null) && !properties.isEmpty()) { if ((properties != null) && !properties.isEmpty())
{
final Enumeration enumProperties = properties.propertyNames(); final Enumeration enumProperties = properties.propertyNames();
while (enumProperties.hasMoreElements()) { while (enumProperties.hasMoreElements())
{
final String name = (String) enumProperties.nextElement(); final String name = (String) enumProperties.nextElement();
jo.put(name, properties.getProperty(name)); jo.put(name, properties.getProperty(name));
} }
@ -61,11 +65,14 @@ public class Property {
* *
* @throws JSONException * @throws JSONException
*/ */
public static Properties toProperties(final JSONObject jo) throws JSONException { public static Properties toProperties(final JSONObject jo) throws JSONException
{
final Properties properties = new Properties(); final Properties properties = new Properties();
if (jo != null) { if (jo != null)
{
final Iterator<String> keys = jo.keys(); final Iterator<String> keys = jo.keys();
while (keys.hasNext()) { while (keys.hasNext())
{
final String name = keys.next(); final String name = keys.next();
properties.put(name, jo.getString(name)); properties.put(name, jo.getString(name));
} }

View File

@ -8,7 +8,8 @@ import java.util.Iterator;
* @author JSON.org * @author JSON.org
* @version 2014-05-03 * @version 2014-05-03
*/ */
public class XML { public class XML
{
public static final Character AMP = '&'; public static final Character AMP = '&';
public static final Character APOS = '\''; public static final Character APOS = '\'';
public static final Character BANG = '!'; public static final Character BANG = '!';
@ -19,11 +20,14 @@ public class XML {
public static final Character QUOT = '"'; public static final Character QUOT = '"';
public static final Character SLASH = '/'; public static final Character SLASH = '/';
public static String escape(final String string) { public static String escape(final String string)
{
final StringBuilder sb = new StringBuilder(string.length()); final StringBuilder sb = new StringBuilder(string.length());
for (int i = 0, length = string.length(); i < length; i++) { for (int i = 0, length = string.length(); i < length; i++)
{
final char c = string.charAt(i); final char c = string.charAt(i);
switch (c) { switch (c)
{
case '&': case '&':
sb.append("&amp;"); sb.append("&amp;");
break; break;
@ -53,16 +57,14 @@ public class XML {
* *
* @throws JSONException * @throws JSONException
*/ */
public static void noSpace(final String string) throws JSONException { public static void noSpace(final String string) throws JSONException
{
int i; int i;
final int length = string.length(); final int length = string.length();
if (length == 0) { if (length == 0) { throw new JSONException("Empty string."); }
throw new JSONException("Empty string."); for (i = 0; i < length; i += 1)
} {
for (i = 0; i < length; i += 1) { if (Character.isWhitespace(string.charAt(i))) { throw new JSONException("'" + string + "' contains a space character."); }
if (Character.isWhitespace(string.charAt(i))) {
throw new JSONException("'" + string + "' contains a space character.");
}
} }
} }
@ -77,7 +79,8 @@ public class XML {
* *
* @throws JSONException * @throws JSONException
*/ */
private static boolean parse(final XMLTokener x, final JSONObject context, final String name) throws JSONException { private static boolean parse(final XMLTokener x, final JSONObject context, final String name) throws JSONException
{
char c; char c;
int i; int i;
JSONObject jsonobject = null; JSONObject jsonobject = null;
@ -95,20 +98,28 @@ public class XML {
// << // <<
token = x.nextToken(); token = x.nextToken();
// <! // <!
if (token == BANG) { if (token == BANG)
{
c = x.next(); c = x.next();
if (c == '-') { if (c == '-')
if (x.next() == '-') { {
if (x.next() == '-')
{
x.skipPast("-->"); x.skipPast("-->");
return false; return false;
} }
x.back(); x.back();
} else if (c == '[') { }
else if (c == '[')
{
token = x.nextToken(); token = x.nextToken();
if ("CDATA".equals(token)) { if ("CDATA".equals(token))
if (x.next() == '[') { {
if (x.next() == '[')
{
string = x.nextCDATA(); string = x.nextCDATA();
if (string.length() > 0) { if (string.length() > 0)
{
context.accumulate("content", string); context.accumulate("content", string);
} }
return false; return false;
@ -117,99 +128,130 @@ public class XML {
throw x.syntaxError("Expected 'CDATA['"); throw x.syntaxError("Expected 'CDATA['");
} }
i = 1; i = 1;
do { do
{
token = x.nextMeta(); token = x.nextMeta();
if (token == null) { if (token == null)
{
throw x.syntaxError("Missing '>' after '<!'."); throw x.syntaxError("Missing '>' after '<!'.");
} else if (token == LT) { }
else if (token == LT)
{
i += 1; i += 1;
} else if (token == GT) { }
else if (token == GT)
{
i -= 1; i -= 1;
} }
} while (i > 0); }
while (i > 0);
return false; return false;
} else if (token == QUEST) { }
else if (token == QUEST)
{
// <? // <?
x.skipPast("?>"); x.skipPast("?>");
return false; return false;
} else if (token == SLASH) { }
else if (token == SLASH)
{
// Close tag </ // Close tag </
token = x.nextToken(); token = x.nextToken();
if (name == null) { if (name == null) { throw x.syntaxError("Mismatched close tag " + token); }
throw x.syntaxError("Mismatched close tag " + token); if (!token.equals(name)) { throw x.syntaxError("Mismatched " + name + " and " + token); }
} if (x.nextToken() != GT) { throw x.syntaxError("Misshaped close tag"); }
if (!token.equals(name)) {
throw x.syntaxError("Mismatched " + name + " and " + token);
}
if (x.nextToken() != GT) {
throw x.syntaxError("Misshaped close tag");
}
return true; return true;
} else if (token instanceof Character) { }
else if (token instanceof Character)
{
throw x.syntaxError("Misshaped tag"); throw x.syntaxError("Misshaped tag");
// Open tag < // Open tag <
} else { }
else
{
tagName = (String) token; tagName = (String) token;
token = null; token = null;
jsonobject = new JSONObject(); jsonobject = new JSONObject();
for (;;) { for (;;)
if (token == null) { {
if (token == null)
{
token = x.nextToken(); token = x.nextToken();
} }
// attribute = value // attribute = value
if (token instanceof String) { if (token instanceof String)
{
string = (String) token; string = (String) token;
token = x.nextToken(); token = x.nextToken();
if (token == EQ) { if (token == EQ)
{
token = x.nextToken(); token = x.nextToken();
if (!(token instanceof String)) { if (!(token instanceof String)) { throw x.syntaxError("Missing value"); }
throw x.syntaxError("Missing value");
}
jsonobject.accumulate(string, XML.stringToValue((String) token)); jsonobject.accumulate(string, XML.stringToValue((String) token));
token = null; token = null;
} else { }
else
{
jsonobject.accumulate(string, ""); jsonobject.accumulate(string, "");
} }
// Empty tag <.../> // Empty tag <.../>
} else if (token == SLASH) { }
if (x.nextToken() != GT) { else if (token == SLASH)
throw x.syntaxError("Misshaped tag"); {
} if (x.nextToken() != GT) { throw x.syntaxError("Misshaped tag"); }
if (jsonobject.length() > 0) { if (jsonobject.length() > 0)
{
context.accumulate(tagName, jsonobject); context.accumulate(tagName, jsonobject);
} else { }
else
{
context.accumulate(tagName, ""); context.accumulate(tagName, "");
} }
return false; return false;
// Content, between <...> and </...> // Content, between <...> and </...>
} else if (token == GT) { }
for (;;) { else if (token == GT)
{
for (;;)
{
token = x.nextContent(); token = x.nextContent();
if (token == null) { if (token == null)
if (tagName != null) { {
throw x.syntaxError("Unclosed tag " + tagName); if (tagName != null) { throw x.syntaxError("Unclosed tag " + tagName); }
}
return false; return false;
} else if (token instanceof String) { }
else if (token instanceof String)
{
string = (String) token; string = (String) token;
if (string.length() > 0) { if (string.length() > 0)
{
jsonobject.accumulate("content", XML.stringToValue(string)); jsonobject.accumulate("content", XML.stringToValue(string));
} }
// Nested element // Nested element
} else if (token == LT) { }
if (parse(x, jsonobject, tagName)) { else if (token == LT)
if (jsonobject.length() == 0) { {
if (parse(x, jsonobject, tagName))
{
if (jsonobject.length() == 0)
{
context.accumulate(tagName, ""); context.accumulate(tagName, "");
} else if ((jsonobject.length() == 1) && (jsonobject.opt("content") != null)) { }
else if ((jsonobject.length() == 1) && (jsonobject.opt("content") != null))
{
context.accumulate(tagName, jsonobject.opt("content")); context.accumulate(tagName, jsonobject.opt("content"));
} else { }
else
{
context.accumulate(tagName, jsonobject); context.accumulate(tagName, jsonobject);
} }
return false; return false;
} }
} }
} }
} else { }
else
{
throw x.syntaxError("Misshaped tag"); throw x.syntaxError("Misshaped tag");
} }
} }
@ -225,43 +267,42 @@ public class XML {
* *
* @return A simple JSON value. * @return A simple JSON value.
*/ */
public static Object stringToValue(final String string) { public static Object stringToValue(final String string)
if ("true".equalsIgnoreCase(string)) { {
return Boolean.TRUE; if ("true".equalsIgnoreCase(string)) { return Boolean.TRUE; }
} if ("false".equalsIgnoreCase(string)) { return Boolean.FALSE; }
if ("false".equalsIgnoreCase(string)) { if ("null".equalsIgnoreCase(string)) { return JSONObject.NULL; }
return Boolean.FALSE;
}
if ("null".equalsIgnoreCase(string)) {
return JSONObject.NULL;
}
// If it might be a number, try converting it, first as a Long, and then // If it might be a number, try converting it, first as a Long, and then
// as a // as a
// Double. If that doesn't work, return the string. // Double. If that doesn't work, return the string.
try { try
{
final char initial = string.charAt(0); final char initial = string.charAt(0);
if ((initial == '-') || ((initial >= '0') && (initial <= '9'))) { if ((initial == '-') || ((initial >= '0') && (initial <= '9')))
{
final Long value = new Long(string); final Long value = new Long(string);
if (value.toString().equals(string)) { if (value.toString().equals(string)) { return value; }
return value;
}
} }
} catch (final Exception ignore) { }
try { catch (final Exception ignore)
{
try
{
final Double value = new Double(string); final Double value = new Double(string);
if (value.toString().equals(string)) { if (value.toString().equals(string)) { return value; }
return value;
}
} catch (final Exception ignoreAlso) {
} }
catch (final Exception ignoreAlso)
{}
} }
return string; return string;
} }
public static JSONObject toJSONObject(final String string) throws JSONException { public static JSONObject toJSONObject(final String string) throws JSONException
{
final JSONObject jo = new JSONObject(); final JSONObject jo = new JSONObject();
final XMLTokener x = new XMLTokener(string); final XMLTokener x = new XMLTokener(string);
while (x.more() && x.skipPast("<")) { while (x.more() && x.skipPast("<"))
{
parse(x, jo, null); parse(x, jo, null);
} }
return jo; return jo;
@ -276,7 +317,8 @@ public class XML {
* *
* @throws JSONException * @throws JSONException
*/ */
public static String toString(final Object object) throws JSONException { public static String toString(final Object object) throws JSONException
{
return toString(object, null); return toString(object, null);
} }
@ -290,7 +332,8 @@ public class XML {
* *
* @throws JSONException * @throws JSONException
*/ */
public static String toString(Object object, final String tagName) throws JSONException { public static String toString(Object object, final String tagName) throws JSONException
{
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
int i; int i;
JSONArray ja; JSONArray ja;
@ -300,9 +343,11 @@ public class XML {
int length; int length;
String string; String string;
Object value; Object value;
if (object instanceof JSONObject) { if (object instanceof JSONObject)
{
// Emit <tagName> // Emit <tagName>
if (tagName != null) { if (tagName != null)
{
sb.append('<'); sb.append('<');
sb.append(tagName); sb.append(tagName);
sb.append('>'); sb.append('>');
@ -310,34 +355,46 @@ public class XML {
// Loop thru the keys. // Loop thru the keys.
jo = (JSONObject) object; jo = (JSONObject) object;
keys = jo.keys(); keys = jo.keys();
while (keys.hasNext()) { while (keys.hasNext())
{
key = keys.next(); key = keys.next();
value = jo.opt(key); value = jo.opt(key);
if (value == null) { if (value == null)
{
value = ""; value = "";
} }
string = value instanceof String ? (String) value : null; string = value instanceof String ? (String) value : null;
// Emit content in body // Emit content in body
if ("content".equals(key)) { if ("content".equals(key))
if (value instanceof JSONArray) { {
if (value instanceof JSONArray)
{
ja = (JSONArray) value; ja = (JSONArray) value;
length = ja.length(); length = ja.length();
for (i = 0; i < length; i += 1) { for (i = 0; i < length; i += 1)
if (i > 0) { {
if (i > 0)
{
sb.append('\n'); sb.append('\n');
} }
sb.append(escape(ja.get(i).toString())); sb.append(escape(ja.get(i).toString()));
} }
} else { }
else
{
sb.append(escape(value.toString())); sb.append(escape(value.toString()));
} }
// Emit an array of similar keys // Emit an array of similar keys
} else if (value instanceof JSONArray) { }
else if (value instanceof JSONArray)
{
ja = (JSONArray) value; ja = (JSONArray) value;
length = ja.length(); length = ja.length();
for (i = 0; i < length; i += 1) { for (i = 0; i < length; i += 1)
{
value = ja.get(i); value = ja.get(i);
if (value instanceof JSONArray) { if (value instanceof JSONArray)
{
sb.append('<'); sb.append('<');
sb.append(key); sb.append(key);
sb.append('>'); sb.append('>');
@ -345,20 +402,27 @@ public class XML {
sb.append("</"); sb.append("</");
sb.append(key); sb.append(key);
sb.append('>'); sb.append('>');
} else { }
else
{
sb.append(toString(value, key)); sb.append(toString(value, key));
} }
} }
} else if ("".equals(value)) { }
else if ("".equals(value))
{
sb.append('<'); sb.append('<');
sb.append(key); sb.append(key);
sb.append("/>"); sb.append("/>");
// Emit a new tag <k> // Emit a new tag <k>
} else { }
else
{
sb.append(toString(value, key)); sb.append(toString(value, key));
} }
} }
if (tagName != null) { if (tagName != null)
{
// Emit the </tagname> close tag // Emit the </tagname> close tag
sb.append("</"); sb.append("</");
sb.append(tagName); sb.append(tagName);
@ -368,18 +432,25 @@ public class XML {
// XML does not have good support for arrays. If an array appears in // XML does not have good support for arrays. If an array appears in
// a place // a place
// where XML is lacking, synthesize an <array> element. // where XML is lacking, synthesize an <array> element.
} else { }
if (object.getClass().isArray()) { else
{
if (object.getClass().isArray())
{
object = new JSONArray(object); object = new JSONArray(object);
} }
if (object instanceof JSONArray) { if (object instanceof JSONArray)
{
ja = (JSONArray) object; ja = (JSONArray) object;
length = ja.length(); length = ja.length();
for (i = 0; i < length; i += 1) { for (i = 0; i < length; i += 1)
{
sb.append(toString(ja.opt(i), tagName == null ? "array" : tagName)); sb.append(toString(ja.opt(i), tagName == null ? "array" : tagName));
} }
return sb.toString(); return sb.toString();
} else { }
else
{
string = (object == null) ? "null" : escape(object.toString()); string = (object == null) ? "null" : escape(object.toString());
return (tagName == null) ? "\"" + string + "\"" : (string.length() == 0) ? "<" + tagName + "/>" : "<" + tagName + ">" + string + "</" + tagName + ">"; return (tagName == null) ? "\"" + string + "\"" : (string.length() == 0) ? "<" + tagName + "/>" : "<" + tagName + ">" + string + "</" + tagName + ">";
} }

View File

@ -6,12 +6,14 @@ package com.intellectualcrafters.json;
* @author JSON.org * @author JSON.org
* @version 2014-05-03 * @version 2014-05-03
*/ */
public class XMLTokener extends JSONTokener { public class XMLTokener extends JSONTokener
{
/** /**
* The table of entity values. It initially contains Character values for amp, apos, gt, lt, quot. * The table of entity values. It initially contains Character values for amp, apos, gt, lt, quot.
*/ */
public static final java.util.HashMap<String, Character> entity; public static final java.util.HashMap<String, Character> entity;
static { static
{
entity = new java.util.HashMap<String, Character>(8); entity = new java.util.HashMap<String, Character>(8);
entity.put("amp", XML.AMP); entity.put("amp", XML.AMP);
entity.put("apos", XML.APOS); entity.put("apos", XML.APOS);
@ -25,7 +27,8 @@ public class XMLTokener extends JSONTokener {
* *
* @param s A source string. * @param s A source string.
*/ */
public XMLTokener(final String s) { public XMLTokener(final String s)
{
super(s); super(s);
} }
@ -36,18 +39,19 @@ public class XMLTokener extends JSONTokener {
* *
* @throws JSONException If the <code>]]&gt;</code> is not found. * @throws JSONException If the <code>]]&gt;</code> is not found.
*/ */
public String nextCDATA() throws JSONException { public String nextCDATA() throws JSONException
{
char c; char c;
int i; int i;
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
for (;;) { for (;;)
{
c = next(); c = next();
if (end()) { if (end()) { throw syntaxError("Unclosed CDATA"); }
throw syntaxError("Unclosed CDATA");
}
sb.append(c); sb.append(c);
i = sb.length() - 3; i = sb.length() - 3;
if ((i >= 0) && (sb.charAt(i) == ']') && (sb.charAt(i + 1) == ']') && (sb.charAt(i + 2) == '>')) { if ((i >= 0) && (sb.charAt(i) == ']') && (sb.charAt(i + 1) == ']') && (sb.charAt(i + 2) == '>'))
{
sb.setLength(i); sb.setLength(i);
return sb.toString(); return sb.toString();
} }
@ -62,27 +66,31 @@ public class XMLTokener extends JSONTokener {
* *
* @throws JSONException * @throws JSONException
*/ */
public Object nextContent() throws JSONException { public Object nextContent() throws JSONException
{
char c; char c;
StringBuilder sb; StringBuilder sb;
do { do
{
c = next(); c = next();
} while (Character.isWhitespace(c));
if (c == 0) {
return null;
}
if (c == '<') {
return XML.LT;
} }
while (Character.isWhitespace(c));
if (c == 0) { return null; }
if (c == '<') { return XML.LT; }
sb = new StringBuilder(); sb = new StringBuilder();
for (;;) { for (;;)
if ((c == '<') || (c == 0)) { {
if ((c == '<') || (c == 0))
{
back(); back();
return sb.toString().trim(); return sb.toString().trim();
} }
if (c == '&') { if (c == '&')
{
sb.append(nextEntity(c)); sb.append(nextEntity(c));
} else { }
else
{
sb.append(c); sb.append(c);
} }
c = next(); c = next();
@ -99,15 +107,22 @@ public class XMLTokener extends JSONTokener {
* *
* @throws JSONException If missing ';' in XML entity. * @throws JSONException If missing ';' in XML entity.
*/ */
public Object nextEntity(final char ampersand) throws JSONException { public Object nextEntity(final char ampersand) throws JSONException
{
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
for (;;) { for (;;)
{
final char c = next(); final char c = next();
if (Character.isLetterOrDigit(c) || (c == '#')) { if (Character.isLetterOrDigit(c) || (c == '#'))
{
sb.append(Character.toLowerCase(c)); sb.append(Character.toLowerCase(c));
} else if (c == ';') { }
else if (c == ';')
{
break; break;
} else { }
else
{
throw syntaxError("Missing ';' in XML entity: &" + sb); throw syntaxError("Missing ';' in XML entity: &" + sb);
} }
} }
@ -124,13 +139,17 @@ public class XMLTokener extends JSONTokener {
* *
* @throws JSONException If a string is not properly closed or if the XML is badly structured. * @throws JSONException If a string is not properly closed or if the XML is badly structured.
*/ */
public Object nextMeta() throws JSONException { public Object nextMeta() throws JSONException
{
char c; char c;
char q; char q;
do { do
{
c = next(); c = next();
} while (Character.isWhitespace(c)); }
switch (c) { while (Character.isWhitespace(c));
switch (c)
{
case 0: case 0:
throw syntaxError("Misshaped meta tag"); throw syntaxError("Misshaped meta tag");
case '<': case '<':
@ -148,22 +167,19 @@ public class XMLTokener extends JSONTokener {
case '"': case '"':
case '\'': case '\'':
q = c; q = c;
for (;;) { for (;;)
{
c = next(); c = next();
if (c == 0) { if (c == 0) { throw syntaxError("Unterminated string"); }
throw syntaxError("Unterminated string"); if (c == q) { return Boolean.TRUE; }
}
if (c == q) {
return Boolean.TRUE;
}
} }
default: default:
for (;;) { for (;;)
{
c = next(); c = next();
if (Character.isWhitespace(c)) { if (Character.isWhitespace(c)) { return Boolean.TRUE; }
return Boolean.TRUE; switch (c)
} {
switch (c) {
case 0: case 0:
case '<': case '<':
case '>': case '>':
@ -188,14 +204,18 @@ public class XMLTokener extends JSONTokener {
* *
* @throws JSONException If the XML is not well formed. * @throws JSONException If the XML is not well formed.
*/ */
public Object nextToken() throws JSONException { public Object nextToken() throws JSONException
{
char c; char c;
char q; char q;
StringBuilder sb; StringBuilder sb;
do { do
{
c = next(); c = next();
} while (Character.isWhitespace(c)); }
switch (c) { while (Character.isWhitespace(c));
switch (c)
{
case 0: case 0:
throw syntaxError("Misshaped element"); throw syntaxError("Misshaped element");
case '<': case '<':
@ -215,30 +235,30 @@ public class XMLTokener extends JSONTokener {
case '\'': case '\'':
q = c; q = c;
sb = new StringBuilder(); sb = new StringBuilder();
for (;;) { for (;;)
{
c = next(); c = next();
if (c == 0) { if (c == 0) { throw syntaxError("Unterminated string"); }
throw syntaxError("Unterminated string"); if (c == q) { return sb.toString(); }
} if (c == '&')
if (c == q) { {
return sb.toString();
}
if (c == '&') {
sb.append(nextEntity(c)); sb.append(nextEntity(c));
} else { }
else
{
sb.append(c); sb.append(c);
} }
} }
default: default:
// Name // Name
sb = new StringBuilder(); sb = new StringBuilder();
for (;;) { for (;;)
{
sb.append(c); sb.append(c);
c = next(); c = next();
if (Character.isWhitespace(c)) { if (Character.isWhitespace(c)) { return sb.toString(); }
return sb.toString(); switch (c)
} {
switch (c) {
case 0: case 0:
return sb.toString(); return sb.toString();
case '>': case '>':
@ -267,7 +287,8 @@ public class XMLTokener extends JSONTokener {
* *
* @throws JSONException * @throws JSONException
*/ */
public boolean skipPast(final String to) throws JSONException { public boolean skipPast(final String to) throws JSONException
{
boolean b; boolean b;
char c; char c;
int i; int i;
@ -279,44 +300,44 @@ public class XMLTokener extends JSONTokener {
* First fill the circle buffer with as many characters as are in the * First fill the circle buffer with as many characters as are in the
* to string. If we reach an early end, bail. * to string. If we reach an early end, bail.
*/ */
for (i = 0; i < length; i += 1) { for (i = 0; i < length; i += 1)
{
c = next(); c = next();
if (c == 0) { if (c == 0) { return false; }
return false;
}
circle[i] = c; circle[i] = c;
} }
/* We will loop, possibly for all of the remaining characters. */ /* We will loop, possibly for all of the remaining characters. */
for (;;) { for (;;)
{
j = offset; j = offset;
b = true; b = true;
/* Compare the circle buffer with the to string. */ /* Compare the circle buffer with the to string. */
for (i = 0; i < length; i += 1) { for (i = 0; i < length; i += 1)
if (circle[j] != to.charAt(i)) { {
if (circle[j] != to.charAt(i))
{
b = false; b = false;
break; break;
} }
j += 1; j += 1;
if (j >= length) { if (j >= length)
{
j -= length; j -= length;
} }
} }
/* If we exit the loop with b intact, then victory is ours. */ /* If we exit the loop with b intact, then victory is ours. */
if (b) { if (b) { return true; }
return true;
}
/* Get the next character. If there isn't one, then defeat is ours. */ /* Get the next character. If there isn't one, then defeat is ours. */
c = next(); c = next();
if (c == 0) { if (c == 0) { return false; }
return false;
}
/* /*
* Shove the character in the circle buffer and advance the * Shove the character in the circle buffer and advance the
* circle offset. The offset is mod n. * circle offset. The offset is mod n.
*/ */
circle[offset] = c; circle[offset] = c;
offset += 1; offset += 1;
if (offset >= length) { if (offset >= length)
{
offset -= length; offset -= length;
} }
} }

View File

@ -16,29 +16,29 @@ import com.intellectualcrafters.plot.util.SchematicHandler;
import com.intellectualcrafters.plot.util.SetupUtils; import com.intellectualcrafters.plot.util.SetupUtils;
import com.intellectualcrafters.plot.util.TaskManager; import com.intellectualcrafters.plot.util.TaskManager;
import com.intellectualcrafters.plot.util.UUIDHandlerImplementation; import com.intellectualcrafters.plot.util.UUIDHandlerImplementation;
import com.sk89q.worldedit.WorldEdit;
public interface IPlotMain { public interface IPlotMain
{
/** /**
* Log a message to console * Log a message to console
* @param message * @param message
*/ */
void log(String message); void log(final String message);
/** /**
* Get the `PlotSquared` directory (e.g. /plugins/PlotSquared or /mods/PlotSquared) * Get the `PlotSquared` directory (e.g. /plugins/PlotSquared or /mods/PlotSquared)
* @return * @return
*/ */
File getDirectory(); File getDirectory();
/** /**
* Wrap a player into a PlotPlayer object * Wrap a player into a PlotPlayer object
* @param obj * @param obj
* @return * @return
*/ */
PlotPlayer wrapPlayer(Object obj); PlotPlayer wrapPlayer(final Object obj);
/** /**
* Disable the implementation * Disable the implementation
* - If a full disable isn't feasibly, just disable what it can * - If a full disable isn't feasibly, just disable what it can
@ -50,32 +50,32 @@ public interface IPlotMain {
* @return * @return
*/ */
int[] getPluginVersion(); int[] getPluginVersion();
/** /**
* Get the version of Minecraft that is running * Get the version of Minecraft that is running
* (used to check what protocols and such are supported) * (used to check what protocols and such are supported)
* @return * @return
*/ */
int[] getServerVersion(); int[] getServerVersion();
/** /**
* Get the nms package prefix * Get the nms package prefix
* @return * @return
*/ */
String getNMSPackage(); String getNMSPackage();
/** /**
* Get the schematic handler * Get the schematic handler
* @return * @return
*/ */
SchematicHandler initSchematicHandler(); SchematicHandler initSchematicHandler();
/** /**
* Get the schematic handler * Get the schematic handler
* @return * @return
*/ */
ChatManager initChatManager(); ChatManager initChatManager();
/** /**
* The task manager will run and manage minecraft tasks * The task manager will run and manage minecraft tasks
* @return * @return
@ -116,7 +116,7 @@ public interface IPlotMain {
* Register the WorldEdit hook * Register the WorldEdit hook
*/ */
boolean initWorldEdit(); boolean initWorldEdit();
/** /**
* Register TNT related events (if TNT protection is enabled) * Register TNT related events (if TNT protection is enabled)
*/ */
@ -133,7 +133,7 @@ public interface IPlotMain {
* @return * @return
*/ */
BlockManager initBlockManager(); BlockManager initBlockManager();
/** /**
* Get the EventUtil class * Get the EventUtil class
* @return * @return
@ -157,24 +157,24 @@ public interface IPlotMain {
* @return * @return
*/ */
HybridUtils initHybridUtils(); HybridUtils initHybridUtils();
/** /**
* Start the metrics task * Start the metrics task
*/ */
void startMetrics(); void startMetrics();
/** /**
* If a world is already loaded, set the generator (use NMS if required) * If a world is already loaded, set the generator (use NMS if required)
* @param world * @param world
*/ */
void setGenerator(String world); void setGenerator(final String world);
/** /**
* Get the UUIDHandlerImplementation which will cache and provide UUIDs * Get the UUIDHandlerImplementation which will cache and provide UUIDs
* @return * @return
*/ */
UUIDHandlerImplementation initUUIDHandler(); UUIDHandlerImplementation initUUIDHandler();
/** /**
* Get the InventoryUtil class (used for implementation specific inventory guis) * Get the InventoryUtil class (used for implementation specific inventory guis)
* @return * @return
@ -186,12 +186,12 @@ public interface IPlotMain {
* @return * @return
*/ */
boolean initPlotMeConverter(); boolean initPlotMeConverter();
/** /**
* Unregister a PlotPlayer from cache e.g. if they have logged off * Unregister a PlotPlayer from cache e.g. if they have logged off
* @param player * @param player
*/ */
void unregister(PlotPlayer player); void unregister(final PlotPlayer player);
/** /**
* Get the generator wrapper for a world (world) and generator (name) * Get the generator wrapper for a world (world) and generator (name)
@ -199,7 +199,7 @@ public interface IPlotMain {
* @param name * @param name
* @return * @return
*/ */
PlotGenerator<?> getGenerator(String world, String name); PlotGenerator<?> getGenerator(final String world, final String name);
/** /**
* Register the chunk processor which will clean out chunks that have too many blockstates or entities * Register the chunk processor which will clean out chunks that have too many blockstates or entities
@ -216,7 +216,7 @@ public interface IPlotMain {
* @return * @return
*/ */
String getServerName(); String getServerName();
/** /**
* Get the class that will manage player titles * Get the class that will manage player titles
* @return * @return

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -32,71 +32,82 @@ import com.intellectualcrafters.plot.util.EventUtil;
import com.intellectualcrafters.plot.util.MainUtil; import com.intellectualcrafters.plot.util.MainUtil;
import com.intellectualcrafters.plot.util.Permissions; import com.intellectualcrafters.plot.util.Permissions;
import com.intellectualcrafters.plot.util.UUIDHandler; import com.intellectualcrafters.plot.util.UUIDHandler;
import com.plotsquared.bukkit.uuid.SQLUUIDHandler;
import com.plotsquared.general.commands.Argument; import com.plotsquared.general.commands.Argument;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "add", command = "add",
aliases = {"a"}, aliases = { "a" },
description = "Allow a user to build while you are online", description = "Allow a user to build while you are online",
usage = "/plot add <player>", usage = "/plot add <player>",
category = CommandCategory.ACTIONS, category = CommandCategory.ACTIONS,
permission = "plots.add", permission = "plots.add",
requiredType = RequiredType.NONE requiredType = RequiredType.NONE)
) public class Add extends SubCommand
public class Add extends SubCommand { {
public Add() { public Add()
{
requiredArguments = new Argument[] { requiredArguments = new Argument[] {
Argument.PlayerName Argument.PlayerName
}; };
} }
@Override @Override
public boolean onCommand(PlotPlayer plr, String[] args) { public boolean onCommand(final PlotPlayer plr, final String[] args)
{
final Location loc = plr.getLocation(); final Location loc = plr.getLocation();
final Plot plot = MainUtil.getPlot(loc); final Plot plot = MainUtil.getPlot(loc);
if (plot == null) { if (plot == null) { return !sendMessage(plr, C.NOT_IN_PLOT); }
return !sendMessage(plr, C.NOT_IN_PLOT); if (!plot.hasOwner())
} {
if (!plot.hasOwner()) {
MainUtil.sendMessage(plr, C.PLOT_UNOWNED); MainUtil.sendMessage(plr, C.PLOT_UNOWNED);
return false; return false;
} }
if (!plot.isOwner(plr.getUUID()) && !Permissions.hasPermission(plr, "plots.admin.command.add")) { if (!plot.isOwner(plr.getUUID()) && !Permissions.hasPermission(plr, "plots.admin.command.add"))
{
MainUtil.sendMessage(plr, C.NO_PLOT_PERMS); MainUtil.sendMessage(plr, C.NO_PLOT_PERMS);
return true; return true;
} }
UUID uuid; UUID uuid;
if (args[0].equalsIgnoreCase("*")) { if (args[0].equalsIgnoreCase("*"))
{
uuid = DBFunc.everyone; uuid = DBFunc.everyone;
} else { }
else
{
// TODO have a runnable for fetch // TODO have a runnable for fetch
uuid = UUIDHandler.getUUID(args[0], null); uuid = UUIDHandler.getUUID(args[0], null);
} }
if (uuid == null) { if (uuid == null)
{
MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[0]); MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[0]);
return false; return false;
} }
if (plot.isOwner(uuid)) { if (plot.isOwner(uuid))
{
MainUtil.sendMessage(plr, C.ALREADY_OWNER); MainUtil.sendMessage(plr, C.ALREADY_OWNER);
return false; return false;
} }
if (plot.getMembers().contains(uuid)) { if (plot.getMembers().contains(uuid))
{
MainUtil.sendMessage(plr, C.ALREADY_ADDED); MainUtil.sendMessage(plr, C.ALREADY_ADDED);
return false; return false;
} }
if (plot.removeTrusted(uuid)) { if (plot.removeTrusted(uuid))
{
plot.addMember(uuid); plot.addMember(uuid);
} }
else { else
if (plot.getMembers().size() + plot.getTrusted().size() >= PS.get().getPlotWorld(plot.world).MAX_PLOT_MEMBERS) { {
if ((plot.getMembers().size() + plot.getTrusted().size()) >= PS.get().getPlotWorld(plot.world).MAX_PLOT_MEMBERS)
{
MainUtil.sendMessage(plr, C.PLOT_MAX_MEMBERS); MainUtil.sendMessage(plr, C.PLOT_MAX_MEMBERS);
return false; return false;
} }
if (plot.getDenied().contains(uuid)) { if (plot.getDenied().contains(uuid))
{
plot.removeDenied(uuid); plot.removeDenied(uuid);
} }
plot.addMember(uuid); plot.addMember(uuid);

View File

@ -29,84 +29,102 @@ import com.intellectualcrafters.plot.object.PlotCluster;
import com.intellectualcrafters.plot.object.PlotId; import com.intellectualcrafters.plot.object.PlotId;
import com.intellectualcrafters.plot.object.PlotPlayer; import com.intellectualcrafters.plot.object.PlotPlayer;
import com.intellectualcrafters.plot.object.PlotWorld; import com.intellectualcrafters.plot.object.PlotWorld;
import com.intellectualcrafters.plot.util.ClusterManager;
import com.intellectualcrafters.plot.util.EconHandler; import com.intellectualcrafters.plot.util.EconHandler;
import com.intellectualcrafters.plot.util.MainUtil; import com.intellectualcrafters.plot.util.MainUtil;
import com.intellectualcrafters.plot.util.Permissions; import com.intellectualcrafters.plot.util.Permissions;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "auto", command = "auto",
permission = "plots.auto", permission = "plots.auto",
category = CommandCategory.CLAIMING, category = CommandCategory.CLAIMING,
requiredType = RequiredType.NONE, requiredType = RequiredType.NONE,
description = "Claim the nearest plot", description = "Claim the nearest plot",
aliases = {"a"}, aliases = { "a" },
usage = "/plot auto" usage = "/plot auto")
) public class Auto extends SubCommand
public class Auto extends SubCommand { {
public static PlotId getNextPlot(final PlotId id, final int step) { public static PlotId getNextPlot(final PlotId id, final int step)
{
final int absX = Math.abs(id.x); final int absX = Math.abs(id.x);
final int absY = Math.abs(id.y); final int absY = Math.abs(id.y);
if (absX > absY) { if (absX > absY)
if (id.x > 0) { {
if (id.x > 0)
{
return new PlotId(id.x, id.y + 1); return new PlotId(id.x, id.y + 1);
} else { }
else
{
return new PlotId(id.x, id.y - 1); return new PlotId(id.x, id.y - 1);
} }
} else if (absY > absX) { }
if (id.y > 0) { else if (absY > absX)
{
if (id.y > 0)
{
return new PlotId(id.x - 1, id.y); return new PlotId(id.x - 1, id.y);
} else { }
else
{
return new PlotId(id.x + 1, id.y); return new PlotId(id.x + 1, id.y);
} }
} else { }
if (id.x.equals(id.y) && (id.x > 0)) { else
return new PlotId(id.x, id.y + step); {
} if (id.x.equals(id.y) && (id.x > 0)) { return new PlotId(id.x, id.y + step); }
if (id.x == absX) { if (id.x == absX) { return new PlotId(id.x, id.y + 1); }
return new PlotId(id.x, id.y + 1); if (id.y == absY) { return new PlotId(id.x, id.y - 1); }
}
if (id.y == absY) {
return new PlotId(id.x, id.y - 1);
}
return new PlotId(id.x + 1, id.y); return new PlotId(id.x + 1, id.y);
} }
} }
@Override @Override
public boolean onCommand(PlotPlayer plr, String[] args) { public boolean onCommand(final PlotPlayer plr, final String[] args)
{
String world; String world;
int size_x = 1; int size_x = 1;
int size_z = 1; int size_z = 1;
String schematic = ""; String schematic = "";
if (PS.get().getPlotWorlds().size() == 1) { if (PS.get().getPlotWorlds().size() == 1)
{
world = PS.get().getPlotWorlds().iterator().next(); world = PS.get().getPlotWorlds().iterator().next();
} else { }
else
{
world = plr.getLocation().getWorld(); world = plr.getLocation().getWorld();
if (!PS.get().isPlotWorld(world)) { if (!PS.get().isPlotWorld(world))
{
MainUtil.sendMessage(plr, C.NOT_IN_PLOT_WORLD); MainUtil.sendMessage(plr, C.NOT_IN_PLOT_WORLD);
return false; return false;
} }
} }
if (args.length > 0) { if (args.length > 0)
if (Permissions.hasPermission(plr, "plots.auto.mega")) { {
try { if (Permissions.hasPermission(plr, "plots.auto.mega"))
{
try
{
final String[] split = args[0].split(","); final String[] split = args[0].split(",");
size_x = Integer.parseInt(split[0]); size_x = Integer.parseInt(split[0]);
size_z = Integer.parseInt(split[1]); size_z = Integer.parseInt(split[1]);
if ((size_x < 1) || (size_z < 1)) { if ((size_x < 1) || (size_z < 1))
{
MainUtil.sendMessage(plr, "&cError: size<=0"); MainUtil.sendMessage(plr, "&cError: size<=0");
} }
if ((size_x > 4) || (size_z > 4)) { if ((size_x > 4) || (size_z > 4))
{
MainUtil.sendMessage(plr, "&cError: size>4"); MainUtil.sendMessage(plr, "&cError: size>4");
} }
if (args.length > 1) { if (args.length > 1)
{
schematic = args[1]; schematic = args[1];
} }
} catch (final Exception e) { }
catch (final Exception e)
{
size_x = 1; size_x = 1;
size_z = 1; size_z = 1;
schematic = args[0]; schematic = args[0];
@ -114,32 +132,42 @@ public class Auto extends SubCommand {
// "&cError: Invalid size (X,Y)"); // "&cError: Invalid size (X,Y)");
// return false; // return false;
} }
} else { }
else
{
schematic = args[0]; schematic = args[0];
// PlayerFunctions.sendMessage(plr, C.NO_PERMISSION); // PlayerFunctions.sendMessage(plr, C.NO_PERMISSION);
// return false; // return false;
} }
} }
if ((size_x * size_z) > Settings.MAX_AUTO_SIZE) { if ((size_x * size_z) > Settings.MAX_AUTO_SIZE)
{
MainUtil.sendMessage(plr, C.CANT_CLAIM_MORE_PLOTS_NUM, Settings.MAX_AUTO_SIZE + ""); MainUtil.sendMessage(plr, C.CANT_CLAIM_MORE_PLOTS_NUM, Settings.MAX_AUTO_SIZE + "");
return false; return false;
} }
final int currentPlots = Settings.GLOBAL_LIMIT ? MainUtil.getPlayerPlotCount(plr) : MainUtil.getPlayerPlotCount(world, plr); final int currentPlots = Settings.GLOBAL_LIMIT ? MainUtil.getPlayerPlotCount(plr) : MainUtil.getPlayerPlotCount(world, plr);
final int diff = currentPlots - MainUtil.getAllowedPlots(plr); final int diff = currentPlots - MainUtil.getAllowedPlots(plr);
if ((diff + (size_x * size_z)) > 0) { if ((diff + (size_x * size_z)) > 0)
if (diff < 0) { {
if (diff < 0)
{
MainUtil.sendMessage(plr, C.CANT_CLAIM_MORE_PLOTS_NUM, (-diff) + ""); MainUtil.sendMessage(plr, C.CANT_CLAIM_MORE_PLOTS_NUM, (-diff) + "");
} else { }
else
{
MainUtil.sendMessage(plr, C.CANT_CLAIM_MORE_PLOTS); MainUtil.sendMessage(plr, C.CANT_CLAIM_MORE_PLOTS);
} }
return false; return false;
} }
final PlotWorld pWorld = PS.get().getPlotWorld(world); final PlotWorld pWorld = PS.get().getPlotWorld(world);
if ((EconHandler.manager != null) && pWorld.USE_ECONOMY) { if ((EconHandler.manager != null) && pWorld.USE_ECONOMY)
{
double cost = pWorld.PLOT_PRICE; double cost = pWorld.PLOT_PRICE;
cost = (size_x * size_z) * cost; cost = (size_x * size_z) * cost;
if (cost > 0d) { if (cost > 0d)
if (EconHandler.manager.getMoney(plr) < cost) { {
if (EconHandler.manager.getMoney(plr) < cost)
{
sendMessage(plr, C.CANNOT_AFFORD_PLOT, "" + cost); sendMessage(plr, C.CANNOT_AFFORD_PLOT, "" + cost);
return true; return true;
} }
@ -147,13 +175,16 @@ public class Auto extends SubCommand {
sendMessage(plr, C.REMOVED_BALANCE, cost + ""); sendMessage(plr, C.REMOVED_BALANCE, cost + "");
} }
} }
if (!schematic.equals("")) { if (!schematic.equals(""))
{
// if (pWorld.SCHEMATIC_CLAIM_SPECIFY) { // if (pWorld.SCHEMATIC_CLAIM_SPECIFY) {
if (!pWorld.SCHEMATICS.contains(schematic.toLowerCase())) { if (!pWorld.SCHEMATICS.contains(schematic.toLowerCase()))
{
sendMessage(plr, C.SCHEMATIC_INVALID, "non-existent: " + schematic); sendMessage(plr, C.SCHEMATIC_INVALID, "non-existent: " + schematic);
return true; return true;
} }
if (!Permissions.hasPermission(plr, "plots.claim." + schematic) && !Permissions.hasPermission(plr, "plots.admin.command.schematic")) { if (!Permissions.hasPermission(plr, "plots.claim." + schematic) && !Permissions.hasPermission(plr, "plots.admin.command.schematic"))
{
MainUtil.sendMessage(plr, C.NO_SCHEMATIC_PERMISSION, schematic); MainUtil.sendMessage(plr, C.NO_SCHEMATIC_PERMISSION, schematic);
return true; return true;
} }
@ -161,15 +192,15 @@ public class Auto extends SubCommand {
} }
final String worldname = world; final String worldname = world;
final PlotWorld plotworld = PS.get().getPlotWorld(worldname); final PlotWorld plotworld = PS.get().getPlotWorld(worldname);
if (plotworld.TYPE == 2) { if (plotworld.TYPE == 2)
{
final Location loc = plr.getLocation(); final Location loc = plr.getLocation();
final Plot plot = MainUtil.getPlot(new Location(worldname, loc.getX(), loc.getY(), loc.getZ())); final Plot plot = MainUtil.getPlot(new Location(worldname, loc.getX(), loc.getY(), loc.getZ()));
if (plot == null) { if (plot == null) { return sendMessage(plr, C.NOT_IN_PLOT); }
return sendMessage(plr, C.NOT_IN_PLOT);
}
final PlotCluster cluster = plot.getCluster(); final PlotCluster cluster = plot.getCluster();
// Must be standing in a cluster // Must be standing in a cluster
if (cluster == null) { if (cluster == null)
{
MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER); MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER);
return false; return false;
} }
@ -180,10 +211,12 @@ public class Auto extends SubCommand {
final int width = Math.max((top.x - bot.x) + 1, (top.y - bot.y) + 1); final int width = Math.max((top.x - bot.x) + 1, (top.y - bot.y) + 1);
final int max = width * width; final int max = width * width;
// //
for (int i = 0; i <= max; i++) { for (int i = 0; i <= max; i++)
{
final PlotId currentId = new PlotId(origin.x + id.x, origin.y + id.y); final PlotId currentId = new PlotId(origin.x + id.x, origin.y + id.y);
final Plot current = MainUtil.getPlot(worldname, currentId); final Plot current = MainUtil.getPlot(worldname, currentId);
if (MainUtil.canClaim(plr, current) && (current.getSettings().isMerged() == false) && cluster.equals(current.getCluster())) { if (MainUtil.canClaim(plr, current) && (current.getSettings().isMerged() == false) && cluster.equals(current.getCluster()))
{
Claim.claimPlot(plr, current, true, true); Claim.claimPlot(plr, current, true, true);
return true; return true;
} }
@ -194,40 +227,50 @@ public class Auto extends SubCommand {
return false; return false;
} }
boolean br = false; boolean br = false;
if ((size_x == 1) && (size_z == 1)) { if ((size_x == 1) && (size_z == 1))
while (!br) { {
while (!br)
{
final Plot plot = MainUtil.getPlot(worldname, getLastPlot(worldname)); final Plot plot = MainUtil.getPlot(worldname, getLastPlot(worldname));
if (MainUtil.canClaim(plr, plot)) { if (MainUtil.canClaim(plr, plot))
{
Claim.claimPlot(plr, plot, true, true); Claim.claimPlot(plr, plot, true, true);
br = true; br = true;
} }
MainUtil.lastPlot.put(worldname, getNextPlot(getLastPlot(worldname), 1)); MainUtil.lastPlot.put(worldname, getNextPlot(getLastPlot(worldname), 1));
} }
} else { }
else
{
boolean lastPlot = true; boolean lastPlot = true;
while (!br) { while (!br)
{
final PlotId start = getNextPlot(getLastPlot(worldname), 1); final PlotId start = getNextPlot(getLastPlot(worldname), 1);
// Checking if the current set of plots is a viable option. // Checking if the current set of plots is a viable option.
MainUtil.lastPlot.put(worldname, start); MainUtil.lastPlot.put(worldname, start);
if (lastPlot) { if (lastPlot)
} {}
if ((PS.get().getPlot(worldname, start) != null) && (PS.get().getPlot(worldname, start).owner != null)) { if ((PS.get().getPlot(worldname, start) != null) && (PS.get().getPlot(worldname, start).owner != null))
{
continue; continue;
} else { }
else
{
lastPlot = false; lastPlot = false;
} }
final PlotId end = new PlotId((start.x + size_x) - 1, (start.y + size_z) - 1); final PlotId end = new PlotId((start.x + size_x) - 1, (start.y + size_z) - 1);
if (MainUtil.canClaim(plr, worldname, start, end)) { if (MainUtil.canClaim(plr, worldname, start, end))
for (int i = start.x; i <= end.x; i++) { {
for (int j = start.y; j <= end.y; j++) { for (int i = start.x; i <= end.x; i++)
{
for (int j = start.y; j <= end.y; j++)
{
final Plot plot = MainUtil.getPlot(worldname, new PlotId(i, j)); final Plot plot = MainUtil.getPlot(worldname, new PlotId(i, j));
final boolean teleport = ((i == end.x) && (j == end.y)); final boolean teleport = ((i == end.x) && (j == end.y));
Claim.claimPlot(plr, plot, teleport, true); Claim.claimPlot(plr, plot, teleport, true);
} }
} }
if (!MainUtil.mergePlots(worldname, MainUtil.getPlotSelectionIds(start, end), true, true)) { if (!MainUtil.mergePlots(worldname, MainUtil.getPlotSelectionIds(start, end), true, true)) { return false; }
return false;
}
br = true; br = true;
} }
} }
@ -236,8 +279,10 @@ public class Auto extends SubCommand {
return true; return true;
} }
public PlotId getLastPlot(final String world) { public PlotId getLastPlot(final String world)
if ((MainUtil.lastPlot == null) || !MainUtil.lastPlot.containsKey(world)) { {
if ((MainUtil.lastPlot == null) || !MainUtil.lastPlot.containsKey(world))
{
MainUtil.lastPlot.put(world, new PlotId(0, 0)); MainUtil.lastPlot.put(world, new PlotId(0, 0));
} }
return MainUtil.lastPlot.get(world); return MainUtil.lastPlot.get(world);

View File

@ -21,67 +21,65 @@
package com.intellectualcrafters.plot.commands; package com.intellectualcrafters.plot.commands;
import com.intellectualcrafters.plot.config.C; import com.intellectualcrafters.plot.config.C;
import com.intellectualcrafters.plot.config.Settings;
import com.intellectualcrafters.plot.flag.Flag;
import com.intellectualcrafters.plot.flag.FlagManager;
import com.intellectualcrafters.plot.generator.HybridUtils;
import com.intellectualcrafters.plot.object.Location; import com.intellectualcrafters.plot.object.Location;
import com.intellectualcrafters.plot.object.Plot; import com.intellectualcrafters.plot.object.Plot;
import com.intellectualcrafters.plot.object.PlotAnalysis;
import com.intellectualcrafters.plot.object.PlotPlayer; import com.intellectualcrafters.plot.object.PlotPlayer;
import com.intellectualcrafters.plot.object.RunnableVal;
import com.intellectualcrafters.plot.util.BO3Handler; import com.intellectualcrafters.plot.util.BO3Handler;
import com.intellectualcrafters.plot.util.BlockManager;
import com.intellectualcrafters.plot.util.MainUtil; import com.intellectualcrafters.plot.util.MainUtil;
import com.intellectualcrafters.plot.util.Permissions; import com.intellectualcrafters.plot.util.Permissions;
import com.intellectualcrafters.plot.util.UUIDHandler;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "bo3", command = "bo3",
aliases = {"bo2"}, aliases = { "bo2" },
description = "Mark a plot as done", description = "Mark a plot as done",
permission = "plots.bo3", permission = "plots.bo3",
category = CommandCategory.ACTIONS, category = CommandCategory.ACTIONS,
requiredType = RequiredType.NONE requiredType = RequiredType.NONE)
) public class BO3 extends SubCommand
public class BO3 extends SubCommand { {
public void noArgs(PlotPlayer plr) { public void noArgs(final PlotPlayer plr)
{
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot bo3 export [category] [alias] [-r]"); MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot bo3 export [category] [alias] [-r]");
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot bo3 import <file>"); MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot bo3 import <file>");
} }
@Override @Override
public boolean onCommand(final PlotPlayer plr, final String[] args) { public boolean onCommand(final PlotPlayer plr, final String[] args)
{
final Location loc = plr.getLocation(); final Location loc = plr.getLocation();
final Plot plot = MainUtil.getPlot(loc); final Plot plot = MainUtil.getPlot(loc);
if (plot == null || !plot.hasOwner()) { if ((plot == null) || !plot.hasOwner()) { return !sendMessage(plr, C.NOT_IN_PLOT); }
return !sendMessage(plr, C.NOT_IN_PLOT); if ((!plot.isOwner(plr.getUUID())) && !Permissions.hasPermission(plr, "plots.admin.command.bo3"))
} {
if ((!plot.isOwner(plr.getUUID())) && !Permissions.hasPermission(plr, "plots.admin.command.bo3")) {
MainUtil.sendMessage(plr, C.NO_PLOT_PERMS); MainUtil.sendMessage(plr, C.NO_PLOT_PERMS);
return false; return false;
} }
if (args.length == 0) { if (args.length == 0)
{
noArgs(plr); noArgs(plr);
return false; return false;
} }
switch (args[0].toLowerCase()) { switch (args[0].toLowerCase())
{
case "output": case "output":
case "save": case "save":
case "export": { case "export":
{
return BO3Handler.saveBO3(plr, plot); return BO3Handler.saveBO3(plr, plot);
} }
case "paste": case "paste":
case "load": case "load":
case "import": case "import":
case "input": { case "input":
{
// TODO NOT IMPLEMENTED YET // TODO NOT IMPLEMENTED YET
MainUtil.sendMessage(plr, "NOT IMPLEMENTED YET!!!"); MainUtil.sendMessage(plr, "NOT IMPLEMENTED YET!!!");
return false; return false;
} }
default: { default:
{
noArgs(plr); noArgs(plr);
return false; return false;
} }

View File

@ -38,83 +38,78 @@ import com.intellectualcrafters.plot.util.UUIDHandler;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "buy", command = "buy",
aliases = {"b"}, aliases = { "b" },
description = "Buy the plot you are standing on", description = "Buy the plot you are standing on",
usage = "/plot buy", usage = "/plot buy",
permission = "plots.buy", permission = "plots.buy",
category = CommandCategory.CLAIMING, category = CommandCategory.CLAIMING,
requiredType = RequiredType.NONE requiredType = RequiredType.NONE)
) public class Buy extends SubCommand
public class Buy extends SubCommand { {
@Override @Override
public boolean onCommand(final PlotPlayer plr, final String ... args) { public boolean onCommand(final PlotPlayer plr, final String... args)
{
if (EconHandler.manager == null) {
return sendMessage(plr, C.ECON_DISABLED); if (EconHandler.manager == null) { return sendMessage(plr, C.ECON_DISABLED); }
}
final Location loc = plr.getLocation(); final Location loc = plr.getLocation();
final String world = loc.getWorld(); final String world = loc.getWorld();
if (!PS.get().isPlotWorld(world)) { if (!PS.get().isPlotWorld(world)) { return sendMessage(plr, C.NOT_IN_PLOT_WORLD); }
return sendMessage(plr, C.NOT_IN_PLOT_WORLD);
}
Plot plot; Plot plot;
if (args.length > 0) { if (args.length > 0)
try { {
try
{
final String[] split = args[0].split(";"); final String[] split = args[0].split(";");
final PlotId id = new PlotId(Integer.parseInt(split[0]), Integer.parseInt(split[1])); final PlotId id = new PlotId(Integer.parseInt(split[0]), Integer.parseInt(split[1]));
plot = MainUtil.getPlot(world, id); plot = MainUtil.getPlot(world, id);
} catch (final Exception e) { }
catch (final Exception e)
{
return sendMessage(plr, C.NOT_VALID_PLOT_ID); return sendMessage(plr, C.NOT_VALID_PLOT_ID);
} }
} else { }
else
{
plot = MainUtil.getPlot(loc); plot = MainUtil.getPlot(loc);
} }
if (plot == null) { if (plot == null) { return sendMessage(plr, C.NOT_IN_PLOT); }
return sendMessage(plr, C.NOT_IN_PLOT);
}
final int currentPlots = Settings.GLOBAL_LIMIT ? MainUtil.getPlayerPlotCount(plr) : MainUtil.getPlayerPlotCount(world, plr); final int currentPlots = Settings.GLOBAL_LIMIT ? MainUtil.getPlayerPlotCount(plr) : MainUtil.getPlayerPlotCount(world, plr);
if (currentPlots >= MainUtil.getAllowedPlots(plr)) { if (currentPlots >= MainUtil.getAllowedPlots(plr)) { return sendMessage(plr, C.CANT_CLAIM_MORE_PLOTS); }
return sendMessage(plr, C.CANT_CLAIM_MORE_PLOTS); if (!plot.hasOwner()) { return sendMessage(plr, C.PLOT_UNOWNED); }
} if (PlotHandler.isOwner(plot, plr.getUUID())) { return sendMessage(plr, C.CANNOT_BUY_OWN); }
if (!plot.hasOwner()) {
return sendMessage(plr, C.PLOT_UNOWNED);
}
if (PlotHandler.isOwner(plot, plr.getUUID())) {
return sendMessage(plr, C.CANNOT_BUY_OWN);
}
final Flag flag = FlagManager.getPlotFlag(plot, "price"); final Flag flag = FlagManager.getPlotFlag(plot, "price");
if (flag == null) { if (flag == null) { return sendMessage(plr, C.NOT_FOR_SALE); }
return sendMessage(plr, C.NOT_FOR_SALE);
}
double initPrice = (double) flag.getValue(); double initPrice = (double) flag.getValue();
double price = initPrice; double price = initPrice;
final PlotId id = plot.id; final PlotId id = plot.id;
final PlotId id2 = MainUtil.getTopPlot(plot).id; final PlotId id2 = MainUtil.getTopPlot(plot).id;
final int size = MainUtil.getPlotSelectionIds(id, id2).size(); final int size = MainUtil.getPlotSelectionIds(id, id2).size();
final PlotWorld plotworld = PS.get().getPlotWorld(world); final PlotWorld plotworld = PS.get().getPlotWorld(world);
if (plotworld.USE_ECONOMY) { if (plotworld.USE_ECONOMY)
{
price += plotworld.PLOT_PRICE * size; price += plotworld.PLOT_PRICE * size;
initPrice += plotworld.SELL_PRICE * size; initPrice += plotworld.SELL_PRICE * size;
} }
if ((EconHandler.manager != null) && (price > 0d)) { if ((EconHandler.manager != null) && (price > 0d))
if (EconHandler.manager.getMoney(plr) < price) { {
return sendMessage(plr, C.CANNOT_AFFORD_PLOT, "" + price); if (EconHandler.manager.getMoney(plr) < price) { return sendMessage(plr, C.CANNOT_AFFORD_PLOT, "" + price); }
}
EconHandler.manager.withdrawMoney(plr, price); EconHandler.manager.withdrawMoney(plr, price);
sendMessage(plr, C.REMOVED_BALANCE, price + ""); sendMessage(plr, C.REMOVED_BALANCE, price + "");
EconHandler.manager.depositMoney(UUIDHandler.getUUIDWrapper().getOfflinePlayer(plot.owner), initPrice); EconHandler.manager.depositMoney(UUIDHandler.getUUIDWrapper().getOfflinePlayer(plot.owner), initPrice);
final PlotPlayer owner = UUIDHandler.getPlayer(plot.owner); final PlotPlayer owner = UUIDHandler.getPlayer(plot.owner);
if (owner != null) { if (owner != null)
{
sendMessage(plr, C.PLOT_SOLD, plot.id + "", plr.getName(), initPrice + ""); sendMessage(plr, C.PLOT_SOLD, plot.id + "", plr.getName(), initPrice + "");
} }
FlagManager.removePlotFlag(plot, "price"); FlagManager.removePlotFlag(plot, "price");
} }
Plot top = MainUtil.getTopPlot(plot); final Plot top = MainUtil.getTopPlot(plot);
for (PlotId myId : MainUtil.getPlotSelectionIds(plot.id, top.id)) { for (final PlotId myId : MainUtil.getPlotSelectionIds(plot.id, top.id))
Plot myPlot = MainUtil.getPlot(plot.world, myId); {
final Plot myPlot = MainUtil.getPlot(plot.world, myId);
myPlot.owner = plr.getUUID(); myPlot.owner = plr.getUUID();
DBFunc.setOwner(plot, myPlot.owner); DBFunc.setOwner(plot, myPlot.owner);
} }

View File

@ -1,23 +1,21 @@
package com.intellectualcrafters.plot.commands; package com.intellectualcrafters.plot.commands;
import com.intellectualcrafters.plot.PS;
import com.intellectualcrafters.plot.config.C;
import com.intellectualcrafters.plot.object.PlotPlayer; import com.intellectualcrafters.plot.object.PlotPlayer;
import com.intellectualcrafters.plot.object.PlotWorld;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "chat", command = "chat",
description = "Toggle plot chat on or off", description = "Toggle plot chat on or off",
usage = "/plot chat [on|off]", usage = "/plot chat [on|off]",
permission = "plots.chat", permission = "plots.chat",
category = CommandCategory.ACTIONS, category = CommandCategory.ACTIONS,
requiredType = RequiredType.NONE requiredType = RequiredType.NONE)
) public class Chat extends SubCommand
public class Chat extends SubCommand { {
@Override @Override
public boolean onCommand(final PlotPlayer player, final String ... args) { public boolean onCommand(final PlotPlayer player, final String... args)
return MainCommand.onCommand(player, "plot", new String[] {"toggle", "chat"}); {
return MainCommand.onCommand(player, "plot", new String[] { "toggle", "chat" });
} }
} }

View File

@ -37,53 +37,64 @@ import com.intellectualcrafters.plot.util.SchematicHandler.Schematic;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "claim", command = "claim",
aliases = {"c"}, aliases = { "c" },
description = "Claim the current plot you're standing on", description = "Claim the current plot you're standing on",
category = CommandCategory.CLAIMING, category = CommandCategory.CLAIMING,
requiredType = RequiredType.NONE, requiredType = RequiredType.NONE,
permission = "plots.claim", permission = "plots.claim",
usage = "/plot claim" usage = "/plot claim")
) public class Claim extends SubCommand
public class Claim extends SubCommand { {
public static boolean claimPlot(final PlotPlayer player, final Plot plot, final boolean teleport, final boolean auto) { public static boolean claimPlot(final PlotPlayer player, final Plot plot, final boolean teleport, final boolean auto)
{
return claimPlot(player, plot, teleport, "", auto); return claimPlot(player, plot, teleport, "", auto);
} }
public static boolean claimPlot(final PlotPlayer player, final Plot plot, final boolean teleport, final String schematic, final boolean auto) { public static boolean claimPlot(final PlotPlayer player, final Plot plot, final boolean teleport, final String schematic, final boolean auto)
if (plot.hasOwner() || plot.getSettings().isMerged()) { {
return false; if (plot.hasOwner() || plot.getSettings().isMerged()) { return false; }
}
final boolean result = EventUtil.manager.callClaim(player, plot, false); final boolean result = EventUtil.manager.callClaim(player, plot, false);
if (result) { if (result)
{
MainUtil.createPlot(player.getUUID(), plot); MainUtil.createPlot(player.getUUID(), plot);
MainUtil.setSign(player.getName(), plot); MainUtil.setSign(player.getName(), plot);
MainUtil.sendMessage(player, C.CLAIMED); MainUtil.sendMessage(player, C.CLAIMED);
final Location loc = player.getLocation(); final Location loc = player.getLocation();
if (teleport) { if (teleport)
{
MainUtil.teleportPlayer(player, loc, plot); MainUtil.teleportPlayer(player, loc, plot);
} }
final String world = plot.world; final String world = plot.world;
final PlotWorld plotworld = PS.get().getPlotWorld(world); final PlotWorld plotworld = PS.get().getPlotWorld(world);
final Plot plot2 = PS.get().getPlot(world, plot.id); final Plot plot2 = PS.get().getPlot(world, plot.id);
if (plotworld.SCHEMATIC_ON_CLAIM) { if (plotworld.SCHEMATIC_ON_CLAIM)
{
Schematic sch; Schematic sch;
if (schematic.equals("")) { if (schematic.equals(""))
{
sch = SchematicHandler.manager.getSchematic(plotworld.SCHEMATIC_FILE); sch = SchematicHandler.manager.getSchematic(plotworld.SCHEMATIC_FILE);
} else { }
else
{
sch = SchematicHandler.manager.getSchematic(schematic); sch = SchematicHandler.manager.getSchematic(schematic);
if (sch == null) { if (sch == null)
{
sch = SchematicHandler.manager.getSchematic(plotworld.SCHEMATIC_FILE); sch = SchematicHandler.manager.getSchematic(plotworld.SCHEMATIC_FILE);
} }
} }
SchematicHandler.manager.paste(sch, plot2, 0, 0, new RunnableVal<Boolean>() { SchematicHandler.manager.paste(sch, plot2, 0, 0, new RunnableVal<Boolean>()
{
@Override @Override
public void run() { public void run()
if (value) { {
if (value)
{
MainUtil.sendMessage(player, C.SCHEMATIC_PASTE_SUCCESS); MainUtil.sendMessage(player, C.SCHEMATIC_PASTE_SUCCESS);
} }
else { else
{
MainUtil.sendMessage(player, C.SCHEMATIC_PASTE_FAILED); MainUtil.sendMessage(player, C.SCHEMATIC_PASTE_FAILED);
} }
} }
@ -95,43 +106,38 @@ public class Claim extends SubCommand {
} }
@Override @Override
public boolean onCommand(final PlotPlayer plr, final String ... args) { public boolean onCommand(final PlotPlayer plr, final String... args)
{
String schematic = ""; String schematic = "";
if (args.length >= 1) { if (args.length >= 1)
{
schematic = args[0]; schematic = args[0];
} }
final Location loc = plr.getLocation(); final Location loc = plr.getLocation();
final Plot plot = MainUtil.getPlot(loc); final Plot plot = MainUtil.getPlot(loc);
if (plot == null) { if (plot == null) { return sendMessage(plr, C.NOT_IN_PLOT); }
return sendMessage(plr, C.NOT_IN_PLOT);
}
final int currentPlots = Settings.GLOBAL_LIMIT ? MainUtil.getPlayerPlotCount(plr) : MainUtil.getPlayerPlotCount(loc.getWorld(), plr); final int currentPlots = Settings.GLOBAL_LIMIT ? MainUtil.getPlayerPlotCount(plr) : MainUtil.getPlayerPlotCount(loc.getWorld(), plr);
if (currentPlots >= MainUtil.getAllowedPlots(plr)) { if (currentPlots >= MainUtil.getAllowedPlots(plr)) { return sendMessage(plr, C.CANT_CLAIM_MORE_PLOTS); }
return sendMessage(plr, C.CANT_CLAIM_MORE_PLOTS); if (!MainUtil.canClaim(plr, plot)) { return sendMessage(plr, C.PLOT_IS_CLAIMED); }
}
if (!MainUtil.canClaim(plr, plot)) {
return sendMessage(plr, C.PLOT_IS_CLAIMED);
}
final PlotWorld world = PS.get().getPlotWorld(plot.world); final PlotWorld world = PS.get().getPlotWorld(plot.world);
if ((EconHandler.manager != null) && world.USE_ECONOMY) { if ((EconHandler.manager != null) && world.USE_ECONOMY)
{
final double cost = world.PLOT_PRICE; final double cost = world.PLOT_PRICE;
if (cost > 0d) { if (cost > 0d)
if (EconHandler.manager.getMoney(plr) < cost) { {
return sendMessage(plr, C.CANNOT_AFFORD_PLOT, "" + cost); if (EconHandler.manager.getMoney(plr) < cost) { return sendMessage(plr, C.CANNOT_AFFORD_PLOT, "" + cost); }
}
EconHandler.manager.withdrawMoney(plr, cost); EconHandler.manager.withdrawMoney(plr, cost);
sendMessage(plr, C.REMOVED_BALANCE, cost + ""); sendMessage(plr, C.REMOVED_BALANCE, cost + "");
} }
} }
if (!schematic.equals("")) { if (!schematic.equals(""))
if (world.SCHEMATIC_CLAIM_SPECIFY) { {
if (!world.SCHEMATICS.contains(schematic.toLowerCase())) { if (world.SCHEMATIC_CLAIM_SPECIFY)
return sendMessage(plr, C.SCHEMATIC_INVALID, "non-existent: " + schematic); {
} if (!world.SCHEMATICS.contains(schematic.toLowerCase())) { return sendMessage(plr, C.SCHEMATIC_INVALID, "non-existent: " + schematic); }
if (!Permissions.hasPermission(plr, "plots.claim." + schematic) && !Permissions.hasPermission(plr, "plots.admin.command.schematic")) { if (!Permissions.hasPermission(plr, "plots.claim." + schematic) && !Permissions.hasPermission(plr, "plots.admin.command.schematic")) { return sendMessage(plr,
return sendMessage(plr, C.NO_SCHEMATIC_PERMISSION, schematic); C.NO_SCHEMATIC_PERMISSION, schematic); }
}
} }
} }
return claimPlot(plr, plot, false, schematic, false) || sendMessage(plr, C.PLOT_NOT_CLAIMED); return claimPlot(plr, plot, false, schematic, false) || sendMessage(plr, C.PLOT_NOT_CLAIMED);

View File

@ -38,86 +38,105 @@ import com.intellectualcrafters.plot.util.UUIDHandler;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "clear", command = "clear",
description = "Clear a plot", description = "Clear a plot",
permission = "plots.clear", permission = "plots.clear",
category = CommandCategory.ACTIONS, category = CommandCategory.ACTIONS,
usage = "/plot clear [id]" usage = "/plot clear [id]")
) public class Clear extends SubCommand
public class Clear extends SubCommand { {
@Override @Override
public boolean onCommand(final PlotPlayer plr, final String ... args) { public boolean onCommand(final PlotPlayer plr, final String... args)
{
final Location loc = plr.getLocation(); final Location loc = plr.getLocation();
final Plot plot; final Plot plot;
if (args.length == 2) { if (args.length == 2)
PlotId id = PlotId.fromString(args[0]); {
if (id == null) { final PlotId id = PlotId.fromString(args[0]);
if (args[1].equalsIgnoreCase("mine")) { if (id == null)
Set<Plot> plots = PS.get().getPlots(plr); {
if (plots.size() == 0) { if (args[1].equalsIgnoreCase("mine"))
{
final Set<Plot> plots = PS.get().getPlots(plr);
if (plots.size() == 0)
{
MainUtil.sendMessage(plr, C.NO_PLOTS); MainUtil.sendMessage(plr, C.NO_PLOTS);
return false; return false;
} }
plot = plots.iterator().next(); plot = plots.iterator().next();
} }
else { else
{
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot clear [X;Z|mine]"); MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot clear [X;Z|mine]");
return false; return false;
} }
} }
else { else
{
plot = MainUtil.getPlot(loc.getWorld(), id); plot = MainUtil.getPlot(loc.getWorld(), id);
} }
} }
else { else
{
plot = MainUtil.getPlot(loc); plot = MainUtil.getPlot(loc);
} }
if (plot == null) { if (plot == null)
{
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot clear [X;Z|mine]"); MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot clear [X;Z|mine]");
return sendMessage(plr, C.NOT_IN_PLOT); return sendMessage(plr, C.NOT_IN_PLOT);
} }
// if (!MainUtil.getTopPlot(plot).equals(MainUtil.getBottomPlot(plot))) { // if (!MainUtil.getTopPlot(plot).equals(MainUtil.getBottomPlot(plot))) {
// return sendMessage(plr, C.UNLINK_REQUIRED); // return sendMessage(plr, C.UNLINK_REQUIRED);
// } // }
if (((plot == null) || !plot.hasOwner() || !plot.isOwner(UUIDHandler.getUUID(plr))) && !Permissions.hasPermission(plr, "plots.admin.command.clear")) { if (((plot == null) || !plot.hasOwner() || !plot.isOwner(UUIDHandler.getUUID(plr))) && !Permissions.hasPermission(plr, "plots.admin.command.clear")) { return sendMessage(plr, C.NO_PLOT_PERMS); }
return sendMessage(plr, C.NO_PLOT_PERMS);
}
assert plot != null; assert plot != null;
if (MainUtil.runners.containsKey(plot)) { if (MainUtil.runners.containsKey(plot))
{
MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER); MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER);
return false; return false;
} }
if (FlagManager.getPlotFlag(plot, "done") != null && (!Permissions.hasPermission(plr, "plots.continue") || (Settings.DONE_COUNTS_TOWARDS_LIMIT && MainUtil.getAllowedPlots(plr) >= MainUtil.getPlayerPlotCount(plr)))) { if ((FlagManager.getPlotFlag(plot, "done") != null)
&& (!Permissions.hasPermission(plr, "plots.continue") || (Settings.DONE_COUNTS_TOWARDS_LIMIT && (MainUtil.getAllowedPlots(plr) >= MainUtil.getPlayerPlotCount(plr)))))
{
MainUtil.sendMessage(plr, C.DONE_ALREADY_DONE); MainUtil.sendMessage(plr, C.DONE_ALREADY_DONE);
return false; return false;
} }
Runnable runnable = new Runnable() { final Runnable runnable = new Runnable()
{
@Override @Override
public void run() { public void run()
{
final long start = System.currentTimeMillis(); final long start = System.currentTimeMillis();
final boolean result = MainUtil.clearAsPlayer(plot, plot.owner == null, new Runnable() { final boolean result = MainUtil.clearAsPlayer(plot, plot.owner == null, new Runnable()
{
@Override @Override
public void run() { public void run()
{
// If the state changes, then mark it as no longer done // If the state changes, then mark it as no longer done
if (FlagManager.getPlotFlag(plot, "done" ) != null) { if (FlagManager.getPlotFlag(plot, "done") != null)
{
FlagManager.removePlotFlag(plot, "done"); FlagManager.removePlotFlag(plot, "done");
} }
if (FlagManager.getPlotFlag(plot, "analysis") != null) { if (FlagManager.getPlotFlag(plot, "analysis") != null)
{
FlagManager.removePlotFlag(plot, "analysis"); FlagManager.removePlotFlag(plot, "analysis");
} }
MainUtil.sendMessage(plr, C.CLEARING_DONE, "" + (System.currentTimeMillis() - start)); MainUtil.sendMessage(plr, C.CLEARING_DONE, "" + (System.currentTimeMillis() - start));
} }
}); });
if (!result) { if (!result)
{
MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER); MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER);
} }
} }
}; };
if (Settings.CONFIRM_CLEAR && !(Permissions.hasPermission(plr, "plots.confirm.bypass"))) { if (Settings.CONFIRM_CLEAR && !(Permissions.hasPermission(plr, "plots.confirm.bypass")))
{
CmdConfirm.addPending(plr, "/plot clear " + plot.id, runnable); CmdConfirm.addPending(plr, "/plot clear " + plot.id, runnable);
} }
else { else
{
TaskManager.runTask(runnable); TaskManager.runTask(runnable);
} }
return true; return true;

View File

@ -53,60 +53,77 @@ import com.intellectualcrafters.plot.util.UUIDHandler;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "cluster", command = "cluster",
aliases = {"clusters"}, aliases = { "clusters" },
category = CommandCategory.ACTIONS, category = CommandCategory.ACTIONS,
requiredType = RequiredType.NONE, requiredType = RequiredType.NONE,
permission = "plots.cluster", permission = "plots.cluster",
description = "Manage a plot cluster" description = "Manage a plot cluster")
) public class Cluster extends SubCommand
public class Cluster extends SubCommand { {
@Override @Override
public boolean onCommand(final PlotPlayer plr, final String ... args) { public boolean onCommand(final PlotPlayer plr, final String... args)
{
// list, create, delete, resize, invite, kick, leave, helpers, tp, sethome // list, create, delete, resize, invite, kick, leave, helpers, tp, sethome
if (args.length == 0) { if (args.length == 0)
{
// return arguments // return arguments
MainUtil.sendMessage(plr, C.CLUSTER_AVAILABLE_ARGS); MainUtil.sendMessage(plr, C.CLUSTER_AVAILABLE_ARGS);
return false; return false;
} }
final String sub = args[0].toLowerCase(); final String sub = args[0].toLowerCase();
switch (sub) { switch (sub)
{
case "l": case "l":
case "list": { case "list":
if (!Permissions.hasPermission(plr, "plots.cluster.list")) { {
if (!Permissions.hasPermission(plr, "plots.cluster.list"))
{
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.list"); MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.list");
return false; return false;
} }
if (args.length != 1) { if (args.length != 1)
{
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster list"); MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster list");
return false; return false;
} }
final HashSet<PlotCluster> clusters = ClusterManager.getClusters(plr.getLocation().getWorld()); final HashSet<PlotCluster> clusters = ClusterManager.getClusters(plr.getLocation().getWorld());
MainUtil.sendMessage(plr, C.CLUSTER_LIST_HEADING, clusters.size() + ""); MainUtil.sendMessage(plr, C.CLUSTER_LIST_HEADING, clusters.size() + "");
for (final PlotCluster cluster : clusters) { for (final PlotCluster cluster : clusters)
{
// Ignore unmanaged clusters // Ignore unmanaged clusters
final String name = "'" + cluster.getName() + "' : " + cluster.toString(); final String name = "'" + cluster.getName() + "' : " + cluster.toString();
if (UUIDHandler.getUUID(plr).equals(cluster.owner)) { if (UUIDHandler.getUUID(plr).equals(cluster.owner))
{
MainUtil.sendMessage(plr, C.CLUSTER_LIST_ELEMENT, "&a" + name); MainUtil.sendMessage(plr, C.CLUSTER_LIST_ELEMENT, "&a" + name);
} else if (cluster.helpers.contains(UUIDHandler.getUUID(plr))) { }
else if (cluster.helpers.contains(UUIDHandler.getUUID(plr)))
{
MainUtil.sendMessage(plr, C.CLUSTER_LIST_ELEMENT, "&3" + name); MainUtil.sendMessage(plr, C.CLUSTER_LIST_ELEMENT, "&3" + name);
} else if (cluster.invited.contains(UUIDHandler.getUUID(plr))) { }
else if (cluster.invited.contains(UUIDHandler.getUUID(plr)))
{
MainUtil.sendMessage(plr, C.CLUSTER_LIST_ELEMENT, "&9" + name); MainUtil.sendMessage(plr, C.CLUSTER_LIST_ELEMENT, "&9" + name);
} else { }
else
{
MainUtil.sendMessage(plr, C.CLUSTER_LIST_ELEMENT, cluster.toString()); MainUtil.sendMessage(plr, C.CLUSTER_LIST_ELEMENT, cluster.toString());
} }
} }
return true; return true;
} }
case "c": case "c":
case "create": { case "create":
if (!Permissions.hasPermission(plr, "plots.cluster.create")) { {
if (!Permissions.hasPermission(plr, "plots.cluster.create"))
{
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.create"); MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.create");
return false; return false;
} }
if (args.length != 4) { if (args.length != 4)
{
final PlotId id = ClusterManager.estimatePlotId(plr.getLocation()); final PlotId id = ClusterManager.estimatePlotId(plr.getLocation());
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster create <name> <id-bot> <id-top>"); MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster create <name> <id-bot> <id-top>");
MainUtil.sendMessage(plr, C.CLUSTER_CURRENT_PLOTID, "" + id); MainUtil.sendMessage(plr, C.CLUSTER_CURRENT_PLOTID, "" + id);
@ -115,37 +132,46 @@ public class Cluster extends SubCommand {
// check pos1 / pos2 // check pos1 / pos2
PlotId pos1 = MainUtil.parseId(args[2]); PlotId pos1 = MainUtil.parseId(args[2]);
PlotId pos2 = MainUtil.parseId(args[3]); PlotId pos2 = MainUtil.parseId(args[3]);
if ((pos1 == null) || (pos2 == null)) { if ((pos1 == null) || (pos2 == null))
{
MainUtil.sendMessage(plr, C.NOT_VALID_PLOT_ID); MainUtil.sendMessage(plr, C.NOT_VALID_PLOT_ID);
return false; return false;
} }
// check if name is taken // check if name is taken
final String name = args[1]; final String name = args[1];
for (final PlotCluster cluster : ClusterManager.getClusters(plr.getLocation().getWorld())) { for (final PlotCluster cluster : ClusterManager.getClusters(plr.getLocation().getWorld()))
if (name.equals(cluster.getName())) { {
if (name.equals(cluster.getName()))
{
MainUtil.sendMessage(plr, C.ALIAS_IS_TAKEN); MainUtil.sendMessage(plr, C.ALIAS_IS_TAKEN);
return false; return false;
} }
} }
if ((pos2.x < pos1.x) || (pos2.y < pos1.y) ) { if ((pos2.x < pos1.x) || (pos2.y < pos1.y))
{
pos1 = new PlotId(Math.min(pos1.x, pos2.x), Math.min(pos1.y, pos2.y)); pos1 = new PlotId(Math.min(pos1.x, pos2.x), Math.min(pos1.y, pos2.y));
pos2 = new PlotId(Math.max(pos1.x, pos2.x), Math.max(pos1.y, pos2.y)); pos2 = new PlotId(Math.max(pos1.x, pos2.x), Math.max(pos1.y, pos2.y));
} }
//check if overlap //check if overlap
String world = plr.getLocation().getWorld(); final String world = plr.getLocation().getWorld();
final PlotClusterId id = new PlotClusterId(pos1, pos2); final PlotClusterId id = new PlotClusterId(pos1, pos2);
final HashSet<PlotCluster> intersects = ClusterManager.getIntersects(world, id); final HashSet<PlotCluster> intersects = ClusterManager.getIntersects(world, id);
if ((intersects.size() > 0)) { if ((intersects.size() > 0))
{
MainUtil.sendMessage(plr, C.CLUSTER_INTERSECTION, intersects.size() + ""); MainUtil.sendMessage(plr, C.CLUSTER_INTERSECTION, intersects.size() + "");
return false; return false;
} }
// Check if it occupies existing plots // Check if it occupies existing plots
Set<Plot> plots = MainUtil.getPlotSelectionOwned(world, pos1, pos2); final Set<Plot> plots = MainUtil.getPlotSelectionOwned(world, pos1, pos2);
if (plots.size() > 0) { if (plots.size() > 0)
if (!Permissions.hasPermission(plr, "plots.cluster.create.other")) { {
UUID uuid = plr.getUUID(); if (!Permissions.hasPermission(plr, "plots.cluster.create.other"))
for (Plot plot : plots) { {
if (!plot.isOwner(uuid)) { final UUID uuid = plr.getUUID();
for (final Plot plot : plots)
{
if (!plot.isOwner(uuid))
{
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.create.other"); MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.create.other");
return false; return false;
} }
@ -155,64 +181,76 @@ public class Cluster extends SubCommand {
// Check allowed cluster size // Check allowed cluster size
final PlotCluster cluster = new PlotCluster(world, pos1, pos2, UUIDHandler.getUUID(plr)); final PlotCluster cluster = new PlotCluster(world, pos1, pos2, UUIDHandler.getUUID(plr));
int current; int current;
if (Settings.GLOBAL_LIMIT) { if (Settings.GLOBAL_LIMIT)
{
current = ClusterManager.getPlayerClusterCount(plr); current = ClusterManager.getPlayerClusterCount(plr);
} }
else { else
{
current = ClusterManager.getPlayerClusterCount(world, plr); current = ClusterManager.getPlayerClusterCount(world, plr);
} }
int allowed = Permissions.hasPermissionRange(plr, "plots.cluster", Settings.MAX_PLOTS); final int allowed = Permissions.hasPermissionRange(plr, "plots.cluster", Settings.MAX_PLOTS);
if (current + cluster.getArea() > allowed) { if ((current + cluster.getArea()) > allowed)
{
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster." + (current + cluster.getArea())); MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster." + (current + cluster.getArea()));
return false; return false;
} }
// Set the generator (if applicable) // Set the generator (if applicable)
PlotWorld plotworld = PS.get().getPlotWorld(world); final PlotWorld plotworld = PS.get().getPlotWorld(world);
if (plotworld == null) { if (plotworld == null)
{
PS.get().config.createSection("worlds." + world); PS.get().config.createSection("worlds." + world);
PS.get().loadWorld(world, PS.get().IMP.getGenerator(world, null)); PS.get().loadWorld(world, PS.get().IMP.getGenerator(world, null));
} }
else { else
{
String gen_string = PS.get().config.getString("worlds." + world + "." + "generator.plugin"); String gen_string = PS.get().config.getString("worlds." + world + "." + "generator.plugin");
if (gen_string == null) { if (gen_string == null)
{
gen_string = "PlotSquared"; gen_string = "PlotSquared";
} }
PlotGenerator<?> wrapper = PS.get().IMP.getGenerator(world, gen_string); final PlotGenerator<?> wrapper = PS.get().IMP.getGenerator(world, gen_string);
if (wrapper.isFull()) { if (wrapper.isFull())
{
wrapper.augment(cluster, plotworld); wrapper.augment(cluster, plotworld);
} }
else { else
{
MainUtil.sendMessage(plr, C.SETUP_INVALID_GENERATOR, StringMan.join(SetupUtils.generators.keySet(), ",")); MainUtil.sendMessage(plr, C.SETUP_INVALID_GENERATOR, StringMan.join(SetupUtils.generators.keySet(), ","));
return false; return false;
} }
// BukkitPlotGenerator generator; // BukkitPlotGenerator generator;
// if (gen_string == null) { // if (gen_string == null) {
// generator = new HybridGen(world); // generator = new HybridGen(world);
// } else { // } else {
// ChunkGenerator chunkgen = (ChunkGenerator) PS.get().IMP.getGenerator(world, gen_string).generator; // ChunkGenerator chunkgen = (ChunkGenerator) PS.get().IMP.getGenerator(world, gen_string).generator;
// if (chunkgen instanceof BukkitPlotGenerator) { // if (chunkgen instanceof BukkitPlotGenerator) {
// generator = (BukkitPlotGenerator) chunkgen; // generator = (BukkitPlotGenerator) chunkgen;
// } // }
// else { // else {
// MainUtil.sendMessage(plr, C.SETUP_INVALID_GENERATOR, StringMan.join(SetupUtils.generators.keySet(), ",")); // MainUtil.sendMessage(plr, C.SETUP_INVALID_GENERATOR, StringMan.join(SetupUtils.generators.keySet(), ","));
// return false; // return false;
// } // }
// } // }
// new AugmentedPopulator(world, generator, cluster, plotworld.TERRAIN == 2, plotworld.TERRAIN != 2); // new AugmentedPopulator(world, generator, cluster, plotworld.TERRAIN == 2, plotworld.TERRAIN != 2);
} }
// create cluster // create cluster
cluster.settings.setAlias(name); cluster.settings.setAlias(name);
DBFunc.createCluster(world, cluster); DBFunc.createCluster(world, cluster);
if (!ClusterManager.clusters.containsKey(world)) { if (!ClusterManager.clusters.containsKey(world))
{
ClusterManager.clusters.put(world, new HashSet<PlotCluster>()); ClusterManager.clusters.put(world, new HashSet<PlotCluster>());
} }
ClusterManager.clusters.get(world).add(cluster); ClusterManager.clusters.get(world).add(cluster);
// Add any existing plots to the current cluster // Add any existing plots to the current cluster
for (Plot plot : plots) { for (final Plot plot : plots)
if (plot.hasOwner()) { {
Flag flag = new Flag(FlagManager.getFlag("cluster"), cluster); if (plot.hasOwner())
{
final Flag flag = new Flag(FlagManager.getFlag("cluster"), cluster);
FlagManager.addPlotFlag(plot, flag); FlagManager.addPlotFlag(plot, flag);
if (!cluster.isAdded(plot.owner)) { if (!cluster.isAdded(plot.owner))
{
cluster.invited.add(plot.owner); cluster.invited.add(plot.owner);
DBFunc.setInvited(world, cluster, plot.owner); DBFunc.setInvited(world, cluster, plot.owner);
} }
@ -223,50 +261,65 @@ public class Cluster extends SubCommand {
} }
case "disband": case "disband":
case "del": case "del":
case "delete": { case "delete":
if (!Permissions.hasPermission(plr, "plots.cluster.delete")) { {
if (!Permissions.hasPermission(plr, "plots.cluster.delete"))
{
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.delete"); MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.delete");
return false; return false;
} }
if ((args.length != 1) && (args.length != 2)) { if ((args.length != 1) && (args.length != 2))
{
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster delete [name]"); MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster delete [name]");
return false; return false;
} }
PlotCluster cluster; PlotCluster cluster;
if (args.length == 2) { if (args.length == 2)
{
cluster = ClusterManager.getCluster(plr.getLocation().getWorld(), args[1]); cluster = ClusterManager.getCluster(plr.getLocation().getWorld(), args[1]);
if (cluster == null) { if (cluster == null)
{
MainUtil.sendMessage(plr, C.INVALID_CLUSTER, args[1]); MainUtil.sendMessage(plr, C.INVALID_CLUSTER, args[1]);
return false; return false;
} }
} else { }
else
{
cluster = ClusterManager.getCluster(plr.getLocation()); cluster = ClusterManager.getCluster(plr.getLocation());
if (cluster == null) { if (cluster == null)
{
MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER); MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER);
return false; return false;
} }
} }
if (!cluster.owner.equals(UUIDHandler.getUUID(plr))) { if (!cluster.owner.equals(UUIDHandler.getUUID(plr)))
if (!Permissions.hasPermission(plr, "plots.cluster.delete.other")) { {
if (!Permissions.hasPermission(plr, "plots.cluster.delete.other"))
{
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.delete.other"); MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.delete.other");
return false; return false;
} }
} }
final PlotWorld plotworld = PS.get().getPlotWorld(plr.getLocation().getWorld()); final PlotWorld plotworld = PS.get().getPlotWorld(plr.getLocation().getWorld());
if (plotworld.TYPE == 2) { if (plotworld.TYPE == 2)
{
final ArrayList<Plot> toRemove = new ArrayList<>(); final ArrayList<Plot> toRemove = new ArrayList<>();
for (final Plot plot : PS.get().getPlotsInWorld(plr.getLocation().getWorld())) { for (final Plot plot : PS.get().getPlotsInWorld(plr.getLocation().getWorld()))
{
final PlotCluster other = ClusterManager.getCluster(plot); final PlotCluster other = ClusterManager.getCluster(plot);
if (cluster.equals(other)) { if (cluster.equals(other))
{
toRemove.add(plot); toRemove.add(plot);
} }
} }
for (final Plot plot : toRemove) { for (final Plot plot : toRemove)
{
plot.unclaim(); plot.unclaim();
} }
} }
DBFunc.delete(cluster); DBFunc.delete(cluster);
if (plotworld.TYPE == 2) { if (plotworld.TYPE == 2)
{
SetupUtils.manager.removePopulator(plr.getLocation().getWorld(), cluster); SetupUtils.manager.removePopulator(plr.getLocation().getWorld(), cluster);
} }
ClusterManager.last = null; ClusterManager.last = null;
@ -276,36 +329,44 @@ public class Cluster extends SubCommand {
return true; return true;
} }
case "res": case "res":
case "resize": { case "resize":
if (!Permissions.hasPermission(plr, "plots.cluster.resize")) { {
if (!Permissions.hasPermission(plr, "plots.cluster.resize"))
{
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.resize"); MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.resize");
return false; return false;
} }
if (args.length != 3) { if (args.length != 3)
{
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster resize <pos1> <pos2>"); MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster resize <pos1> <pos2>");
return false; return false;
} }
// check pos1 / pos2 // check pos1 / pos2
PlotId pos1 = MainUtil.parseId(args[1]); PlotId pos1 = MainUtil.parseId(args[1]);
PlotId pos2 = MainUtil.parseId(args[2]); PlotId pos2 = MainUtil.parseId(args[2]);
if ((pos1 == null) || (pos2 == null)) { if ((pos1 == null) || (pos2 == null))
{
MainUtil.sendMessage(plr, C.NOT_VALID_PLOT_ID); MainUtil.sendMessage(plr, C.NOT_VALID_PLOT_ID);
return false; return false;
} }
if ((pos2.x < pos1.x) || (pos2.y < pos1.y) ) { if ((pos2.x < pos1.x) || (pos2.y < pos1.y))
{
pos1 = new PlotId(Math.min(pos1.x, pos2.x), Math.min(pos1.y, pos2.y)); pos1 = new PlotId(Math.min(pos1.x, pos2.x), Math.min(pos1.y, pos2.y));
pos2 = new PlotId(Math.max(pos1.x, pos2.x), Math.max(pos1.y, pos2.y)); pos2 = new PlotId(Math.max(pos1.x, pos2.x), Math.max(pos1.y, pos2.y));
} }
// check if in cluster // check if in cluster
Location loc = plr.getLocation(); final Location loc = plr.getLocation();
String world = loc.getWorld(); final String world = loc.getWorld();
final PlotCluster cluster = ClusterManager.getCluster(loc); final PlotCluster cluster = ClusterManager.getCluster(loc);
if (cluster == null) { if (cluster == null)
{
MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER); MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER);
return false; return false;
} }
if (!cluster.hasHelperRights(UUIDHandler.getUUID(plr))) { if (!cluster.hasHelperRights(UUIDHandler.getUUID(plr)))
if (!Permissions.hasPermission(plr, "plots.cluster.resize.other")) { {
if (!Permissions.hasPermission(plr, "plots.cluster.resize.other"))
{
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.resize.other"); MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.resize.other");
return false; return false;
} }
@ -313,46 +374,56 @@ public class Cluster extends SubCommand {
//check if overlap //check if overlap
final PlotClusterId id = new PlotClusterId(pos1, pos2); final PlotClusterId id = new PlotClusterId(pos1, pos2);
final HashSet<PlotCluster> intersects = ClusterManager.getIntersects(world, id); final HashSet<PlotCluster> intersects = ClusterManager.getIntersects(world, id);
if (intersects.size() > 1) { if (intersects.size() > 1)
{
MainUtil.sendMessage(plr, C.CLUSTER_INTERSECTION, (intersects.size() - 1) + ""); MainUtil.sendMessage(plr, C.CLUSTER_INTERSECTION, (intersects.size() - 1) + "");
return false; return false;
} }
HashSet<Plot> existing = MainUtil.getPlotSelectionOwned(world, cluster.getP1(), cluster.getP2()); final HashSet<Plot> existing = MainUtil.getPlotSelectionOwned(world, cluster.getP1(), cluster.getP2());
HashSet<Plot> newplots = MainUtil.getPlotSelectionOwned(world, pos1, pos2); final HashSet<Plot> newplots = MainUtil.getPlotSelectionOwned(world, pos1, pos2);
HashSet<Plot> removed = ((HashSet<Plot>) existing.clone()); final HashSet<Plot> removed = ((HashSet<Plot>) existing.clone());
removed.removeAll(newplots); removed.removeAll(newplots);
// Check expand / shrink // Check expand / shrink
if (removed.size() > 0) { if (removed.size() > 0)
if (!Permissions.hasPermission(plr, "plots.cluster.resize.shrink")) { {
if (!Permissions.hasPermission(plr, "plots.cluster.resize.shrink"))
{
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.resize.shrink"); MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.resize.shrink");
return false; return false;
} }
} }
newplots.removeAll(existing); newplots.removeAll(existing);
if (newplots.size() > 0) { if (newplots.size() > 0)
if (!Permissions.hasPermission(plr, "plots.cluster.resize.expand")) { {
if (!Permissions.hasPermission(plr, "plots.cluster.resize.expand"))
{
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.resize.expand"); MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.resize.expand");
return false; return false;
} }
} }
// Check allowed cluster size // Check allowed cluster size
int current; int current;
if (Settings.GLOBAL_LIMIT) { if (Settings.GLOBAL_LIMIT)
{
current = ClusterManager.getPlayerClusterCount(plr); current = ClusterManager.getPlayerClusterCount(plr);
} }
else { else
{
current = ClusterManager.getPlayerClusterCount(world, plr); current = ClusterManager.getPlayerClusterCount(world, plr);
} }
current -= cluster.getArea() + (1 + pos2.x - pos1.x) * (1 + pos2.y - pos1.y); current -= cluster.getArea() + (((1 + pos2.x) - pos1.x) * ((1 + pos2.y) - pos1.y));
int allowed = Permissions.hasPermissionRange(plr, "plots.cluster", Settings.MAX_PLOTS); final int allowed = Permissions.hasPermissionRange(plr, "plots.cluster", Settings.MAX_PLOTS);
if (current + cluster.getArea() > allowed) { if ((current + cluster.getArea()) > allowed)
{
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster." + (current + cluster.getArea())); MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster." + (current + cluster.getArea()));
return false; return false;
} }
for (Plot plot : removed) { for (final Plot plot : removed)
{
FlagManager.removePlotFlag(plot, "cluster"); FlagManager.removePlotFlag(plot, "cluster");
} }
for (Plot plot : newplots) { for (final Plot plot : newplots)
{
FlagManager.addPlotFlag(plot, new Flag(FlagManager.getFlag("cluster"), cluster)); FlagManager.addPlotFlag(plot, new Flag(FlagManager.getFlag("cluster"), cluster));
} }
// resize cluster // resize cluster
@ -362,76 +433,95 @@ public class Cluster extends SubCommand {
} }
case "reg": case "reg":
case "regenerate": case "regenerate":
case "regen": { case "regen":
if (!Permissions.hasPermission(plr, "plots.cluster.delete")) { {
if (!Permissions.hasPermission(plr, "plots.cluster.delete"))
{
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.regen"); MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.regen");
return false; return false;
} }
if ((args.length != 1) && (args.length != 2)) { if ((args.length != 1) && (args.length != 2))
{
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster regen [name]"); MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster regen [name]");
return false; return false;
} }
PlotCluster cluster; PlotCluster cluster;
if (args.length == 2) { if (args.length == 2)
{
cluster = ClusterManager.getCluster(plr.getLocation().getWorld(), args[1]); cluster = ClusterManager.getCluster(plr.getLocation().getWorld(), args[1]);
if (cluster == null) { if (cluster == null)
{
MainUtil.sendMessage(plr, C.INVALID_CLUSTER, args[1]); MainUtil.sendMessage(plr, C.INVALID_CLUSTER, args[1]);
return false; return false;
} }
} else { }
else
{
cluster = ClusterManager.getCluster(plr.getLocation()); cluster = ClusterManager.getCluster(plr.getLocation());
if (cluster == null) { if (cluster == null)
{
MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER); MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER);
return false; return false;
} }
} }
if (!cluster.owner.equals(UUIDHandler.getUUID(plr))) { if (!cluster.owner.equals(UUIDHandler.getUUID(plr)))
if (!Permissions.hasPermission(plr, "plots.cluster.regen.other")) { {
if (!Permissions.hasPermission(plr, "plots.cluster.regen.other"))
{
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.regen.other"); MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.regen.other");
return false; return false;
} }
} }
long start = System.currentTimeMillis(); final long start = System.currentTimeMillis();
ClusterManager.regenCluster(cluster); ClusterManager.regenCluster(cluster);
MainUtil.sendMessage(plr, C.CLUSTER_REGENERATED, (System.currentTimeMillis() - start) + ""); MainUtil.sendMessage(plr, C.CLUSTER_REGENERATED, (System.currentTimeMillis() - start) + "");
return true; return true;
} }
case "add": case "add":
case "inv": case "inv":
case "invite": { case "invite":
if (!Permissions.hasPermission(plr, "plots.cluster.invite")) { {
if (!Permissions.hasPermission(plr, "plots.cluster.invite"))
{
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.invite"); MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.invite");
return false; return false;
} }
if (args.length != 2) { if (args.length != 2)
{
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster invite <player>"); MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster invite <player>");
return false; return false;
} }
// check if in cluster // check if in cluster
final PlotCluster cluster = ClusterManager.getCluster(plr.getLocation()); final PlotCluster cluster = ClusterManager.getCluster(plr.getLocation());
if (cluster == null) { if (cluster == null)
{
MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER); MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER);
return false; return false;
} }
if (!cluster.hasHelperRights(UUIDHandler.getUUID(plr))) { if (!cluster.hasHelperRights(UUIDHandler.getUUID(plr)))
if (!Permissions.hasPermission(plr, "plots.cluster.invite.other")) { {
if (!Permissions.hasPermission(plr, "plots.cluster.invite.other"))
{
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.invite.other"); MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.invite.other");
return false; return false;
} }
} }
// check uuid // check uuid
final UUID uuid = UUIDHandler.getUUID(args[1], null); final UUID uuid = UUIDHandler.getUUID(args[1], null);
if (uuid == null) { if (uuid == null)
{
MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[2]); MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[2]);
return false; return false;
} }
if (!cluster.isAdded(uuid)) { if (!cluster.isAdded(uuid))
{
// add the user if not added // add the user if not added
cluster.invited.add(uuid); cluster.invited.add(uuid);
final String world = plr.getLocation().getWorld(); final String world = plr.getLocation().getWorld();
DBFunc.setInvited(world, cluster, uuid); DBFunc.setInvited(world, cluster, uuid);
final PlotPlayer player = UUIDHandler.getPlayer(uuid); final PlotPlayer player = UUIDHandler.getPlayer(uuid);
if (player != null) { if (player != null)
{
MainUtil.sendMessage(player, C.CLUSTER_INVITED, cluster.getName()); MainUtil.sendMessage(player, C.CLUSTER_INVITED, cluster.getName());
} }
} }
@ -440,51 +530,63 @@ public class Cluster extends SubCommand {
} }
case "k": case "k":
case "remove": case "remove":
case "kick": { case "kick":
if (!Permissions.hasPermission(plr, "plots.cluster.kick")) { {
if (!Permissions.hasPermission(plr, "plots.cluster.kick"))
{
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.kick"); MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.kick");
return false; return false;
} }
if (args.length != 2) { if (args.length != 2)
{
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster kick <player>"); MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster kick <player>");
return false; return false;
} }
final PlotCluster cluster = ClusterManager.getCluster(plr.getLocation()); final PlotCluster cluster = ClusterManager.getCluster(plr.getLocation());
if (cluster == null) { if (cluster == null)
{
MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER); MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER);
return false; return false;
} }
if (!cluster.hasHelperRights(UUIDHandler.getUUID(plr))) { if (!cluster.hasHelperRights(UUIDHandler.getUUID(plr)))
if (!Permissions.hasPermission(plr, "plots.cluster.kick.other")) { {
if (!Permissions.hasPermission(plr, "plots.cluster.kick.other"))
{
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.kick.other"); MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.kick.other");
return false; return false;
} }
} }
// check uuid // check uuid
final UUID uuid = UUIDHandler.getUUID(args[1], null); final UUID uuid = UUIDHandler.getUUID(args[1], null);
if (uuid == null) { if (uuid == null)
{
MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[1]); MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[1]);
return false; return false;
} }
// Can't kick if the player is yourself, the owner, or not added to the cluster // Can't kick if the player is yourself, the owner, or not added to the cluster
if (uuid.equals(UUIDHandler.getUUID(plr)) || uuid.equals(cluster.owner) || !cluster.isAdded(uuid)) { if (uuid.equals(UUIDHandler.getUUID(plr)) || uuid.equals(cluster.owner) || !cluster.isAdded(uuid))
{
MainUtil.sendMessage(plr, C.CANNOT_KICK_PLAYER, cluster.getName()); MainUtil.sendMessage(plr, C.CANNOT_KICK_PLAYER, cluster.getName());
return false; return false;
} }
if (cluster.helpers.contains(uuid)) { if (cluster.helpers.contains(uuid))
{
cluster.helpers.remove(uuid); cluster.helpers.remove(uuid);
DBFunc.removeHelper(cluster, uuid); DBFunc.removeHelper(cluster, uuid);
} }
cluster.invited.remove(uuid); cluster.invited.remove(uuid);
DBFunc.removeInvited(cluster, uuid); DBFunc.removeInvited(cluster, uuid);
final PlotPlayer player = UUIDHandler.getPlayer(uuid); final PlotPlayer player = UUIDHandler.getPlayer(uuid);
if (player != null) { if (player != null)
{
MainUtil.sendMessage(player, C.CLUSTER_REMOVED, cluster.getName()); MainUtil.sendMessage(player, C.CLUSTER_REMOVED, cluster.getName());
} }
for (final Plot plot : new ArrayList<>(PS.get().getPlots(plr.getLocation().getWorld(), uuid))) { for (final Plot plot : new ArrayList<>(PS.get().getPlots(plr.getLocation().getWorld(), uuid)))
{
final PlotCluster current = ClusterManager.getCluster(plot); final PlotCluster current = ClusterManager.getCluster(plot);
if ((current != null) && current.equals(cluster)) { if ((current != null) && current.equals(cluster))
final String world = plr.getLocation().getWorld(); {
plr.getLocation().getWorld();
plot.unclaim(); plot.unclaim();
} }
} }
@ -492,49 +594,62 @@ public class Cluster extends SubCommand {
return true; return true;
} }
case "quit": case "quit":
case "leave": { case "leave":
if (!Permissions.hasPermission(plr, "plots.cluster.leave")) { {
if (!Permissions.hasPermission(plr, "plots.cluster.leave"))
{
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.leave"); MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.leave");
return false; return false;
} }
if ((args.length != 1) && (args.length != 2)) { if ((args.length != 1) && (args.length != 2))
{
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster leave [name]"); MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster leave [name]");
return false; return false;
} }
PlotCluster cluster; PlotCluster cluster;
if (args.length == 2) { if (args.length == 2)
{
cluster = ClusterManager.getCluster(plr.getLocation().getWorld(), args[1]); cluster = ClusterManager.getCluster(plr.getLocation().getWorld(), args[1]);
if (cluster == null) { if (cluster == null)
{
MainUtil.sendMessage(plr, C.INVALID_CLUSTER, args[1]); MainUtil.sendMessage(plr, C.INVALID_CLUSTER, args[1]);
return false; return false;
} }
} else { }
else
{
cluster = ClusterManager.getCluster(plr.getLocation()); cluster = ClusterManager.getCluster(plr.getLocation());
if (cluster == null) { if (cluster == null)
{
MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER); MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER);
return false; return false;
} }
} }
final UUID uuid = UUIDHandler.getUUID(plr); final UUID uuid = UUIDHandler.getUUID(plr);
if (!cluster.isAdded(uuid)) { if (!cluster.isAdded(uuid))
{
MainUtil.sendMessage(plr, C.CLUSTER_NOT_ADDED); MainUtil.sendMessage(plr, C.CLUSTER_NOT_ADDED);
return false; return false;
} }
if (uuid.equals(cluster.owner)) { if (uuid.equals(cluster.owner))
{
MainUtil.sendMessage(plr, C.CLUSTER_CANNOT_LEAVE); MainUtil.sendMessage(plr, C.CLUSTER_CANNOT_LEAVE);
return false; return false;
} }
if (cluster.helpers.contains(uuid)) { if (cluster.helpers.contains(uuid))
{
cluster.helpers.remove(uuid); cluster.helpers.remove(uuid);
DBFunc.removeHelper(cluster, uuid); DBFunc.removeHelper(cluster, uuid);
} }
cluster.invited.remove(uuid); cluster.invited.remove(uuid);
DBFunc.removeInvited(cluster, uuid); DBFunc.removeInvited(cluster, uuid);
MainUtil.sendMessage(plr, C.CLUSTER_REMOVED, cluster.getName()); MainUtil.sendMessage(plr, C.CLUSTER_REMOVED, cluster.getName());
for (final Plot plot : new ArrayList<>(PS.get().getPlots(plr.getLocation().getWorld(), uuid))) { for (final Plot plot : new ArrayList<>(PS.get().getPlots(plr.getLocation().getWorld(), uuid)))
{
final PlotCluster current = ClusterManager.getCluster(plot); final PlotCluster current = ClusterManager.getCluster(plot);
if ((current != null) && current.equals(cluster)) { if ((current != null) && current.equals(cluster))
final String world = plr.getLocation().getWorld(); {
plr.getLocation().getWorld();
plot.unclaim(); plot.unclaim();
} }
} }
@ -542,31 +657,38 @@ public class Cluster extends SubCommand {
} }
case "admin": case "admin":
case "helper": case "helper":
case "helpers": { case "helpers":
if (!Permissions.hasPermission(plr, "plots.cluster.helpers")) { {
if (!Permissions.hasPermission(plr, "plots.cluster.helpers"))
{
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.helpers"); MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.helpers");
return false; return false;
} }
if (args.length != 3) { if (args.length != 3)
{
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster helpers <add|remove> <player>"); MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster helpers <add|remove> <player>");
return false; return false;
} }
final PlotCluster cluster = ClusterManager.getCluster(plr.getLocation()); final PlotCluster cluster = ClusterManager.getCluster(plr.getLocation());
if (cluster == null) { if (cluster == null)
{
MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER); MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER);
return false; return false;
} }
final UUID uuid = UUIDHandler.getUUID(args[2], null); final UUID uuid = UUIDHandler.getUUID(args[2], null);
if (uuid == null) { if (uuid == null)
{
MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[2]); MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[2]);
return false; return false;
} }
if (args[1].toLowerCase().equals("add")) { if (args[1].toLowerCase().equals("add"))
{
cluster.helpers.add(uuid); cluster.helpers.add(uuid);
DBFunc.setHelper(cluster, uuid); DBFunc.setHelper(cluster, uuid);
return MainUtil.sendMessage(plr, C.CLUSTER_ADDED_HELPER); return MainUtil.sendMessage(plr, C.CLUSTER_ADDED_HELPER);
} }
if (args[1].toLowerCase().equals("remove")) { if (args[1].toLowerCase().equals("remove"))
{
cluster.helpers.remove(uuid); cluster.helpers.remove(uuid);
DBFunc.removeHelper(cluster, uuid); DBFunc.removeHelper(cluster, uuid);
return MainUtil.sendMessage(plr, C.CLUSTER_REMOVED_HELPER); return MainUtil.sendMessage(plr, C.CLUSTER_REMOVED_HELPER);
@ -576,23 +698,29 @@ public class Cluster extends SubCommand {
} }
case "spawn": case "spawn":
case "home": case "home":
case "tp": { case "tp":
if (!Permissions.hasPermission(plr, "plots.cluster.tp")) { {
if (!Permissions.hasPermission(plr, "plots.cluster.tp"))
{
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.tp"); MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.tp");
return false; return false;
} }
if (args.length != 2) { if (args.length != 2)
{
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster tp <name>"); MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster tp <name>");
return false; return false;
} }
final PlotCluster cluster = ClusterManager.getCluster(plr.getLocation().getWorld(), args[1]); final PlotCluster cluster = ClusterManager.getCluster(plr.getLocation().getWorld(), args[1]);
if (cluster == null) { if (cluster == null)
{
MainUtil.sendMessage(plr, C.INVALID_CLUSTER, args[1]); MainUtil.sendMessage(plr, C.INVALID_CLUSTER, args[1]);
return false; return false;
} }
final UUID uuid = UUIDHandler.getUUID(plr); final UUID uuid = UUIDHandler.getUUID(plr);
if (!cluster.isAdded(uuid)) { if (!cluster.isAdded(uuid))
if (!Permissions.hasPermission(plr, "plots.cluster.tp.other")) { {
if (!Permissions.hasPermission(plr, "plots.cluster.tp.other"))
{
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.tp.other"); MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.tp.other");
return false; return false;
} }
@ -603,32 +731,41 @@ public class Cluster extends SubCommand {
case "i": case "i":
case "info": case "info":
case "show": case "show":
case "information": { case "information":
if (!Permissions.hasPermission(plr, "plots.cluster.info")) { {
if (!Permissions.hasPermission(plr, "plots.cluster.info"))
{
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.info"); MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.info");
return false; return false;
} }
if ((args.length != 1) && (args.length != 2)) { if ((args.length != 1) && (args.length != 2))
{
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster info [name]"); MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster info [name]");
return false; return false;
} }
PlotCluster cluster; PlotCluster cluster;
if (args.length == 2) { if (args.length == 2)
{
cluster = ClusterManager.getCluster(plr.getLocation().getWorld(), args[1]); cluster = ClusterManager.getCluster(plr.getLocation().getWorld(), args[1]);
if (cluster == null) { if (cluster == null)
{
MainUtil.sendMessage(plr, C.INVALID_CLUSTER, args[1]); MainUtil.sendMessage(plr, C.INVALID_CLUSTER, args[1]);
return false; return false;
} }
} else { }
else
{
cluster = ClusterManager.getCluster(plr.getLocation()); cluster = ClusterManager.getCluster(plr.getLocation());
if (cluster == null) { if (cluster == null)
{
MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER); MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER);
return false; return false;
} }
} }
final String id = cluster.toString(); final String id = cluster.toString();
String owner = UUIDHandler.getName(cluster.owner); String owner = UUIDHandler.getName(cluster.owner);
if (owner == null) { if (owner == null)
{
owner = "unknown"; owner = "unknown";
} }
final String name = cluster.getName(); final String name = cluster.getName();
@ -645,22 +782,28 @@ public class Cluster extends SubCommand {
} }
case "sh": case "sh":
case "setspawn": case "setspawn":
case "sethome": { case "sethome":
if (!Permissions.hasPermission(plr, "plots.cluster.sethome")) { {
if (!Permissions.hasPermission(plr, "plots.cluster.sethome"))
{
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.sethome"); MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.sethome");
return false; return false;
} }
if ((args.length != 1) && (args.length != 2)) { if ((args.length != 1) && (args.length != 2))
{
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster sethome"); MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster sethome");
return false; return false;
} }
final PlotCluster cluster = ClusterManager.getCluster(plr.getLocation()); final PlotCluster cluster = ClusterManager.getCluster(plr.getLocation());
if (cluster == null) { if (cluster == null)
{
MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER); MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER);
return false; return false;
} }
if (!cluster.hasHelperRights(UUIDHandler.getUUID(plr))) { if (!cluster.hasHelperRights(UUIDHandler.getUUID(plr)))
if (!Permissions.hasPermission(plr, "plots.cluster.sethome.other")) { {
if (!Permissions.hasPermission(plr, "plots.cluster.sethome.other"))
{
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.sethome.other"); MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.sethome.other");
return false; return false;
} }

View File

@ -1,58 +1,59 @@
package com.intellectualcrafters.plot.commands; package com.intellectualcrafters.plot.commands;
/** /**
* CommandCategory * CommandCategory
* *
* @author Citymonstret */
* @author Empire92 public enum CommandCategory
*/ {
public enum CommandCategory { /**
/** * Claiming Commands
* Claiming Commands *
* * Such as: /plot claim
* Such as: /plot claim */
*/ CLAIMING("Claiming"),
CLAIMING("Claiming"), /**
/** * Teleportation Commands
* Teleportation Commands *
* * Such as: /plot visit
* Such as: /plot visit */
*/ TELEPORT("Teleportation"),
TELEPORT("Teleportation"), /**
/** * Action Commands
* Action Commands *
* * Such as: /plot clear
* Such as: /plot clear */
*/ ACTIONS("Actions"),
ACTIONS("Actions"), /**
/** * Information Commands
* Information Commands *
* * Such as: /plot info
* Such as: /plot info */
*/ INFO("Information"),
INFO("Information"), /**
/** * Debug Commands
* Debug Commands *
* * Such as: /plot debug
* Such as: /plot debug */
*/ DEBUG("Debug");
DEBUG("Debug"); /**
/** * The category name (Readable)
* The category name (Readable) */
*/ private final String name;
private final String name;
/**
/** * Constructor
* Constructor *
* * @param name readable name
* @param name readable name */
*/ CommandCategory(final String name)
CommandCategory(final String name) { {
this.name = name; this.name = name;
} }
@Override @Override
public String toString() { public String toString()
return this.name; {
} return name;
} }
}

View File

@ -1,52 +1,54 @@
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
// PlotSquared - A plot manager and world generator for the Bukkit API / // PlotSquared - A plot manager and world generator for the Bukkit API /
// Copyright (c) 2014 IntellectualSites/IntellectualCrafters / // Copyright (c) 2014 IntellectualSites/IntellectualCrafters /
// / // /
// This program is free software; you can redistribute it and/or modify / // This program is free software; you can redistribute it and/or modify /
// it under the terms of the GNU General Public License as published by / // it under the terms of the GNU General Public License as published by /
// the Free Software Foundation; either version 3 of the License, or / // the Free Software Foundation; either version 3 of the License, or /
// (at your option) any later version. / // (at your option) any later version. /
// / // /
// This program is distributed in the hope that it will be useful, / // This program is distributed in the hope that it will be useful, /
// but WITHOUT ANY WARRANTY; without even the implied warranty of / // but WITHOUT ANY WARRANTY; without even the implied warranty of /
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the / // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /
// GNU General Public License for more details. / // GNU General Public License for more details. /
// / // /
// You should have received a copy of the GNU General Public License / // You should have received a copy of the GNU General Public License /
// along with this program; if not, write to the Free Software Foundation, / // along with this program; if not, write to the Free Software Foundation, /
// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA / // Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA /
// / // /
// You can contact us via: support@intellectualsites.com / // You can contact us via: support@intellectualsites.com /
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
package com.intellectualcrafters.plot.commands; package com.intellectualcrafters.plot.commands;
import com.intellectualcrafters.plot.object.PlotPlayer; import com.intellectualcrafters.plot.object.PlotPlayer;
import com.intellectualcrafters.plot.util.Permissions; import com.intellectualcrafters.plot.util.Permissions;
/** /**
* Created by Citymonstret on 2014-08-03. * Created by Citymonstret on 2014-08-03.
* *
* @author Citymonstret */
*/ public class CommandPermission
public class CommandPermission { {
/** /**
* Permission Node * Permission Node
*/ */
public final String permission; public final String permission;
/** /**
* @param permission Command Permission * @param permission Command Permission
*/ */
public CommandPermission(final String permission) { public CommandPermission(final String permission)
this.permission = permission.toLowerCase(); {
} this.permission = permission.toLowerCase();
}
/**
* @param player Does the player have the permission? /**
* * @param player Does the player have the permission?
* @return true of player has the required permission node *
*/ * @return true of player has the required permission node
public boolean hasPermission(final PlotPlayer player) { */
return Permissions.hasPermission(player, this.permission); public boolean hasPermission(final PlotPlayer player)
} {
} return Permissions.hasPermission(player, permission);
}
}

View File

@ -36,56 +36,66 @@ import com.intellectualcrafters.plot.util.UUIDHandler;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "comment", command = "comment",
aliases = {"msg"}, aliases = { "msg" },
description = "Comment on a plot", description = "Comment on a plot",
category = CommandCategory.ACTIONS, category = CommandCategory.ACTIONS,
requiredType = RequiredType.NONE, requiredType = RequiredType.NONE,
permission = "plots.comment" permission = "plots.comment")
) public class Comment extends SubCommand
public class Comment extends SubCommand { {
@Override @Override
public boolean onCommand(PlotPlayer player, String[] args) { public boolean onCommand(final PlotPlayer player, final String[] args)
if (args.length < 2) { {
sendMessage(player, C.COMMENT_SYNTAX, StringMan.join(CommentManager.inboxes.keySet(),"|")); if (args.length < 2)
{
sendMessage(player, C.COMMENT_SYNTAX, StringMan.join(CommentManager.inboxes.keySet(), "|"));
return false; return false;
} }
CommentInbox inbox = CommentManager.inboxes.get(args[0].toLowerCase()); final CommentInbox inbox = CommentManager.inboxes.get(args[0].toLowerCase());
if (inbox == null) { if (inbox == null)
sendMessage(player, C.COMMENT_SYNTAX, StringMan.join(CommentManager.inboxes.keySet(),"|")); {
sendMessage(player, C.COMMENT_SYNTAX, StringMan.join(CommentManager.inboxes.keySet(), "|"));
return false; return false;
} }
Plot plot; Plot plot;
Location loc = player.getLocation(); final Location loc = player.getLocation();
PlotId id = PlotId.fromString(args[1]); final PlotId id = PlotId.fromString(args[1]);
int index; int index;
if (id != null) { if (id != null)
if (args.length < 4) { {
sendMessage(player, C.COMMENT_SYNTAX, StringMan.join(CommentManager.inboxes.keySet(),"|")); if (args.length < 4)
{
sendMessage(player, C.COMMENT_SYNTAX, StringMan.join(CommentManager.inboxes.keySet(), "|"));
return false; return false;
} }
index = 2; index = 2;
plot = MainUtil.getPlot(loc.getWorld(), id); plot = MainUtil.getPlot(loc.getWorld(), id);
} }
else { else
{
index = 1; index = 1;
plot = MainUtil.getPlot(loc); plot = MainUtil.getPlot(loc);
} }
if (!inbox.canWrite(plot, player)) { if (!inbox.canWrite(plot, player))
{
sendMessage(player, C.NO_PERM_INBOX, ""); sendMessage(player, C.NO_PERM_INBOX, "");
return false; return false;
} }
String message = StringMan.join(Arrays.copyOfRange(args,index, args.length), " "); final String message = StringMan.join(Arrays.copyOfRange(args, index, args.length), " ");
PlotComment comment = new PlotComment(loc.getWorld(), id, message, player.getName(), inbox.toString(), System.currentTimeMillis()); final PlotComment comment = new PlotComment(loc.getWorld(), id, message, player.getName(), inbox.toString(), System.currentTimeMillis());
boolean result = inbox.addComment(plot, comment); final boolean result = inbox.addComment(plot, comment);
if (!result) { if (!result)
{
sendMessage(player, C.NO_PLOT_INBOX, ""); sendMessage(player, C.NO_PLOT_INBOX, "");
sendMessage(player, C.COMMENT_SYNTAX, StringMan.join(CommentManager.inboxes.keySet(),"|")); sendMessage(player, C.COMMENT_SYNTAX, StringMan.join(CommentManager.inboxes.keySet(), "|"));
return false; return false;
} }
for (PlotPlayer pp : UUIDHandler.getPlayers().values()) { for (final PlotPlayer pp : UUIDHandler.getPlayers().values())
if (pp.getAttribute("chatspy")) { {
if (pp.getAttribute("chatspy"))
{
MainUtil.sendMessage(pp, "/plot comment " + StringMan.join(args, " ")); MainUtil.sendMessage(pp, "/plot comment " + StringMan.join(args, " "));
} }
} }

View File

@ -36,42 +36,51 @@ import com.intellectualcrafters.plot.util.MathMan;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "condense", command = "condense",
permission = "plots.admin", permission = "plots.admin",
description = "Condense a plotworld", description = "Condense a plotworld",
category = CommandCategory.DEBUG, category = CommandCategory.DEBUG,
requiredType = RequiredType.CONSOLE requiredType = RequiredType.CONSOLE)
) public class Condense extends SubCommand
public class Condense extends SubCommand { {
public static boolean TASK = false; public static boolean TASK = false;
@Override @Override
public boolean onCommand(final PlotPlayer plr, String ... args) { public boolean onCommand(final PlotPlayer plr, final String... args)
if ((args.length != 2) && (args.length != 3)) { {
if ((args.length != 2) && (args.length != 3))
{
MainUtil.sendMessage(plr, "/plot condense <world> <start|stop|info> [radius]"); MainUtil.sendMessage(plr, "/plot condense <world> <start|stop|info> [radius]");
return false; return false;
} }
final String worldname = args[0]; final String worldname = args[0];
if (!BlockManager.manager.isWorld(worldname) || !PS.get().isPlotWorld(worldname)) { if (!BlockManager.manager.isWorld(worldname) || !PS.get().isPlotWorld(worldname))
{
MainUtil.sendMessage(plr, "INVALID WORLD"); MainUtil.sendMessage(plr, "INVALID WORLD");
return false; return false;
} }
switch (args[1].toLowerCase()) { switch (args[1].toLowerCase())
case "start": { {
if (args.length == 2) { case "start":
{
if (args.length == 2)
{
MainUtil.sendMessage(plr, "/plot condense " + worldname + " start <radius>"); MainUtil.sendMessage(plr, "/plot condense " + worldname + " start <radius>");
return false; return false;
} }
if (TASK) { if (TASK)
{
MainUtil.sendMessage(plr, "TASK ALREADY STARTED"); MainUtil.sendMessage(plr, "TASK ALREADY STARTED");
return false; return false;
} }
if (args.length == 2) { if (args.length == 2)
{
MainUtil.sendMessage(plr, "/plot condense " + worldname + " start <radius>"); MainUtil.sendMessage(plr, "/plot condense " + worldname + " start <radius>");
return false; return false;
} }
if (!MathMan.isInteger(args[2])) { if (!MathMan.isInteger(args[2]))
{
MainUtil.sendMessage(plr, "INVALID RADIUS"); MainUtil.sendMessage(plr, "INVALID RADIUS");
return false; return false;
} }
@ -79,61 +88,76 @@ public class Condense extends SubCommand {
final Collection<Plot> plots = PS.get().getPlotsInWorld(worldname); final Collection<Plot> plots = PS.get().getPlotsInWorld(worldname);
final int size = plots.size(); final int size = plots.size();
final int minimum_radius = (int) Math.ceil((Math.sqrt(size) / 2) + 1); final int minimum_radius = (int) Math.ceil((Math.sqrt(size) / 2) + 1);
if (radius < minimum_radius) { if (radius < minimum_radius)
{
MainUtil.sendMessage(plr, "RADIUS TOO SMALL"); MainUtil.sendMessage(plr, "RADIUS TOO SMALL");
return false; return false;
} }
final List<PlotId> to_move = new ArrayList<>(getPlots(plots, radius)); final List<PlotId> to_move = new ArrayList<>(getPlots(plots, radius));
final List<PlotId> free = new ArrayList<>(); final List<PlotId> free = new ArrayList<>();
PlotId start = new PlotId(0, 0); PlotId start = new PlotId(0, 0);
while ((start.x <= minimum_radius) && (start.y <= minimum_radius)) { while ((start.x <= minimum_radius) && (start.y <= minimum_radius))
{
final Plot plot = MainUtil.getPlot(worldname, start); final Plot plot = MainUtil.getPlot(worldname, start);
if (!plot.hasOwner()) { if (!plot.hasOwner())
{
free.add(plot.id); free.add(plot.id);
} }
start = Auto.getNextPlot(start, 1); start = Auto.getNextPlot(start, 1);
} }
if (free.size() == 0 || to_move.size() == 0) { if ((free.size() == 0) || (to_move.size() == 0))
{
MainUtil.sendMessage(plr, "NO FREE PLOTS FOUND"); MainUtil.sendMessage(plr, "NO FREE PLOTS FOUND");
return false; return false;
} }
MainUtil.move(MainUtil.getPlot(worldname, to_move.get(0)), MainUtil.getPlot(worldname, free.get(0)), new Runnable() { MainUtil.move(MainUtil.getPlot(worldname, to_move.get(0)), MainUtil.getPlot(worldname, free.get(0)), new Runnable()
{
@Override @Override
public void run() { public void run()
if (!TASK) { {
if (!TASK)
{
MainUtil.sendMessage(plr, "CONDENSE TASK CANCELLED"); MainUtil.sendMessage(plr, "CONDENSE TASK CANCELLED");
return; return;
} }
to_move.remove(0); to_move.remove(0);
free.remove(0); free.remove(0);
int index = 0; int index = 0;
for (final PlotId id : to_move) { for (final PlotId id : to_move)
{
final Plot plot = MainUtil.getPlot(worldname, id); final Plot plot = MainUtil.getPlot(worldname, id);
if (plot.hasOwner()) { if (plot.hasOwner())
{
break; break;
} }
index++; index++;
} }
for (int i = 0; i < index; i++) { for (int i = 0; i < index; i++)
{
to_move.remove(0); to_move.remove(0);
} }
index = 0; index = 0;
for (final PlotId id : free) { for (final PlotId id : free)
{
final Plot plot = MainUtil.getPlot(worldname, id); final Plot plot = MainUtil.getPlot(worldname, id);
if (!plot.hasOwner()) { if (!plot.hasOwner())
{
break; break;
} }
index++; index++;
} }
for (int i = 0; i < index; i++) { for (int i = 0; i < index; i++)
{
free.remove(0); free.remove(0);
} }
if (to_move.size() == 0) { if (to_move.size() == 0)
{
MainUtil.sendMessage(plr, "TASK COMPLETE. PLEASE VERIFY THAT NO NEW PLOTS HAVE BEEN CLAIMED DURING TASK."); MainUtil.sendMessage(plr, "TASK COMPLETE. PLEASE VERIFY THAT NO NEW PLOTS HAVE BEEN CLAIMED DURING TASK.");
TASK = false; TASK = false;
return; return;
} }
if (free.size() == 0) { if (free.size() == 0)
{
MainUtil.sendMessage(plr, "TASK FAILED. NO FREE PLOTS FOUND!"); MainUtil.sendMessage(plr, "TASK FAILED. NO FREE PLOTS FOUND!");
TASK = false; TASK = false;
return; return;
@ -146,8 +170,10 @@ public class Condense extends SubCommand {
MainUtil.sendMessage(plr, "TASK STARTED..."); MainUtil.sendMessage(plr, "TASK STARTED...");
return true; return true;
} }
case "stop": { case "stop":
if (!TASK) { {
if (!TASK)
{
MainUtil.sendMessage(plr, "TASK ALREADY STOPPED"); MainUtil.sendMessage(plr, "TASK ALREADY STOPPED");
return false; return false;
} }
@ -155,12 +181,15 @@ public class Condense extends SubCommand {
MainUtil.sendMessage(plr, "TASK STOPPED"); MainUtil.sendMessage(plr, "TASK STOPPED");
return true; return true;
} }
case "info": { case "info":
if (args.length == 2) { {
if (args.length == 2)
{
MainUtil.sendMessage(plr, "/plot condense " + worldname + " info <radius>"); MainUtil.sendMessage(plr, "/plot condense " + worldname + " info <radius>");
return false; return false;
} }
if (!MathMan.isInteger(args[2])) { if (!MathMan.isInteger(args[2]))
{
MainUtil.sendMessage(plr, "INVALID RADIUS"); MainUtil.sendMessage(plr, "INVALID RADIUS");
return false; return false;
} }
@ -168,7 +197,8 @@ public class Condense extends SubCommand {
final Collection<Plot> plots = PS.get().getPlotsInWorld(worldname); final Collection<Plot> plots = PS.get().getPlotsInWorld(worldname);
final int size = plots.size(); final int size = plots.size();
final int minimum_radius = (int) Math.ceil((Math.sqrt(size) / 2) + 1); final int minimum_radius = (int) Math.ceil((Math.sqrt(size) / 2) + 1);
if (radius < minimum_radius) { if (radius < minimum_radius)
{
MainUtil.sendMessage(plr, "RADIUS TOO SMALL"); MainUtil.sendMessage(plr, "RADIUS TOO SMALL");
return false; return false;
} }
@ -189,10 +219,13 @@ public class Condense extends SubCommand {
return false; return false;
} }
public Set<PlotId> getPlots(final Collection<Plot> plots, final int radius) { public Set<PlotId> getPlots(final Collection<Plot> plots, final int radius)
{
final HashSet<PlotId> outside = new HashSet<>(); final HashSet<PlotId> outside = new HashSet<>();
for (final Plot plot : plots) { for (final Plot plot : plots)
if ((plot.id.x > radius) || (plot.id.x < -radius) || (plot.id.y > radius) || (plot.id.y < -radius)) { {
if ((plot.id.x > radius) || (plot.id.x < -radius) || (plot.id.y > radius) || (plot.id.y < -radius))
{
outside.add(plot.id); outside.add(plot.id);
} }
} }

View File

@ -20,7 +20,6 @@
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
package com.intellectualcrafters.plot.commands; package com.intellectualcrafters.plot.commands;
import com.intellectualcrafters.plot.config.C; import com.intellectualcrafters.plot.config.C;
import com.intellectualcrafters.plot.object.CmdInstance; import com.intellectualcrafters.plot.object.CmdInstance;
import com.intellectualcrafters.plot.object.PlotPlayer; import com.intellectualcrafters.plot.object.PlotPlayer;
@ -30,26 +29,29 @@ import com.intellectualcrafters.plot.util.TaskManager;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "confirm", command = "confirm",
permission = "plots.use", permission = "plots.use",
description = "Confirm an action", description = "Confirm an action",
category = CommandCategory.ACTIONS category = CommandCategory.ACTIONS)
) public class Confirm extends SubCommand
public class Confirm extends SubCommand { {
@Override @Override
public boolean onCommand(final PlotPlayer plr, final String ... args) { public boolean onCommand(final PlotPlayer plr, final String... args)
CmdInstance command = CmdConfirm.getPending(plr); {
if (command == null) { final CmdInstance command = CmdConfirm.getPending(plr);
MainUtil.sendMessage(plr, C.FAILED_CONFIRM); if (command == null)
return false; {
} MainUtil.sendMessage(plr, C.FAILED_CONFIRM);
CmdConfirm.removePending(plr); return false;
if (System.currentTimeMillis() - command.timestamp > 20000) { }
MainUtil.sendMessage(plr, C.FAILED_CONFIRM); CmdConfirm.removePending(plr);
return false; if ((System.currentTimeMillis() - command.timestamp) > 20000)
} {
TaskManager.runTask(command.command); MainUtil.sendMessage(plr, C.FAILED_CONFIRM);
return true; return false;
}
TaskManager.runTask(command.command);
return true;
} }
} }

View File

@ -22,49 +22,46 @@ package com.intellectualcrafters.plot.commands;
import com.intellectualcrafters.plot.config.C; import com.intellectualcrafters.plot.config.C;
import com.intellectualcrafters.plot.config.Settings; import com.intellectualcrafters.plot.config.Settings;
import com.intellectualcrafters.plot.flag.Flag;
import com.intellectualcrafters.plot.flag.FlagManager; import com.intellectualcrafters.plot.flag.FlagManager;
import com.intellectualcrafters.plot.generator.HybridUtils;
import com.intellectualcrafters.plot.object.Location; import com.intellectualcrafters.plot.object.Location;
import com.intellectualcrafters.plot.object.Plot; import com.intellectualcrafters.plot.object.Plot;
import com.intellectualcrafters.plot.object.PlotAnalysis;
import com.intellectualcrafters.plot.object.PlotPlayer; import com.intellectualcrafters.plot.object.PlotPlayer;
import com.intellectualcrafters.plot.object.RunnableVal;
import com.intellectualcrafters.plot.util.BlockManager;
import com.intellectualcrafters.plot.util.MainUtil; import com.intellectualcrafters.plot.util.MainUtil;
import com.intellectualcrafters.plot.util.Permissions; import com.intellectualcrafters.plot.util.Permissions;
import com.intellectualcrafters.plot.util.UUIDHandler;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "continue", command = "continue",
description = "Continue a plot that was previously marked as done", description = "Continue a plot that was previously marked as done",
permission = "plots.continue", permission = "plots.continue",
category = CommandCategory.ACTIONS, category = CommandCategory.ACTIONS,
requiredType = RequiredType.NONE requiredType = RequiredType.NONE)
) public class Continue extends SubCommand
public class Continue extends SubCommand { {
@Override @Override
public boolean onCommand(final PlotPlayer plr, final String[] args) { public boolean onCommand(final PlotPlayer plr, final String[] args)
{
final Location loc = plr.getLocation(); final Location loc = plr.getLocation();
final Plot plot = MainUtil.getPlot(loc); final Plot plot = MainUtil.getPlot(loc);
if (plot == null || !plot.hasOwner()) { if ((plot == null) || !plot.hasOwner()) { return !sendMessage(plr, C.NOT_IN_PLOT); }
return !sendMessage(plr, C.NOT_IN_PLOT); if ((!plot.isOwner(plr.getUUID())) && !Permissions.hasPermission(plr, "plots.admin.command.continue"))
} {
if ((!plot.isOwner(plr.getUUID())) && !Permissions.hasPermission(plr, "plots.admin.command.continue")) {
MainUtil.sendMessage(plr, C.NO_PLOT_PERMS); MainUtil.sendMessage(plr, C.NO_PLOT_PERMS);
return false; return false;
} }
if (!plot.getSettings().flags.containsKey("done")) { if (!plot.getSettings().flags.containsKey("done"))
{
MainUtil.sendMessage(plr, C.DONE_NOT_DONE); MainUtil.sendMessage(plr, C.DONE_NOT_DONE);
return false; return false;
} }
if (Settings.DONE_COUNTS_TOWARDS_LIMIT && MainUtil.getAllowedPlots(plr) >= MainUtil.getPlayerPlotCount(plr)) { if (Settings.DONE_COUNTS_TOWARDS_LIMIT && (MainUtil.getAllowedPlots(plr) >= MainUtil.getPlayerPlotCount(plr)))
{
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.admin.command.continue"); MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.admin.command.continue");
return false; return false;
} }
if (MainUtil.runners.containsKey(plot)) { if (MainUtil.runners.containsKey(plot))
{
MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER); MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER);
return false; return false;
} }

View File

@ -31,53 +31,61 @@ import com.plotsquared.general.commands.Argument;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "copy", command = "copy",
permission = "plots.copy", permission = "plots.copy",
aliases = {"copypaste"}, aliases = { "copypaste" },
category = CommandCategory.ACTIONS, category = CommandCategory.ACTIONS,
description = "Copy a plot", description = "Copy a plot",
usage = "/plot copy <X;Z>", usage = "/plot copy <X;Z>",
requiredType = RequiredType.NONE requiredType = RequiredType.NONE)
) public class Copy extends SubCommand
public class Copy extends SubCommand { {
public Copy() { public Copy()
{
requiredArguments = new Argument[] { requiredArguments = new Argument[] {
Argument.PlotID Argument.PlotID
}; };
} }
@Override @Override
public boolean onCommand(final PlotPlayer plr, final String ... args) { public boolean onCommand(final PlotPlayer plr, final String... args)
{
final Location loc = plr.getLocation(); final Location loc = plr.getLocation();
final Plot plot1 = MainUtil.getPlot(loc); final Plot plot1 = MainUtil.getPlot(loc);
if (plot1 == null) { if (plot1 == null) { return !MainUtil.sendMessage(plr, C.NOT_IN_PLOT); }
return !MainUtil.sendMessage(plr, C.NOT_IN_PLOT); if (!plot1.isAdded(plr.getUUID()) && !Permissions.hasPermission(plr, C.PERMISSION_ADMIN.s()))
} {
if (!plot1.isAdded(plr.getUUID()) && !Permissions.hasPermission(plr, C.PERMISSION_ADMIN.s())) {
MainUtil.sendMessage(plr, C.NO_PLOT_PERMS); MainUtil.sendMessage(plr, C.NO_PLOT_PERMS);
return false; return false;
} }
final String world = loc.getWorld(); final String world = loc.getWorld();
final PlotId plot2 = MainUtil.parseId(args[0]); final PlotId plot2 = MainUtil.parseId(args[0]);
if ((plot2 == null)) { if ((plot2 == null))
{
MainUtil.sendMessage(plr, C.NOT_VALID_PLOT_ID); MainUtil.sendMessage(plr, C.NOT_VALID_PLOT_ID);
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot copy <X;Z>"); MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot copy <X;Z>");
return false; return false;
} }
if (plot1.id.equals(plot2)) { if (plot1.id.equals(plot2))
{
MainUtil.sendMessage(plr, C.NOT_VALID_PLOT_ID); MainUtil.sendMessage(plr, C.NOT_VALID_PLOT_ID);
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot copy <X;Z>"); MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot copy <X;Z>");
return false; return false;
} }
if (MainUtil.copy(world, plot1.id, plot2, new Runnable() { if (MainUtil.copy(world, plot1.id, plot2, new Runnable()
{
@Override @Override
public void run() { public void run()
{
MainUtil.sendMessage(plr, C.COPY_SUCCESS); MainUtil.sendMessage(plr, C.COPY_SUCCESS);
} }
})) { }))
{
return true; return true;
} else { }
else
{
MainUtil.sendMessage(plr, C.REQUIRES_UNOWNED); MainUtil.sendMessage(plr, C.REQUIRES_UNOWNED);
return false; return false;
} }

View File

@ -31,26 +31,23 @@ import com.intellectualcrafters.plot.util.MainUtil;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "createroadschematic", command = "createroadschematic",
aliases = {"crs"}, aliases = { "crs" },
category = CommandCategory.DEBUG, category = CommandCategory.DEBUG,
requiredType = RequiredType.NONE, requiredType = RequiredType.NONE,
permission = "plots.createroadschematic", permission = "plots.createroadschematic",
description = "Add a road schematic to your world using the roads around your current plot", description = "Add a road schematic to your world using the roads around your current plot",
usage = "/plot createroadschematic" usage = "/plot createroadschematic")
) public class CreateRoadSchematic extends SubCommand
public class CreateRoadSchematic extends SubCommand { {
@Override @Override
public boolean onCommand(final PlotPlayer player, final String ... args) { public boolean onCommand(final PlotPlayer player, final String... args)
{
final Location loc = player.getLocation(); final Location loc = player.getLocation();
final Plot plot = MainUtil.getPlot(loc); final Plot plot = MainUtil.getPlot(loc);
if (plot == null) { if (plot == null) { return sendMessage(player, C.NOT_IN_PLOT); }
return sendMessage(player, C.NOT_IN_PLOT); if (!(PS.get().getPlotWorld(loc.getWorld()) instanceof HybridPlotWorld)) { return sendMessage(player, C.NOT_IN_PLOT_WORLD); }
}
if (!(PS.get().getPlotWorld(loc.getWorld()) instanceof HybridPlotWorld)) {
return sendMessage(player, C.NOT_IN_PLOT_WORLD);
}
HybridUtils.manager.setupRoadSchematic(plot); HybridUtils.manager.setupRoadSchematic(plot);
MainUtil.sendMessage(player, "&6Saved new road schematic. To test the road, fly to a few other plots and use /plot debugroadregen"); MainUtil.sendMessage(player, "&6Saved new road schematic. To test the road, fly to a few other plots and use /plot debugroadregen");
return true; return true;

View File

@ -3,12 +3,10 @@ package com.intellectualcrafters.plot.commands;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashSet;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import com.intellectualcrafters.plot.PS; import com.intellectualcrafters.plot.PS;
import com.intellectualcrafters.plot.config.Settings;
import com.intellectualcrafters.plot.database.DBFunc; import com.intellectualcrafters.plot.database.DBFunc;
import com.intellectualcrafters.plot.database.MySQL; import com.intellectualcrafters.plot.database.MySQL;
import com.intellectualcrafters.plot.database.SQLManager; import com.intellectualcrafters.plot.database.SQLManager;
@ -21,35 +19,45 @@ import com.intellectualcrafters.plot.util.TaskManager;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "database", command = "database",
aliases = {"convert"}, aliases = { "convert" },
category = CommandCategory.DEBUG, category = CommandCategory.DEBUG,
permission = "plots.database", permission = "plots.database",
description = "Convert/Backup Storage", description = "Convert/Backup Storage",
requiredType = RequiredType.CONSOLE, requiredType = RequiredType.CONSOLE,
usage = "/plots database [world] <sqlite|mysql|import>" usage = "/plots database [world] <sqlite|mysql|import>"
)
public class Database extends SubCommand {
public static void insertPlots(final SQLManager manager, final ArrayList<Plot> plots, final PlotPlayer player) { )
TaskManager.runTaskAsync(new Runnable() { public class Database extends SubCommand
{
public static void insertPlots(final SQLManager manager, final ArrayList<Plot> plots, final PlotPlayer player)
{
TaskManager.runTaskAsync(new Runnable()
{
@Override @Override
public void run() { public void run()
try { {
try
{
final ArrayList<Plot> ps = new ArrayList<>(); final ArrayList<Plot> ps = new ArrayList<>();
for (final Plot p : plots) { for (final Plot p : plots)
{
ps.add(p); ps.add(p);
} }
MainUtil.sendMessage(player, "&6Starting..."); MainUtil.sendMessage(player, "&6Starting...");
manager.createPlotsAndData(ps, new Runnable() { manager.createPlotsAndData(ps, new Runnable()
{
@Override @Override
public void run() { public void run()
{
MainUtil.sendMessage(player, "&6Database conversion finished!"); MainUtil.sendMessage(player, "&6Database conversion finished!");
manager.close(); manager.close();
} }
}); });
} catch (final Exception e) { }
catch (final Exception e)
{
MainUtil.sendMessage(player, "Failed to insert plot objects, see stacktrace for info"); MainUtil.sendMessage(player, "Failed to insert plot objects, see stacktrace for info");
e.printStackTrace(); e.printStackTrace();
} }
@ -58,42 +66,54 @@ public class Database extends SubCommand {
} }
@Override @Override
public boolean onCommand(final PlotPlayer player, String[] args) { public boolean onCommand(final PlotPlayer player, String[] args)
if (args.length < 1) { {
if (args.length < 1)
{
MainUtil.sendMessage(player, "/plot database [world] <sqlite|mysql>"); MainUtil.sendMessage(player, "/plot database [world] <sqlite|mysql>");
return false; return false;
} }
ArrayList<Plot> plots; ArrayList<Plot> plots;
if (PS.get().isPlotWorld(args[0])) { if (PS.get().isPlotWorld(args[0]))
{
plots = PS.get().sortPlotsByTemp(PS.get().getPlotsInWorld(args[0])); plots = PS.get().sortPlotsByTemp(PS.get().getPlotsInWorld(args[0]));
args = Arrays.copyOfRange(args, 1, args.length); args = Arrays.copyOfRange(args, 1, args.length);
} }
else { else
{
plots = PS.get().sortPlotsByTemp(PS.get().getPlotsRaw()); plots = PS.get().sortPlotsByTemp(PS.get().getPlotsRaw());
} }
if (args.length < 1) { if (args.length < 1)
{
MainUtil.sendMessage(player, "/plot database [world] <sqlite|mysql|import>"); MainUtil.sendMessage(player, "/plot database [world] <sqlite|mysql|import>");
MainUtil.sendMessage(player, "[arg] indicates an optional argument"); MainUtil.sendMessage(player, "[arg] indicates an optional argument");
return false; return false;
} }
try { try
{
com.intellectualcrafters.plot.database.Database implementation; com.intellectualcrafters.plot.database.Database implementation;
String prefix = ""; String prefix = "";
switch (args[0].toLowerCase()) { switch (args[0].toLowerCase())
case "import": { {
if (args.length < 2) { case "import":
{
if (args.length < 2)
{
MainUtil.sendMessage(player, "/plot database import [sqlite file] [prefix]"); MainUtil.sendMessage(player, "/plot database import [sqlite file] [prefix]");
return false; return false;
} }
MainUtil.sendMessage(player, "&6Starting..."); MainUtil.sendMessage(player, "&6Starting...");
implementation = new SQLite(PS.get().IMP.getDirectory() + File.separator + args[1] + ".db"); implementation = new SQLite(PS.get().IMP.getDirectory() + File.separator + args[1] + ".db");
SQLManager manager = new SQLManager(implementation, (args.length == 3) ? args[2] : "", true); final SQLManager manager = new SQLManager(implementation, (args.length == 3) ? args[2] : "", true);
ConcurrentHashMap<String, ConcurrentHashMap<PlotId, Plot>> map = manager.getPlots(); final ConcurrentHashMap<String, ConcurrentHashMap<PlotId, Plot>> map = manager.getPlots();
plots = new ArrayList<Plot>(); plots = new ArrayList<Plot>();
for (Entry<String, ConcurrentHashMap<PlotId, Plot>> entry : map.entrySet()) { for (final Entry<String, ConcurrentHashMap<PlotId, Plot>> entry : map.entrySet())
for (Entry<PlotId, Plot> entry2 : entry.getValue().entrySet()) { {
Plot plot = entry2.getValue(); for (final Entry<PlotId, Plot> entry2 : entry.getValue().entrySet())
if (PS.get().getPlot(plot.world, plot.id) != null) { {
final Plot plot = entry2.getValue();
if (PS.get().getPlot(plot.world, plot.id) != null)
{
MainUtil.sendMessage(player, "Skipping duplicate plot: " + plot + " | id=" + plot.temp); MainUtil.sendMessage(player, "Skipping duplicate plot: " + plot + " | id=" + plot.temp);
continue; continue;
} }
@ -101,43 +121,44 @@ public class Database extends SubCommand {
plots.add(entry2.getValue()); plots.add(entry2.getValue());
} }
} }
DBFunc.createPlotsAndData(plots, new Runnable() { DBFunc.createPlotsAndData(plots, new Runnable()
{
@Override @Override
public void run() { public void run()
{
MainUtil.sendMessage(player, "&6Database conversion finished!"); MainUtil.sendMessage(player, "&6Database conversion finished!");
} }
}); });
return true; return true;
} }
case "mysql": case "mysql":
if (args.length < 6) { if (args.length < 6) { return MainUtil.sendMessage(player, "/plot database mysql [host] [port] [username] [password] [database] {prefix}"); }
return MainUtil.sendMessage(player, "/plot database mysql [host] [port] [username] [password] [database] {prefix}");
}
final String host = args[1]; final String host = args[1];
final String port = args[2]; final String port = args[2];
final String username = args[3]; final String username = args[3];
final String password = args[4]; final String password = args[4];
final String database = args[5]; final String database = args[5];
if (args.length > 6) { if (args.length > 6)
{
prefix = args[6]; prefix = args[6];
} }
implementation = new MySQL(host, port, database, username, password); implementation = new MySQL(host, port, database, username, password);
break; break;
case "sqlite": case "sqlite":
if (args.length < 2) { if (args.length < 2) { return MainUtil.sendMessage(player, "/plot database sqlite [file]"); }
return MainUtil.sendMessage(player, "/plot database sqlite [file]");
}
implementation = new SQLite(PS.get().IMP.getDirectory() + File.separator + args[1] + ".db"); implementation = new SQLite(PS.get().IMP.getDirectory() + File.separator + args[1] + ".db");
break; break;
default: default:
return MainUtil.sendMessage(player, "/plot database [sqlite/mysql]"); return MainUtil.sendMessage(player, "/plot database [sqlite/mysql]");
} }
try { try
{
final SQLManager manager = new SQLManager(implementation, prefix, true); final SQLManager manager = new SQLManager(implementation, prefix, true);
insertPlots(manager, plots, player); insertPlots(manager, plots, player);
return true; return true;
} }
catch (Exception e) { catch (final Exception e)
{
MainUtil.sendMessage(player, "$1Failed to save plots, read stacktrace for info"); MainUtil.sendMessage(player, "$1Failed to save plots, read stacktrace for info");
MainUtil.sendMessage(player, "&d==== Here is an ugly stacktrace, if you are interested in those things ==="); MainUtil.sendMessage(player, "&d==== Here is an ugly stacktrace, if you are interested in those things ===");
e.printStackTrace(); e.printStackTrace();
@ -146,7 +167,8 @@ public class Database extends SubCommand {
return false; return false;
} }
} }
catch (Exception e) { catch (final Exception e)
{
MainUtil.sendMessage(player, "$1Failed to open connection, read stacktrace for info"); MainUtil.sendMessage(player, "$1Failed to open connection, read stacktrace for info");
MainUtil.sendMessage(player, "&d==== Here is an ugly stacktrace, if you are interested in those things ==="); MainUtil.sendMessage(player, "&d==== Here is an ugly stacktrace, if you are interested in those things ===");
e.printStackTrace(); e.printStackTrace();

View File

@ -28,19 +28,22 @@ import com.intellectualcrafters.plot.util.MainUtil;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "debug", command = "debug",
category = CommandCategory.DEBUG, category = CommandCategory.DEBUG,
description = "Show debug information", description = "Show debug information",
usage = "/plot debug [msg]", usage = "/plot debug [msg]",
permission = "plots.admin" permission = "plots.admin")
) public class Debug extends SubCommand
public class Debug extends SubCommand { {
@Override @Override
public boolean onCommand(PlotPlayer plr, String[] args) { public boolean onCommand(final PlotPlayer plr, final String[] args)
if ((args.length > 0) && args[0].equalsIgnoreCase("msg")) { {
if ((args.length > 0) && args[0].equalsIgnoreCase("msg"))
{
final StringBuilder msg = new StringBuilder(); final StringBuilder msg = new StringBuilder();
for (final C c : C.values()) { for (final C c : C.values())
{
msg.append(c.s()).append("\n"); msg.append(c.s()).append("\n");
} }
MainUtil.sendMessage(plr, msg.toString()); MainUtil.sendMessage(plr, msg.toString());
@ -56,7 +59,8 @@ public class Debug extends SubCommand {
} }
{ {
final StringBuilder worlds = new StringBuilder(""); final StringBuilder worlds = new StringBuilder("");
for (final String world : PS.get().getPlotWorlds()) { for (final String world : PS.get().getPlotWorlds())
{
worlds.append(world).append(" "); worlds.append(world).append(" ");
} }
information.append(header); information.append(header);
@ -77,11 +81,13 @@ public class Debug extends SubCommand {
return true; return true;
} }
private String getSection(final String line, final String val) { private String getSection(final String line, final String val)
{
return line.replaceAll("%val%", val) + "\n"; return line.replaceAll("%val%", val) + "\n";
} }
private String getLine(final String line, final String var, final Object val) { private String getLine(final String line, final String var, final Object val)
{
return line.replaceAll("%var%", var).replaceAll("%val%", "" + val) + "\n"; return line.replaceAll("%var%", var).replaceAll("%val%", "" + val) + "\n";
} }
} }

View File

@ -9,24 +9,28 @@ import com.intellectualcrafters.plot.object.PlotPlayer;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "debugallowunsafe", command = "debugallowunsafe",
description = "Allow unsafe actions until toggled off", description = "Allow unsafe actions until toggled off",
usage = "/plot debugallowunsafe", usage = "/plot debugallowunsafe",
category = CommandCategory.DEBUG, category = CommandCategory.DEBUG,
requiredType = RequiredType.NONE, requiredType = RequiredType.NONE,
permission = "plots.debugallowunsafe" permission = "plots.debugallowunsafe")
) public class DebugAllowUnsafe extends SubCommand
public class DebugAllowUnsafe extends SubCommand { {
public static final List<UUID> unsafeAllowed = new ArrayList<>(); public static final List<UUID> unsafeAllowed = new ArrayList<>();
@Override @Override
public boolean onCommand(final PlotPlayer plr, final String ... args) { public boolean onCommand(final PlotPlayer plr, final String... args)
{
if (unsafeAllowed.contains(plr.getUUID())) {
if (unsafeAllowed.contains(plr.getUUID()))
{
unsafeAllowed.remove(plr.getUUID()); unsafeAllowed.remove(plr.getUUID());
sendMessage(plr, C.DEBUGALLOWUNSAFE_OFF); sendMessage(plr, C.DEBUGALLOWUNSAFE_OFF);
} else { }
else
{
unsafeAllowed.add(plr.getUUID()); unsafeAllowed.add(plr.getUUID());
sendMessage(plr, C.DEBUGALLOWUNSAFE_ON); sendMessage(plr, C.DEBUGALLOWUNSAFE_ON);
} }

View File

@ -43,25 +43,29 @@ import com.intellectualcrafters.plot.util.UUIDHandler;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "debugclaimtest", command = "debugclaimtest",
description = "If you accidentally delete your database, this command will attempt to restore all plots based on the data from plot sighs. Execution time may vary", description = "If you accidentally delete your database, this command will attempt to restore all plots based on the data from plot sighs. Execution time may vary",
category = CommandCategory.DEBUG, category = CommandCategory.DEBUG,
requiredType = RequiredType.CONSOLE, requiredType = RequiredType.CONSOLE,
permission = "plots.debugclaimtest" permission = "plots.debugclaimtest")
) public class DebugClaimTest extends SubCommand
public class DebugClaimTest extends SubCommand { {
public static boolean claimPlot(final PlotPlayer player, final Plot plot, final boolean teleport) { public static boolean claimPlot(final PlotPlayer player, final Plot plot, final boolean teleport)
{
return claimPlot(player, plot, teleport, ""); return claimPlot(player, plot, teleport, "");
} }
public static boolean claimPlot(final PlotPlayer player, final Plot plot, final boolean teleport, final String schematic) { public static boolean claimPlot(final PlotPlayer player, final Plot plot, final boolean teleport, final String schematic)
{
final boolean result = EventUtil.manager.callClaim(player, plot, false); final boolean result = EventUtil.manager.callClaim(player, plot, false);
if (result) { if (result)
{
MainUtil.createPlot(player.getUUID(), plot); MainUtil.createPlot(player.getUUID(), plot);
MainUtil.setSign(player.getName(), plot); MainUtil.setSign(player.getName(), plot);
MainUtil.sendMessage(player, C.CLAIMED); MainUtil.sendMessage(player, C.CLAIMED);
if (teleport) { if (teleport)
{
MainUtil.teleportPlayer(player, player.getLocation(), plot); MainUtil.teleportPlayer(player, player.getLocation(), plot);
} }
} }
@ -69,81 +73,103 @@ public class DebugClaimTest extends SubCommand {
} }
@Override @Override
public boolean onCommand(PlotPlayer plr, String[] args) { public boolean onCommand(final PlotPlayer plr, final String[] args)
if (args.length < 3) { {
return !MainUtil.sendMessage(null, "If you accidentally delete your database, this command will attempt to restore all plots based on the data from the plot signs. \n\n&cMissing world arg /plot debugclaimtest {world} {PlotId min} {PlotId max}"); if (args.length < 3) { return !MainUtil
} .sendMessage(
null,
"If you accidentally delete your database, this command will attempt to restore all plots based on the data from the plot signs. \n\n&cMissing world arg /plot debugclaimtest {world} {PlotId min} {PlotId max}"); }
final String world = args[0]; final String world = args[0];
if (!BlockManager.manager.isWorld(world) || !PS.get().isPlotWorld(world)) { if (!BlockManager.manager.isWorld(world) || !PS.get().isPlotWorld(world)) { return !MainUtil.sendMessage(null, "&cInvalid plot world!"); }
return !MainUtil.sendMessage(null, "&cInvalid plot world!");
}
PlotId min, max; PlotId min, max;
try { try
final String[] split1 = args[1].split(";"); {
final String[] split2 = args[2].split(";"); args[1].split(";");
args[2].split(";");
min = PlotId.fromString(args[1]); min = PlotId.fromString(args[1]);
max = PlotId.fromString(args[2]); max = PlotId.fromString(args[2]);
} catch (final Exception e) { }
return !MainUtil.sendMessage(null, "&cInvalid min/max values. &7The values are to Plot IDs in the format &cX;Y &7where X;Y are the plot coords\nThe conversion will only check the plots in the selected area."); catch (final Exception e)
{
return !MainUtil.sendMessage(null,
"&cInvalid min/max values. &7The values are to Plot IDs in the format &cX;Y &7where X;Y are the plot coords\nThe conversion will only check the plots in the selected area.");
} }
MainUtil.sendMessage(null, "&3Sign Block&8->&3PlotSquared&8: &7Beginning sign to plot conversion. This may take a while..."); MainUtil.sendMessage(null, "&3Sign Block&8->&3PlotSquared&8: &7Beginning sign to plot conversion. This may take a while...");
MainUtil.sendMessage(null, "&3Sign Block&8->&3PlotSquared&8: Found an excess of 250,000 chunks. Limiting search radius... (~3.8 min)"); MainUtil.sendMessage(null, "&3Sign Block&8->&3PlotSquared&8: Found an excess of 250,000 chunks. Limiting search radius... (~3.8 min)");
final PlotManager manager = PS.get().getPlotManager(world); final PlotManager manager = PS.get().getPlotManager(world);
final PlotWorld plotworld = PS.get().getPlotWorld(world); final PlotWorld plotworld = PS.get().getPlotWorld(world);
final ArrayList<Plot> plots = new ArrayList<>(); final ArrayList<Plot> plots = new ArrayList<>();
for (final PlotId id : MainUtil.getPlotSelectionIds(min, max)) { for (final PlotId id : MainUtil.getPlotSelectionIds(min, max))
{
final Plot plot = MainUtil.getPlot(world, id); final Plot plot = MainUtil.getPlot(world, id);
if (PS.get().getPlot(world, plot.id) != null) { if (PS.get().getPlot(world, plot.id) != null)
{
MainUtil.sendMessage(null, " - &cDB Already contains: " + plot.id); MainUtil.sendMessage(null, " - &cDB Already contains: " + plot.id);
continue; continue;
} }
final Location loc = manager.getSignLoc(plotworld, plot); final Location loc = manager.getSignLoc(plotworld, plot);
final ChunkLoc chunk = new ChunkLoc(loc.getX() >> 4, loc.getZ() >> 4); final ChunkLoc chunk = new ChunkLoc(loc.getX() >> 4, loc.getZ() >> 4);
final boolean result = ChunkManager.manager.loadChunk(world, chunk, false); final boolean result = ChunkManager.manager.loadChunk(world, chunk, false);
if (!result) { if (!result)
{
continue; continue;
} }
final String[] lines = BlockManager.manager.getSign(loc); final String[] lines = BlockManager.manager.getSign(loc);
if (lines != null) { if (lines != null)
{
String line = lines[2]; String line = lines[2];
if ((line != null) && (line.length() > 2)) { if ((line != null) && (line.length() > 2))
{
line = line.substring(2); line = line.substring(2);
final BiMap<StringWrapper, UUID> map = UUIDHandler.getUuidMap(); final BiMap<StringWrapper, UUID> map = UUIDHandler.getUuidMap();
UUID uuid = (map.get(new StringWrapper(line))); UUID uuid = (map.get(new StringWrapper(line)));
if (uuid == null) { if (uuid == null)
for (final StringWrapper string : map.keySet()) { {
if (string.value.toLowerCase().startsWith(line.toLowerCase())) { for (final StringWrapper string : map.keySet())
{
if (string.value.toLowerCase().startsWith(line.toLowerCase()))
{
uuid = map.get(string); uuid = map.get(string);
break; break;
} }
} }
} }
if (uuid == null) { if (uuid == null)
{
uuid = UUIDHandler.getUUID(line, null); uuid = UUIDHandler.getUUID(line, null);
} }
if (uuid != null) { if (uuid != null)
{
MainUtil.sendMessage(null, " - &aFound plot: " + plot.id + " : " + line); MainUtil.sendMessage(null, " - &aFound plot: " + plot.id + " : " + line);
plot.owner = uuid; plot.owner = uuid;
plots.add(plot); plots.add(plot);
} else { }
else
{
MainUtil.sendMessage(null, " - &cInvalid playername: " + plot.id + " : " + line); MainUtil.sendMessage(null, " - &cInvalid playername: " + plot.id + " : " + line);
} }
} }
} }
} }
if (plots.size() > 0) { if (plots.size() > 0)
{
MainUtil.sendMessage(null, "&3Sign Block&8->&3PlotSquared&8: &7Updating '" + plots.size() + "' plots!"); MainUtil.sendMessage(null, "&3Sign Block&8->&3PlotSquared&8: &7Updating '" + plots.size() + "' plots!");
DBFunc.createPlotsAndData(plots, new Runnable() { DBFunc.createPlotsAndData(plots, new Runnable()
{
@Override @Override
public void run() { public void run()
{
MainUtil.sendMessage(null, "&6Database update finished!"); MainUtil.sendMessage(null, "&6Database update finished!");
} }
}); });
for (final Plot plot : plots) { for (final Plot plot : plots)
{
PS.get().updatePlot(plot); PS.get().updatePlot(plot);
} }
MainUtil.sendMessage(null, "&3Sign Block&8->&3PlotSquared&8: &7Complete!"); MainUtil.sendMessage(null, "&3Sign Block&8->&3PlotSquared&8: &7Complete!");
} else { }
else
{
MainUtil.sendMessage(null, "No plots were found for the given search."); MainUtil.sendMessage(null, "No plots were found for the given search.");
} }
return true; return true;

View File

@ -33,36 +33,34 @@ import com.intellectualcrafters.plot.util.UUIDHandler;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "debugclear", command = "debugclear",
aliases = {"fastclear"}, aliases = { "fastclear" },
description = "Clear a plot using a fast experiment algorithm", description = "Clear a plot using a fast experiment algorithm",
category = CommandCategory.DEBUG category = CommandCategory.DEBUG)
) public class DebugClear extends SubCommand
public class DebugClear extends SubCommand { {
@Override @Override
public boolean onCommand(final PlotPlayer plr, String[] args) { public boolean onCommand(final PlotPlayer plr, final String[] args)
{
final Location loc = plr.getLocation(); final Location loc = plr.getLocation();
final Plot plot = MainUtil.getPlot(loc); final Plot plot = MainUtil.getPlot(loc);
if ((plot == null) || !(PS.get().getPlotWorld(loc.getWorld()) instanceof SquarePlotWorld)) { if ((plot == null) || !(PS.get().getPlotWorld(loc.getWorld()) instanceof SquarePlotWorld)) { return sendMessage(plr, C.NOT_IN_PLOT); }
return sendMessage(plr, C.NOT_IN_PLOT); if (!MainUtil.getTopPlot(plot).equals(MainUtil.getBottomPlot(plot))) { return sendMessage(plr, C.UNLINK_REQUIRED); }
} if ((!plot.hasOwner() || !plot.isOwner(UUIDHandler.getUUID(plr))) && !Permissions.hasPermission(plr, "plots.admin.command.debugclear")) { return sendMessage(plr, C.NO_PLOT_PERMS); }
if (!MainUtil.getTopPlot(plot).equals(MainUtil.getBottomPlot(plot))) {
return sendMessage(plr, C.UNLINK_REQUIRED);
}
if ((!plot.hasOwner() || !plot.isOwner(UUIDHandler.getUUID(plr))) && !Permissions.hasPermission(plr, "plots.admin.command.debugclear")) {
return sendMessage(plr, C.NO_PLOT_PERMS);
}
final Location pos1 = MainUtil.getPlotBottomLoc(loc.getWorld(), plot.id).add(1, 0, 1); final Location pos1 = MainUtil.getPlotBottomLoc(loc.getWorld(), plot.id).add(1, 0, 1);
final Location pos2 = MainUtil.getPlotTopLoc(loc.getWorld(), plot.id); final Location pos2 = MainUtil.getPlotTopLoc(loc.getWorld(), plot.id);
if (MainUtil.runners.containsKey(plot)) { if (MainUtil.runners.containsKey(plot))
{
MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER); MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER);
return false; return false;
} }
MainUtil.runners.put(plot, 1); MainUtil.runners.put(plot, 1);
ChunkManager.manager.regenerateRegion(pos1, pos2, new Runnable() { ChunkManager.manager.regenerateRegion(pos1, pos2, new Runnable()
{
@Override @Override
public void run() { public void run()
{
MainUtil.runners.remove(plot); MainUtil.runners.remove(plot);
MainUtil.sendMessage(plr, "&aDone!"); MainUtil.sendMessage(plr, "&aDone!");
} }

View File

@ -65,7 +65,6 @@ import com.intellectualcrafters.plot.util.EventUtil;
import com.intellectualcrafters.plot.util.ExpireManager; import com.intellectualcrafters.plot.util.ExpireManager;
import com.intellectualcrafters.plot.util.MainUtil; import com.intellectualcrafters.plot.util.MainUtil;
import com.intellectualcrafters.plot.util.MathMan; import com.intellectualcrafters.plot.util.MathMan;
import com.intellectualcrafters.plot.util.Permissions;
import com.intellectualcrafters.plot.util.SchematicHandler; import com.intellectualcrafters.plot.util.SchematicHandler;
import com.intellectualcrafters.plot.util.SetupUtils; import com.intellectualcrafters.plot.util.SetupUtils;
import com.intellectualcrafters.plot.util.StringMan; import com.intellectualcrafters.plot.util.StringMan;
@ -73,61 +72,67 @@ import com.intellectualcrafters.plot.util.TaskManager;
import com.intellectualcrafters.plot.util.UUIDHandler; import com.intellectualcrafters.plot.util.UUIDHandler;
import com.plotsquared.bukkit.util.BukkitHybridUtils; import com.plotsquared.bukkit.util.BukkitHybridUtils;
import com.plotsquared.general.commands.Command; import com.plotsquared.general.commands.Command;
import com.plotsquared.general.commands.CommandCaller;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "debugexec", command = "debugexec",
permission = "plots.admin", permission = "plots.admin",
description = "Mutli-purpose debug command", description = "Mutli-purpose debug command",
aliases = {"exec"}, aliases = { "exec" },
category = CommandCategory.DEBUG category = CommandCategory.DEBUG)
) public class DebugExec extends SubCommand
public class DebugExec extends SubCommand { {
private ScriptEngine engine; private ScriptEngine engine;
private Bindings scope; private Bindings scope;
public DebugExec() { public DebugExec()
try { {
File file = new File(PS.get().IMP.getDirectory(), "scripts" + File.separator + "start.js"); try
if (file.exists()) { {
final File file = new File(PS.get().IMP.getDirectory(), "scripts" + File.separator + "start.js");
if (file.exists())
{
init(); init();
String script = StringMan.join(Files.readLines(new File(new File(PS.get().IMP.getDirectory() + File.separator + "scripts"), "start.js"), StandardCharsets.UTF_8), System.getProperty("line.separator")); final String script = StringMan.join(Files.readLines(new File(new File(PS.get().IMP.getDirectory() + File.separator + "scripts"), "start.js"), StandardCharsets.UTF_8),
scope.put("THIS", this); System.getProperty("line.separator"));
scope.put("PlotPlayer", ConsolePlayer.getConsole()); scope.put("THIS", this);
engine.eval(script, scope); scope.put("PlotPlayer", ConsolePlayer.getConsole());
engine.eval(script, scope);
} }
} catch (Exception e) {
} }
catch (final Exception e)
{}
} }
public ScriptEngine getEngine() { public ScriptEngine getEngine()
{
return engine; return engine;
} }
public Bindings getScope() { public Bindings getScope()
{
return scope; return scope;
} }
public void init() { public void init()
if (engine != null) { {
return; if (engine != null) { return; }
}
engine = (new ScriptEngineManager(null)).getEngineByName("nashorn"); engine = (new ScriptEngineManager(null)).getEngineByName("nashorn");
if (engine == null) { if (engine == null)
{
engine = (new ScriptEngineManager(null)).getEngineByName("JavaScript"); engine = (new ScriptEngineManager(null)).getEngineByName("JavaScript");
} }
ScriptContext context = new SimpleScriptContext(); final ScriptContext context = new SimpleScriptContext();
scope = context.getBindings(ScriptContext.ENGINE_SCOPE); scope = context.getBindings(ScriptContext.ENGINE_SCOPE);
// stuff // stuff
scope.put("MainUtil", new MainUtil()); scope.put("MainUtil", new MainUtil());
scope.put("Settings", new Settings()); scope.put("Settings", new Settings());
scope.put("StringMan", new StringMan()); scope.put("StringMan", new StringMan());
scope.put("MathMan", new MathMan()); scope.put("MathMan", new MathMan());
scope.put("FlagManager", new FlagManager()); scope.put("FlagManager", new FlagManager());
// Classes // Classes
scope.put("Location", Location.class); scope.put("Location", Location.class);
scope.put("PlotBlock", PlotBlock.class); scope.put("PlotBlock", PlotBlock.class);
@ -135,7 +140,7 @@ public class DebugExec extends SubCommand {
scope.put("PlotId", PlotId.class); scope.put("PlotId", PlotId.class);
scope.put("Runnable", Runnable.class); scope.put("Runnable", Runnable.class);
scope.put("RunnableVal", RunnableVal.class); scope.put("RunnableVal", RunnableVal.class);
// Instances // Instances
scope.put("PS", PS.get()); scope.put("PS", PS.get());
scope.put("TaskManager", PS.get().TASK); scope.put("TaskManager", PS.get().TASK);
@ -152,112 +157,143 @@ public class DebugExec extends SubCommand {
scope.put("HybridUtils", HybridUtils.manager); scope.put("HybridUtils", HybridUtils.manager);
scope.put("IMP", PS.get().IMP); scope.put("IMP", PS.get().IMP);
scope.put("MainCommand", MainCommand.getInstance()); scope.put("MainCommand", MainCommand.getInstance());
// enums // enums
for (Enum<?> value : C.values()) { for (final Enum<?> value : C.values())
{
scope.put("C_" + value.name(), value); scope.put("C_" + value.name(), value);
} }
} }
@Override @Override
public boolean onCommand(final PlotPlayer player, String... args) { public boolean onCommand(final PlotPlayer player, final String... args)
{
final List<String> allowed_params = Arrays.asList("calibrate-analysis", "remove-flag", "stop-expire", "start-expire", "show-expired", "update-expired", "seen", "trim-check"); final List<String> allowed_params = Arrays.asList("calibrate-analysis", "remove-flag", "stop-expire", "start-expire", "show-expired", "update-expired", "seen", "trim-check");
if (args.length > 0) { if (args.length > 0)
{
final String arg = args[0].toLowerCase(); final String arg = args[0].toLowerCase();
String script; String script;
boolean async = false; boolean async = false;
switch (arg) { switch (arg)
case "analyze": { {
Plot plot = MainUtil.getPlot(player.getLocation()); case "analyze":
if (plot == null) { {
final Plot plot = MainUtil.getPlot(player.getLocation());
if (plot == null)
{
MainUtil.sendMessage(player, C.NOT_IN_PLOT); MainUtil.sendMessage(player, C.NOT_IN_PLOT);
return false; return false;
} }
PlotAnalysis analysis = plot.getComplexity(); final PlotAnalysis analysis = plot.getComplexity();
if (analysis != null) { if (analysis != null)
int complexity = analysis.getComplexity(); {
final int complexity = analysis.getComplexity();
MainUtil.sendMessage(player, "Changes: " + analysis.changes); MainUtil.sendMessage(player, "Changes: " + analysis.changes);
MainUtil.sendMessage(player, "Complexity: " + complexity); MainUtil.sendMessage(player, "Complexity: " + complexity);
return true; return true;
} }
MainUtil.sendMessage(player, "$1Starting task..."); MainUtil.sendMessage(player, "$1Starting task...");
HybridUtils.manager.analyzePlot(plot, new RunnableVal<PlotAnalysis>() { HybridUtils.manager.analyzePlot(plot, new RunnableVal<PlotAnalysis>()
{
@Override @Override
public void run() { public void run()
{
MainUtil.sendMessage(player, "$1Done: $2use $3/plot debugexec analyze$2 for more information"); MainUtil.sendMessage(player, "$1Done: $2use $3/plot debugexec analyze$2 for more information");
} }
}); });
return true; return true;
} }
case "calibrate-analysis": { case "calibrate-analysis":
if (args.length != 2) { {
if (args.length != 2)
{
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot debugexec analyze <threshold>"); MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot debugexec analyze <threshold>");
MainUtil.sendMessage(player, "$1<threshold> $2= $1The percentage of plots you want to clear (100 clears 100% of plots so no point calibrating it)"); MainUtil.sendMessage(player, "$1<threshold> $2= $1The percentage of plots you want to clear (100 clears 100% of plots so no point calibrating it)");
return false; return false;
} }
double threshold; double threshold;
try { try
{
threshold = Integer.parseInt(args[1]) / 100d; threshold = Integer.parseInt(args[1]) / 100d;
} }
catch (NumberFormatException e) { catch (final NumberFormatException e)
{
MainUtil.sendMessage(player, "$2Invalid threshold: " + args[1]); MainUtil.sendMessage(player, "$2Invalid threshold: " + args[1]);
MainUtil.sendMessage(player, "$1<threshold> $2= $1The percentage of plots you want to clear as a number between 0 - 100"); MainUtil.sendMessage(player, "$1<threshold> $2= $1The percentage of plots you want to clear as a number between 0 - 100");
return false; return false;
} }
PlotAnalysis.calcOptimalModifiers(new Runnable() { PlotAnalysis.calcOptimalModifiers(new Runnable()
{
@Override @Override
public void run() { public void run()
{
MainUtil.sendMessage(player, "$1Thank you for calibrating PlotSquared plot expiry"); MainUtil.sendMessage(player, "$1Thank you for calibrating PlotSquared plot expiry");
} }
}, threshold); }, threshold);
return true; return true;
} }
case "stop-expire": { case "stop-expire":
if (ExpireManager.task != -1) { {
if (ExpireManager.task != -1)
{
PS.get().TASK.cancelTask(ExpireManager.task); PS.get().TASK.cancelTask(ExpireManager.task);
} else { }
else
{
return MainUtil.sendMessage(player, "Task already halted"); return MainUtil.sendMessage(player, "Task already halted");
} }
ExpireManager.task = -1; ExpireManager.task = -1;
return MainUtil.sendMessage(player, "Cancelled task."); return MainUtil.sendMessage(player, "Cancelled task.");
} }
case "remove-flag": { case "remove-flag":
if (args.length != 2) { {
if (args.length != 2)
{
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot debugexec remove-flag <flag>"); MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot debugexec remove-flag <flag>");
return false; return false;
} }
String flag = args[1]; final String flag = args[1];
for (Plot plot : PS.get().getPlots()) { for (final Plot plot : PS.get().getPlots())
if (FlagManager.getPlotFlag(plot, flag) != null) { {
if (FlagManager.getPlotFlag(plot, flag) != null)
{
FlagManager.removePlotFlag(plot, flag); FlagManager.removePlotFlag(plot, flag);
} }
} }
return MainUtil.sendMessage(player, "Cleared flag: " + flag); return MainUtil.sendMessage(player, "Cleared flag: " + flag);
} }
case "start-rgar": { case "start-rgar":
if (args.length != 2) { {
if (args.length != 2)
{
MainUtil.sendMessage(player, "&cInvalid syntax: /plot debugexec start-rgar <world>"); MainUtil.sendMessage(player, "&cInvalid syntax: /plot debugexec start-rgar <world>");
return false; return false;
} }
boolean result; boolean result;
if (!PS.get().isPlotWorld(args[1])) { if (!PS.get().isPlotWorld(args[1]))
{
MainUtil.sendMessage(player, C.NOT_VALID_PLOT_WORLD, args[1]); MainUtil.sendMessage(player, C.NOT_VALID_PLOT_WORLD, args[1]);
return false; return false;
} }
if (BukkitHybridUtils.regions != null) { if (HybridUtils.regions != null)
result = ((BukkitHybridUtils)(HybridUtils.manager)).scheduleRoadUpdate(args[1], BukkitHybridUtils.regions, 0); {
result = ((BukkitHybridUtils) (HybridUtils.manager)).scheduleRoadUpdate(args[1], HybridUtils.regions, 0);
} }
else { else
{
result = HybridUtils.manager.scheduleRoadUpdate(args[1], 0); result = HybridUtils.manager.scheduleRoadUpdate(args[1], 0);
} }
if (!result) { if (!result)
{
MainUtil.sendMessage(player, "&cCannot schedule mass schematic update! (Is one already in progress?)"); MainUtil.sendMessage(player, "&cCannot schedule mass schematic update! (Is one already in progress?)");
return false; return false;
} }
return true; return true;
} }
case "stop-rgar": { case "stop-rgar":
if (!HybridUtils.UPDATE) { {
if (!HybridUtils.UPDATE)
{
MainUtil.sendMessage(player, "&cTASK NOT RUNNING!"); MainUtil.sendMessage(player, "&cTASK NOT RUNNING!");
return false; return false;
} }
@ -265,55 +301,53 @@ public class DebugExec extends SubCommand {
MainUtil.sendMessage(player, "&cCancelling task... (please wait)"); MainUtil.sendMessage(player, "&cCancelling task... (please wait)");
return true; return true;
} }
case "start-expire": { case "start-expire":
if (ExpireManager.task == -1) { {
if (ExpireManager.task == -1)
{
ExpireManager.runTask(); ExpireManager.runTask();
} else { }
else
{
return MainUtil.sendMessage(player, "Plot expiry task already started"); return MainUtil.sendMessage(player, "Plot expiry task already started");
} }
return MainUtil.sendMessage(player, "Started plot expiry task"); return MainUtil.sendMessage(player, "Started plot expiry task");
} }
case "update-expired": { case "update-expired":
if (args.length > 1) { {
if (args.length > 1)
{
final String world = args[1]; final String world = args[1];
if (!BlockManager.manager.isWorld(world)) { if (!BlockManager.manager.isWorld(world)) { return MainUtil.sendMessage(player, "Invalid world: " + args[1]); }
return MainUtil.sendMessage(player, "Invalid world: " + args[1]);
}
MainUtil.sendMessage(player, "Updating expired plot list"); MainUtil.sendMessage(player, "Updating expired plot list");
ExpireManager.updateExpired(args[1]); ExpireManager.updateExpired(args[1]);
return true; return true;
} }
return MainUtil.sendMessage(player, "Use /plot debugexec update-expired <world>"); return MainUtil.sendMessage(player, "Use /plot debugexec update-expired <world>");
} }
case "show-expired": { case "show-expired":
if (args.length > 1) { {
if (args.length > 1)
{
final String world = args[1]; final String world = args[1];
if (!BlockManager.manager.isWorld(world)) { if (!BlockManager.manager.isWorld(world)) { return MainUtil.sendMessage(player, "Invalid world: " + args[1]); }
return MainUtil.sendMessage(player, "Invalid world: " + args[1]); if (!ExpireManager.expiredPlots.containsKey(args[1])) { return MainUtil.sendMessage(player, "No task for world: " + args[1]); }
}
if (!ExpireManager.expiredPlots.containsKey(args[1])) {
return MainUtil.sendMessage(player, "No task for world: " + args[1]);
}
MainUtil.sendMessage(player, "Expired plots (" + ExpireManager.expiredPlots.get(args[1]).size() + "):"); MainUtil.sendMessage(player, "Expired plots (" + ExpireManager.expiredPlots.get(args[1]).size() + "):");
for (final Plot plot : ExpireManager.expiredPlots.get(args[1])) { for (final Plot plot : ExpireManager.expiredPlots.get(args[1]))
{
MainUtil.sendMessage(player, " - " + plot.world + ";" + plot.id.x + ";" + plot.id.y + ";" + UUIDHandler.getName(plot.owner) + " : " + ExpireManager.dates.get(plot.owner)); MainUtil.sendMessage(player, " - " + plot.world + ";" + plot.id.x + ";" + plot.id.y + ";" + UUIDHandler.getName(plot.owner) + " : " + ExpireManager.dates.get(plot.owner));
} }
return true; return true;
} }
return MainUtil.sendMessage(player, "Use /plot debugexec show-expired <world>"); return MainUtil.sendMessage(player, "Use /plot debugexec show-expired <world>");
} }
case "seen": { case "seen":
if (args.length != 2) { {
return MainUtil.sendMessage(player, "Use /plot debugexec seen <player>"); if (args.length != 2) { return MainUtil.sendMessage(player, "Use /plot debugexec seen <player>"); }
}
final UUID uuid = UUIDHandler.getUUID(args[1], null); final UUID uuid = UUIDHandler.getUUID(args[1], null);
if (uuid == null) { if (uuid == null) { return MainUtil.sendMessage(player, "player not found: " + args[1]); }
return MainUtil.sendMessage(player, "player not found: " + args[1]);
}
final OfflinePlotPlayer op = UUIDHandler.getUUIDWrapper().getOfflinePlayer(uuid); final OfflinePlotPlayer op = UUIDHandler.getUUIDWrapper().getOfflinePlayer(uuid);
if ((op == null) || (op.getLastPlayed() == 0)) { if ((op == null) || (op.getLastPlayed() == 0)) { return MainUtil.sendMessage(player, "player hasn't connected before: " + args[1]); }
return MainUtil.sendMessage(player, "player hasn't connected before: " + args[1]);
}
final Timestamp stamp = new Timestamp(op.getLastPlayed()); final Timestamp stamp = new Timestamp(op.getLastPlayed());
final Date date = new Date(stamp.getTime()); final Date date = new Date(stamp.getTime());
MainUtil.sendMessage(player, "PLAYER: " + args[1]); MainUtil.sendMessage(player, "PLAYER: " + args[1]);
@ -323,34 +357,40 @@ public class DebugExec extends SubCommand {
MainUtil.sendMessage(player, "Local: " + date.toLocaleString()); MainUtil.sendMessage(player, "Local: " + date.toLocaleString());
return true; return true;
} }
case "trim-check": { case "trim-check":
if (args.length != 2) { {
if (args.length != 2)
{
MainUtil.sendMessage(player, "Use /plot debugexec trim-check <world>"); MainUtil.sendMessage(player, "Use /plot debugexec trim-check <world>");
MainUtil.sendMessage(player, "&7 - Generates a list of regions to trim"); MainUtil.sendMessage(player, "&7 - Generates a list of regions to trim");
return MainUtil.sendMessage(player, "&7 - Run after plot expiry has run"); return MainUtil.sendMessage(player, "&7 - Run after plot expiry has run");
} }
final String world = args[1]; final String world = args[1];
if (!BlockManager.manager.isWorld(world) || !PS.get().isPlotWorld(args[1])) { if (!BlockManager.manager.isWorld(world) || !PS.get().isPlotWorld(args[1])) { return MainUtil.sendMessage(player, "Invalid world: " + args[1]); }
return MainUtil.sendMessage(player, "Invalid world: " + args[1]);
}
final ArrayList<ChunkLoc> empty = new ArrayList<>(); final ArrayList<ChunkLoc> empty = new ArrayList<>();
final boolean result = Trim.getTrimRegions(empty, world, new Runnable() { final boolean result = Trim.getTrimRegions(empty, world, new Runnable()
{
@Override @Override
public void run() { public void run()
{
Trim.sendMessage("Processing is complete! Here's how many chunks would be deleted:"); Trim.sendMessage("Processing is complete! Here's how many chunks would be deleted:");
Trim.sendMessage(" - MCA #: " + empty.size()); Trim.sendMessage(" - MCA #: " + empty.size());
Trim.sendMessage(" - CHUNKS: " + (empty.size() * 1024) + " (max)"); Trim.sendMessage(" - CHUNKS: " + (empty.size() * 1024) + " (max)");
Trim.sendMessage("Exporting log for manual approval..."); Trim.sendMessage("Exporting log for manual approval...");
final File file = new File(PS.get().IMP.getDirectory() + File.separator + "trim.txt"); final File file = new File(PS.get().IMP.getDirectory() + File.separator + "trim.txt");
PrintWriter writer; PrintWriter writer;
try { try
{
writer = new PrintWriter(file); writer = new PrintWriter(file);
for (final ChunkLoc loc : empty) { for (final ChunkLoc loc : empty)
{
writer.println(world + "/region/r." + loc.x + "." + loc.z + ".mca"); writer.println(world + "/region/r." + loc.x + "." + loc.z + ".mca");
} }
writer.close(); writer.close();
Trim.sendMessage("File saved to 'plugins/PlotSquared/trim.txt'"); Trim.sendMessage("File saved to 'plugins/PlotSquared/trim.txt'");
} catch (final FileNotFoundException e) { }
catch (final FileNotFoundException e)
{
e.printStackTrace(); e.printStackTrace();
Trim.sendMessage("File failed to save! :("); Trim.sendMessage("File failed to save! :(");
} }
@ -360,7 +400,8 @@ public class DebugExec extends SubCommand {
Trim.sendMessage(" - Add 31 to each number to get the end position"); Trim.sendMessage(" - Add 31 to each number to get the end position");
} }
}); });
if (!result) { if (!result)
{
MainUtil.sendMessage(player, "Trim task already started!"); MainUtil.sendMessage(player, "Trim task already started!");
} }
return result; return result;
@ -368,90 +409,120 @@ public class DebugExec extends SubCommand {
case "h": case "h":
case "he": case "he":
case "?": case "?":
case "help": { case "help":
{
MainUtil.sendMessage(player, "Possible sub commands: /plot debugexec <" + StringMan.join(allowed_params, "|") + ">"); MainUtil.sendMessage(player, "Possible sub commands: /plot debugexec <" + StringMan.join(allowed_params, "|") + ">");
return false; return false;
} }
case "addcmd": { case "addcmd":
try { {
final String cmd = StringMan.join(Files.readLines(new File(new File(PS.get().IMP.getDirectory() + File.separator + "scripts"), args[1]), StandardCharsets.UTF_8), System.getProperty("line.separator")); try
Command<PlotPlayer> subcommand = new Command<PlotPlayer>(args[1].split("\\.")[0]) { {
@Override final String cmd = StringMan.join(Files.readLines(new File(new File(PS.get().IMP.getDirectory() + File.separator + "scripts"), args[1]), StandardCharsets.UTF_8),
public boolean onCommand(PlotPlayer plr, String[] args) { System.getProperty("line.separator"));
try { final Command<PlotPlayer> subcommand = new Command<PlotPlayer>(args[1].split("\\.")[0])
scope.put("PlotPlayer", plr); {
scope.put("args", args); @Override
engine.eval(cmd, scope); public boolean onCommand(final PlotPlayer plr, final String[] args)
return true; {
} catch (ScriptException e) { try
e.printStackTrace(); {
MainUtil.sendMessage(player, C.COMMAND_WENT_WRONG); scope.put("PlotPlayer", plr);
return false; scope.put("args", args);
engine.eval(cmd, scope);
return true;
}
catch (final ScriptException e)
{
e.printStackTrace();
MainUtil.sendMessage(player, C.COMMAND_WENT_WRONG);
return false;
}
} }
} };
}; MainCommand.getInstance().addCommand(subcommand);
MainCommand.getInstance().addCommand(subcommand); return true;
return true;
} }
catch (Exception e) { catch (final Exception e)
{
e.printStackTrace(); e.printStackTrace();
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot debugexec addcmd <file>"); MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot debugexec addcmd <file>");
return false; return false;
} }
} }
case "runasync": { case "runasync":
{
async = true; async = true;
} }
case "run": { case "run":
try { {
script = StringMan.join(Files.readLines(new File(new File(PS.get().IMP.getDirectory() + File.separator + "scripts"), args[1]), StandardCharsets.UTF_8), System.getProperty("line.separator")); try
if (args.length > 2) { {
HashMap<String, String> replacements = new HashMap<>(); script = StringMan.join(Files.readLines(new File(new File(PS.get().IMP.getDirectory() + File.separator + "scripts"), args[1]), StandardCharsets.UTF_8),
for (int i = 2; i < args.length; i++) { System.getProperty("line.separator"));
replacements.put("%s" + (i-2), args[i]); if (args.length > 2)
{
final HashMap<String, String> replacements = new HashMap<>();
for (int i = 2; i < args.length; i++)
{
replacements.put("%s" + (i - 2), args[i]);
} }
script = StringMan.replaceFromMap(script, replacements); script = StringMan.replaceFromMap(script, replacements);
} }
} catch (IOException e) { }
catch (final IOException e)
{
e.printStackTrace(); e.printStackTrace();
return false; return false;
} }
break; break;
} }
default: { default:
{
script = StringMan.join(args, " "); script = StringMan.join(args, " ");
} }
} }
if (!ConsolePlayer.isConsole(player)) { if (!ConsolePlayer.isConsole(player))
{
MainUtil.sendMessage(player, C.NOT_CONSOLE); MainUtil.sendMessage(player, C.NOT_CONSOLE);
return false; return false;
} }
init(); init();
scope.put("PlotPlayer", player); scope.put("PlotPlayer", player);
PS.debug("> " + script); PS.debug("> " + script);
try { try
if (async) { {
if (async)
{
final String toExec = script; final String toExec = script;
TaskManager.runTaskAsync(new Runnable() { TaskManager.runTaskAsync(new Runnable()
{
@Override @Override
public void run() { public void run()
long start = System.currentTimeMillis(); {
try { final long start = System.currentTimeMillis();
try
{
engine.eval(toExec, scope); engine.eval(toExec, scope);
} catch (ScriptException e) { }
catch (final ScriptException e)
{
e.printStackTrace(); e.printStackTrace();
} }
PS.log("> " + (System.currentTimeMillis() - start) + "ms"); PS.log("> " + (System.currentTimeMillis() - start) + "ms");
} }
}); });
} }
else { else
long start = System.currentTimeMillis(); {
final long start = System.currentTimeMillis();
engine.eval(script, scope); engine.eval(script, scope);
PS.log("> " + (System.currentTimeMillis() - start) + "ms"); PS.log("> " + (System.currentTimeMillis() - start) + "ms");
} }
return true; return true;
} catch (ScriptException e) { }
catch (final ScriptException e)
{
e.printStackTrace(); e.printStackTrace();
return false; return false;
} }

View File

@ -32,36 +32,39 @@ import com.intellectualcrafters.plot.util.TaskManager;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "fill", command = "fill",
permission = "plots.fill", permission = "plots.fill",
description = "Fill or surround a plot in bedrock", description = "Fill or surround a plot in bedrock",
usage = "/plot fill", usage = "/plot fill",
aliases = {"debugfill"}, aliases = { "debugfill" },
category = CommandCategory.DEBUG, category = CommandCategory.DEBUG,
requiredType = RequiredType.NONE requiredType = RequiredType.NONE)
) public class DebugFill extends SubCommand
public class DebugFill extends SubCommand { {
@Override @Override
public boolean onCommand(final PlotPlayer player, final String ... args) { public boolean onCommand(final PlotPlayer player, final String... args)
if (args.length != 1 || (!args[0].equalsIgnoreCase("outline") && !args[0].equalsIgnoreCase("all"))) { {
if ((args.length != 1) || (!args[0].equalsIgnoreCase("outline") && !args[0].equalsIgnoreCase("all")))
{
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot fill <outline|all>"); MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot fill <outline|all>");
return true; return true;
} }
final Location loc = player.getLocation(); final Location loc = player.getLocation();
final Plot plot = MainUtil.getPlot(loc); final Plot plot = MainUtil.getPlot(loc);
if (plot == null) { if (plot == null) { return !sendMessage(player, C.NOT_IN_PLOT); }
return !sendMessage(player, C.NOT_IN_PLOT); if (!plot.hasOwner())
} {
if (!plot.hasOwner()) {
MainUtil.sendMessage(player, C.PLOT_UNOWNED); MainUtil.sendMessage(player, C.PLOT_UNOWNED);
return false; return false;
} }
if (!plot.isOwner(player.getUUID()) && !Permissions.hasPermission(player, "plots.admin.command.fill")) { if (!plot.isOwner(player.getUUID()) && !Permissions.hasPermission(player, "plots.admin.command.fill"))
{
MainUtil.sendMessage(player, C.NO_PLOT_PERMS); MainUtil.sendMessage(player, C.NO_PLOT_PERMS);
return true; return true;
} }
if (MainUtil.runners.containsKey(plot)) { if (MainUtil.runners.containsKey(plot))
{
MainUtil.sendMessage(player, C.WAIT_FOR_TIMER); MainUtil.sendMessage(player, C.WAIT_FOR_TIMER);
return false; return false;
} }
@ -69,89 +72,119 @@ public class DebugFill extends SubCommand {
final Location top = MainUtil.getPlotTopLoc(plot.world, plot.id); final Location top = MainUtil.getPlotTopLoc(plot.world, plot.id);
MainUtil.sendMessage(player, "&cPreparing task"); MainUtil.sendMessage(player, "&cPreparing task");
MainUtil.runners.put(plot, 1); MainUtil.runners.put(plot, 1);
SetBlockQueue.addNotify(new Runnable() { SetBlockQueue.addNotify(new Runnable()
{
@Override @Override
public void run() { public void run()
TaskManager.runTaskAsync(new Runnable() { {
TaskManager.runTaskAsync(new Runnable()
{
@Override @Override
public void run() { public void run()
{
MainUtil.sendMessage(player, "&7 - Starting"); MainUtil.sendMessage(player, "&7 - Starting");
if (args[0].equalsIgnoreCase("all")) { if (args[0].equalsIgnoreCase("all"))
{
int height = 255; int height = 255;
PlotBlock block = new PlotBlock((short) 7, (byte) 0); PlotBlock block = new PlotBlock((short) 7, (byte) 0);
PlotBlock air = new PlotBlock((short) 0, (byte) 0); final PlotBlock air = new PlotBlock((short) 0, (byte) 0);
if (args.length > 2) { if (args.length > 2)
try { {
try
{
block = new PlotBlock(Short.parseShort(args[1]), (byte) 0); block = new PlotBlock(Short.parseShort(args[1]), (byte) 0);
if (args.length == 3) { if (args.length == 3)
{
height = Integer.parseInt(args[2]); height = Integer.parseInt(args[2]);
} }
} }
catch (Exception e) { catch (final Exception e)
{
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot fill all <id> <height>"); MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot fill all <id> <height>");
MainUtil.runners.remove(plot); MainUtil.runners.remove(plot);
return; return;
} }
} }
for (int y = 0; y <= height; y++) { for (int y = 0; y <= height; y++)
for (int x = bottom.getX(); x <= top.getX(); x++) { {
for (int z = bottom.getZ(); z <= top.getZ(); z++) { for (int x = bottom.getX(); x <= top.getX(); x++)
{
for (int z = bottom.getZ(); z <= top.getZ(); z++)
{
SetBlockQueue.setBlock(plot.world, x, y, z, block); SetBlockQueue.setBlock(plot.world, x, y, z, block);
} }
} }
} }
for (int y = height + 1; y <= 255; y++) { for (int y = height + 1; y <= 255; y++)
for (int x = bottom.getX(); x <= top.getX(); x++) { {
for (int z = bottom.getZ(); z <= top.getZ(); z++) { for (int x = bottom.getX(); x <= top.getX(); x++)
{
for (int z = bottom.getZ(); z <= top.getZ(); z++)
{
SetBlockQueue.setBlock(plot.world, x, y, z, air); SetBlockQueue.setBlock(plot.world, x, y, z, air);
} }
} }
} }
SetBlockQueue.addNotify(new Runnable() { SetBlockQueue.addNotify(new Runnable()
{
@Override @Override
public void run() { public void run()
{
MainUtil.runners.remove(plot); MainUtil.runners.remove(plot);
MainUtil.sendMessage(player, "&aFill task complete!"); MainUtil.sendMessage(player, "&aFill task complete!");
} }
}); });
} }
else if (args[0].equals("outline")) { else if (args[0].equals("outline"))
{
int x, z; int x, z;
z = bottom.getZ(); z = bottom.getZ();
for (x = bottom.getX(); x <= (top.getX() - 1); x++) { for (x = bottom.getX(); x <= (top.getX() - 1); x++)
for (int y = 1; y <= 255; y++) { {
for (int y = 1; y <= 255; y++)
{
SetBlockQueue.setBlock(plot.world, x, y, z, 7); SetBlockQueue.setBlock(plot.world, x, y, z, 7);
} }
} }
x = top.getX(); x = top.getX();
for (z = bottom.getZ(); z <= (top.getZ() - 1); z++) { for (z = bottom.getZ(); z <= (top.getZ() - 1); z++)
for (int y = 1; y <= 255; y++) { {
for (int y = 1; y <= 255; y++)
{
SetBlockQueue.setBlock(plot.world, x, y, z, 7); SetBlockQueue.setBlock(plot.world, x, y, z, 7);
} }
} }
z = top.getZ(); z = top.getZ();
for (x = top.getX(); x >= (bottom.getX() + 1); x--) { for (x = top.getX(); x >= (bottom.getX() + 1); x--)
for (int y = 1; y <= 255; y++) { {
for (int y = 1; y <= 255; y++)
{
SetBlockQueue.setBlock(plot.world, x, y, z, 7); SetBlockQueue.setBlock(plot.world, x, y, z, 7);
} }
} }
x = bottom.getX(); x = bottom.getX();
for (z = top.getZ(); z >= (bottom.getZ() + 1); z--) { for (z = top.getZ(); z >= (bottom.getZ() + 1); z--)
for (int y = 1; y <= 255; y++) { {
for (int y = 1; y <= 255; y++)
{
SetBlockQueue.setBlock(plot.world, x, y, z, 7); SetBlockQueue.setBlock(plot.world, x, y, z, 7);
} }
} }
SetBlockQueue.addNotify(new Runnable() { SetBlockQueue.addNotify(new Runnable()
{
@Override @Override
public void run() { public void run()
{
MainUtil.sendMessage(player, "&aWalls complete! The ceiling will take a while :("); MainUtil.sendMessage(player, "&aWalls complete! The ceiling will take a while :(");
bottom.setY(255); bottom.setY(255);
top.add(1,0,1); top.add(1, 0, 1);
SetBlockQueue.setSlow(true); SetBlockQueue.setSlow(true);
MainUtil.setSimpleCuboidAsync(plot.world, bottom, top, new PlotBlock((short) 7, (byte) 0)); MainUtil.setSimpleCuboidAsync(plot.world, bottom, top, new PlotBlock((short) 7, (byte) 0));
SetBlockQueue.addNotify(new Runnable() { SetBlockQueue.addNotify(new Runnable()
{
@Override @Override
public void run() { public void run()
{
MainUtil.runners.remove(plot); MainUtil.runners.remove(plot);
MainUtil.sendMessage(player, "&aFill task complete!"); MainUtil.sendMessage(player, "&aFill task complete!");
SetBlockQueue.setSlow(false); SetBlockQueue.setSlow(false);

View File

@ -37,40 +37,47 @@ import com.plotsquared.general.commands.Argument;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "debugfixflags", command = "debugfixflags",
usage = "/plot debugfixflags <world>", usage = "/plot debugfixflags <world>",
permission = "plots.debugfixflags", permission = "plots.debugfixflags",
description = "Attempt to fix all flags for a world", description = "Attempt to fix all flags for a world",
requiredType = RequiredType.CONSOLE, requiredType = RequiredType.CONSOLE,
category = CommandCategory.DEBUG category = CommandCategory.DEBUG)
) public class DebugFixFlags extends SubCommand
public class DebugFixFlags extends SubCommand { {
public DebugFixFlags() { public DebugFixFlags()
{
requiredArguments = new Argument[] { requiredArguments = new Argument[] {
Argument.String Argument.String
}; };
} }
@Override @Override
public boolean onCommand(PlotPlayer plr, String[] args) { public boolean onCommand(final PlotPlayer plr, final String[] args)
{
final String world = args[0]; final String world = args[0];
if (!BlockManager.manager.isWorld(world) || !PS.get().isPlotWorld(world)) { if (!BlockManager.manager.isWorld(world) || !PS.get().isPlotWorld(world))
{
MainUtil.sendMessage(plr, C.NOT_VALID_PLOT_WORLD, args[0]); MainUtil.sendMessage(plr, C.NOT_VALID_PLOT_WORLD, args[0]);
return false; return false;
} }
MainUtil.sendMessage(plr, "&8--- &6Starting task &8 ---"); MainUtil.sendMessage(plr, "&8--- &6Starting task &8 ---");
for (final Plot plot : PS.get().getPlotsInWorld(world)) { for (final Plot plot : PS.get().getPlotsInWorld(world))
{
final HashMap<String, Flag> flags = plot.getSettings().flags; final HashMap<String, Flag> flags = plot.getSettings().flags;
Iterator<Entry<String, Flag>> i = flags.entrySet().iterator(); final Iterator<Entry<String, Flag>> i = flags.entrySet().iterator();
boolean changed = false; boolean changed = false;
while (i.hasNext()) { while (i.hasNext())
if (FlagManager.getFlag(i.next().getKey()) == null) { {
if (FlagManager.getFlag(i.next().getKey()) == null)
{
changed = true; changed = true;
i.remove(); i.remove();
} }
} }
if (changed) { if (changed)
{
DBFunc.setFlags(plot, plot.getSettings().flags.values()); DBFunc.setFlags(plot, plot.getSettings().flags.values());
} }
} }

View File

@ -28,22 +28,26 @@ import com.intellectualcrafters.plot.object.PlotPlayer;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "debugloadtest", command = "debugloadtest",
permission = "plots.debugloadtest", permission = "plots.debugloadtest",
description = "This debug command will force the reload of all plots in the DB", description = "This debug command will force the reload of all plots in the DB",
usage = "/plot debugloadtest", usage = "/plot debugloadtest",
category = CommandCategory.DEBUG, category = CommandCategory.DEBUG,
requiredType = RequiredType.CONSOLE requiredType = RequiredType.CONSOLE)
) public class DebugLoadTest extends SubCommand
public class DebugLoadTest extends SubCommand { {
@Override @Override
public boolean onCommand(PlotPlayer plr, String[] args) { public boolean onCommand(final PlotPlayer plr, final String[] args)
try { {
try
{
final Field fPlots = PS.class.getDeclaredField("plots"); final Field fPlots = PS.class.getDeclaredField("plots");
fPlots.setAccessible(true); fPlots.setAccessible(true);
fPlots.set(null, DBFunc.getPlots()); fPlots.set(null, DBFunc.getPlots());
} catch (final Exception e) { }
catch (final Exception e)
{
PS.debug("&3===FAILED&3==="); PS.debug("&3===FAILED&3===");
e.printStackTrace(); e.printStackTrace();
PS.debug("&3===END OF STACKTRACE==="); PS.debug("&3===END OF STACKTRACE===");

View File

@ -15,30 +15,37 @@ import com.plotsquared.bukkit.BukkitMain;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "debugpaste", command = "debugpaste",
aliases = {"dp"}, aliases = { "dp" },
usage = "/plot debugpaste", usage = "/plot debugpaste",
description = "Upload settings.yml & latest.log to hastebin", description = "Upload settings.yml & latest.log to hastebin",
permission = "plots.debugpaste", permission = "plots.debugpaste",
category = CommandCategory.DEBUG category = CommandCategory.DEBUG)
) public class DebugPaste extends SubCommand
public class DebugPaste extends SubCommand { {
@Override @Override
public boolean onCommand(final PlotPlayer plr, String[] args) { public boolean onCommand(final PlotPlayer plr, final String[] args)
TaskManager.runTaskAsync(new Runnable() { {
TaskManager.runTaskAsync(new Runnable()
{
@Override @Override
public void run() { public void run()
try { {
String settingsYML = HastebinUtility.upload(PS.get().configFile); try
{
final String settingsYML = HastebinUtility.upload(PS.get().configFile);
String latestLOG; String latestLOG;
try { try
{
latestLOG = HastebinUtility.upload(new File(BukkitMain.THIS.getDirectory(), "../../logs/latest.log")); latestLOG = HastebinUtility.upload(new File(BukkitMain.THIS.getDirectory(), "../../logs/latest.log"));
} catch(final Exception e) { }
catch (final Exception e)
{
plr.sendMessage("&clatest.log is too big to be pasted, will ignore"); plr.sendMessage("&clatest.log is too big to be pasted, will ignore");
latestLOG = "too big :("; latestLOG = "too big :(";
} }
StringBuilder b = new StringBuilder(); final StringBuilder b = new StringBuilder();
b.append("# Welcome to this paste\n# It is meant to provide us at IntellectualSites with better information about your problem\n\n# We will start with some informational files\n"); b.append("# Welcome to this paste\n# It is meant to provide us at IntellectualSites with better information about your problem\n\n# We will start with some informational files\n");
b.append("links.settings_yml: '").append(settingsYML).append("'\n"); b.append("links.settings_yml: '").append(settingsYML).append("'\n");
b.append("links.latest_log: '").append(latestLOG).append("'\n"); b.append("links.latest_log: '").append(latestLOG).append("'\n");
@ -47,11 +54,12 @@ public class DebugPaste extends SubCommand {
b.append("version.bukkit: '").append(Bukkit.getBukkitVersion()).append("'\n"); b.append("version.bukkit: '").append(Bukkit.getBukkitVersion()).append("'\n");
b.append("online_mode: ").append(Bukkit.getServer().getOnlineMode()).append("\n"); b.append("online_mode: ").append(Bukkit.getServer().getOnlineMode()).append("\n");
b.append("plugins:"); b.append("plugins:");
for (final Plugin p : Bukkit.getPluginManager().getPlugins()) { for (final Plugin p : Bukkit.getPluginManager().getPlugins())
{
b.append("\n ").append(p.getName()).append(":\n ").append("version: '").append(p.getDescription().getVersion()).append("'").append("\n enabled: ").append(p.isEnabled()); b.append("\n ").append(p.getName()).append(":\n ").append("version: '").append(p.getDescription().getVersion()).append("'").append("\n enabled: ").append(p.isEnabled());
} }
b.append("\n\n# YAY! Now, let's see what we can find in your JVM\n"); b.append("\n\n# YAY! Now, let's see what we can find in your JVM\n");
Runtime runtime = Runtime.getRuntime(); final Runtime runtime = Runtime.getRuntime();
b.append("memory.free: ").append(runtime.freeMemory()).append("\n"); b.append("memory.free: ").append(runtime.freeMemory()).append("\n");
b.append("memory.max: ").append(runtime.maxMemory()).append("\n"); b.append("memory.max: ").append(runtime.maxMemory()).append("\n");
b.append("java.specification.version: '").append(System.getProperty("java.specification.version")).append("'\n"); b.append("java.specification.version: '").append(System.getProperty("java.specification.version")).append("'\n");
@ -63,9 +71,11 @@ public class DebugPaste extends SubCommand {
b.append("# Okay :D Great. You are now ready to create your bug report!"); b.append("# Okay :D Great. You are now ready to create your bug report!");
b.append("\n# You can do so at https://github.com/IntellectualSites/PlotSquared/issues"); b.append("\n# You can do so at https://github.com/IntellectualSites/PlotSquared/issues");
String link = HastebinUtility.upload(b.toString()); final String link = HastebinUtility.upload(b.toString());
plr.sendMessage(C.DEBUG_REPORT_CREATED.s().replace("%url%", link)); plr.sendMessage(C.DEBUG_REPORT_CREATED.s().replace("%url%", link));
} catch (IOException e) { }
catch (final IOException e)
{
e.printStackTrace(); e.printStackTrace();
} }
} }

View File

@ -35,44 +35,49 @@ import com.intellectualcrafters.plot.util.MathMan;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "debugroadregen", command = "debugroadregen",
usage = "/plot debugroadregen", usage = "/plot debugroadregen",
requiredType = RequiredType.NONE, requiredType = RequiredType.NONE,
description = "Regenerate all roads based on the road schematic", description = "Regenerate all roads based on the road schematic",
category = CommandCategory.DEBUG, category = CommandCategory.DEBUG,
permission = "plots.debugroadregen" permission = "plots.debugroadregen")
) public class DebugRoadRegen extends SubCommand
public class DebugRoadRegen extends SubCommand { {
@Override @Override
public boolean onCommand(final PlotPlayer player, final String ... args) { public boolean onCommand(final PlotPlayer player, final String... args)
{
final Location loc = player.getLocation(); final Location loc = player.getLocation();
final String world = loc.getWorld(); final String world = loc.getWorld();
PlotWorld plotworld = PS.get().getPlotWorld(world); final PlotWorld plotworld = PS.get().getPlotWorld(world);
if (!(plotworld instanceof HybridPlotWorld)) { if (!(plotworld instanceof HybridPlotWorld)) { return sendMessage(player, C.NOT_IN_PLOT_WORLD); }
return sendMessage(player, C.NOT_IN_PLOT_WORLD); final Plot plot = player.getCurrentPlot();
} if (plot == null)
Plot plot = player.getCurrentPlot(); {
if (plot == null) {
final ChunkLoc chunk = new ChunkLoc(loc.getX() >> 4, loc.getZ() >> 4); final ChunkLoc chunk = new ChunkLoc(loc.getX() >> 4, loc.getZ() >> 4);
int extend = 0; int extend = 0;
if (args.length == 1) { if (args.length == 1)
if (MathMan.isInteger(args[0])) { {
try { if (MathMan.isInteger(args[0]))
{
try
{
extend = Integer.parseInt(args[0]); extend = Integer.parseInt(args[0]);
} }
catch (Exception e) { catch (final Exception e)
{
C.NOT_VALID_NUMBER.send(player, "(0, <EXTEND HEIGHT>)"); C.NOT_VALID_NUMBER.send(player, "(0, <EXTEND HEIGHT>)");
return false; return false;
} }
} }
} }
boolean result = HybridUtils.manager.regenerateRoad(world, chunk, extend); final boolean result = HybridUtils.manager.regenerateRoad(world, chunk, extend);
MainUtil.sendMessage(player, "&6Regenerating chunk: " + chunk.x + "," + chunk.z + "\n&6 - Result: " + (result == true ? "&aSuccess" : "&cFailed")); MainUtil.sendMessage(player, "&6Regenerating chunk: " + chunk.x + "," + chunk.z + "\n&6 - Result: " + (result == true ? "&aSuccess" : "&cFailed"));
MainUtil.sendMessage(player, "&cTo regenerate all roads: /plot regenallroads"); MainUtil.sendMessage(player, "&cTo regenerate all roads: /plot regenallroads");
} }
else { else
HybridPlotManager manager = (HybridPlotManager) PS.get().getPlotManager(world); {
final HybridPlotManager manager = (HybridPlotManager) PS.get().getPlotManager(world);
manager.createRoadEast(plotworld, plot); manager.createRoadEast(plotworld, plot);
manager.createRoadSouth(plotworld, plot); manager.createRoadSouth(plotworld, plot);
manager.createRoadSouthEast(plotworld, plot); manager.createRoadSouthEast(plotworld, plot);

View File

@ -30,23 +30,26 @@ import com.intellectualcrafters.plot.util.MainUtil;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "debugsavetest", command = "debugsavetest",
permission = "plots.debugsavetest", permission = "plots.debugsavetest",
category = CommandCategory.DEBUG, category = CommandCategory.DEBUG,
requiredType = RequiredType.CONSOLE, requiredType = RequiredType.CONSOLE,
usage = "/plot debugsavetest", usage = "/plot debugsavetest",
description = "This command will force the recreation of all plots in the DB" description = "This command will force the recreation of all plots in the DB")
) public class DebugSaveTest extends SubCommand
public class DebugSaveTest extends SubCommand { {
@Override @Override
public boolean onCommand(PlotPlayer plr, String[] args) { public boolean onCommand(final PlotPlayer plr, final String[] args)
{
final ArrayList<Plot> plots = new ArrayList<Plot>(); final ArrayList<Plot> plots = new ArrayList<Plot>();
plots.addAll(PS.get().getPlots()); plots.addAll(PS.get().getPlots());
MainUtil.sendMessage(null, "&6Starting `DEBUGSAVETEST`"); MainUtil.sendMessage(null, "&6Starting `DEBUGSAVETEST`");
DBFunc.createPlotsAndData(plots, new Runnable() { DBFunc.createPlotsAndData(plots, new Runnable()
{
@Override @Override
public void run() { public void run()
{
MainUtil.sendMessage(null, "&6Database sync finished!"); MainUtil.sendMessage(null, "&6Database sync finished!");
} }
}); });

View File

@ -36,7 +36,6 @@ import org.bukkit.Bukkit;
import com.intellectualcrafters.plot.PS; import com.intellectualcrafters.plot.PS;
import com.intellectualcrafters.plot.config.C; import com.intellectualcrafters.plot.config.C;
import com.intellectualcrafters.plot.config.Settings;
import com.intellectualcrafters.plot.database.AbstractDB; import com.intellectualcrafters.plot.database.AbstractDB;
import com.intellectualcrafters.plot.database.DBFunc; import com.intellectualcrafters.plot.database.DBFunc;
import com.intellectualcrafters.plot.object.OfflinePlotPlayer; import com.intellectualcrafters.plot.object.OfflinePlotPlayer;
@ -55,54 +54,64 @@ import com.plotsquared.general.commands.Argument;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "uuidconvert", command = "uuidconvert",
permission = "plots.admin", permission = "plots.admin",
description = "Debug UUID conversion", description = "Debug UUID conversion",
usage = "/plot uuidconvert <lower|offline|online>", usage = "/plot uuidconvert <lower|offline|online>",
requiredType = RequiredType.CONSOLE, requiredType = RequiredType.CONSOLE,
category = CommandCategory.DEBUG category = CommandCategory.DEBUG)
) public class DebugUUID extends SubCommand
public class DebugUUID extends SubCommand { {
public DebugUUID() { public DebugUUID()
{
requiredArguments = new Argument[] { requiredArguments = new Argument[] {
Argument.String Argument.String
}; };
} }
@Override @Override
public boolean onCommand(final PlotPlayer plr, final String[] args) { public boolean onCommand(final PlotPlayer plr, final String[] args)
PlotPlayer player = null; {
final PlotPlayer player = null;
final UUIDWrapper currentUUIDWrapper = UUIDHandler.getUUIDWrapper(); final UUIDWrapper currentUUIDWrapper = UUIDHandler.getUUIDWrapper();
final UUIDWrapper newWrapper; final UUIDWrapper newWrapper;
switch (args[0].toLowerCase()) { switch (args[0].toLowerCase())
case "lower": { {
case "lower":
{
newWrapper = new LowerOfflineUUIDWrapper(); newWrapper = new LowerOfflineUUIDWrapper();
break; break;
} }
case "offline": { case "offline":
{
newWrapper = new OfflineUUIDWrapper(); newWrapper = new OfflineUUIDWrapper();
break; break;
} }
case "online": { case "online":
{
newWrapper = new DefaultUUIDWrapper(); newWrapper = new DefaultUUIDWrapper();
break; break;
} }
default: { default:
try { {
Class<?> clazz = Class.forName(args[0]); try
{
final Class<?> clazz = Class.forName(args[0]);
newWrapper = (UUIDWrapper) clazz.newInstance(); newWrapper = (UUIDWrapper) clazz.newInstance();
} }
catch (Exception e) { catch (final Exception e)
{
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot uuidconvert <lower|offline|online>"); MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot uuidconvert <lower|offline|online>");
return false; return false;
} }
} }
} }
if (args.length != 2 || !args[1].equals("-o")) { if ((args.length != 2) || !args[1].equals("-o"))
{
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot uuidconvert " + args[0] + " - o"); MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot uuidconvert " + args[0] + " - o");
MainUtil.sendMessage(player, "&cBe aware of the following!"); MainUtil.sendMessage(player, "&cBe aware of the following!");
MainUtil.sendMessage(player, "&8 - &cUse the database command or another method to backup your plots beforehand"); MainUtil.sendMessage(player, "&8 - &cUse the database command or another method to backup your plots beforehand");
@ -113,22 +122,24 @@ public class DebugUUID extends SubCommand {
MainUtil.sendMessage(player, "&7Retype the command with the override parameter when ready :)"); MainUtil.sendMessage(player, "&7Retype the command with the override parameter when ready :)");
return false; return false;
} }
if (currentUUIDWrapper.getClass().getCanonicalName().equals(newWrapper.getClass().getCanonicalName())) { if (currentUUIDWrapper.getClass().getCanonicalName().equals(newWrapper.getClass().getCanonicalName()))
{
MainUtil.sendMessage(player, "&cUUID mode already in use!"); MainUtil.sendMessage(player, "&cUUID mode already in use!");
return false; return false;
} }
MainUtil.sendConsoleMessage("&6Beginning UUID mode conversion"); MainUtil.sendConsoleMessage("&6Beginning UUID mode conversion");
MainUtil.sendConsoleMessage("&7 - Disconnecting players"); MainUtil.sendConsoleMessage("&7 - Disconnecting players");
for (PlotPlayer pp : UUIDHandler.getPlayers().values()) { for (final PlotPlayer pp : UUIDHandler.getPlayers().values())
{
pp.kick("PlotSquared UUID conversion has been initiated. You may reconnect when finished."); pp.kick("PlotSquared UUID conversion has been initiated. You may reconnect when finished.");
} }
MainUtil.sendConsoleMessage("&7 - Initializing map"); MainUtil.sendConsoleMessage("&7 - Initializing map");
final HashMap<UUID, UUID> uCMap = new HashMap<UUID, UUID>(); final HashMap<UUID, UUID> uCMap = new HashMap<UUID, UUID>();
final HashMap<UUID, UUID> uCReverse = new HashMap<UUID, UUID>(); final HashMap<UUID, UUID> uCReverse = new HashMap<UUID, UUID>();
MainUtil.sendConsoleMessage("&7 - Collecting playerdata"); MainUtil.sendConsoleMessage("&7 - Collecting playerdata");
final HashSet<String> worlds = new HashSet<>(); final HashSet<String> worlds = new HashSet<>();
@ -136,212 +147,269 @@ public class DebugUUID extends SubCommand {
worlds.add("world"); worlds.add("world");
final HashSet<UUID> uuids = new HashSet<>(); final HashSet<UUID> uuids = new HashSet<>();
final HashSet<String> names = new HashSet<>(); final HashSet<String> names = new HashSet<>();
for (final String worldname : worlds) { for (final String worldname : worlds)
{
final File playerdataFolder = new File(worldname + File.separator + "playerdata"); final File playerdataFolder = new File(worldname + File.separator + "playerdata");
String[] dat = playerdataFolder.list(new FilenameFilter() { String[] dat = playerdataFolder.list(new FilenameFilter()
{
@Override @Override
public boolean accept(final File f, final String s) { public boolean accept(final File f, final String s)
{
return s.endsWith(".dat"); return s.endsWith(".dat");
} }
}); });
if (dat != null) { if (dat != null)
for (final String current : dat) { {
for (final String current : dat)
{
final String s = current.replaceAll(".dat$", ""); final String s = current.replaceAll(".dat$", "");
try { try
{
final UUID uuid = UUID.fromString(s); final UUID uuid = UUID.fromString(s);
uuids.add(uuid); uuids.add(uuid);
} catch (final Exception e) { }
catch (final Exception e)
{
MainUtil.sendMessage(plr, C.PREFIX.s() + "Invalid playerdata: " + current); MainUtil.sendMessage(plr, C.PREFIX.s() + "Invalid playerdata: " + current);
} }
} }
} }
final File playersFolder = new File(worldname + File.separator + "players"); final File playersFolder = new File(worldname + File.separator + "players");
dat = playersFolder.list(new FilenameFilter() { dat = playersFolder.list(new FilenameFilter()
{
@Override @Override
public boolean accept(final File f, final String s) { public boolean accept(final File f, final String s)
{
return s.endsWith(".dat"); return s.endsWith(".dat");
} }
}); });
if (dat != null) { if (dat != null)
for (final String current : dat) { {
for (final String current : dat)
{
names.add(current.replaceAll(".dat$", "")); names.add(current.replaceAll(".dat$", ""));
} }
} }
} }
MainUtil.sendConsoleMessage("&7 - Populating map"); MainUtil.sendConsoleMessage("&7 - Populating map");
UUID uuid2; UUID uuid2;
final UUIDWrapper wrapper = new DefaultUUIDWrapper(); final UUIDWrapper wrapper = new DefaultUUIDWrapper();
for (UUID uuid : uuids) { for (UUID uuid : uuids)
try { {
try
{
final OfflinePlotPlayer op = wrapper.getOfflinePlayer(uuid); final OfflinePlotPlayer op = wrapper.getOfflinePlayer(uuid);
uuid = currentUUIDWrapper.getUUID(op); uuid = currentUUIDWrapper.getUUID(op);
uuid2 = newWrapper.getUUID(op); uuid2 = newWrapper.getUUID(op);
if (!uuid.equals(uuid2) && !uCMap.containsKey(uuid) && !uCReverse.containsKey(uuid2)) { if (!uuid.equals(uuid2) && !uCMap.containsKey(uuid) && !uCReverse.containsKey(uuid2))
{
uCMap.put(uuid, uuid2); uCMap.put(uuid, uuid2);
uCReverse.put(uuid2, uuid); uCReverse.put(uuid2, uuid);
} }
} catch (final Throwable e) { }
catch (final Throwable e)
{
MainUtil.sendMessage(plr, C.PREFIX.s() + "&6Invalid playerdata: " + uuid.toString() + ".dat"); MainUtil.sendMessage(plr, C.PREFIX.s() + "&6Invalid playerdata: " + uuid.toString() + ".dat");
} }
} }
for (final String name : names) { for (final String name : names)
{
final UUID uuid = currentUUIDWrapper.getUUID(name); final UUID uuid = currentUUIDWrapper.getUUID(name);
uuid2 = newWrapper.getUUID(name); uuid2 = newWrapper.getUUID(name);
if (!uuid.equals(uuid2)) { if (!uuid.equals(uuid2))
{
uCMap.put(uuid, uuid2); uCMap.put(uuid, uuid2);
uCReverse.put(uuid2, uuid); uCReverse.put(uuid2, uuid);
} }
} }
if (uCMap.size() == 0) { if (uCMap.size() == 0)
{
MainUtil.sendConsoleMessage("&c - Error! Attempting to repopulate"); MainUtil.sendConsoleMessage("&c - Error! Attempting to repopulate");
for (OfflinePlotPlayer op : currentUUIDWrapper.getOfflinePlayers()) { for (final OfflinePlotPlayer op : currentUUIDWrapper.getOfflinePlayers())
if (op.getLastPlayed() != 0) { {
// String name = op.getName(); if (op.getLastPlayed() != 0)
// StringWrapper wrap = new StringWrapper(name); {
UUID uuid = currentUUIDWrapper.getUUID(op); // String name = op.getName();
// StringWrapper wrap = new StringWrapper(name);
final UUID uuid = currentUUIDWrapper.getUUID(op);
uuid2 = newWrapper.getUUID(op); uuid2 = newWrapper.getUUID(op);
if (!uuid.equals(uuid2)) { if (!uuid.equals(uuid2))
{
uCMap.put(uuid, uuid2); uCMap.put(uuid, uuid2);
uCReverse.put(uuid2, uuid); uCReverse.put(uuid2, uuid);
} }
} }
} }
if (uCMap.size() == 0) { if (uCMap.size() == 0)
{
MainUtil.sendConsoleMessage("&cError. Failed to collect UUIDs!"); MainUtil.sendConsoleMessage("&cError. Failed to collect UUIDs!");
return false; return false;
} }
else { else
{
MainUtil.sendConsoleMessage("&a - Successfully repopulated"); MainUtil.sendConsoleMessage("&a - Successfully repopulated");
} }
} }
MainUtil.sendConsoleMessage("&7 - Replacing cache"); MainUtil.sendConsoleMessage("&7 - Replacing cache");
TaskManager.runTaskAsync(new Runnable() { TaskManager.runTaskAsync(new Runnable()
{
@Override @Override
public void run() { public void run()
for (Entry<UUID, UUID> entry : uCMap.entrySet()) { {
String name = UUIDHandler.getName(entry.getKey()); for (final Entry<UUID, UUID> entry : uCMap.entrySet())
if (name != null) { {
final String name = UUIDHandler.getName(entry.getKey());
if (name != null)
{
UUIDHandler.add(new StringWrapper(name), entry.getValue()); UUIDHandler.add(new StringWrapper(name), entry.getValue());
} }
} }
MainUtil.sendConsoleMessage("&7 - Scanning for applicable files (uuids.txt)"); MainUtil.sendConsoleMessage("&7 - Scanning for applicable files (uuids.txt)");
File file = new File(PS.get().IMP.getDirectory(), "uuids.txt"); final File file = new File(PS.get().IMP.getDirectory(), "uuids.txt");
if (file.exists()) { if (file.exists())
try { {
List<String> lines = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8); try
for (String line : lines) { {
try { final List<String> lines = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8);
for (String line : lines)
{
try
{
line = line.trim(); line = line.trim();
if (line.length() == 0) { if (line.length() == 0)
{
continue; continue;
} }
line = line.replaceAll("[\\|][0-9]+[\\|][0-9]+[\\|]", ""); line = line.replaceAll("[\\|][0-9]+[\\|][0-9]+[\\|]", "");
String[] split = line.split("\\|"); final String[] split = line.split("\\|");
String name = split[0]; final String name = split[0];
if (name.length() == 0 || name.length() > 16 || !StringMan.isAlphanumericUnd(name)) { if ((name.length() == 0) || (name.length() > 16) || !StringMan.isAlphanumericUnd(name))
{
continue; continue;
} }
UUID old = currentUUIDWrapper.getUUID(name); final UUID old = currentUUIDWrapper.getUUID(name);
if (old == null) { if (old == null)
{
continue; continue;
} }
UUID now = newWrapper.getUUID(name); final UUID now = newWrapper.getUUID(name);
UUIDHandler.add(new StringWrapper(name), now); UUIDHandler.add(new StringWrapper(name), now);
uCMap.put(old, now); uCMap.put(old, now);
uCReverse.put(now, old); uCReverse.put(now, old);
} }
catch (Exception e2) { catch (final Exception e2)
{
e2.printStackTrace(); e2.printStackTrace();
} }
} }
} catch (IOException e) { }
catch (final IOException e)
{
e.printStackTrace(); e.printStackTrace();
} }
} }
MainUtil.sendConsoleMessage("&7 - Replacing wrapper"); MainUtil.sendConsoleMessage("&7 - Replacing wrapper");
UUIDHandler.setUUIDWrapper(newWrapper); UUIDHandler.setUUIDWrapper(newWrapper);
MainUtil.sendConsoleMessage("&7 - Updating plot objects"); MainUtil.sendConsoleMessage("&7 - Updating plot objects");
for (Plot plot : PS.get().getPlotsRaw()) { for (final Plot plot : PS.get().getPlotsRaw())
UUID value = uCMap.get(plot.owner); {
if (value != null) { final UUID value = uCMap.get(plot.owner);
if (value != null)
{
plot.owner = value; plot.owner = value;
} }
plot.getTrusted().clear(); plot.getTrusted().clear();
plot.getMembers().clear(); plot.getMembers().clear();
plot.getDenied().clear(); plot.getDenied().clear();
} }
MainUtil.sendConsoleMessage("&7 - Deleting database"); MainUtil.sendConsoleMessage("&7 - Deleting database");
final AbstractDB database = DBFunc.dbManager; final AbstractDB database = DBFunc.dbManager;
boolean result = database.deleteTables(); final boolean result = database.deleteTables();
MainUtil.sendConsoleMessage("&7 - Creating tables"); MainUtil.sendConsoleMessage("&7 - Creating tables");
try { try
{
database.createTables(); database.createTables();
if (!result) { if (!result)
{
MainUtil.sendConsoleMessage("&cConversion failed! Attempting recovery"); MainUtil.sendConsoleMessage("&cConversion failed! Attempting recovery");
for (Plot plot : PS.get().getPlots()) { for (final Plot plot : PS.get().getPlots())
UUID value = uCReverse.get(plot.owner); {
if (value != null) { final UUID value = uCReverse.get(plot.owner);
if (value != null)
{
plot.owner = value; plot.owner = value;
} }
} }
database.createPlotsAndData(new ArrayList<>(PS.get().getPlots()), new Runnable() { database.createPlotsAndData(new ArrayList<>(PS.get().getPlots()), new Runnable()
{
@Override @Override
public void run() { public void run()
{
MainUtil.sendMessage(null, "&6Recovery was successful!"); MainUtil.sendMessage(null, "&6Recovery was successful!");
} }
}); });
return; return;
} }
} }
catch (Exception e) { catch (final Exception e)
{
e.printStackTrace(); e.printStackTrace();
return; return;
} }
if (newWrapper instanceof OfflineUUIDWrapper) { if (newWrapper instanceof OfflineUUIDWrapper)
{
PS.get().config.set("UUID.force-lowercase", false); PS.get().config.set("UUID.force-lowercase", false);
PS.get().config.set("UUID.offline", true); PS.get().config.set("UUID.offline", true);
} }
else if (newWrapper instanceof LowerOfflineUUIDWrapper) { else if (newWrapper instanceof LowerOfflineUUIDWrapper)
{
PS.get().config.set("UUID.force-lowercase", true); PS.get().config.set("UUID.force-lowercase", true);
PS.get().config.set("UUID.offline", true); PS.get().config.set("UUID.offline", true);
} }
else if (newWrapper instanceof DefaultUUIDWrapper) { else if (newWrapper instanceof DefaultUUIDWrapper)
{
PS.get().config.set("UUID.force-lowercase", false); PS.get().config.set("UUID.force-lowercase", false);
PS.get().config.set("UUID.offline", false); PS.get().config.set("UUID.offline", false);
} }
try { try
{
PS.get().config.save(PS.get().configFile); PS.get().config.save(PS.get().configFile);
} }
catch (Exception e) { catch (final Exception e)
{
MainUtil.sendConsoleMessage("Could not save configuration. It will need to be manuall set!"); MainUtil.sendConsoleMessage("Could not save configuration. It will need to be manuall set!");
} }
MainUtil.sendConsoleMessage("&7 - Populating tables"); MainUtil.sendConsoleMessage("&7 - Populating tables");
TaskManager.runTaskAsync(new Runnable() { TaskManager.runTaskAsync(new Runnable()
{
@Override @Override
public void run() { public void run()
ArrayList<Plot> plots = new ArrayList<>(PS.get().getPlots()); {
database.createPlotsAndData(plots, new Runnable() { final ArrayList<Plot> plots = new ArrayList<>(PS.get().getPlots());
database.createPlotsAndData(plots, new Runnable()
{
@Override @Override
public void run() { public void run()
{
MainUtil.sendConsoleMessage("&aConversion complete!"); MainUtil.sendConsoleMessage("&aConversion complete!");
} }
}); });
} }
}); });
MainUtil.sendConsoleMessage("&aIt is now safe for players to join"); MainUtil.sendConsoleMessage("&aIt is now safe for players to join");
MainUtil.sendConsoleMessage("&cConversion is still in progress, you will be notified when it is complete"); MainUtil.sendConsoleMessage("&cConversion is still in progress, you will be notified when it is complete");
} }

View File

@ -36,66 +36,73 @@ import com.intellectualcrafters.plot.util.UUIDHandler;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "delete", command = "delete",
permission = "plots.delete", permission = "plots.delete",
description = "Delete a plot", description = "Delete a plot",
usage = "/plot delete", usage = "/plot delete",
aliases = {"dispose", "del"}, aliases = { "dispose", "del" },
category = CommandCategory.ACTIONS, category = CommandCategory.ACTIONS,
requiredType = RequiredType.NONE requiredType = RequiredType.NONE)
) public class Delete extends SubCommand
public class Delete extends SubCommand { {
@Override @Override
public boolean onCommand(final PlotPlayer plr, final String[] args) { public boolean onCommand(final PlotPlayer plr, final String[] args)
{
final Location loc = plr.getLocation(); final Location loc = plr.getLocation();
final Plot plot = MainUtil.getPlot(loc); final Plot plot = MainUtil.getPlot(loc);
if (plot == null) { if (plot == null) { return !sendMessage(plr, C.NOT_IN_PLOT); }
return !sendMessage(plr, C.NOT_IN_PLOT); if (!MainUtil.getTopPlot(plot).equals(MainUtil.getBottomPlot(plot))) { return !sendMessage(plr, C.UNLINK_REQUIRED); }
} if (((!plot.hasOwner() || !plot.isOwner(plr.getUUID()))) && !Permissions.hasPermission(plr, "plots.admin.command.delete")) { return !sendMessage(plr, C.NO_PLOT_PERMS); }
if (!MainUtil.getTopPlot(plot).equals(MainUtil.getBottomPlot(plot))) {
return !sendMessage(plr, C.UNLINK_REQUIRED);
}
if (((!plot.hasOwner() || !plot.isOwner(plr.getUUID()))) && !Permissions.hasPermission(plr, "plots.admin.command.delete")) {
return !sendMessage(plr, C.NO_PLOT_PERMS);
}
final PlotWorld pWorld = PS.get().getPlotWorld(plot.world); final PlotWorld pWorld = PS.get().getPlotWorld(plot.world);
if (MainUtil.runners.containsKey(plot)) { if (MainUtil.runners.containsKey(plot))
{
MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER); MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER);
return false; return false;
} }
Runnable runnable = new Runnable() { final Runnable runnable = new Runnable()
{
@Override @Override
public void run() { public void run()
if ((EconHandler.manager != null) && pWorld.USE_ECONOMY && plot.hasOwner() && plot.isOwner(UUIDHandler.getUUID(plr))) { {
if ((EconHandler.manager != null) && pWorld.USE_ECONOMY && plot.hasOwner() && plot.isOwner(UUIDHandler.getUUID(plr)))
{
final double c = pWorld.SELL_PRICE; final double c = pWorld.SELL_PRICE;
if (c > 0d) { if (c > 0d)
{
EconHandler.manager.depositMoney(plr, c); EconHandler.manager.depositMoney(plr, c);
sendMessage(plr, C.ADDED_BALANCE, c + ""); sendMessage(plr, C.ADDED_BALANCE, c + "");
} }
} }
if (plot.unclaim()) { if (plot.unclaim())
{
final long start = System.currentTimeMillis(); final long start = System.currentTimeMillis();
final boolean result = MainUtil.clearAsPlayer(plot, true, new Runnable() { final boolean result = MainUtil.clearAsPlayer(plot, true, new Runnable()
{
@Override @Override
public void run() { public void run()
{
MainUtil.sendMessage(plr, C.CLEARING_DONE, "" + (System.currentTimeMillis() - start)); MainUtil.sendMessage(plr, C.CLEARING_DONE, "" + (System.currentTimeMillis() - start));
} }
}); });
if (!result) { if (!result)
{
MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER); MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER);
} }
} }
else { else
{
MainUtil.sendMessage(plr, C.UNCLAIM_FAILED); MainUtil.sendMessage(plr, C.UNCLAIM_FAILED);
} }
} }
}; };
if (Settings.CONFIRM_DELETE && !(Permissions.hasPermission(plr, "plots.confirm.bypass"))) { if (Settings.CONFIRM_DELETE && !(Permissions.hasPermission(plr, "plots.confirm.bypass")))
{
CmdConfirm.addPending(plr, "/plot delete " + plot.id, runnable); CmdConfirm.addPending(plr, "/plot delete " + plot.id, runnable);
} }
else { else
{
TaskManager.runTask(runnable); TaskManager.runTask(runnable);
} }
return true; return true;

View File

@ -37,57 +37,68 @@ import com.plotsquared.general.commands.Argument;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "deny", command = "deny",
aliases = {"d"}, aliases = { "d" },
description = "Deny a user from a plot", description = "Deny a user from a plot",
usage = "/plot deny <player>", usage = "/plot deny <player>",
category = CommandCategory.ACTIONS, category = CommandCategory.ACTIONS,
requiredType = RequiredType.NONE requiredType = RequiredType.NONE)
) public class Deny extends SubCommand
public class Deny extends SubCommand { {
public Deny() { public Deny()
{
requiredArguments = new Argument[] { requiredArguments = new Argument[] {
Argument.PlayerName Argument.PlayerName
}; };
} }
@Override @Override
public boolean onCommand(final PlotPlayer plr, final String[] args) { public boolean onCommand(final PlotPlayer plr, final String[] args)
{
final Location loc = plr.getLocation(); final Location loc = plr.getLocation();
final Plot plot = MainUtil.getPlot(loc); final Plot plot = MainUtil.getPlot(loc);
if (plot == null) { if (plot == null) { return !sendMessage(plr, C.NOT_IN_PLOT); }
return !sendMessage(plr, C.NOT_IN_PLOT); if ((plot == null) || !plot.hasOwner())
} {
if ((plot == null) || !plot.hasOwner()) {
MainUtil.sendMessage(plr, C.PLOT_UNOWNED); MainUtil.sendMessage(plr, C.PLOT_UNOWNED);
return false; return false;
} }
if (!plot.isOwner(plr.getUUID()) && !Permissions.hasPermission(plr, "plots.admin.command.deny")) { if (!plot.isOwner(plr.getUUID()) && !Permissions.hasPermission(plr, "plots.admin.command.deny"))
{
MainUtil.sendMessage(plr, C.NO_PLOT_PERMS); MainUtil.sendMessage(plr, C.NO_PLOT_PERMS);
return true; return true;
} }
UUID uuid; UUID uuid;
if (args[0].equalsIgnoreCase("*")) { if (args[0].equalsIgnoreCase("*"))
{
uuid = DBFunc.everyone; uuid = DBFunc.everyone;
} else { }
else
{
uuid = UUIDHandler.getUUID(args[0], null); uuid = UUIDHandler.getUUID(args[0], null);
} }
if (uuid == null) { if (uuid == null)
if (UUIDHandler.implementation instanceof SQLUUIDHandler) { {
if (UUIDHandler.implementation instanceof SQLUUIDHandler)
{
MainUtil.sendMessage(plr, C.INVALID_PLAYER_WAIT, args[0]); MainUtil.sendMessage(plr, C.INVALID_PLAYER_WAIT, args[0]);
} else { }
else
{
MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[0]); MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[0]);
} }
return false; return false;
} }
if (plot.isOwner(uuid)) { if (plot.isOwner(uuid))
{
MainUtil.sendMessage(plr, C.ALREADY_OWNER); MainUtil.sendMessage(plr, C.ALREADY_OWNER);
return false; return false;
} }
if (plot.getDenied().contains(uuid)) { if (plot.getDenied().contains(uuid))
{
MainUtil.sendMessage(plr, C.ALREADY_ADDED); MainUtil.sendMessage(plr, C.ALREADY_ADDED);
return false; return false;
} }
@ -96,15 +107,18 @@ public class Deny extends SubCommand {
plot.addDenied(uuid); plot.addDenied(uuid);
EventUtil.manager.callDenied(plr, plot, uuid, true); EventUtil.manager.callDenied(plr, plot, uuid, true);
MainUtil.sendMessage(plr, C.DENIED_ADDED); MainUtil.sendMessage(plr, C.DENIED_ADDED);
if (!uuid.equals(DBFunc.everyone)) { if (!uuid.equals(DBFunc.everyone))
{
handleKick(uuid, plot); handleKick(uuid, plot);
} }
return true; return true;
} }
private void handleKick(final UUID uuid, final Plot plot) { private void handleKick(final UUID uuid, final Plot plot)
PlotPlayer pp = UUIDHandler.getPlayer(uuid); {
if (pp != null && plot.equals(MainUtil.getPlot(pp.getLocation()))) { final PlotPlayer pp = UUIDHandler.getPlayer(uuid);
if ((pp != null) && plot.equals(MainUtil.getPlot(pp.getLocation())))
{
pp.teleport(BlockManager.manager.getSpawn(pp.getLocation().getWorld())); pp.teleport(BlockManager.manager.getSpawn(pp.getLocation().getWorld()));
MainUtil.sendMessage(pp, C.YOU_GOT_DENIED); MainUtil.sendMessage(pp, C.YOU_GOT_DENIED);
} }

View File

@ -30,53 +30,57 @@ import com.intellectualcrafters.plot.object.Plot;
import com.intellectualcrafters.plot.object.PlotAnalysis; import com.intellectualcrafters.plot.object.PlotAnalysis;
import com.intellectualcrafters.plot.object.PlotPlayer; import com.intellectualcrafters.plot.object.PlotPlayer;
import com.intellectualcrafters.plot.object.RunnableVal; import com.intellectualcrafters.plot.object.RunnableVal;
import com.intellectualcrafters.plot.util.BlockManager;
import com.intellectualcrafters.plot.util.MainUtil; import com.intellectualcrafters.plot.util.MainUtil;
import com.intellectualcrafters.plot.util.Permissions; import com.intellectualcrafters.plot.util.Permissions;
import com.intellectualcrafters.plot.util.UUIDHandler;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "done", command = "done",
aliases = {"submit"}, aliases = { "submit" },
description = "Mark a plot as done", description = "Mark a plot as done",
permission = "plots.done", permission = "plots.done",
category = CommandCategory.ACTIONS, category = CommandCategory.ACTIONS,
requiredType = RequiredType.NONE requiredType = RequiredType.NONE)
) public class Done extends SubCommand
public class Done extends SubCommand { {
@Override @Override
public boolean onCommand(final PlotPlayer plr, final String[] args) { public boolean onCommand(final PlotPlayer plr, final String[] args)
{
final Location loc = plr.getLocation(); final Location loc = plr.getLocation();
final Plot plot = MainUtil.getPlot(loc); final Plot plot = MainUtil.getPlot(loc);
if (plot == null || !plot.hasOwner()) { if ((plot == null) || !plot.hasOwner()) { return !sendMessage(plr, C.NOT_IN_PLOT); }
return !sendMessage(plr, C.NOT_IN_PLOT); if ((!plot.isOwner(plr.getUUID())) && !Permissions.hasPermission(plr, "plots.admin.command.done"))
} {
if ((!plot.isOwner(plr.getUUID())) && !Permissions.hasPermission(plr, "plots.admin.command.done")) {
MainUtil.sendMessage(plr, C.NO_PLOT_PERMS); MainUtil.sendMessage(plr, C.NO_PLOT_PERMS);
return false; return false;
} }
if (plot.getSettings().flags.containsKey("done")) { if (plot.getSettings().flags.containsKey("done"))
{
MainUtil.sendMessage(plr, C.DONE_ALREADY_DONE); MainUtil.sendMessage(plr, C.DONE_ALREADY_DONE);
return false; return false;
} }
if (MainUtil.runners.containsKey(plot)) { if (MainUtil.runners.containsKey(plot))
{
MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER); MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER);
return false; return false;
} }
MainUtil.runners.put(plot, 1); MainUtil.runners.put(plot, 1);
MainUtil.sendMessage(plr, C.GENERATING_LINK); MainUtil.sendMessage(plr, C.GENERATING_LINK);
HybridUtils.manager.analyzePlot(plot, new RunnableVal<PlotAnalysis>() { HybridUtils.manager.analyzePlot(plot, new RunnableVal<PlotAnalysis>()
{
@Override @Override
public void run() { public void run()
{
MainUtil.runners.remove(plot); MainUtil.runners.remove(plot);
if (value == null || value.getComplexity() >= Settings.CLEAR_THRESHOLD) { if ((value == null) || (value.getComplexity() >= Settings.CLEAR_THRESHOLD))
Flag flag = new Flag(FlagManager.getFlag("done"), (System.currentTimeMillis() / 1000)); {
final Flag flag = new Flag(FlagManager.getFlag("done"), (System.currentTimeMillis() / 1000));
FlagManager.addPlotFlag(plot, flag); FlagManager.addPlotFlag(plot, flag);
MainUtil.sendMessage(plr, C.DONE_SUCCESS); MainUtil.sendMessage(plr, C.DONE_SUCCESS);
} }
else { else
{
MainUtil.sendMessage(plr, C.DONE_INSUFFICIENT_COMPLEXITY); MainUtil.sendMessage(plr, C.DONE_INSUFFICIENT_COMPLEXITY);
} }
} }

View File

@ -17,52 +17,58 @@ import com.intellectualcrafters.plot.util.TaskManager;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "download", command = "download",
aliases = {"dl"}, aliases = { "dl" },
category = CommandCategory.ACTIONS, category = CommandCategory.ACTIONS,
requiredType = RequiredType.NONE, requiredType = RequiredType.NONE,
description = "Download your plot", description = "Download your plot",
permission = "plots.download" permission = "plots.download")
) public class Download extends SubCommand
public class Download extends SubCommand { {
@Override @Override
public boolean onCommand(final PlotPlayer plr, final String[] args) { public boolean onCommand(final PlotPlayer plr, final String[] args)
{
if (!Settings.METRICS) {
if (!Settings.METRICS)
{
MainUtil.sendMessage(plr, "&cPlease enable metrics in order to use this command.\n&7 - Or host it yourself if you don't like the free service"); MainUtil.sendMessage(plr, "&cPlease enable metrics in order to use this command.\n&7 - Or host it yourself if you don't like the free service");
return false; return false;
} }
final String world = plr.getLocation().getWorld(); final String world = plr.getLocation().getWorld();
if (!PS.get().isPlotWorld(world)) { if (!PS.get().isPlotWorld(world)) { return !sendMessage(plr, C.NOT_IN_PLOT_WORLD); }
return !sendMessage(plr, C.NOT_IN_PLOT_WORLD);
}
final Plot plot = MainUtil.getPlot(plr.getLocation()); final Plot plot = MainUtil.getPlot(plr.getLocation());
if (plot == null) { if (plot == null) { return !sendMessage(plr, C.NOT_IN_PLOT); }
return !sendMessage(plr, C.NOT_IN_PLOT); if (!plot.hasOwner())
} {
if (!plot.hasOwner()) {
MainUtil.sendMessage(plr, C.PLOT_UNOWNED); MainUtil.sendMessage(plr, C.PLOT_UNOWNED);
return false; return false;
} }
if ((!plot.isOwner(plr.getUUID()) || (Settings.DOWNLOAD_REQUIRES_DONE && FlagManager.getPlotFlag(plot, "done") != null)) && !Permissions.hasPermission(plr, "plots.admin.command.download")) { if ((!plot.isOwner(plr.getUUID()) || (Settings.DOWNLOAD_REQUIRES_DONE && (FlagManager.getPlotFlag(plot, "done") != null))) && !Permissions.hasPermission(plr, "plots.admin.command.download"))
{
MainUtil.sendMessage(plr, C.NO_PLOT_PERMS); MainUtil.sendMessage(plr, C.NO_PLOT_PERMS);
return false; return false;
} }
if (MainUtil.runners.containsKey(plot)) { if (MainUtil.runners.containsKey(plot))
{
MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER); MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER);
return false; return false;
} }
MainUtil.runners.put(plot, 1); MainUtil.runners.put(plot, 1);
MainUtil.sendMessage(plr, C.GENERATING_LINK); MainUtil.sendMessage(plr, C.GENERATING_LINK);
SchematicHandler.manager.getCompoundTag(plot.world, plot.id, new RunnableVal<CompoundTag>() { SchematicHandler.manager.getCompoundTag(plot.world, plot.id, new RunnableVal<CompoundTag>()
{
@Override @Override
public void run() { public void run()
TaskManager.runTaskAsync(new Runnable() { {
TaskManager.runTaskAsync(new Runnable()
{
@Override @Override
public void run() { public void run()
URL url = SchematicHandler.manager.upload(value, null, null); {
if (url == null) { final URL url = SchematicHandler.manager.upload(value, null, null);
if (url == null)
{
MainUtil.sendMessage(plr, C.GENERATING_LINK_FAILED); MainUtil.sendMessage(plr, C.GENERATING_LINK_FAILED);
MainUtil.runners.remove(plot); MainUtil.runners.remove(plot);
return; return;

View File

@ -39,24 +39,26 @@ import com.intellectualcrafters.plot.util.StringMan;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "flag", command = "flag",
aliases = {"f"}, aliases = { "f" },
usage = "/plot flag <set|remove|add|list|info> <flag> <value>", usage = "/plot flag <set|remove|add|list|info> <flag> <value>",
description = "Manage plot flags", description = "Manage plot flags",
category = CommandCategory.ACTIONS, category = CommandCategory.ACTIONS,
requiredType = RequiredType.NONE, requiredType = RequiredType.NONE,
permission = "plots.flag" permission = "plots.flag")
) public class FlagCmd extends SubCommand
public class FlagCmd extends SubCommand { {
@Override @Override
public String getUsage() { public String getUsage()
{
return super.getUsage().replaceAll("<flag>", StringMan.join(FlagManager.getFlags(), "|")); return super.getUsage().replaceAll("<flag>", StringMan.join(FlagManager.getFlags(), "|"));
} }
@Override @Override
public boolean onCommand(final PlotPlayer player, final String ... args) { public boolean onCommand(final PlotPlayer player, final String... args)
{
/* /*
* plot flag set fly true * plot flag set fly true
* plot flag remove fly * plot flag remove fly
@ -64,40 +66,50 @@ public class FlagCmd extends SubCommand {
* plot flag add use 2,4 * plot flag add use 2,4
* plot flag list * plot flag list
*/ */
if (args.length == 0) { if (args.length == 0)
{
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot flag <set|remove|add|list|info>"); MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot flag <set|remove|add|list|info>");
return false; return false;
} }
final Location loc = player.getLocation(); final Location loc = player.getLocation();
final Plot plot = MainUtil.getPlot(loc); final Plot plot = MainUtil.getPlot(loc);
if (plot == null) { if (plot == null)
{
MainUtil.sendMessage(player, C.NOT_IN_PLOT); MainUtil.sendMessage(player, C.NOT_IN_PLOT);
return false; return false;
} }
if (!plot.hasOwner()) { if (!plot.hasOwner())
{
sendMessage(player, C.PLOT_NOT_CLAIMED); sendMessage(player, C.PLOT_NOT_CLAIMED);
return false; return false;
} }
if (!plot.isOwner(player.getUUID()) && !Permissions.hasPermission(player, "plots.set.flag.other")) { if (!plot.isOwner(player.getUUID()) && !Permissions.hasPermission(player, "plots.set.flag.other"))
{
MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.set.flag.other"); MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.set.flag.other");
return false; return false;
} }
if (args.length > 1 && FlagManager.isReserved(args[1])) { if ((args.length > 1) && FlagManager.isReserved(args[1]))
{
MainUtil.sendMessage(player, C.NOT_VALID_FLAG); MainUtil.sendMessage(player, C.NOT_VALID_FLAG);
return false; return false;
} }
switch (args[0].toLowerCase()) { switch (args[0].toLowerCase())
case "info": { {
if (!Permissions.hasPermission(player, "plots.set.flag")) { case "info":
{
if (!Permissions.hasPermission(player, "plots.set.flag"))
{
MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.flag.info"); MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.flag.info");
return false; return false;
} }
if (args.length != 2) { if (args.length != 2)
{
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot flag info <flag>"); MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot flag info <flag>");
return false; return false;
} }
final AbstractFlag af = FlagManager.getFlag(args[1]); final AbstractFlag af = FlagManager.getFlag(args[1]);
if (af == null) { if (af == null)
{
MainUtil.sendMessage(player, C.NOT_VALID_FLAG); MainUtil.sendMessage(player, C.NOT_VALID_FLAG);
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot flag info <flag>"); MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot flag info <flag>");
return false; return false;
@ -110,73 +122,92 @@ public class FlagCmd extends SubCommand {
MainUtil.sendMessage(player, C.FLAG_DESC, af.getValueDesc()); MainUtil.sendMessage(player, C.FLAG_DESC, af.getValueDesc());
return true; return true;
} }
case "set": { case "set":
if (!Permissions.hasPermission(player, "plots.set.flag")) { {
if (!Permissions.hasPermission(player, "plots.set.flag"))
{
MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.set.flag"); MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.set.flag");
return false; return false;
} }
if (args.length < 3) { if (args.length < 3)
{
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot flag set <flag> <value>"); MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot flag set <flag> <value>");
return false; return false;
} }
final AbstractFlag af = FlagManager.getFlag(args[1].toLowerCase()); final AbstractFlag af = FlagManager.getFlag(args[1].toLowerCase());
if (af == null) { if (af == null)
{
MainUtil.sendMessage(player, C.NOT_VALID_FLAG); MainUtil.sendMessage(player, C.NOT_VALID_FLAG);
return false; return false;
} }
final String value = StringMan.join(Arrays.copyOfRange(args, 2, args.length), " "); final String value = StringMan.join(Arrays.copyOfRange(args, 2, args.length), " ");
if (!Permissions.hasPermission(player, "plots.set.flag." + args[1].toLowerCase() + "." + value.toLowerCase())) { if (!Permissions.hasPermission(player, "plots.set.flag." + args[1].toLowerCase() + "." + value.toLowerCase()))
{
MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.set.flag." + args[1].toLowerCase() + "." + value.toLowerCase()); MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.set.flag." + args[1].toLowerCase() + "." + value.toLowerCase());
return false; return false;
} }
final Object parsed = af.parseValueRaw(value); final Object parsed = af.parseValueRaw(value);
if (parsed == null) { if (parsed == null)
{
MainUtil.sendMessage(player, "&c" + af.getValueDesc()); MainUtil.sendMessage(player, "&c" + af.getValueDesc());
return false; return false;
} }
final Flag flag = new Flag(FlagManager.getFlag(args[1].toLowerCase(), true), parsed); final Flag flag = new Flag(FlagManager.getFlag(args[1].toLowerCase(), true), parsed);
final boolean result = FlagManager.addPlotFlag(plot, flag); final boolean result = FlagManager.addPlotFlag(plot, flag);
if (!result) { if (!result)
{
MainUtil.sendMessage(player, C.FLAG_NOT_ADDED); MainUtil.sendMessage(player, C.FLAG_NOT_ADDED);
return false; return false;
} }
MainUtil.sendMessage(player, C.FLAG_ADDED); MainUtil.sendMessage(player, C.FLAG_ADDED);
return true; return true;
} }
case "remove": { case "remove":
if (!Permissions.hasPermission(player, "plots.flag.remove")) { {
if (!Permissions.hasPermission(player, "plots.flag.remove"))
{
MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.flag.remove"); MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.flag.remove");
return false; return false;
} }
if ((args.length != 2) && (args.length != 3)) { if ((args.length != 2) && (args.length != 3))
{
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot flag remove <flag> [values]"); MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot flag remove <flag> [values]");
return false; return false;
} }
final AbstractFlag af = FlagManager.getFlag(args[1].toLowerCase()); final AbstractFlag af = FlagManager.getFlag(args[1].toLowerCase());
if (af == null) { if (af == null)
{
MainUtil.sendMessage(player, C.NOT_VALID_FLAG); MainUtil.sendMessage(player, C.NOT_VALID_FLAG);
return false; return false;
} }
final Flag flag = FlagManager.getPlotFlagAbs(plot, args[1].toLowerCase()); final Flag flag = FlagManager.getPlotFlagAbs(plot, args[1].toLowerCase());
if (!Permissions.hasPermission(player, "plots.set.flag." + args[1].toLowerCase())) { if (!Permissions.hasPermission(player, "plots.set.flag." + args[1].toLowerCase()))
for (String entry : args[2].split(",")) { {
if (!Permissions.hasPermission(player, "plots.set.flag." + args[1].toLowerCase() + "." + entry)) { for (final String entry : args[2].split(","))
{
if (!Permissions.hasPermission(player, "plots.set.flag." + args[1].toLowerCase() + "." + entry))
{
MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.set.flag." + args[1].toLowerCase() + "." + entry); MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.set.flag." + args[1].toLowerCase() + "." + entry);
return false; return false;
} }
} }
} }
if (flag == null) { if (flag == null)
{
MainUtil.sendMessage(player, C.FLAG_NOT_IN_PLOT); MainUtil.sendMessage(player, C.FLAG_NOT_IN_PLOT);
return false; return false;
} }
if ((args.length == 3) && flag.getAbstractFlag().isList()) { if ((args.length == 3) && flag.getAbstractFlag().isList())
{
final String value = StringMan.join(Arrays.copyOfRange(args, 2, args.length), " "); final String value = StringMan.join(Arrays.copyOfRange(args, 2, args.length), " ");
((FlagValue.ListValue) flag.getAbstractFlag().value).remove(flag.getValue(), value); ((FlagValue.ListValue) flag.getAbstractFlag().value).remove(flag.getValue(), value);
DBFunc.setFlags(plot, plot.getSettings().flags.values()); DBFunc.setFlags(plot, plot.getSettings().flags.values());
} else { }
else
{
final boolean result = FlagManager.removePlotFlag(plot, flag.getKey()); final boolean result = FlagManager.removePlotFlag(plot, flag.getKey());
if (!result) { if (!result)
{
MainUtil.sendMessage(player, C.FLAG_NOT_REMOVED); MainUtil.sendMessage(player, C.FLAG_NOT_REMOVED);
return false; return false;
} }
@ -184,23 +215,30 @@ public class FlagCmd extends SubCommand {
MainUtil.sendMessage(player, C.FLAG_REMOVED); MainUtil.sendMessage(player, C.FLAG_REMOVED);
return true; return true;
} }
case "add": { case "add":
if (!Permissions.hasPermission(player, "plots.flag.add")) { {
if (!Permissions.hasPermission(player, "plots.flag.add"))
{
MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.flag.add"); MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.flag.add");
return false; return false;
} }
if (args.length < 3) { if (args.length < 3)
{
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot flag add <flag> <values>"); MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot flag add <flag> <values>");
return false; return false;
} }
final AbstractFlag af = FlagManager.getFlag(args[1].toLowerCase()); final AbstractFlag af = FlagManager.getFlag(args[1].toLowerCase());
if (af == null) { if (af == null)
{
MainUtil.sendMessage(player, C.NOT_VALID_FLAG); MainUtil.sendMessage(player, C.NOT_VALID_FLAG);
return false; return false;
} }
if (!Permissions.hasPermission(player, "plots.set.flag." + args[1].toLowerCase())) { if (!Permissions.hasPermission(player, "plots.set.flag." + args[1].toLowerCase()))
for (String entry : args[2].split(",")) { {
if (!Permissions.hasPermission(player, "plots.set.flag." + args[1].toLowerCase() + "." + entry)) { for (final String entry : args[2].split(","))
{
if (!Permissions.hasPermission(player, "plots.set.flag." + args[1].toLowerCase() + "." + entry))
{
MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.set.flag." + args[1].toLowerCase() + "." + entry); MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.set.flag." + args[1].toLowerCase() + "." + entry);
return false; return false;
} }
@ -208,18 +246,23 @@ public class FlagCmd extends SubCommand {
} }
final String value = StringMan.join(Arrays.copyOfRange(args, 2, args.length), " "); final String value = StringMan.join(Arrays.copyOfRange(args, 2, args.length), " ");
final Object parsed = af.parseValueRaw(value); final Object parsed = af.parseValueRaw(value);
if (parsed == null) { if (parsed == null)
{
MainUtil.sendMessage(player, "&c" + af.getValueDesc()); MainUtil.sendMessage(player, "&c" + af.getValueDesc());
return false; return false;
} }
Flag flag = FlagManager.getPlotFlag(plot, args[1].toLowerCase()); Flag flag = FlagManager.getPlotFlag(plot, args[1].toLowerCase());
if ((flag == null) || !flag.getAbstractFlag().isList()) { if ((flag == null) || !flag.getAbstractFlag().isList())
{
flag = new Flag(FlagManager.getFlag(args[1].toLowerCase(), true), parsed); flag = new Flag(FlagManager.getFlag(args[1].toLowerCase(), true), parsed);
} else { }
else
{
((FlagValue.ListValue) flag.getAbstractFlag().value).add(flag.getValue(), value); ((FlagValue.ListValue) flag.getAbstractFlag().value).add(flag.getValue(), value);
} }
final boolean result = FlagManager.addPlotFlag(plot, flag); final boolean result = FlagManager.addPlotFlag(plot, flag);
if (!result) { if (!result)
{
MainUtil.sendMessage(player, C.FLAG_NOT_ADDED); MainUtil.sendMessage(player, C.FLAG_NOT_ADDED);
return false; return false;
} }
@ -227,26 +270,32 @@ public class FlagCmd extends SubCommand {
MainUtil.sendMessage(player, C.FLAG_ADDED); MainUtil.sendMessage(player, C.FLAG_ADDED);
return true; return true;
} }
case "list": { case "list":
if (!Permissions.hasPermission(player, "plots.flag.list")) { {
if (!Permissions.hasPermission(player, "plots.flag.list"))
{
MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.flag.list"); MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.flag.list");
return false; return false;
} }
if (args.length != 1) { if (args.length != 1)
{
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot flag list"); MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot flag list");
return false; return false;
} }
final HashMap<String, ArrayList<String>> flags = new HashMap<>(); final HashMap<String, ArrayList<String>> flags = new HashMap<>();
for (final AbstractFlag af : FlagManager.getFlags()) { for (final AbstractFlag af : FlagManager.getFlags())
{
final String type = af.value.getClass().getSimpleName().replaceAll("Value", ""); final String type = af.value.getClass().getSimpleName().replaceAll("Value", "");
if (!flags.containsKey(type)) { if (!flags.containsKey(type))
{
flags.put(type, new ArrayList<String>()); flags.put(type, new ArrayList<String>());
} }
flags.get(type).add(af.getKey()); flags.get(type).add(af.getKey());
} }
String message = ""; String message = "";
String prefix = ""; String prefix = "";
for (final String flag : flags.keySet()) { for (final String flag : flags.keySet())
{
message += prefix + "&6" + flag + ": &7" + StringMan.join(flags.get(flag), ", "); message += prefix + "&6" + flag + ": &7" + StringMan.join(flags.get(flag), ", ");
prefix = "\n"; prefix = "\n";
} }

View File

@ -9,79 +9,86 @@ import java.util.Set;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import com.intellectualcrafters.plot.PS;
import com.intellectualcrafters.plot.object.ConsolePlayer;
import com.intellectualcrafters.plot.object.PlotPlayer; import com.intellectualcrafters.plot.object.PlotPlayer;
import com.intellectualcrafters.plot.util.Permissions;
import com.intellectualcrafters.plot.util.StringMan; import com.intellectualcrafters.plot.util.StringMan;
import com.plotsquared.general.commands.Command; import com.plotsquared.general.commands.Command;
public class GenerateDocs { public class GenerateDocs
public static void main(String[] args) { {
public static void main(final String[] args)
{
MainCommand.getInstance().addCommand(new WE_Anywhere()); MainCommand.getInstance().addCommand(new WE_Anywhere());
MainCommand.getInstance().addCommand(new Cluster()); MainCommand.getInstance().addCommand(new Cluster());
ArrayList<Command<PlotPlayer>> commands = MainCommand.getInstance().getCommands(); final ArrayList<Command<PlotPlayer>> commands = MainCommand.getInstance().getCommands();
log("### Want to document some commands?"); log("### Want to document some commands?");
log(" - This page is automatically generated"); log(" - This page is automatically generated");
log(" - Fork the project and add a javadoc comment to one of the command classes"); log(" - Fork the project and add a javadoc comment to one of the command classes");
log(" - Then do a pull request and it will be added to this page"); log(" - Then do a pull request and it will be added to this page");
log(""); log("");
log("# Contents"); log("# Contents");
for (CommandCategory category : CommandCategory.values()) { for (final CommandCategory category : CommandCategory.values())
{
log("###### " + category.name()); log("###### " + category.name());
for (Command<PlotPlayer> command : MainCommand.getCommands(category, null)) { for (final Command<PlotPlayer> command : MainCommand.getCommands(category, null))
log(" - [/plot " + command.getCommand() + "](https://github.com/IntellectualSites/PlotSquared/wiki/Commands#" + command.getCommand() +") "); {
log(" - [/plot " + command.getCommand() + "](https://github.com/IntellectualSites/PlotSquared/wiki/Commands#" + command.getCommand() + ") ");
} }
log(""); log("");
} }
log("# Commands"); log("# Commands");
for (Command<PlotPlayer> command : commands) { for (final Command<PlotPlayer> command : commands)
{
printCommand(command); printCommand(command);
} }
} }
public static void printCommand(Command<PlotPlayer> command) { public static void printCommand(final Command<PlotPlayer> command)
try { {
String clazz = command.getClass().getSimpleName(); try
String name = command.getCommand(); {
final String clazz = command.getClass().getSimpleName();
final String name = command.getCommand();
// Header // Header
String source = "https://github.com/IntellectualSites/PlotSquared/tree/master/src/main/java/com/intellectualcrafters/plot/commands/" + clazz + ".java"; final String source = "https://github.com/IntellectualSites/PlotSquared/tree/master/src/main/java/com/intellectualcrafters/plot/commands/" + clazz + ".java";
log("## [" + name.toUpperCase() + "](" + source + ") "); log("## [" + name.toUpperCase() + "](" + source + ") ");
File file = new File("src/main/java/com/intellectualcrafters/plot/commands/" + clazz + ".java"); final File file = new File("src/main/java/com/intellectualcrafters/plot/commands/" + clazz + ".java");
List<String> lines = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8); final List<String> lines = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8);
List<String> perms = getPerms(name, lines); final List<String> perms = getPerms(name, lines);
String comment = getComments(lines); final String comment = getComments(lines);
log("#### Description"); log("#### Description");
log("`" + command.getDescription() + "`"); log("`" + command.getDescription() + "`");
if (comment.length() > 0) { if (comment.length() > 0)
{
log("##### Comments"); log("##### Comments");
log("``` java"); log("``` java");
log(comment); log(comment);
log("```"); log("```");
} }
log("#### Usage"); log("#### Usage");
log("`" + command.getUsage().replaceAll("\\{label\\}", "plot") + "`"); log("`" + command.getUsage().replaceAll("\\{label\\}", "plot") + "`");
if (command.getRequiredType() != RequiredType.NONE)
if (command.getRequiredType() != RequiredType.NONE) { {
log("#### Required callers"); log("#### Required callers");
log("`" + command.getRequiredType().name() + "`"); log("`" + command.getRequiredType().name() + "`");
} }
Set<String> aliases = command.getAliases(); final Set<String> aliases = command.getAliases();
if (aliases.size() > 0) { if (aliases.size() > 0)
{
log("#### Aliases"); log("#### Aliases");
log("`" + StringMan.getString(command.getAliases()) + "`"); log("`" + StringMan.getString(command.getAliases()) + "`");
} }
log("#### Permissions"); log("#### Permissions");
log("##### Primary"); log("##### Primary");
log(" - `" + command.getPermission() + "` "); log(" - `" + command.getPermission() + "` ");
if (perms.size() > 0) { if (perms.size() > 0)
{
log(""); log("");
log("##### Other"); log("##### Other");
log(" - `" + StringMan.join(perms, "`\n - `") + "`"); log(" - `" + StringMan.join(perms, "`\n - `") + "`");
@ -90,54 +97,68 @@ public class GenerateDocs {
log("***"); log("***");
log(""); log("");
} }
catch (Exception e) { catch (final Exception e)
{
e.printStackTrace(); e.printStackTrace();
} }
} }
public static List<String> getPerms(String cmd, List<String> lines) { public static List<String> getPerms(final String cmd, final List<String> lines)
ArrayList<String> perms = new ArrayList<String>(); {
Pattern p = Pattern.compile("\"([^\"]*)\""); final ArrayList<String> perms = new ArrayList<String>();
for (String line : lines) { final Pattern p = Pattern.compile("\"([^\"]*)\"");
if (line.contains("Permissions.hasPermission(")) { for (final String line : lines)
Matcher m = p.matcher(line); {
while (m.find()) { if (line.contains("Permissions.hasPermission("))
{
final Matcher m = p.matcher(line);
while (m.find())
{
String perm = m.group(1); String perm = m.group(1);
if (perm.endsWith(".")) { if (perm.endsWith("."))
{
perm += "<arg>"; perm += "<arg>";
} }
if (perm.startsWith(".")) { if (perm.startsWith("."))
{
perms.set(perms.size() - 1, perms.get(perms.size() - 1) + perm); perms.set(perms.size() - 1, perms.get(perms.size() - 1) + perm);
} }
else if (perm.contains(".")) { else if (perm.contains("."))
{
perms.add(perm); perms.add(perm);
} }
} }
} }
} }
switch (cmd.toLowerCase()) { switch (cmd.toLowerCase())
{
case "auto": case "auto":
case "claim": { case "claim":
{
perms.add("plots.plot.#"); perms.add("plots.plot.#");
break; break;
} }
} }
return perms; return perms;
} }
public static String getComments(List<String> lines) { public static String getComments(final List<String> lines)
StringBuilder result = new StringBuilder(); {
for (String line : lines) { final StringBuilder result = new StringBuilder();
for (String line : lines)
{
line = line.trim(); line = line.trim();
if (line.startsWith("/** ") || line.startsWith("*/ ") || line.startsWith("* ")) { if (line.startsWith("/** ") || line.startsWith("*/ ") || line.startsWith("* "))
{
line = (line.replaceAll("/[*][*] ", "").replaceAll("[*]/ ", "").replaceAll("[*] ", "")).trim(); line = (line.replaceAll("/[*][*] ", "").replaceAll("[*]/ ", "").replaceAll("[*] ", "")).trim();
result.append(line + "\n"); result.append(line + "\n");
} }
} }
return result.toString().trim(); return result.toString().trim();
} }
public static void log(String s) { public static void log(final String s)
{
System.out.println(s); System.out.println(s);
} }
} }

View File

@ -4,15 +4,16 @@ import com.intellectualcrafters.plot.object.PlotPlayer;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "help", command = "help",
description = "Get this help menu", description = "Get this help menu",
aliases = {"he"}, aliases = { "he" },
category = CommandCategory.INFO category = CommandCategory.INFO)
) public class Help extends SubCommand
public class Help extends SubCommand { {
@Override @Override
public boolean onCommand(final PlotPlayer plr, final String[] args) { public boolean onCommand(final PlotPlayer plr, final String[] args)
{
return true; return true;
} }
} }

View File

@ -23,7 +23,6 @@ package com.intellectualcrafters.plot.commands;
import java.util.ArrayList; import java.util.ArrayList;
import com.intellectualcrafters.plot.PS; import com.intellectualcrafters.plot.PS;
import com.intellectualcrafters.plot.PS.SortType;
import com.intellectualcrafters.plot.config.C; import com.intellectualcrafters.plot.config.C;
import com.intellectualcrafters.plot.object.Plot; import com.intellectualcrafters.plot.object.Plot;
import com.intellectualcrafters.plot.object.PlotPlayer; import com.intellectualcrafters.plot.object.PlotPlayer;
@ -31,42 +30,53 @@ import com.intellectualcrafters.plot.util.MainUtil;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "home", command = "home",
aliases = {"h"}, aliases = { "h" },
description = "Go to your plot", description = "Go to your plot",
usage = "/plot home [id|alias]", usage = "/plot home [id|alias]",
category = CommandCategory.TELEPORT, category = CommandCategory.TELEPORT,
requiredType = RequiredType.NONE requiredType = RequiredType.NONE)
) public class Home extends SubCommand
public class Home extends SubCommand { {
private Plot isAlias(final String a) { private Plot isAlias(final String a)
for (final Plot p : PS.get().getPlots()) { {
if ((p.getSettings().getAlias().length() > 0) && p.getSettings().getAlias().equalsIgnoreCase(a)) { for (final Plot p : PS.get().getPlots())
return p; {
} if ((p.getSettings().getAlias().length() > 0) && p.getSettings().getAlias().equalsIgnoreCase(a)) { return p; }
} }
return null; return null;
} }
@Override @Override
public boolean onCommand(final PlotPlayer plr, String[] args) { public boolean onCommand(final PlotPlayer plr, String[] args)
{
final ArrayList<Plot> plots = PS.get().sortPlotsByTemp(PS.get().getPlots(plr));//PS.get().sortPlots(PS.get().getPlots(plr), SortType.CREATION_DATE, null); final ArrayList<Plot> plots = PS.get().sortPlotsByTemp(PS.get().getPlots(plr));//PS.get().sortPlots(PS.get().getPlots(plr), SortType.CREATION_DATE, null);
if (plots.size() == 1) { if (plots.size() == 1)
{
MainUtil.teleportPlayer(plr, plr.getLocation(), plots.get(0)); MainUtil.teleportPlayer(plr, plr.getLocation(), plots.get(0));
return true; return true;
} else if (plots.size() > 1) { }
if (args.length < 1) { else if (plots.size() > 1)
{
if (args.length < 1)
{
args = new String[] { "1" }; args = new String[] { "1" };
} }
int id = 0; int id = 0;
try { try
{
id = Integer.parseInt(args[0]); id = Integer.parseInt(args[0]);
} catch (final Exception e) { }
catch (final Exception e)
{
Plot temp; Plot temp;
if ((temp = isAlias(args[0])) != null) { if ((temp = isAlias(args[0])) != null)
if (temp.hasOwner()) { {
if (temp.isOwner(plr.getUUID())) { if (temp.hasOwner())
{
if (temp.isOwner(plr.getUUID()))
{
MainUtil.teleportPlayer(plr, plr.getLocation(), temp); MainUtil.teleportPlayer(plr, plr.getLocation(), temp);
return true; return true;
} }
@ -77,19 +87,23 @@ public class Home extends SubCommand {
MainUtil.sendMessage(plr, C.NOT_VALID_NUMBER, "(1, " + plots.size() + ")"); MainUtil.sendMessage(plr, C.NOT_VALID_NUMBER, "(1, " + plots.size() + ")");
return true; return true;
} }
if ((id > (plots.size())) || (id < 1)) { if ((id > (plots.size())) || (id < 1))
{
MainUtil.sendMessage(plr, C.NOT_VALID_NUMBER, "(1, " + plots.size() + ")"); MainUtil.sendMessage(plr, C.NOT_VALID_NUMBER, "(1, " + plots.size() + ")");
return false; return false;
} }
MainUtil.teleportPlayer(plr, plr.getLocation(), plots.get(id - 1)); MainUtil.teleportPlayer(plr, plr.getLocation(), plots.get(id - 1));
return true; return true;
} else { }
else
{
MainUtil.sendMessage(plr, C.FOUND_NO_PLOTS); MainUtil.sendMessage(plr, C.FOUND_NO_PLOTS);
return true; return true;
} }
} }
public void teleportPlayer(final PlotPlayer player, final Plot plot) { public void teleportPlayer(final PlotPlayer player, final Plot plot)
{
MainUtil.teleportPlayer(player, player.getLocation(), plot); MainUtil.teleportPlayer(player, player.getLocation(), plot);
} }
} }

View File

@ -35,46 +35,54 @@ import com.intellectualcrafters.plot.util.StringMan;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "inbox", command = "inbox",
description = "Review the comments for a plot", description = "Review the comments for a plot",
usage = "/plot inbox [inbox] [delete <index>|clear|page]", usage = "/plot inbox [inbox] [delete <index>|clear|page]",
permission = "plots.inbox", permission = "plots.inbox",
category = CommandCategory.ACTIONS, category = CommandCategory.ACTIONS,
requiredType = RequiredType.NONE requiredType = RequiredType.NONE)
) public class Inbox extends SubCommand
public class Inbox extends SubCommand { {
public void displayComments(PlotPlayer player, List<PlotComment> oldComments, int page) { public void displayComments(final PlotPlayer player, final List<PlotComment> oldComments, int page)
if (oldComments == null || oldComments.size() == 0) { {
if ((oldComments == null) || (oldComments.size() == 0))
{
MainUtil.sendMessage(player, C.INBOX_EMPTY); MainUtil.sendMessage(player, C.INBOX_EMPTY);
return; return;
} }
PlotComment[] comments = oldComments.toArray(new PlotComment[oldComments.size()]); final PlotComment[] comments = oldComments.toArray(new PlotComment[oldComments.size()]);
if (page < 0) { if (page < 0)
{
page = 0; page = 0;
} }
// Get the total pages // Get the total pages
// int totalPages = ((int) Math.ceil(12 * // int totalPages = ((int) Math.ceil(12 *
final int totalPages = (int) Math.ceil(comments.length / 12); final int totalPages = (int) Math.ceil(comments.length / 12);
if (page > totalPages) { if (page > totalPages)
{
page = totalPages; page = totalPages;
} }
// Only display 12 per page // Only display 12 per page
int max = (page * 12) + 12; int max = (page * 12) + 12;
if (max > comments.length) { if (max > comments.length)
{
max = comments.length; max = comments.length;
} }
final StringBuilder string = new StringBuilder(); final StringBuilder string = new StringBuilder();
string.append(StringMan.replaceAll(C.COMMENT_LIST_HEADER_PAGED.s(), "%amount%", comments.length, "%cur", page + 1, "%max", totalPages + 1, "%word", "all") + "\n"); string.append(StringMan.replaceAll(C.COMMENT_LIST_HEADER_PAGED.s(), "%amount%", comments.length, "%cur", page + 1, "%max", totalPages + 1, "%word", "all") + "\n");
PlotComment c; PlotComment c;
// This might work xD // This might work xD
for (int x = (page * 12); x < max; x++) { for (int x = (page * 12); x < max; x++)
{
c = comments[x]; c = comments[x];
String color; String color;
if (player.getName().equals(c.senderName)) { if (player.getName().equals(c.senderName))
{
color = "&a"; color = "&a";
} }
else { else
{
color = "&7"; color = "&7";
} }
string.append("&8[&7#" + x + "&8][&7" + c.world + ";" + c.id + "&8][&6" + c.senderName + "&8]" + color + c.comment + "\n"); string.append("&8[&7#" + x + "&8][&7" + c.world + ";" + c.id + "&8][&6" + c.senderName + "&8]" + color + c.comment + "\n");
@ -83,32 +91,43 @@ public class Inbox extends SubCommand {
} }
@Override @Override
public boolean onCommand(final PlotPlayer player, final String[] args) { public boolean onCommand(final PlotPlayer player, final String[] args)
{
final Plot plot = MainUtil.getPlot(player.getLocation()); final Plot plot = MainUtil.getPlot(player.getLocation());
if (args.length == 0) { if (args.length == 0)
{
sendMessage(player, C.COMMAND_SYNTAX, "/plot inbox [inbox] [delete <index>|clear|page]"); sendMessage(player, C.COMMAND_SYNTAX, "/plot inbox [inbox] [delete <index>|clear|page]");
for (final CommentInbox inbox : CommentManager.inboxes.values()) { for (final CommentInbox inbox : CommentManager.inboxes.values())
if (inbox.canRead(plot, player)) { {
if (!inbox.getComments(plot, new RunnableVal() { if (inbox.canRead(plot, player))
{
if (!inbox.getComments(plot, new RunnableVal()
{
@Override @Override
public void run() { public void run()
if (value != null) { {
if (value != null)
{
int total = 0; int total = 0;
int unread = 0; int unread = 0;
for (PlotComment comment : (ArrayList<PlotComment>) value) { for (final PlotComment comment : (ArrayList<PlotComment>) value)
{
total++; total++;
if (comment.timestamp > CommentManager.getTimestamp(player, inbox.toString())) { if (comment.timestamp > CommentManager.getTimestamp(player, inbox.toString()))
{
unread++; unread++;
} }
} }
if (total != 0) { if (total != 0)
{
String color; String color;
if (unread > 0) { if (unread > 0)
{
color = "&c"; color = "&c";
} }
else { else
{
color = ""; color = "";
} }
sendMessage(player, C.INBOX_ITEM, color + inbox.toString() + " (" + total + "/" + unread + ")"); sendMessage(player, C.INBOX_ITEM, color + inbox.toString() + " (" + total + "/" + unread + ")");
@ -117,7 +136,8 @@ public class Inbox extends SubCommand {
} }
sendMessage(player, C.INBOX_ITEM, inbox.toString()); sendMessage(player, C.INBOX_ITEM, inbox.toString());
} }
})) { }))
{
sendMessage(player, C.INBOX_ITEM, inbox.toString()); sendMessage(player, C.INBOX_ITEM, inbox.toString());
} }
} }
@ -125,94 +145,120 @@ public class Inbox extends SubCommand {
return false; return false;
} }
final CommentInbox inbox = CommentManager.inboxes.get(args[0].toLowerCase()); final CommentInbox inbox = CommentManager.inboxes.get(args[0].toLowerCase());
if (inbox == null) { if (inbox == null)
sendMessage(player, C.INVALID_INBOX, StringMan.join(CommentManager.inboxes.keySet(),", ")); {
sendMessage(player, C.INVALID_INBOX, StringMan.join(CommentManager.inboxes.keySet(), ", "));
return false; return false;
} }
player.setMeta("inbox:" + inbox.toString(), System.currentTimeMillis()); player.setMeta("inbox:" + inbox.toString(), System.currentTimeMillis());
final int page; final int page;
if (args.length > 1) { if (args.length > 1)
switch (args[1].toLowerCase()) { {
case "delete": { switch (args[1].toLowerCase())
if (!inbox.canModify(plot, player)) { {
case "delete":
{
if (!inbox.canModify(plot, player))
{
sendMessage(player, C.NO_PERM_INBOX_MODIFY); sendMessage(player, C.NO_PERM_INBOX_MODIFY);
return false; return false;
} }
if (args.length != 3) { if (args.length != 3)
{
sendMessage(player, C.COMMAND_SYNTAX, "/plot inbox " + inbox.toString() + " delete <index>"); sendMessage(player, C.COMMAND_SYNTAX, "/plot inbox " + inbox.toString() + " delete <index>");
} }
final int index; final int index;
try { try
{
index = Integer.parseInt(args[2]); index = Integer.parseInt(args[2]);
if (index < 1) { if (index < 1)
{
sendMessage(player, C.NOT_VALID_INBOX_INDEX, index + ""); sendMessage(player, C.NOT_VALID_INBOX_INDEX, index + "");
return false; return false;
} }
} }
catch (NumberFormatException e) { catch (final NumberFormatException e)
{
sendMessage(player, C.COMMAND_SYNTAX, "/plot inbox " + inbox.toString() + " delete <index>"); sendMessage(player, C.COMMAND_SYNTAX, "/plot inbox " + inbox.toString() + " delete <index>");
return false; return false;
} }
if (!inbox.getComments(plot, new RunnableVal() { if (!inbox.getComments(plot, new RunnableVal()
{
@Override @Override
public void run() { public void run()
List<PlotComment> comments = (List<PlotComment>) value; {
if (index > comments.size()) { final List<PlotComment> comments = (List<PlotComment>) value;
if (index > comments.size())
{
sendMessage(player, C.NOT_VALID_INBOX_INDEX, index + ""); sendMessage(player, C.NOT_VALID_INBOX_INDEX, index + "");
} }
PlotComment comment = comments.get(index - 1); final PlotComment comment = comments.get(index - 1);
inbox.removeComment(plot, comment); inbox.removeComment(plot, comment);
plot.getSettings().removeComment(comment); plot.getSettings().removeComment(comment);
MainUtil.sendMessage(player, C.COMMENT_REMOVED, comment.comment); MainUtil.sendMessage(player, C.COMMENT_REMOVED, comment.comment);
} }
})) { }))
{
sendMessage(player, C.NOT_IN_PLOT); sendMessage(player, C.NOT_IN_PLOT);
return false; return false;
} }
return true; return true;
} }
case "clear": { case "clear":
if (!inbox.canModify(plot, player)) { {
if (!inbox.canModify(plot, player))
{
sendMessage(player, C.NO_PERM_INBOX_MODIFY); sendMessage(player, C.NO_PERM_INBOX_MODIFY);
} }
inbox.clearInbox(plot); inbox.clearInbox(plot);
ArrayList<PlotComment> comments = plot.getSettings().getComments(inbox.toString()); final ArrayList<PlotComment> comments = plot.getSettings().getComments(inbox.toString());
if (comments != null) { if (comments != null)
{
plot.getSettings().removeComments(comments); plot.getSettings().removeComments(comments);
} }
MainUtil.sendMessage(player, C.COMMENT_REMOVED, "*"); MainUtil.sendMessage(player, C.COMMENT_REMOVED, "*");
return true; return true;
} }
default: { default:
try { {
page = Integer.parseInt(args[1]) ; try
{
page = Integer.parseInt(args[1]);
} }
catch (NumberFormatException e) { catch (final NumberFormatException e)
{
sendMessage(player, C.COMMAND_SYNTAX, "/plot inbox [inbox] [delete <index>|clear|page]"); sendMessage(player, C.COMMAND_SYNTAX, "/plot inbox [inbox] [delete <index>|clear|page]");
return false; return false;
} }
} }
} }
} }
else { else
{
page = 1; page = 1;
} }
if (!inbox.canRead(plot, player)) { if (!inbox.canRead(plot, player))
{
sendMessage(player, C.NO_PERM_INBOX); sendMessage(player, C.NO_PERM_INBOX);
return false; return false;
} }
if (!inbox.getComments(plot, new RunnableVal() { if (!inbox.getComments(plot, new RunnableVal()
{
@Override @Override
public void run() { public void run()
List<PlotComment> comments = (List<PlotComment>) value; {
final List<PlotComment> comments = (List<PlotComment>) value;
displayComments(player, comments, page); displayComments(player, comments, page);
} }
})) { }))
if (plot == null) { {
if (plot == null)
{
sendMessage(player, C.NOT_IN_PLOT); sendMessage(player, C.NOT_IN_PLOT);
} }
else { else
{
sendMessage(player, C.PLOT_UNOWNED); sendMessage(player, C.PLOT_UNOWNED);
} }
return false; return false;

View File

@ -25,7 +25,6 @@ import java.util.Collection;
import java.util.UUID; import java.util.UUID;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import com.intellectualcrafters.plot.PS;
import com.intellectualcrafters.plot.config.C; import com.intellectualcrafters.plot.config.C;
import com.intellectualcrafters.plot.config.Settings; import com.intellectualcrafters.plot.config.Settings;
import com.intellectualcrafters.plot.database.DBFunc; import com.intellectualcrafters.plot.database.DBFunc;
@ -37,7 +36,6 @@ import com.intellectualcrafters.plot.object.PlotId;
import com.intellectualcrafters.plot.object.PlotInventory; import com.intellectualcrafters.plot.object.PlotInventory;
import com.intellectualcrafters.plot.object.PlotItemStack; import com.intellectualcrafters.plot.object.PlotItemStack;
import com.intellectualcrafters.plot.object.PlotPlayer; import com.intellectualcrafters.plot.object.PlotPlayer;
import com.intellectualcrafters.plot.object.PlotWorld;
import com.intellectualcrafters.plot.util.BlockManager; import com.intellectualcrafters.plot.util.BlockManager;
import com.intellectualcrafters.plot.util.MainUtil; import com.intellectualcrafters.plot.util.MainUtil;
import com.intellectualcrafters.plot.util.StringMan; import com.intellectualcrafters.plot.util.StringMan;
@ -46,52 +44,56 @@ import com.intellectualcrafters.plot.util.UUIDHandler;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "info", command = "info",
aliases = {"i"}, aliases = { "i" },
description = "Display plot info", description = "Display plot info",
usage = "/plot info <id>", usage = "/plot info <id>",
category = CommandCategory.INFO category = CommandCategory.INFO)
) public class Info extends SubCommand
public class Info extends SubCommand { {
public static String getPlayerList(final Collection<UUID> uuids) { public static String getPlayerList(final Collection<UUID> uuids)
ArrayList<UUID> l = new ArrayList<>(uuids); {
if ((l == null) || (l.size() < 1)) { final ArrayList<UUID> l = new ArrayList<>(uuids);
return C.NONE.s(); if ((l == null) || (l.size() < 1)) { return C.NONE.s(); }
}
final String c = C.PLOT_USER_LIST.s(); final String c = C.PLOT_USER_LIST.s();
final StringBuilder list = new StringBuilder(); final StringBuilder list = new StringBuilder();
for (int x = 0; x < l.size(); x++) { for (int x = 0; x < l.size(); x++)
if ((x + 1) == l.size()) { {
if ((x + 1) == l.size())
{
list.append(c.replace("%user%", getPlayerName(l.get(x))).replace(",", "")); list.append(c.replace("%user%", getPlayerName(l.get(x))).replace(",", ""));
} else { }
else
{
list.append(c.replace("%user%", getPlayerName(l.get(x)))); list.append(c.replace("%user%", getPlayerName(l.get(x))));
} }
} }
return list.toString(); return list.toString();
} }
public static String getPlayerName(final UUID uuid) { public static String getPlayerName(final UUID uuid)
if (uuid == null) { {
return C.UNKNOWN.s(); if (uuid == null) { return C.UNKNOWN.s(); }
} if (uuid.equals(DBFunc.everyone) || uuid.toString().equalsIgnoreCase(DBFunc.everyone.toString())) { return "everyone"; }
if (uuid.equals(DBFunc.everyone) || uuid.toString().equalsIgnoreCase(DBFunc.everyone.toString())) {
return "everyone";
}
final String name = UUIDHandler.getName(uuid); final String name = UUIDHandler.getName(uuid);
if (name == null) { if (name == null) { return "unknown"; }
return "unknown";
}
return name; return name;
} }
@Override @Override
public boolean onCommand(final PlotPlayer player, String[] args) { public boolean onCommand(final PlotPlayer player, String[] args)
{
String arg = null; String arg = null;
Plot plot; Plot plot;
if (args.length > 0) arg = args[0] + ""; if (args.length > 0)
if (arg != null) { {
switch (arg) { arg = args[0] + "";
}
if (arg != null)
{
switch (arg)
{
case "trusted": case "trusted":
case "alias": case "alias":
case "inv": case "inv":
@ -107,49 +109,66 @@ public class Info extends SubCommand {
break; break;
default: default:
plot = MainUtil.getPlotFromString(player, arg, false); plot = MainUtil.getPlotFromString(player, arg, false);
if (args.length == 2) { if (args.length == 2)
{
arg = args[1]; arg = args[1];
} }
else { else
{
arg = null; arg = null;
} }
break; break;
} }
} }
else { else
{
plot = MainUtil.getPlotFromString(player, null, false); plot = MainUtil.getPlotFromString(player, null, false);
} }
if (plot == null && arg != null) { if ((plot == null) && (arg != null))
{
plot = MainUtil.getPlotFromString(player, null, false); plot = MainUtil.getPlotFromString(player, null, false);
} }
if (plot == null) { if (plot == null)
{
MainUtil.sendMessage(player, C.NOT_IN_PLOT); MainUtil.sendMessage(player, C.NOT_IN_PLOT);
return false; return false;
} }
if (arg != null) { if (arg != null)
if (args.length == 1) { {
if (args.length == 1)
{
args = new String[0]; args = new String[0];
} }
else { else
{
args = new String[] { args[1] }; args = new String[] { args[1] };
} }
} }
if ((args.length == 1) && args[0].equalsIgnoreCase("inv")) { if ((args.length == 1) && args[0].equalsIgnoreCase("inv"))
PlotInventory inv = new PlotInventory(player) { {
final PlotInventory inv = new PlotInventory(player)
{
@Override @Override
public boolean onClick(int index) { public boolean onClick(final int index)
{
// TODO InfoInventory not implemented yet!!!!!!!! // TODO InfoInventory not implemented yet!!!!!!!!
// See plot rating or musicsubcommand on examples // See plot rating or musicsubcommand on examples
return false; return false;
} }
}; };
UUID uuid = player.getUUID(); final UUID uuid = player.getUUID();
String name = MainUtil.getName(plot.owner); final String name = MainUtil.getName(plot.owner);
inv.setItem(1, new PlotItemStack(388, (short) 0, 1, "&cPlot Info", new String[] { "&cID: &6" + plot.getId().toString(), "&cOwner: &6" + name, "&cAlias: &6" + plot.getSettings().getAlias(), "&cBiome: &6" + plot.getBiome().toString().replaceAll("_", "").toLowerCase(), "&cCan Build: &6" + plot.isAdded(uuid), "&cIs Denied: &6" + plot.isDenied(uuid)})); inv.setItem(1, new PlotItemStack(388, (short) 0, 1, "&cPlot Info", new String[] {
inv.setItem(1, new PlotItemStack(388, (short) 0, 1, "&cTrusted", new String[] {"&cAmount: &6" + plot.getTrusted().size(), "&8Click to view a list of the trusted users"})); "&cID: &6" + plot.getId().toString(),
inv.setItem(1, new PlotItemStack(388, (short) 0, 1, "&cMembers", new String[] {"&cAmount: &6" + plot.getMembers().size(), "&8Click to view a list of plot members"})); "&cOwner: &6" + name,
inv.setItem(1, new PlotItemStack(388, (short) 0, 1, "&cDenied", new String[] {"&cDenied", "&cAmount: &6" + plot.getDenied().size(), "&8Click to view a list of denied players"})); "&cAlias: &6" + plot.getSettings().getAlias(),
inv.setItem(1, new PlotItemStack(388, (short) 0, 1, "&cFlags", new String[] {"&cFlags", "&cAmount: &6" + plot.getSettings().flags.size(), "&8Click to view a list of plot flags"})); "&cBiome: &6" + plot.getBiome().toString().replaceAll("_", "").toLowerCase(),
"&cCan Build: &6" + plot.isAdded(uuid),
"&cIs Denied: &6" + plot.isDenied(uuid) }));
inv.setItem(1, new PlotItemStack(388, (short) 0, 1, "&cTrusted", new String[] { "&cAmount: &6" + plot.getTrusted().size(), "&8Click to view a list of the trusted users" }));
inv.setItem(1, new PlotItemStack(388, (short) 0, 1, "&cMembers", new String[] { "&cAmount: &6" + plot.getMembers().size(), "&8Click to view a list of plot members" }));
inv.setItem(1, new PlotItemStack(388, (short) 0, 1, "&cDenied", new String[] { "&cDenied", "&cAmount: &6" + plot.getDenied().size(), "&8Click to view a list of denied players" }));
inv.setItem(1, new PlotItemStack(388, (short) 0, 1, "&cFlags", new String[] { "&cFlags", "&cAmount: &6" + plot.getSettings().flags.size(), "&8Click to view a list of plot flags" }));
inv.openInventory(); inv.openInventory();
return true; return true;
} }
@ -162,27 +181,33 @@ public class Info extends SubCommand {
trustedEveryone = (plot.getMembers() != null) && plot.getMembers().contains(DBFunc.everyone); trustedEveryone = (plot.getMembers() != null) && plot.getMembers().contains(DBFunc.everyone);
} }
// Unclaimed? // Unclaimed?
if (!hasOwner && !containsEveryone && !trustedEveryone) { if (!hasOwner && !containsEveryone && !trustedEveryone)
{
MainUtil.sendMessage(player, C.PLOT_INFO_UNCLAIMED, (plot.id.x + ";" + plot.id.y)); MainUtil.sendMessage(player, C.PLOT_INFO_UNCLAIMED, (plot.id.x + ";" + plot.id.y));
return true; return true;
} }
String info = C.PLOT_INFO.s(); String info = C.PLOT_INFO.s();
if (arg != null) { if (arg != null)
{
info = getCaption(arg); info = getCaption(arg);
if (info == null) { if (info == null)
{
MainUtil.sendMessage(player, "&6Categories&7: &amembers&7, &aalias&7, &abiome&7, &adenied&7, &aflags&7, &aid&7, &asize&7, &atrusted&7, &aowner&7, &arating"); MainUtil.sendMessage(player, "&6Categories&7: &amembers&7, &aalias&7, &abiome&7, &adenied&7, &aflags&7, &aid&7, &asize&7, &atrusted&7, &aowner&7, &arating");
return false; return false;
} }
formatAndSend(info, plot.world, plot, player, true); formatAndSend(info, plot.world, plot, player, true);
} }
else { else
{
formatAndSend(info, plot.world, plot, player, false); formatAndSend(info, plot.world, plot, player, false);
} }
return true; return true;
} }
private String getCaption(final String string) { private String getCaption(final String string)
switch (string) { {
switch (string)
{
case "trusted": case "trusted":
return C.PLOT_INFO_TRUSTED.s(); return C.PLOT_INFO_TRUSTED.s();
case "alias": case "alias":
@ -208,25 +233,29 @@ public class Info extends SubCommand {
} }
} }
private void formatAndSend(String info, final String world, final Plot plot, final PlotPlayer player, final boolean full) { private void formatAndSend(String info, final String world, final Plot plot, final PlotPlayer player, final boolean full)
{
final PlotId id = plot.id; final PlotId id = plot.id;
final PlotId id2 = MainUtil.getTopPlot(plot).id; final PlotId id2 = MainUtil.getTopPlot(plot).id;
final int num = MainUtil.getPlotSelectionIds(id, id2).size(); final int num = MainUtil.getPlotSelectionIds(id, id2).size();
final String alias = plot.getSettings().getAlias().length() > 0 ? plot.getSettings().getAlias() : C.NONE.s(); final String alias = plot.getSettings().getAlias().length() > 0 ? plot.getSettings().getAlias() : C.NONE.s();
Location top = MainUtil.getPlotTopLoc(world, plot.id); final Location top = MainUtil.getPlotTopLoc(world, plot.id);
Location bot = MainUtil.getPlotBottomLoc(world, plot.id).add(1, 0, 1); final Location bot = MainUtil.getPlotBottomLoc(world, plot.id).add(1, 0, 1);
final String biome = BlockManager.manager.getBiome(plot.world, bot.getX() + ((top.getX() - bot.getX()) / 2), bot.getZ() + ((top.getZ() - bot.getZ()) / 2)); final String biome = BlockManager.manager.getBiome(plot.world, bot.getX() + ((top.getX() - bot.getX()) / 2), bot.getZ() + ((top.getZ() - bot.getZ()) / 2));
final String trusted = getPlayerList(plot.getTrusted()); final String trusted = getPlayerList(plot.getTrusted());
final String members = getPlayerList(plot.getMembers()); final String members = getPlayerList(plot.getMembers());
final String denied = getPlayerList(plot.getDenied()); final String denied = getPlayerList(plot.getDenied());
Flag descriptionFlag = FlagManager.getPlotFlag(plot, "description"); final Flag descriptionFlag = FlagManager.getPlotFlag(plot, "description");
final String description = descriptionFlag == null ? C.NONE.s() : descriptionFlag.getValueString(); final String description = descriptionFlag == null ? C.NONE.s() : descriptionFlag.getValueString();
final String flags = StringMan.replaceFromMap("$2" + (StringMan.join(FlagManager.getPlotFlags(plot.world, plot.getSettings(), true).values(), "").length() > 0 ? StringMan.join(FlagManager.getPlotFlags(plot.world, plot.getSettings(), true).values(), "$1, $2") : C.NONE.s()), C.replacements); final String flags = StringMan.replaceFromMap(
"$2"
+ (StringMan.join(FlagManager.getPlotFlags(plot.world, plot.getSettings(), true).values(), "").length() > 0 ? StringMan.join(FlagManager.getPlotFlags(plot.world, plot.getSettings(), true)
.values(), "$1, $2") : C.NONE.s()), C.replacements);
final boolean build = plot.isAdded(player.getUUID()); final boolean build = plot.isAdded(player.getUUID());
String owner = plot.owner == null ? "unowned" : getPlayerList(plot.getOwners()); final String owner = plot.owner == null ? "unowned" : getPlayerList(plot.getOwners());
info = info.replaceAll("%alias%", alias); info = info.replaceAll("%alias%", alias);
info = info.replaceAll("%id%", id.toString()); info = info.replaceAll("%id%", id.toString());
@ -242,27 +271,34 @@ public class Info extends SubCommand {
info = info.replaceAll("%flags%", Matcher.quoteReplacement(flags)); info = info.replaceAll("%flags%", Matcher.quoteReplacement(flags));
info = info.replaceAll("%build%", build + ""); info = info.replaceAll("%build%", build + "");
info = info.replaceAll("%desc%", "No description set."); info = info.replaceAll("%desc%", "No description set.");
if (info.contains("%rating%")) { if (info.contains("%rating%"))
{
final String newInfo = info; final String newInfo = info;
TaskManager.runTaskAsync(new Runnable() { TaskManager.runTaskAsync(new Runnable()
{
@Override @Override
public void run() { public void run()
{
int max = 10; int max = 10;
if (Settings.RATING_CATEGORIES != null && Settings.RATING_CATEGORIES.size() > 0) { if ((Settings.RATING_CATEGORIES != null) && (Settings.RATING_CATEGORIES.size() > 0))
{
max = 8; max = 8;
} }
String info; String info;
if (full && Settings.RATING_CATEGORIES != null && Settings.RATING_CATEGORIES.size() > 1) { if (full && (Settings.RATING_CATEGORIES != null) && (Settings.RATING_CATEGORIES.size() > 1))
{
String rating = ""; String rating = "";
String prefix = ""; String prefix = "";
double[] ratings = MainUtil.getAverageRatings(plot); final double[] ratings = MainUtil.getAverageRatings(plot);
for (int i = 0; i < ratings.length; i++) { for (int i = 0; i < ratings.length; i++)
{
rating += prefix + Settings.RATING_CATEGORIES.get(i) + "=" + String.format("%.1f", ratings[i]); rating += prefix + Settings.RATING_CATEGORIES.get(i) + "=" + String.format("%.1f", ratings[i]);
prefix = ","; prefix = ",";
} }
info = newInfo.replaceAll("%rating%", rating); info = newInfo.replaceAll("%rating%", rating);
} }
else { else
{
info = newInfo.replaceAll("%rating%", String.format("%.1f", MainUtil.getAverageRating(plot)) + "/" + max); info = newInfo.replaceAll("%rating%", String.format("%.1f", MainUtil.getAverageRating(plot)) + "/" + max);
} }
MainUtil.sendMessage(player, C.PLOT_INFO_HEADER); MainUtil.sendMessage(player, C.PLOT_INFO_HEADER);

View File

@ -31,38 +31,41 @@ import com.intellectualcrafters.plot.util.UUIDHandler;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "kick", command = "kick",
aliases = {"k"}, aliases = { "k" },
description = "Kick a player from your plot", description = "Kick a player from your plot",
permission = "plots.kick", permission = "plots.kick",
category = CommandCategory.ACTIONS, category = CommandCategory.ACTIONS,
requiredType = RequiredType.NONE requiredType = RequiredType.NONE)
) public class Kick extends SubCommand
public class Kick extends SubCommand { {
@Override @Override
public boolean onCommand(final PlotPlayer plr, final String[] args) { public boolean onCommand(final PlotPlayer plr, final String[] args)
{
final Location loc = plr.getLocation(); final Location loc = plr.getLocation();
final Plot plot = MainUtil.getPlot(loc); final Plot plot = MainUtil.getPlot(loc);
if (plot == null) { if (plot == null) { return !sendMessage(plr, C.NOT_IN_PLOT); }
return !sendMessage(plr, C.NOT_IN_PLOT); if ((plot == null) || ((!plot.hasOwner() || !plot.isOwner(plr.getUUID())) && !Permissions.hasPermission(plr, "plots.admin.command.kick")))
} {
if (plot == null || ((!plot.hasOwner() || !plot.isOwner(plr.getUUID())) && !Permissions.hasPermission(plr, "plots.admin.command.kick"))) {
MainUtil.sendMessage(plr, C.NO_PLOT_PERMS); MainUtil.sendMessage(plr, C.NO_PLOT_PERMS);
return false; return false;
} }
if (args.length != 1) { if (args.length != 1)
{
MainUtil.sendMessage(plr, "&c/plot kick <player>"); MainUtil.sendMessage(plr, "&c/plot kick <player>");
return false; return false;
} }
final PlotPlayer player = UUIDHandler.getPlayer(args[0]); final PlotPlayer player = UUIDHandler.getPlayer(args[0]);
if (player == null) { if (player == null)
{
MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[0]); MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[0]);
return false; return false;
} }
Location otherLoc = player.getLocation(); final Location otherLoc = player.getLocation();
if (!plr.getLocation().getWorld().equals(otherLoc.getWorld()) || !plot.equals(MainUtil.getPlot(otherLoc))) { if (!plr.getLocation().getWorld().equals(otherLoc.getWorld()) || !plot.equals(MainUtil.getPlot(otherLoc)))
{
MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[0]); MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[0]);
return false; return false;
} }

View File

@ -23,7 +23,6 @@ package com.intellectualcrafters.plot.commands;
import java.util.UUID; import java.util.UUID;
import com.intellectualcrafters.plot.config.C; import com.intellectualcrafters.plot.config.C;
import com.intellectualcrafters.plot.object.OfflinePlotPlayer;
import com.intellectualcrafters.plot.object.PlotPlayer; import com.intellectualcrafters.plot.object.PlotPlayer;
import com.intellectualcrafters.plot.util.MainUtil; import com.intellectualcrafters.plot.util.MainUtil;
import com.intellectualcrafters.plot.util.UUIDHandler; import com.intellectualcrafters.plot.util.UUIDHandler;
@ -31,38 +30,40 @@ import com.plotsquared.general.commands.Argument;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "limit", command = "limit",
permission = "plots.limit", permission = "plots.limit",
description = "Set or increment player plot claim limits", description = "Set or increment player plot claim limits",
aliases = {"setlimit"}, aliases = { "setlimit" },
usage = "/plot limit <player> <expression>", usage = "/plot limit <player> <expression>",
category = CommandCategory.DEBUG category = CommandCategory.DEBUG)
) public class Limit extends SubCommand
public class Limit extends SubCommand { {
public Limit() { public Limit()
{
requiredArguments = new Argument[] { requiredArguments = new Argument[] {
Argument.String, Argument.String,
Argument.String Argument.String
}; };
} }
@Override @Override
public boolean onCommand(final PlotPlayer plr, final String[] args) { public boolean onCommand(final PlotPlayer plr, final String[] args)
UUID uuid = UUIDHandler.getUUID(args[0], null); {
if (uuid == null) { final UUID uuid = UUIDHandler.getUUID(args[0], null);
if (uuid == null)
{
MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[0]); MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[0]);
return false; return false;
} }
OfflinePlotPlayer op = UUIDHandler.getUUIDWrapper().getOfflinePlayer(uuid); UUIDHandler.getUUIDWrapper().getOfflinePlayer(uuid);
// get current plot limit // get current plot limit
// increase // increase
// EconHandler.manager.setPermission(op, perm, value); // EconHandler.manager.setPermission(op, perm, value);
plr.sendMessage("TODO"); plr.sendMessage("TODO");
return true; return true;
} }
} }

View File

@ -19,90 +19,106 @@ import com.intellectualcrafters.plot.util.TaskManager;
import com.plotsquared.general.commands.CommandDeclaration; import com.plotsquared.general.commands.CommandDeclaration;
@CommandDeclaration( @CommandDeclaration(
command = "load", command = "load",
aliases = {"restore"}, aliases = { "restore" },
category = CommandCategory.ACTIONS, category = CommandCategory.ACTIONS,
requiredType = RequiredType.NONE, requiredType = RequiredType.NONE,
description = "Load your plot", description = "Load your plot",
permission = "plots.load", permission = "plots.load",
usage = "/plot restore" usage = "/plot restore")
) public class Load extends SubCommand
public class Load extends SubCommand { {
@Override @Override
public boolean onCommand(final PlotPlayer plr, final String[] args) { public boolean onCommand(final PlotPlayer plr, final String[] args)
{
if (!Settings.METRICS) {
if (!Settings.METRICS)
{
MainUtil.sendMessage(plr, "&cPlease enable metrics in order to use this command.\n&7 - Or host it yourself if you don't like the free service"); MainUtil.sendMessage(plr, "&cPlease enable metrics in order to use this command.\n&7 - Or host it yourself if you don't like the free service");
return false; return false;
} }
final String world = plr.getLocation().getWorld(); final String world = plr.getLocation().getWorld();
if (!PS.get().isPlotWorld(world)) { if (!PS.get().isPlotWorld(world)) { return !sendMessage(plr, C.NOT_IN_PLOT_WORLD); }
return !sendMessage(plr, C.NOT_IN_PLOT_WORLD);
}
final Plot plot = MainUtil.getPlot(plr.getLocation()); final Plot plot = MainUtil.getPlot(plr.getLocation());
if (plot == null) { if (plot == null) { return !sendMessage(plr, C.NOT_IN_PLOT); }
return !sendMessage(plr, C.NOT_IN_PLOT); if (!plot.hasOwner())
} {
if (!plot.hasOwner()) {
MainUtil.sendMessage(plr, C.PLOT_UNOWNED); MainUtil.sendMessage(plr, C.PLOT_UNOWNED);
return false; return false;
} }
if (!plot.isOwner(plr.getUUID()) && !Permissions.hasPermission(plr, "plots.admin.command.load")) { if (!plot.isOwner(plr.getUUID()) && !Permissions.hasPermission(plr, "plots.admin.command.load"))
{
MainUtil.sendMessage(plr, C.NO_PLOT_PERMS); MainUtil.sendMessage(plr, C.NO_PLOT_PERMS);
return false; return false;
} }
if (MainUtil.runners.containsKey(plot)) { if (MainUtil.runners.containsKey(plot))
{
MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER); MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER);
return false; return false;
} }
if (args.length != 0) { if (args.length != 0)
if (args.length == 1) { {
if (args.length == 1)
{
// TODO load save here // TODO load save here
List<String> schematics = (List<String>) plr.getMeta("plot_schematics"); final List<String> schematics = (List<String>) plr.getMeta("plot_schematics");
if (schematics == null) { if (schematics == null)
{
// No schematics found: // No schematics found:
MainUtil.sendMessage(plr, C.LOAD_NULL); MainUtil.sendMessage(plr, C.LOAD_NULL);
return false; return false;
} }
String schem; String schem;
try { try
{
schem = schematics.get(Integer.parseInt(args[0]) - 1); schem = schematics.get(Integer.parseInt(args[0]) - 1);
} }
catch (Exception e) { catch (final Exception e)
{
// use /plot load <index> // use /plot load <index>
MainUtil.sendMessage(plr, C.NOT_VALID_NUMBER, "(1, " + schematics.size() + ")"); MainUtil.sendMessage(plr, C.NOT_VALID_NUMBER, "(1, " + schematics.size() + ")");
return false; return false;
} }
final URL url; final URL url;
try { try
{
url = new URL(Settings.WEB_URL + "saves/" + plr.getUUID() + "/" + schem + ".schematic"); url = new URL(Settings.WEB_URL + "saves/" + plr.getUUID() + "/" + schem + ".schematic");
} catch (MalformedURLException e) { }
catch (final MalformedURLException e)
{
e.printStackTrace(); e.printStackTrace();
MainUtil.sendMessage(plr, C.LOAD_FAILED); MainUtil.sendMessage(plr, C.LOAD_FAILED);
return false; return false;
} }
MainUtil.runners.put(plot, 1); MainUtil.runners.put(plot, 1);
MainUtil.sendMessage(plr, C.GENERATING_COMPONENT); MainUtil.sendMessage(plr, C.GENERATING_COMPONENT);
TaskManager.runTaskAsync(new Runnable() { TaskManager.runTaskAsync(new Runnable()
{
@Override @Override
public void run() { public void run()
Schematic schematic = SchematicHandler.manager.getSchematic(url); {
if (schematic == null) { final Schematic schematic = SchematicHandler.manager.getSchematic(url);
if (schematic == null)
{
MainUtil.runners.remove(plot); MainUtil.runners.remove(plot);
sendMessage(plr, C.SCHEMATIC_INVALID, "non-existent or not in gzip format"); sendMessage(plr, C.SCHEMATIC_INVALID, "non-existent or not in gzip format");
return; return;
} }
SchematicHandler.manager.paste(schematic, plot, 0, 0, new RunnableVal<Boolean>() { SchematicHandler.manager.paste(schematic, plot, 0, 0, new RunnableVal<Boolean>()
{
@Override @Override
public void run() { public void run()
{
MainUtil.runners.remove(plot); MainUtil.runners.remove(plot);
if (this.value) { if (value)
{
sendMessage(plr, C.SCHEMATIC_PASTE_SUCCESS); sendMessage(plr, C.SCHEMATIC_PASTE_SUCCESS);
} }
else { else
{
sendMessage(plr, C.SCHEMATIC_PASTE_FAILED); sendMessage(plr, C.SCHEMATIC_PASTE_FAILED);
} }
} }
@ -115,18 +131,22 @@ public class Load extends SubCommand {
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot load <index>"); MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot load <index>");
return false; return false;
} }
// list schematics // list schematics
List<String> schematics = (List<String>) plr.getMeta("plot_schematics"); final List<String> schematics = (List<String>) plr.getMeta("plot_schematics");
if (schematics == null) { if (schematics == null)
{
MainUtil.runners.put(plot, 1); MainUtil.runners.put(plot, 1);
TaskManager.runTaskAsync(new Runnable() { TaskManager.runTaskAsync(new Runnable()
{
@Override @Override
public void run() { public void run()
List<String> schematics = SchematicHandler.manager.getSaves(plr.getUUID()); {
final List<String> schematics = SchematicHandler.manager.getSaves(plr.getUUID());
MainUtil.runners.remove(plot); MainUtil.runners.remove(plot);
if (schematics == null || schematics.size() == 0) { if ((schematics == null) || (schematics.size() == 0))
{
MainUtil.sendMessage(plr, C.LOAD_FAILED); MainUtil.sendMessage(plr, C.LOAD_FAILED);
return; return;
} }
@ -135,76 +155,91 @@ public class Load extends SubCommand {
} }
}); });
} }
else { else
{
displaySaves(plr, 0); displaySaves(plr, 0);
} }
return true; return true;
} }
public void displaySaves(PlotPlayer player, int page) { public void displaySaves(final PlotPlayer player, final int page)
List<String> schematics = (List<String>) player.getMeta("plot_schematics"); {
for (int i = 0; i < Math.min(schematics.size(), 32); i++) { final List<String> schematics = (List<String>) player.getMeta("plot_schematics");
try { for (int i = 0; i < Math.min(schematics.size(), 32); i++)
String schem = schematics.get(i); {
String[] split = schem.split("_"); try
if (split.length != 6) { {
final String schem = schematics.get(i);
final String[] split = schem.split("_");
if (split.length != 6)
{
continue; continue;
} }
String time = secToTime((System.currentTimeMillis() / 1000) - (Long.parseLong(split[0]))); final String time = secToTime((System.currentTimeMillis() / 1000) - (Long.parseLong(split[0])));
String world = split[1]; final String world = split[1];
PlotId id = PlotId.fromString(split[2] + ";" + split[3]); final PlotId id = PlotId.fromString(split[2] + ";" + split[3]);
String size = split[4]; final String size = split[4];
String server = split[5].replaceAll(".schematic", ""); final String server = split[5].replaceAll(".schematic", "");
String color; String color;
if (PS.get().IMP.getServerName().replaceAll("[^A-Za-z0-9]", "").equals(server)) { if (PS.get().IMP.getServerName().replaceAll("[^A-Za-z0-9]", "").equals(server))
{
color = "$4"; color = "$4";
} }
else { else
{
color = "$1"; color = "$1";
} }
MainUtil.sendMessage(player, "$3[$2" + (i + 1) + "$3] " + color + time + "$3 | " + color + world + ";" + id + "$3 | " + color + size + "x" + size); MainUtil.sendMessage(player, "$3[$2" + (i + 1) + "$3] " + color + time + "$3 | " + color + world + ";" + id + "$3 | " + color + size + "x" + size);
} }
catch (Exception e) { catch (final Exception e)
{
e.printStackTrace(); e.printStackTrace();
} }
} }
MainUtil.sendMessage(player, C.LOAD_LIST); MainUtil.sendMessage(player, C.LOAD_LIST);
} }
public String secToTime(long time) { public String secToTime(long time)
StringBuilder toreturn = new StringBuilder(); {
final StringBuilder toreturn = new StringBuilder();
int years = 0; int years = 0;
int weeks = 0; int weeks = 0;
int days = 0; int days = 0;
int hours = 0; int hours = 0;
int minutes = 0; int minutes = 0;
if (time>=33868800) { if (time >= 33868800)
years = (int) (time/33868800); {
time-=years*33868800; years = (int) (time / 33868800);
toreturn.append(years+"y "); time -= years * 33868800;
toreturn.append(years + "y ");
} }
if (time>=604800) { if (time >= 604800)
weeks = (int) (time/604800); {
time-=weeks*604800; weeks = (int) (time / 604800);
toreturn.append(weeks+"w "); time -= weeks * 604800;
toreturn.append(weeks + "w ");
} }
if (time>=86400) { if (time >= 86400)
days = (int) (time/86400); {
time-=days*86400; days = (int) (time / 86400);
toreturn.append(days+"d "); time -= days * 86400;
toreturn.append(days + "d ");
} }
if (time>=3600) { if (time >= 3600)
hours = (int) (time/3600); {
time-=hours*3600; hours = (int) (time / 3600);
toreturn.append(hours+"h "); time -= hours * 3600;
toreturn.append(hours + "h ");
} }
if (time>=60) { if (time >= 60)
minutes = (int) (time/60); {
time-=minutes*60; minutes = (int) (time / 60);
toreturn.append(minutes+"m "); time -= minutes * 60;
toreturn.append(minutes + "m ");
} }
if (toreturn.equals("")||time>0){ if (toreturn.equals("") || (time > 0))
toreturn.append((time)+"s "); {
toreturn.append((time) + "s ");
} }
return toreturn.toString().trim(); return toreturn.toString().trim();
} }

Some files were not shown because too many files have changed in this diff Show More