mirror of
https://github.com/IntellectualSites/PlotSquared.git
synced 2024-11-22 05:06:44 +01:00
cleanup
This commit is contained in:
parent
37a8861fa0
commit
c386f33df8
3
.gitignore
vendored
3
.gitignore
vendored
@ -6,4 +6,5 @@
|
||||
/target/PlotSquared-Uber.jar
|
||||
/target/maven-archiver
|
||||
*.project
|
||||
*.classpath
|
||||
*.classpath
|
||||
/target/
|
||||
|
@ -5,7 +5,8 @@ import java.util.Map;
|
||||
/**
|
||||
* 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.
|
||||
* <p>
|
||||
@ -20,7 +21,8 @@ public interface Configuration extends ConfigurationSection {
|
||||
* @param value Value to set the default to.
|
||||
* @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.
|
||||
@ -32,7 +34,7 @@ public interface Configuration extends ConfigurationSection {
|
||||
* @param defaults A map of Path->Values to add to defaults.
|
||||
* @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.
|
||||
@ -49,7 +51,7 @@ public interface Configuration extends ConfigurationSection {
|
||||
* @param defaults A configuration holding a list of defaults to copy.
|
||||
* @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}.
|
||||
@ -60,7 +62,7 @@ public interface Configuration extends ConfigurationSection {
|
||||
* @param defaults New source of default values for this configuration.
|
||||
* @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.
|
||||
|
@ -4,12 +4,14 @@ package com.intellectualcrafters.configuration;
|
||||
* Various settings for controlling the input and output of a {@link
|
||||
* Configuration}
|
||||
*/
|
||||
public class ConfigurationOptions {
|
||||
public class ConfigurationOptions
|
||||
{
|
||||
private char pathSeparator = '.';
|
||||
private boolean copyDefaults = false;
|
||||
private final Configuration configuration;
|
||||
|
||||
protected ConfigurationOptions(Configuration configuration) {
|
||||
protected ConfigurationOptions(final Configuration configuration)
|
||||
{
|
||||
this.configuration = configuration;
|
||||
}
|
||||
|
||||
@ -18,7 +20,8 @@ public class ConfigurationOptions {
|
||||
*
|
||||
* @return Parent configuration
|
||||
*/
|
||||
public Configuration configuration() {
|
||||
public Configuration configuration()
|
||||
{
|
||||
return configuration;
|
||||
}
|
||||
|
||||
@ -31,7 +34,8 @@ public class ConfigurationOptions {
|
||||
*
|
||||
* @return Path separator
|
||||
*/
|
||||
public char pathSeparator() {
|
||||
public char pathSeparator()
|
||||
{
|
||||
return pathSeparator;
|
||||
}
|
||||
|
||||
@ -45,8 +49,9 @@ public class ConfigurationOptions {
|
||||
* @param value Path separator
|
||||
* @return This object, for chaining
|
||||
*/
|
||||
public ConfigurationOptions pathSeparator(char value) {
|
||||
this.pathSeparator = value;
|
||||
public ConfigurationOptions pathSeparator(final char value)
|
||||
{
|
||||
pathSeparator = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
@ -64,7 +69,8 @@ public class ConfigurationOptions {
|
||||
*
|
||||
* @return Whether or not defaults are directly copied
|
||||
*/
|
||||
public boolean copyDefaults() {
|
||||
public boolean copyDefaults()
|
||||
{
|
||||
return copyDefaults;
|
||||
}
|
||||
|
||||
@ -83,8 +89,9 @@ public class ConfigurationOptions {
|
||||
* @param value Whether or not defaults are directly copied
|
||||
* @return This object, for chaining
|
||||
*/
|
||||
public ConfigurationOptions copyDefaults(boolean value) {
|
||||
this.copyDefaults = value;
|
||||
public ConfigurationOptions copyDefaults(final boolean value)
|
||||
{
|
||||
copyDefaults = value;
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
@ -7,7 +7,8 @@ import java.util.Set;
|
||||
/**
|
||||
* Represents a section of a {@link Configuration}
|
||||
*/
|
||||
public interface ConfigurationSection {
|
||||
public interface ConfigurationSection
|
||||
{
|
||||
/**
|
||||
* Gets a set containing all keys in this section.
|
||||
* <p>
|
||||
@ -22,7 +23,7 @@ public interface ConfigurationSection {
|
||||
* list.
|
||||
* @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.
|
||||
@ -38,7 +39,7 @@ public interface ConfigurationSection {
|
||||
* list.
|
||||
* @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.
|
||||
@ -51,7 +52,7 @@ public interface ConfigurationSection {
|
||||
* default or being set.
|
||||
* @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
|
||||
@ -65,7 +66,7 @@ public interface ConfigurationSection {
|
||||
* having a default.
|
||||
* @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
|
||||
@ -132,7 +133,7 @@ public interface ConfigurationSection {
|
||||
* @param path Path of the Object to get.
|
||||
* @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
|
||||
@ -146,7 +147,7 @@ public interface ConfigurationSection {
|
||||
* @param def The default value to return if the path is not found.
|
||||
* @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.
|
||||
@ -162,7 +163,7 @@ public interface ConfigurationSection {
|
||||
* @param path Path of the object to set.
|
||||
* @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.
|
||||
@ -174,7 +175,7 @@ public interface ConfigurationSection {
|
||||
* @param path Path to create the section at.
|
||||
* @return Newly created section
|
||||
*/
|
||||
public ConfigurationSection createSection(String path);
|
||||
public ConfigurationSection createSection(final String path);
|
||||
|
||||
/**
|
||||
* Creates a {@link ConfigurationSection} at the specified path, with
|
||||
@ -188,7 +189,7 @@ public interface ConfigurationSection {
|
||||
* @param map The values to used.
|
||||
* @return Newly created section
|
||||
*/
|
||||
public ConfigurationSection createSection(String path, Map<?, ?> map);
|
||||
public ConfigurationSection createSection(final String path, final Map<?, ?> map);
|
||||
|
||||
// Primitives
|
||||
/**
|
||||
@ -201,7 +202,7 @@ public interface ConfigurationSection {
|
||||
* @param path Path of the String to get.
|
||||
* @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
|
||||
@ -216,7 +217,7 @@ public interface ConfigurationSection {
|
||||
* not a 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.
|
||||
@ -229,7 +230,7 @@ public interface ConfigurationSection {
|
||||
* @param path Path of the String to check.
|
||||
* @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.
|
||||
@ -241,7 +242,7 @@ public interface ConfigurationSection {
|
||||
* @param path Path of the int to get.
|
||||
* @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.
|
||||
@ -255,7 +256,7 @@ public interface ConfigurationSection {
|
||||
* not an 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.
|
||||
@ -268,7 +269,7 @@ public interface ConfigurationSection {
|
||||
* @param path Path of the int to check.
|
||||
* @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.
|
||||
@ -280,7 +281,7 @@ public interface ConfigurationSection {
|
||||
* @param path Path of the boolean to get.
|
||||
* @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
|
||||
@ -295,7 +296,7 @@ public interface ConfigurationSection {
|
||||
* not a 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.
|
||||
@ -308,7 +309,7 @@ public interface ConfigurationSection {
|
||||
* @param path Path of the boolean to check.
|
||||
* @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.
|
||||
@ -320,7 +321,7 @@ public interface ConfigurationSection {
|
||||
* @param path Path of the double to get.
|
||||
* @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
|
||||
@ -335,7 +336,7 @@ public interface ConfigurationSection {
|
||||
* not a 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.
|
||||
@ -348,7 +349,7 @@ public interface ConfigurationSection {
|
||||
* @param path Path of the double to check.
|
||||
* @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.
|
||||
@ -360,7 +361,7 @@ public interface ConfigurationSection {
|
||||
* @param path Path of the long to get.
|
||||
* @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
|
||||
@ -375,7 +376,7 @@ public interface ConfigurationSection {
|
||||
* not a 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.
|
||||
@ -388,7 +389,7 @@ public interface ConfigurationSection {
|
||||
* @param path Path of the long to check.
|
||||
* @return Whether or not the specified path is a long.
|
||||
*/
|
||||
public boolean isLong(String path);
|
||||
public boolean isLong(final String path);
|
||||
|
||||
// Java
|
||||
/**
|
||||
@ -401,7 +402,7 @@ public interface ConfigurationSection {
|
||||
* @param path Path of the List to get.
|
||||
* @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
|
||||
@ -416,7 +417,7 @@ public interface ConfigurationSection {
|
||||
* not a 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.
|
||||
@ -429,7 +430,7 @@ public interface ConfigurationSection {
|
||||
* @param path Path of the List to check.
|
||||
* @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.
|
||||
@ -444,7 +445,7 @@ public interface ConfigurationSection {
|
||||
* @param path Path of the List to get.
|
||||
* @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.
|
||||
@ -459,7 +460,7 @@ public interface ConfigurationSection {
|
||||
* @param path Path of the List to get.
|
||||
* @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.
|
||||
@ -474,7 +475,7 @@ public interface ConfigurationSection {
|
||||
* @param path Path of the List to get.
|
||||
* @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.
|
||||
@ -489,7 +490,7 @@ public interface ConfigurationSection {
|
||||
* @param path Path of the List to get.
|
||||
* @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.
|
||||
@ -504,7 +505,7 @@ public interface ConfigurationSection {
|
||||
* @param path Path of the List to get.
|
||||
* @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.
|
||||
@ -519,7 +520,7 @@ public interface ConfigurationSection {
|
||||
* @param path Path of the List to get.
|
||||
* @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.
|
||||
@ -534,7 +535,7 @@ public interface ConfigurationSection {
|
||||
* @param path Path of the List to get.
|
||||
* @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.
|
||||
@ -549,7 +550,7 @@ public interface ConfigurationSection {
|
||||
* @param path Path of the List to get.
|
||||
* @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.
|
||||
@ -564,7 +565,7 @@ public interface ConfigurationSection {
|
||||
* @param path Path of the List to get.
|
||||
* @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.
|
||||
@ -579,7 +580,7 @@ public interface ConfigurationSection {
|
||||
* @param path Path of the List to get.
|
||||
* @return Requested List of Maps.
|
||||
*/
|
||||
public List<Map<?, ?>> getMapList(String path);
|
||||
public List<Map<?, ?>> getMapList(final String path);
|
||||
|
||||
/**
|
||||
* Gets the requested ConfigurationSection by path.
|
||||
@ -592,7 +593,7 @@ public interface ConfigurationSection {
|
||||
* @param path Path of the ConfigurationSection to get.
|
||||
* @return Requested ConfigurationSection.
|
||||
*/
|
||||
public ConfigurationSection getConfigurationSection(String path);
|
||||
public ConfigurationSection getConfigurationSection(final String path);
|
||||
|
||||
/**
|
||||
* Checks if the specified path is a ConfigurationSection.
|
||||
@ -606,7 +607,7 @@ public interface ConfigurationSection {
|
||||
* @param path Path of the ConfigurationSection to check.
|
||||
* @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
|
||||
@ -638,5 +639,5 @@ public interface ConfigurationSection {
|
||||
* @param value Value to set the default to.
|
||||
* @throws IllegalArgumentException Thrown if path is null.
|
||||
*/
|
||||
public void addDefault(String path, Object value);
|
||||
public void addDefault(final String path, final Object value);
|
||||
}
|
||||
|
@ -4,13 +4,15 @@ package com.intellectualcrafters.configuration;
|
||||
* Exception thrown when attempting to load an invalid {@link Configuration}
|
||||
*/
|
||||
@SuppressWarnings("serial")
|
||||
public class InvalidConfigurationException extends Exception {
|
||||
public class InvalidConfigurationException extends Exception
|
||||
{
|
||||
|
||||
/**
|
||||
* Creates a new instance of InvalidConfigurationException without a
|
||||
* message or cause.
|
||||
*/
|
||||
public InvalidConfigurationException() {}
|
||||
public InvalidConfigurationException()
|
||||
{}
|
||||
|
||||
/**
|
||||
* Constructs an instance of InvalidConfigurationException with the
|
||||
@ -18,7 +20,8 @@ public class InvalidConfigurationException extends Exception {
|
||||
*
|
||||
* @param msg The details of the exception.
|
||||
*/
|
||||
public InvalidConfigurationException(String msg) {
|
||||
public InvalidConfigurationException(final String msg)
|
||||
{
|
||||
super(msg);
|
||||
}
|
||||
|
||||
@ -28,7 +31,8 @@ public class InvalidConfigurationException extends Exception {
|
||||
*
|
||||
* @param cause The cause of the exception.
|
||||
*/
|
||||
public InvalidConfigurationException(Throwable cause) {
|
||||
public InvalidConfigurationException(final Throwable cause)
|
||||
{
|
||||
super(cause);
|
||||
}
|
||||
|
||||
@ -39,7 +43,8 @@ public class InvalidConfigurationException extends Exception {
|
||||
* @param cause The cause 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);
|
||||
}
|
||||
}
|
||||
|
@ -7,14 +7,16 @@ import java.util.Map;
|
||||
* from any source, and stores all values in memory only.
|
||||
* 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 MemoryConfigurationOptions options;
|
||||
|
||||
/**
|
||||
* Creates an empty {@link MemoryConfiguration} with no default values.
|
||||
*/
|
||||
public MemoryConfiguration() {}
|
||||
public MemoryConfiguration()
|
||||
{}
|
||||
|
||||
/**
|
||||
* 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
|
||||
* @throws IllegalArgumentException Thrown if defaults is null
|
||||
*/
|
||||
public MemoryConfiguration(Configuration defaults) {
|
||||
public MemoryConfiguration(final Configuration defaults)
|
||||
{
|
||||
this.defaults = defaults;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addDefault(String path, Object value) {
|
||||
if (path == null) throw new NullPointerException("Path may not be null");
|
||||
if (defaults == null) {
|
||||
public void addDefault(final String path, final Object value)
|
||||
{
|
||||
if (path == null) { throw new NullPointerException("Path may not be null"); }
|
||||
if (defaults == null)
|
||||
{
|
||||
defaults = new MemoryConfiguration();
|
||||
}
|
||||
|
||||
defaults.set(path, value);
|
||||
}
|
||||
|
||||
public void addDefaults(Map<String, Object> defaults) {
|
||||
if (defaults == null) throw new NullPointerException("Defaults may not be null");
|
||||
@Override
|
||||
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());
|
||||
}
|
||||
}
|
||||
|
||||
public void addDefaults(Configuration defaults) {
|
||||
if (defaults == null) throw new NullPointerException("Defaults may not be null");
|
||||
@Override
|
||||
public void addDefaults(final Configuration defaults)
|
||||
{
|
||||
if (defaults == null) { throw new NullPointerException("Defaults may not be null"); }
|
||||
|
||||
addDefaults(defaults.getValues(true));
|
||||
}
|
||||
|
||||
public void setDefaults(Configuration defaults) {
|
||||
if (defaults == null) throw new NullPointerException("Defaults may not be null");
|
||||
@Override
|
||||
public void setDefaults(final Configuration defaults)
|
||||
{
|
||||
if (defaults == null) { throw new NullPointerException("Defaults may not be null"); }
|
||||
|
||||
this.defaults = defaults;
|
||||
}
|
||||
|
||||
public Configuration getDefaults() {
|
||||
@Override
|
||||
public Configuration getDefaults()
|
||||
{
|
||||
return defaults;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ConfigurationSection getParent() {
|
||||
public ConfigurationSection getParent()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
public MemoryConfigurationOptions options() {
|
||||
if (options == null) {
|
||||
@Override
|
||||
public MemoryConfigurationOptions options()
|
||||
{
|
||||
if (options == null)
|
||||
{
|
||||
options = new MemoryConfigurationOptions(this);
|
||||
}
|
||||
|
||||
|
@ -4,24 +4,29 @@ package com.intellectualcrafters.configuration;
|
||||
* Various settings for controlling the input and output of a {@link
|
||||
* MemoryConfiguration}
|
||||
*/
|
||||
public class MemoryConfigurationOptions extends ConfigurationOptions {
|
||||
protected MemoryConfigurationOptions(MemoryConfiguration configuration) {
|
||||
public class MemoryConfigurationOptions extends ConfigurationOptions
|
||||
{
|
||||
protected MemoryConfigurationOptions(final MemoryConfiguration configuration)
|
||||
{
|
||||
super(configuration);
|
||||
}
|
||||
|
||||
@Override
|
||||
public MemoryConfiguration configuration() {
|
||||
public MemoryConfiguration configuration()
|
||||
{
|
||||
return (MemoryConfiguration) super.configuration();
|
||||
}
|
||||
|
||||
@Override
|
||||
public MemoryConfigurationOptions copyDefaults(boolean value) {
|
||||
public MemoryConfigurationOptions copyDefaults(final boolean value)
|
||||
{
|
||||
super.copyDefaults(value);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public MemoryConfigurationOptions pathSeparator(char value) {
|
||||
public MemoryConfigurationOptions pathSeparator(final char value)
|
||||
{
|
||||
super.pathSeparator(value);
|
||||
return this;
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -24,7 +24,8 @@ import com.intellectualcrafters.configuration.MemoryConfiguration;
|
||||
* This is a base class for all File based implementations of {@link
|
||||
* Configuration}
|
||||
*/
|
||||
public abstract class FileConfiguration extends MemoryConfiguration {
|
||||
public abstract class FileConfiguration extends MemoryConfiguration
|
||||
{
|
||||
/**
|
||||
* This value specified that the system default encoding should be
|
||||
* completely ignored, as it cannot handle the ASCII character set, or it
|
||||
@ -49,7 +50,8 @@ public abstract class FileConfiguration extends MemoryConfiguration {
|
||||
*/
|
||||
@Deprecated
|
||||
public static final boolean SYSTEM_UTF;
|
||||
static {
|
||||
static
|
||||
{
|
||||
final byte[] testBytes = Base64Coder.decode("ICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4NCg==");
|
||||
final String testString = " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\r\n";
|
||||
final Charset defaultCharset = Charset.defaultCharset();
|
||||
@ -63,7 +65,8 @@ public abstract class FileConfiguration extends MemoryConfiguration {
|
||||
/**
|
||||
* Creates an empty {@link FileConfiguration} with no default values.
|
||||
*/
|
||||
public FileConfiguration() {
|
||||
public FileConfiguration()
|
||||
{
|
||||
super();
|
||||
}
|
||||
|
||||
@ -73,7 +76,8 @@ public abstract class FileConfiguration extends MemoryConfiguration {
|
||||
*
|
||||
* @param defaults Default value provider
|
||||
*/
|
||||
public FileConfiguration(Configuration defaults) {
|
||||
public FileConfiguration(final Configuration defaults)
|
||||
{
|
||||
super(defaults);
|
||||
}
|
||||
|
||||
@ -92,17 +96,21 @@ public abstract class FileConfiguration extends MemoryConfiguration {
|
||||
* any reason.
|
||||
* @throws IllegalArgumentException Thrown when file is null.
|
||||
*/
|
||||
public void save(File file) throws IOException {
|
||||
if (file == null) throw new NullPointerException("File cannot be null");
|
||||
public void save(final File file) throws IOException
|
||||
{
|
||||
if (file == null) { throw new NullPointerException("File cannot be null"); }
|
||||
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);
|
||||
} finally {
|
||||
}
|
||||
finally
|
||||
{
|
||||
writer.close();
|
||||
}
|
||||
}
|
||||
@ -122,8 +130,9 @@ public abstract class FileConfiguration extends MemoryConfiguration {
|
||||
* any reason.
|
||||
* @throws IllegalArgumentException Thrown when file is null.
|
||||
*/
|
||||
public void save(String file) throws IOException {
|
||||
if (file == null) throw new NullPointerException("File cannot be null");
|
||||
public void save(final String file) throws IOException
|
||||
{
|
||||
if (file == null) { throw new NullPointerException("File cannot be null"); }
|
||||
|
||||
save(new File(file));
|
||||
}
|
||||
@ -157,8 +166,9 @@ public abstract class FileConfiguration extends MemoryConfiguration {
|
||||
* a valid Configuration.
|
||||
* @throws IllegalArgumentException Thrown when file is null.
|
||||
*/
|
||||
public void load(File file) throws IOException, InvalidConfigurationException {
|
||||
if (file == null) throw new NullPointerException("File cannot be null");
|
||||
public void load(final File file) throws IOException, InvalidConfigurationException
|
||||
{
|
||||
if (file == null) { throw new NullPointerException("File cannot be null"); }
|
||||
|
||||
final FileInputStream stream = new FileInputStream(file);
|
||||
|
||||
@ -184,8 +194,9 @@ public abstract class FileConfiguration extends MemoryConfiguration {
|
||||
* @see #load(Reader)
|
||||
*/
|
||||
@Deprecated
|
||||
public void load(InputStream stream) throws IOException, InvalidConfigurationException {
|
||||
if (stream == null) throw new NullPointerException("Stream cannot be null");
|
||||
public void load(final InputStream stream) throws IOException, InvalidConfigurationException
|
||||
{
|
||||
if (stream == null) { throw new NullPointerException("Stream cannot be null"); }
|
||||
|
||||
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
|
||||
* @throws IllegalArgumentException thrown when reader is null
|
||||
*/
|
||||
public void load(Reader reader) throws IOException, InvalidConfigurationException {
|
||||
BufferedReader input = reader instanceof BufferedReader ? (BufferedReader) reader : new BufferedReader(reader);
|
||||
public void load(final Reader reader) throws IOException, InvalidConfigurationException
|
||||
{
|
||||
final BufferedReader input = reader instanceof BufferedReader ? (BufferedReader) reader : new BufferedReader(reader);
|
||||
|
||||
StringBuilder builder = new StringBuilder();
|
||||
final StringBuilder builder = new StringBuilder();
|
||||
|
||||
try {
|
||||
try
|
||||
{
|
||||
String line;
|
||||
|
||||
while ((line = input.readLine()) != null) {
|
||||
while ((line = input.readLine()) != null)
|
||||
{
|
||||
builder.append(line);
|
||||
builder.append('\n');
|
||||
}
|
||||
} finally {
|
||||
}
|
||||
finally
|
||||
{
|
||||
input.close();
|
||||
}
|
||||
|
||||
@ -240,8 +256,9 @@ public abstract class FileConfiguration extends MemoryConfiguration {
|
||||
* a valid Configuration.
|
||||
* @throws IllegalArgumentException Thrown when file is null.
|
||||
*/
|
||||
public void load(String file) throws IOException, InvalidConfigurationException {
|
||||
if (file == null) throw new NullPointerException("File cannot be null");
|
||||
public void load(final String file) throws IOException, InvalidConfigurationException
|
||||
{
|
||||
if (file == null) { throw new NullPointerException("File cannot be null"); }
|
||||
|
||||
load(new File(file));
|
||||
}
|
||||
@ -261,7 +278,7 @@ public abstract class FileConfiguration extends MemoryConfiguration {
|
||||
* invalid.
|
||||
* @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
|
||||
@ -276,11 +293,13 @@ public abstract class FileConfiguration extends MemoryConfiguration {
|
||||
protected abstract String buildHeader();
|
||||
|
||||
@Override
|
||||
public FileConfigurationOptions options() {
|
||||
if (options == null) {
|
||||
public FileConfigurationOptions options()
|
||||
{
|
||||
if (options == null)
|
||||
{
|
||||
options = new FileConfigurationOptions(this);
|
||||
}
|
||||
|
||||
return (FileConfigurationOptions) options;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -7,27 +7,32 @@ import com.intellectualcrafters.configuration.MemoryConfigurationOptions;
|
||||
* Various settings for controlling the input and output of a {@link
|
||||
* FileConfiguration}
|
||||
*/
|
||||
public class FileConfigurationOptions extends MemoryConfigurationOptions {
|
||||
public class FileConfigurationOptions extends MemoryConfigurationOptions
|
||||
{
|
||||
private String header = null;
|
||||
private boolean copyHeader = true;
|
||||
|
||||
protected FileConfigurationOptions(MemoryConfiguration configuration) {
|
||||
protected FileConfigurationOptions(final MemoryConfiguration configuration)
|
||||
{
|
||||
super(configuration);
|
||||
}
|
||||
|
||||
@Override
|
||||
public FileConfiguration configuration() {
|
||||
public FileConfiguration configuration()
|
||||
{
|
||||
return (FileConfiguration) super.configuration();
|
||||
}
|
||||
|
||||
@Override
|
||||
public FileConfigurationOptions copyDefaults(boolean value) {
|
||||
public FileConfigurationOptions copyDefaults(final boolean value)
|
||||
{
|
||||
super.copyDefaults(value);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public FileConfigurationOptions pathSeparator(char value) {
|
||||
public FileConfigurationOptions pathSeparator(final char value)
|
||||
{
|
||||
super.pathSeparator(value);
|
||||
return this;
|
||||
}
|
||||
@ -46,7 +51,8 @@ public class FileConfigurationOptions extends MemoryConfigurationOptions {
|
||||
*
|
||||
* @return Header
|
||||
*/
|
||||
public String header() {
|
||||
public String header()
|
||||
{
|
||||
return header;
|
||||
}
|
||||
|
||||
@ -65,8 +71,9 @@ public class FileConfigurationOptions extends MemoryConfigurationOptions {
|
||||
* @param value New header
|
||||
* @return This object, for chaining
|
||||
*/
|
||||
public FileConfigurationOptions header(String value) {
|
||||
this.header = value;
|
||||
public FileConfigurationOptions header(final String value)
|
||||
{
|
||||
header = value;
|
||||
return this;
|
||||
}
|
||||
|
||||
@ -88,7 +95,8 @@ public class FileConfigurationOptions extends MemoryConfigurationOptions {
|
||||
*
|
||||
* @return Whether or not to copy the header
|
||||
*/
|
||||
public boolean copyHeader() {
|
||||
public boolean copyHeader()
|
||||
{
|
||||
return copyHeader;
|
||||
}
|
||||
|
||||
@ -111,7 +119,8 @@ public class FileConfigurationOptions extends MemoryConfigurationOptions {
|
||||
* @param value Whether or not to copy the header
|
||||
* @return This object, for chaining
|
||||
*/
|
||||
public FileConfigurationOptions copyHeader(boolean value) {
|
||||
public FileConfigurationOptions copyHeader(final boolean value)
|
||||
{
|
||||
copyHeader = value;
|
||||
|
||||
return this;
|
||||
|
@ -22,7 +22,8 @@ import com.intellectualcrafters.plot.PS;
|
||||
* An implementation of {@link Configuration} which saves all files in Yaml.
|
||||
* 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 BLANK_CONFIG = "{}\n";
|
||||
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);
|
||||
|
||||
@Override
|
||||
public String saveToString() {
|
||||
public String saveToString()
|
||||
{
|
||||
yamlOptions.setIndent(options().indent());
|
||||
yamlOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
|
||||
yamlOptions.setAllowUnicode(SYSTEM_UTF);
|
||||
yamlRepresenter.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
|
||||
|
||||
String header = buildHeader();
|
||||
final String header = buildHeader();
|
||||
String dump = yaml.dump(getValues(false));
|
||||
|
||||
if (dump.equals(BLANK_CONFIG)) {
|
||||
if (dump.equals(BLANK_CONFIG))
|
||||
{
|
||||
dump = "";
|
||||
}
|
||||
|
||||
@ -47,63 +50,85 @@ public class YamlConfiguration extends FileConfiguration {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void loadFromString(String contents) throws InvalidConfigurationException {
|
||||
if (contents == null) throw new NullPointerException("Contents cannot be null");
|
||||
public void loadFromString(final String contents) throws InvalidConfigurationException
|
||||
{
|
||||
if (contents == null) { throw new NullPointerException("Contents cannot be null"); }
|
||||
|
||||
Map<?, ?> input;
|
||||
try {
|
||||
try
|
||||
{
|
||||
input = (Map<?, ?>) yaml.load(contents);
|
||||
} catch (YAMLException e) {
|
||||
}
|
||||
catch (final YAMLException e)
|
||||
{
|
||||
throw new InvalidConfigurationException(e);
|
||||
} catch (ClassCastException e) {
|
||||
}
|
||||
catch (final ClassCastException e)
|
||||
{
|
||||
throw new InvalidConfigurationException("Top level is not a Map.");
|
||||
}
|
||||
|
||||
String header = parseHeader(contents);
|
||||
if (header.length() > 0) {
|
||||
final String header = parseHeader(contents);
|
||||
if (header.length() > 0)
|
||||
{
|
||||
options().header(header);
|
||||
}
|
||||
|
||||
if (input != null) {
|
||||
if (input != null)
|
||||
{
|
||||
convertMapsToSections(input, this);
|
||||
}
|
||||
}
|
||||
|
||||
protected void convertMapsToSections(Map<?, ?> input, ConfigurationSection section) {
|
||||
for (Map.Entry<?, ?> entry : input.entrySet()) {
|
||||
String key = entry.getKey().toString();
|
||||
Object value = entry.getValue();
|
||||
protected void convertMapsToSections(final Map<?, ?> input, final ConfigurationSection section)
|
||||
{
|
||||
for (final Map.Entry<?, ?> entry : input.entrySet())
|
||||
{
|
||||
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));
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
section.set(key, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected String parseHeader(String input) {
|
||||
String[] lines = input.split("\r?\n", -1);
|
||||
StringBuilder result = new StringBuilder();
|
||||
protected String parseHeader(final String input)
|
||||
{
|
||||
final String[] lines = input.split("\r?\n", -1);
|
||||
final StringBuilder result = new StringBuilder();
|
||||
boolean readingHeader = true;
|
||||
boolean foundHeader = false;
|
||||
|
||||
for (int i = 0; (i < lines.length) && (readingHeader); i++) {
|
||||
String line = lines[i];
|
||||
for (int i = 0; (i < lines.length) && (readingHeader); i++)
|
||||
{
|
||||
final String line = lines[i];
|
||||
|
||||
if (line.startsWith(COMMENT_PREFIX)) {
|
||||
if (i > 0) {
|
||||
if (line.startsWith(COMMENT_PREFIX))
|
||||
{
|
||||
if (i > 0)
|
||||
{
|
||||
result.append("\n");
|
||||
}
|
||||
|
||||
if (line.length() > COMMENT_PREFIX.length()) {
|
||||
if (line.length() > COMMENT_PREFIX.length())
|
||||
{
|
||||
result.append(line.substring(COMMENT_PREFIX.length()));
|
||||
}
|
||||
|
||||
foundHeader = true;
|
||||
} else if ((foundHeader) && (line.length() == 0)) {
|
||||
}
|
||||
else if ((foundHeader) && (line.length() == 0))
|
||||
{
|
||||
result.append("\n");
|
||||
} else if (foundHeader) {
|
||||
}
|
||||
else if (foundHeader)
|
||||
{
|
||||
readingHeader = false;
|
||||
}
|
||||
}
|
||||
@ -112,34 +137,35 @@ public class YamlConfiguration extends FileConfiguration {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String buildHeader() {
|
||||
String header = options().header();
|
||||
protected String buildHeader()
|
||||
{
|
||||
final String header = options().header();
|
||||
|
||||
if (options().copyHeader()) {
|
||||
Configuration def = getDefaults();
|
||||
if (options().copyHeader())
|
||||
{
|
||||
final Configuration def = getDefaults();
|
||||
|
||||
if ((def != null) && (def instanceof FileConfiguration)) {
|
||||
FileConfiguration filedefaults = (FileConfiguration) def;
|
||||
String defaultsHeader = filedefaults.buildHeader();
|
||||
if ((def != null) && (def instanceof FileConfiguration))
|
||||
{
|
||||
final FileConfiguration filedefaults = (FileConfiguration) def;
|
||||
final String defaultsHeader = filedefaults.buildHeader();
|
||||
|
||||
if ((defaultsHeader != null) && (defaultsHeader.length() > 0)) {
|
||||
return defaultsHeader;
|
||||
}
|
||||
if ((defaultsHeader != null) && (defaultsHeader.length() > 0)) { return defaultsHeader; }
|
||||
}
|
||||
}
|
||||
|
||||
if (header == null) {
|
||||
return "";
|
||||
}
|
||||
if (header == null) { return ""; }
|
||||
|
||||
StringBuilder builder = new StringBuilder();
|
||||
String[] lines = header.split("\r?\n", -1);
|
||||
final StringBuilder builder = new StringBuilder();
|
||||
final String[] lines = header.split("\r?\n", -1);
|
||||
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");
|
||||
|
||||
if ((startedHeader) || (lines[i].length() != 0)) {
|
||||
if ((startedHeader) || (lines[i].length() != 0))
|
||||
{
|
||||
builder.insert(0, lines[i]);
|
||||
builder.insert(0, COMMENT_PREFIX);
|
||||
startedHeader = true;
|
||||
@ -150,8 +176,10 @@ public class YamlConfiguration extends FileConfiguration {
|
||||
}
|
||||
|
||||
@Override
|
||||
public YamlConfigurationOptions options() {
|
||||
if (options == null) {
|
||||
public YamlConfigurationOptions options()
|
||||
{
|
||||
if (options == null)
|
||||
{
|
||||
options = new YamlConfigurationOptions(this);
|
||||
}
|
||||
|
||||
@ -171,28 +199,36 @@ public class YamlConfiguration extends FileConfiguration {
|
||||
* @return Resulting configuration
|
||||
* @throws IllegalArgumentException Thrown if file is null
|
||||
*/
|
||||
public static YamlConfiguration loadConfiguration(File file) {
|
||||
if (file == null) throw new NullPointerException("File cannot be null");
|
||||
public static YamlConfiguration loadConfiguration(final File file)
|
||||
{
|
||||
if (file == null) { throw new NullPointerException("File cannot be null"); }
|
||||
|
||||
YamlConfiguration config = new YamlConfiguration();
|
||||
final YamlConfiguration config = new YamlConfiguration();
|
||||
|
||||
try {
|
||||
try
|
||||
{
|
||||
config.load(file);
|
||||
} catch (Exception ex) {
|
||||
try {
|
||||
String path = file.getAbsolutePath() + "_broken";
|
||||
}
|
||||
catch (final Exception ex)
|
||||
{
|
||||
try
|
||||
{
|
||||
file.getAbsolutePath();
|
||||
File dest = new File(file.getAbsolutePath() + "_broken");
|
||||
int i = 0;
|
||||
while (dest.exists()) {
|
||||
while (dest.exists())
|
||||
{
|
||||
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("&drenamed to: &7" + dest.getName());
|
||||
PS.debug("&c============ Full stacktrace ============");
|
||||
ex.printStackTrace();
|
||||
PS.debug("&c=========================================");
|
||||
} catch (IOException e) {
|
||||
}
|
||||
catch (final IOException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
@ -215,17 +251,23 @@ public class YamlConfiguration extends FileConfiguration {
|
||||
* @see #loadConfiguration(Reader)
|
||||
*/
|
||||
@Deprecated
|
||||
public static YamlConfiguration loadConfiguration(InputStream stream) {
|
||||
if (stream == null) throw new NullPointerException("Stream cannot be null");
|
||||
public static YamlConfiguration loadConfiguration(final InputStream stream)
|
||||
{
|
||||
if (stream == null) { throw new NullPointerException("Stream cannot be null"); }
|
||||
|
||||
YamlConfiguration config = new YamlConfiguration();
|
||||
final YamlConfiguration config = new YamlConfiguration();
|
||||
|
||||
try {
|
||||
try
|
||||
{
|
||||
config.load(stream);
|
||||
} catch (IOException ex) {
|
||||
}
|
||||
catch (final IOException ex)
|
||||
{
|
||||
PS.debug("Cannot load configuration from stream");
|
||||
ex.printStackTrace();
|
||||
} catch (InvalidConfigurationException ex) {
|
||||
}
|
||||
catch (final InvalidConfigurationException ex)
|
||||
{
|
||||
ex.printStackTrace();
|
||||
PS.debug("Cannot load configuration from stream");
|
||||
}
|
||||
@ -233,7 +275,6 @@ public class YamlConfiguration extends FileConfiguration {
|
||||
return config;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates a new {@link YamlConfiguration}, loading from the given reader.
|
||||
* <p>
|
||||
@ -245,17 +286,23 @@ public class YamlConfiguration extends FileConfiguration {
|
||||
* @return resulting configuration
|
||||
* @throws IllegalArgumentException Thrown if stream is null
|
||||
*/
|
||||
public static YamlConfiguration loadConfiguration(Reader reader) {
|
||||
if (reader == null) throw new NullPointerException("Reader cannot be null");
|
||||
public static YamlConfiguration loadConfiguration(final Reader reader)
|
||||
{
|
||||
if (reader == null) { throw new NullPointerException("Reader cannot be null"); }
|
||||
|
||||
YamlConfiguration config = new YamlConfiguration();
|
||||
final YamlConfiguration config = new YamlConfiguration();
|
||||
|
||||
try {
|
||||
try
|
||||
{
|
||||
config.load(reader);
|
||||
} catch (IOException ex) {
|
||||
}
|
||||
catch (final IOException ex)
|
||||
{
|
||||
PS.debug("Cannot load configuration from stream");
|
||||
ex.printStackTrace();
|
||||
} catch (InvalidConfigurationException ex) {
|
||||
}
|
||||
catch (final InvalidConfigurationException ex)
|
||||
{
|
||||
PS.debug("Cannot load configuration from stream");
|
||||
ex.printStackTrace();
|
||||
}
|
||||
|
@ -4,38 +4,45 @@ package com.intellectualcrafters.configuration.file;
|
||||
* Various settings for controlling the input and output of a {@link
|
||||
* YamlConfiguration}
|
||||
*/
|
||||
public class YamlConfigurationOptions extends FileConfigurationOptions {
|
||||
public class YamlConfigurationOptions extends FileConfigurationOptions
|
||||
{
|
||||
private int indent = 2;
|
||||
|
||||
protected YamlConfigurationOptions(YamlConfiguration configuration) {
|
||||
protected YamlConfigurationOptions(final YamlConfiguration configuration)
|
||||
{
|
||||
super(configuration);
|
||||
}
|
||||
|
||||
@Override
|
||||
public YamlConfiguration configuration() {
|
||||
public YamlConfiguration configuration()
|
||||
{
|
||||
return (YamlConfiguration) super.configuration();
|
||||
}
|
||||
|
||||
@Override
|
||||
public YamlConfigurationOptions copyDefaults(boolean value) {
|
||||
public YamlConfigurationOptions copyDefaults(final boolean value)
|
||||
{
|
||||
super.copyDefaults(value);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public YamlConfigurationOptions pathSeparator(char value) {
|
||||
public YamlConfigurationOptions pathSeparator(final char value)
|
||||
{
|
||||
super.pathSeparator(value);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public YamlConfigurationOptions header(String value) {
|
||||
public YamlConfigurationOptions header(final String value)
|
||||
{
|
||||
super.header(value);
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public YamlConfigurationOptions copyHeader(boolean value) {
|
||||
public YamlConfigurationOptions copyHeader(final boolean value)
|
||||
{
|
||||
super.copyHeader(value);
|
||||
return this;
|
||||
}
|
||||
@ -47,7 +54,8 @@ public class YamlConfigurationOptions extends FileConfigurationOptions {
|
||||
*
|
||||
* @return How much to indent by
|
||||
*/
|
||||
public int indent() {
|
||||
public int indent()
|
||||
{
|
||||
return indent;
|
||||
}
|
||||
|
||||
@ -59,11 +67,12 @@ public class YamlConfigurationOptions extends FileConfigurationOptions {
|
||||
* @param value New indent
|
||||
* @return This object, for chaining
|
||||
*/
|
||||
public YamlConfigurationOptions indent(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");
|
||||
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"); }
|
||||
|
||||
this.indent = value;
|
||||
indent = value;
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
@ -10,30 +10,37 @@ import org.yaml.snakeyaml.nodes.Tag;
|
||||
|
||||
import com.intellectualcrafters.configuration.serialization.ConfigurationSerialization;
|
||||
|
||||
public class YamlConstructor extends SafeConstructor {
|
||||
public class YamlConstructor extends SafeConstructor
|
||||
{
|
||||
|
||||
public YamlConstructor() {
|
||||
this.yamlConstructors.put(Tag.MAP, new ConstructCustomObject());
|
||||
public YamlConstructor()
|
||||
{
|
||||
yamlConstructors.put(Tag.MAP, new ConstructCustomObject());
|
||||
}
|
||||
|
||||
private class ConstructCustomObject extends ConstructYamlMap {
|
||||
private class ConstructCustomObject extends ConstructYamlMap
|
||||
{
|
||||
@Override
|
||||
public Object construct(Node node) {
|
||||
if (node.isTwoStepsConstruction()) {
|
||||
throw new YAMLException("Unexpected referential mapping structure. Node: " + node);
|
||||
}
|
||||
public Object construct(final 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)) {
|
||||
Map<String, Object> typed = new LinkedHashMap<String, Object>(raw.size());
|
||||
for (Map.Entry<?, ?> entry : raw.entrySet()) {
|
||||
if (raw.containsKey(ConfigurationSerialization.SERIALIZED_TYPE_KEY))
|
||||
{
|
||||
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());
|
||||
}
|
||||
|
||||
try {
|
||||
try
|
||||
{
|
||||
return ConfigurationSerialization.deserializeObject(typed);
|
||||
} catch (IllegalArgumentException ex) {
|
||||
}
|
||||
catch (final IllegalArgumentException ex)
|
||||
{
|
||||
throw new YAMLException("Could not deserialize object", ex);
|
||||
}
|
||||
}
|
||||
@ -42,7 +49,8 @@ public class YamlConstructor extends SafeConstructor {
|
||||
}
|
||||
|
||||
@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);
|
||||
}
|
||||
}
|
||||
|
@ -10,25 +10,31 @@ import com.intellectualcrafters.configuration.ConfigurationSection;
|
||||
import com.intellectualcrafters.configuration.serialization.ConfigurationSerializable;
|
||||
import com.intellectualcrafters.configuration.serialization.ConfigurationSerialization;
|
||||
|
||||
public class YamlRepresenter extends Representer {
|
||||
public class YamlRepresenter extends Representer
|
||||
{
|
||||
|
||||
public YamlRepresenter() {
|
||||
this.multiRepresenters.put(ConfigurationSection.class, new RepresentConfigurationSection());
|
||||
this.multiRepresenters.put(ConfigurationSerializable.class, new RepresentConfigurationSerializable());
|
||||
public YamlRepresenter()
|
||||
{
|
||||
multiRepresenters.put(ConfigurationSection.class, new RepresentConfigurationSection());
|
||||
multiRepresenters.put(ConfigurationSerializable.class, new RepresentConfigurationSerializable());
|
||||
}
|
||||
|
||||
private class RepresentConfigurationSection extends RepresentMap {
|
||||
private class RepresentConfigurationSection extends RepresentMap
|
||||
{
|
||||
@Override
|
||||
public Node representData(Object data) {
|
||||
public Node representData(final Object data)
|
||||
{
|
||||
return super.representData(((ConfigurationSection) data).getValues(false));
|
||||
}
|
||||
}
|
||||
|
||||
private class RepresentConfigurationSerializable extends RepresentMap {
|
||||
private class RepresentConfigurationSerializable extends RepresentMap
|
||||
{
|
||||
@Override
|
||||
public Node representData(Object data) {
|
||||
ConfigurationSerializable serializable = (ConfigurationSerializable) data;
|
||||
Map<String, Object> values = new LinkedHashMap<String, Object>();
|
||||
public Node representData(final Object data)
|
||||
{
|
||||
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.putAll(serializable.serialize());
|
||||
|
||||
|
@ -21,7 +21,8 @@ import java.util.Map;
|
||||
* @see DelegateDeserialization
|
||||
* @see SerializableAs
|
||||
*/
|
||||
public interface ConfigurationSerializable {
|
||||
public interface ConfigurationSerializable
|
||||
{
|
||||
|
||||
/**
|
||||
* Creates a Map representation of this class.
|
||||
|
@ -14,103 +14,130 @@ import com.intellectualcrafters.configuration.Configuration;
|
||||
/**
|
||||
* Utility class for storing and retrieving classes for {@link Configuration}.
|
||||
*/
|
||||
public class ConfigurationSerialization {
|
||||
public class ConfigurationSerialization
|
||||
{
|
||||
public static final String SERIALIZED_TYPE_KEY = "==";
|
||||
private final Class<? extends ConfigurationSerializable> clazz;
|
||||
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;
|
||||
}
|
||||
|
||||
protected Method getMethod(String name, boolean isStatic) {
|
||||
try {
|
||||
Method method = clazz.getDeclaredMethod(name, Map.class);
|
||||
protected Method getMethod(final String name, final boolean isStatic)
|
||||
{
|
||||
try
|
||||
{
|
||||
final Method method = clazz.getDeclaredMethod(name, Map.class);
|
||||
|
||||
if (!ConfigurationSerializable.class.isAssignableFrom(method.getReturnType())) {
|
||||
return null;
|
||||
}
|
||||
if (Modifier.isStatic(method.getModifiers()) != isStatic) {
|
||||
return null;
|
||||
}
|
||||
if (!ConfigurationSerializable.class.isAssignableFrom(method.getReturnType())) { return null; }
|
||||
if (Modifier.isStatic(method.getModifiers()) != isStatic) { return null; }
|
||||
|
||||
return method;
|
||||
} catch (NoSuchMethodException ex) {
|
||||
}
|
||||
catch (final NoSuchMethodException ex)
|
||||
{
|
||||
return null;
|
||||
} catch (SecurityException ex) {
|
||||
}
|
||||
catch (final SecurityException ex)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
protected Constructor<? extends ConfigurationSerializable> getConstructor() {
|
||||
try {
|
||||
protected Constructor<? extends ConfigurationSerializable> getConstructor()
|
||||
{
|
||||
try
|
||||
{
|
||||
return clazz.getConstructor(Map.class);
|
||||
} catch (NoSuchMethodException ex) {
|
||||
}
|
||||
catch (final NoSuchMethodException ex)
|
||||
{
|
||||
return null;
|
||||
} catch (SecurityException ex) {
|
||||
}
|
||||
catch (final SecurityException ex)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
protected ConfigurationSerializable deserializeViaMethod(Method method, Map<String, ?> args) {
|
||||
try {
|
||||
ConfigurationSerializable result = (ConfigurationSerializable) method.invoke(null, args);
|
||||
protected ConfigurationSerializable deserializeViaMethod(final Method method, final Map<String, ?> args)
|
||||
{
|
||||
try
|
||||
{
|
||||
final ConfigurationSerializable result = (ConfigurationSerializable) method.invoke(null, args);
|
||||
|
||||
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 {
|
||||
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
|
||||
{
|
||||
return result;
|
||||
}
|
||||
} catch (Throwable ex) {
|
||||
}
|
||||
catch (final Throwable ex)
|
||||
{
|
||||
Logger.getLogger(ConfigurationSerialization.class.getName()).log(
|
||||
Level.SEVERE,
|
||||
"Could not call method '" + method.toString() + "' of " + clazz + " for deserialization",
|
||||
ex instanceof InvocationTargetException ? ex.getCause() : ex);
|
||||
Level.SEVERE,
|
||||
"Could not call method '" + method.toString() + "' of " + clazz + " for deserialization",
|
||||
ex instanceof InvocationTargetException ? ex.getCause() : ex);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
protected ConfigurationSerializable deserializeViaCtor(Constructor<? extends ConfigurationSerializable> ctor, Map<String, ?> args) {
|
||||
try {
|
||||
protected ConfigurationSerializable deserializeViaCtor(final Constructor<? extends ConfigurationSerializable> ctor, final Map<String, ?> args)
|
||||
{
|
||||
try
|
||||
{
|
||||
return ctor.newInstance(args);
|
||||
} catch (Throwable ex) {
|
||||
}
|
||||
catch (final Throwable ex)
|
||||
{
|
||||
Logger.getLogger(ConfigurationSerialization.class.getName()).log(
|
||||
Level.SEVERE,
|
||||
"Could not call constructor '" + ctor.toString() + "' of " + clazz + " for deserialization",
|
||||
ex instanceof InvocationTargetException ? ex.getCause() : ex);
|
||||
Level.SEVERE,
|
||||
"Could not call constructor '" + ctor.toString() + "' of " + clazz + " for deserialization",
|
||||
ex instanceof InvocationTargetException ? ex.getCause() : ex);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public ConfigurationSerializable deserialize(Map<String, ?> args) {
|
||||
if (args == null) {
|
||||
throw new NullPointerException("Args must not be null");
|
||||
}
|
||||
public ConfigurationSerializable deserialize(final Map<String, ?> args)
|
||||
{
|
||||
if (args == null) { throw new NullPointerException("Args must not be null"); }
|
||||
ConfigurationSerializable result = null;
|
||||
Method method = null;
|
||||
|
||||
if (result == null) {
|
||||
if (result == null)
|
||||
{
|
||||
method = getMethod("deserialize", true);
|
||||
|
||||
if (method != null) {
|
||||
if (method != null)
|
||||
{
|
||||
result = deserializeViaMethod(method, args);
|
||||
}
|
||||
}
|
||||
|
||||
if (result == null) {
|
||||
if (result == null)
|
||||
{
|
||||
method = getMethod("valueOf", true);
|
||||
|
||||
if (method != null) {
|
||||
if (method != null)
|
||||
{
|
||||
result = deserializeViaMethod(method, args);
|
||||
}
|
||||
}
|
||||
|
||||
if (result == null) {
|
||||
Constructor<? extends ConfigurationSerializable> constructor = getConstructor();
|
||||
if (result == null)
|
||||
{
|
||||
final Constructor<? extends ConfigurationSerializable> constructor = getConstructor();
|
||||
|
||||
if (constructor != null) {
|
||||
if (constructor != null)
|
||||
{
|
||||
result = deserializeViaCtor(constructor, args);
|
||||
}
|
||||
}
|
||||
@ -133,7 +160,8 @@ public class ConfigurationSerialization {
|
||||
* @param clazz Class to deserialize into
|
||||
* @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);
|
||||
}
|
||||
|
||||
@ -151,25 +179,28 @@ public class ConfigurationSerialization {
|
||||
* @param args Arguments for deserialization
|
||||
* @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;
|
||||
|
||||
if (args.containsKey(SERIALIZED_TYPE_KEY)) {
|
||||
try {
|
||||
String alias = (String) args.get(SERIALIZED_TYPE_KEY);
|
||||
if (args.containsKey(SERIALIZED_TYPE_KEY))
|
||||
{
|
||||
try
|
||||
{
|
||||
final String alias = (String) args.get(SERIALIZED_TYPE_KEY);
|
||||
|
||||
if (alias == null) {
|
||||
throw new IllegalArgumentException("Cannot have null alias");
|
||||
}
|
||||
if (alias == null) { throw new IllegalArgumentException("Cannot have null alias"); }
|
||||
clazz = getClassByAlias(alias);
|
||||
if (clazz == null) {
|
||||
throw new IllegalArgumentException("Specified class does not exist ('" + alias + "')");
|
||||
}
|
||||
} catch (ClassCastException ex) {
|
||||
if (clazz == null) { throw new IllegalArgumentException("Specified class does not exist ('" + alias + "')"); }
|
||||
}
|
||||
catch (final ClassCastException ex)
|
||||
{
|
||||
ex.fillInStackTrace();
|
||||
throw ex;
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new IllegalArgumentException("Args doesn't contain type key ('" + SERIALIZED_TYPE_KEY + "')");
|
||||
}
|
||||
|
||||
@ -182,10 +213,12 @@ public class ConfigurationSerialization {
|
||||
*
|
||||
* @param clazz Class to register
|
||||
*/
|
||||
public static void registerClass(Class<? extends ConfigurationSerializable> clazz) {
|
||||
DelegateDeserialization delegate = clazz.getAnnotation(DelegateDeserialization.class);
|
||||
public static void registerClass(final Class<? extends ConfigurationSerializable> clazz)
|
||||
{
|
||||
final DelegateDeserialization delegate = clazz.getAnnotation(DelegateDeserialization.class);
|
||||
|
||||
if (delegate == null) {
|
||||
if (delegate == null)
|
||||
{
|
||||
registerClass(clazz, getAlias(clazz));
|
||||
registerClass(clazz, clazz.getName());
|
||||
}
|
||||
@ -199,7 +232,8 @@ public class ConfigurationSerialization {
|
||||
* @param alias Alias to register as
|
||||
* @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);
|
||||
}
|
||||
|
||||
@ -208,7 +242,8 @@ public class ConfigurationSerialization {
|
||||
*
|
||||
* @param alias Alias to unregister
|
||||
*/
|
||||
public static void unregisterClass(String alias) {
|
||||
public static void unregisterClass(final String alias)
|
||||
{
|
||||
aliases.remove(alias);
|
||||
}
|
||||
|
||||
@ -218,9 +253,10 @@ public class ConfigurationSerialization {
|
||||
*
|
||||
* @param clazz Class to unregister
|
||||
*/
|
||||
public static void unregisterClass(Class<? extends ConfigurationSerializable> clazz) {
|
||||
while (aliases.values().remove(clazz)) {
|
||||
}
|
||||
public static void unregisterClass(final Class<? extends ConfigurationSerializable> clazz)
|
||||
{
|
||||
while (aliases.values().remove(clazz))
|
||||
{}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -230,7 +266,8 @@ public class ConfigurationSerialization {
|
||||
* @param alias Alias of the serializable
|
||||
* @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);
|
||||
}
|
||||
|
||||
@ -241,23 +278,27 @@ public class ConfigurationSerialization {
|
||||
* @param clazz Class to get alias for
|
||||
* @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);
|
||||
|
||||
if (delegate != null) {
|
||||
if ((delegate.value() == null) || (delegate.value() == clazz)) {
|
||||
if (delegate != null)
|
||||
{
|
||||
if ((delegate.value() == null) || (delegate.value() == clazz))
|
||||
{
|
||||
delegate = null;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return getAlias(delegate.value());
|
||||
}
|
||||
}
|
||||
|
||||
if (delegate == null) {
|
||||
SerializableAs alias = clazz.getAnnotation(SerializableAs.class);
|
||||
if (delegate == null)
|
||||
{
|
||||
final SerializableAs alias = clazz.getAnnotation(SerializableAs.class);
|
||||
|
||||
if ((alias != null) && (alias.value() != null)) {
|
||||
return alias.value();
|
||||
}
|
||||
if ((alias != null) && (alias.value() != null)) { return alias.value(); }
|
||||
}
|
||||
|
||||
return clazz.getName();
|
||||
|
@ -11,7 +11,8 @@ import java.lang.annotation.Target;
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.TYPE)
|
||||
public @interface DelegateDeserialization {
|
||||
public @interface DelegateDeserialization
|
||||
{
|
||||
/**
|
||||
* Which class should be used as a delegate for this classes
|
||||
* deserialization
|
||||
|
@ -21,7 +21,8 @@ import java.lang.annotation.Target;
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.TYPE)
|
||||
public @interface SerializableAs {
|
||||
public @interface SerializableAs
|
||||
{
|
||||
/**
|
||||
* This is the name your class will be stored and retrieved as.
|
||||
* <p>
|
||||
|
@ -3,7 +3,8 @@ package com.intellectualcrafters.jnbt;
|
||||
/**
|
||||
* The {@code TAG_Byte_Array} tag.
|
||||
*/
|
||||
public final class ByteArrayTag extends Tag {
|
||||
public final class ByteArrayTag extends Tag
|
||||
{
|
||||
private final byte[] value;
|
||||
|
||||
/**
|
||||
@ -11,7 +12,8 @@ public final class ByteArrayTag extends Tag {
|
||||
*
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public ByteArrayTag(final byte[] value) {
|
||||
public ByteArrayTag(final byte[] value)
|
||||
{
|
||||
super();
|
||||
this.value = value;
|
||||
}
|
||||
@ -22,30 +24,36 @@ public final class ByteArrayTag extends Tag {
|
||||
* @param name the name 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);
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getValue() {
|
||||
return this.value;
|
||||
public byte[] getValue()
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
public String toString()
|
||||
{
|
||||
final StringBuilder hex = new StringBuilder();
|
||||
for (final byte b : this.value) {
|
||||
for (final byte b : value)
|
||||
{
|
||||
final String hexDigits = Integer.toHexString(b).toUpperCase();
|
||||
if (hexDigits.length() == 1) {
|
||||
if (hexDigits.length() == 1)
|
||||
{
|
||||
hex.append("0");
|
||||
}
|
||||
hex.append(hexDigits).append(" ");
|
||||
}
|
||||
final String name = getName();
|
||||
String append = "";
|
||||
if ((name != null) && !name.equals("")) {
|
||||
append = "(\"" + this.getName() + "\")";
|
||||
if ((name != null) && !name.equals(""))
|
||||
{
|
||||
append = "(\"" + getName() + "\")";
|
||||
}
|
||||
return "TAG_Byte_Array" + append + ": " + hex;
|
||||
}
|
||||
|
@ -3,7 +3,8 @@ package com.intellectualcrafters.jnbt;
|
||||
/**
|
||||
* The {@code TAG_Byte} tag.
|
||||
*/
|
||||
public final class ByteTag extends Tag {
|
||||
public final class ByteTag extends Tag
|
||||
{
|
||||
private final byte value;
|
||||
|
||||
/**
|
||||
@ -11,7 +12,8 @@ public final class ByteTag extends Tag {
|
||||
*
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public ByteTag(final byte value) {
|
||||
public ByteTag(final byte value)
|
||||
{
|
||||
super();
|
||||
this.value = value;
|
||||
}
|
||||
@ -22,23 +24,27 @@ public final class ByteTag extends Tag {
|
||||
* @param name the name 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);
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Byte getValue() {
|
||||
return this.value;
|
||||
public Byte getValue()
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
public String toString()
|
||||
{
|
||||
final String name = getName();
|
||||
String append = "";
|
||||
if ((name != null) && !name.equals("")) {
|
||||
append = "(\"" + this.getName() + "\")";
|
||||
if ((name != null) && !name.equals(""))
|
||||
{
|
||||
append = "(\"" + getName() + "\")";
|
||||
}
|
||||
return "TAG_Byte" + append + ": " + this.value;
|
||||
return "TAG_Byte" + append + ": " + value;
|
||||
}
|
||||
}
|
||||
|
@ -8,7 +8,8 @@ import java.util.Map;
|
||||
/**
|
||||
* The {@code TAG_Compound} tag.
|
||||
*/
|
||||
public final class CompoundTag extends Tag {
|
||||
public final class CompoundTag extends Tag
|
||||
{
|
||||
private final Map<String, Tag> value;
|
||||
|
||||
/**
|
||||
@ -16,7 +17,8 @@ public final class CompoundTag extends Tag {
|
||||
*
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public CompoundTag(final Map<String, Tag> value) {
|
||||
public CompoundTag(final Map<String, Tag> value)
|
||||
{
|
||||
super();
|
||||
this.value = Collections.unmodifiableMap(value);
|
||||
}
|
||||
@ -27,7 +29,8 @@ public final class CompoundTag extends Tag {
|
||||
* @param name the name 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);
|
||||
this.value = Collections.unmodifiableMap(value);
|
||||
}
|
||||
@ -39,13 +42,15 @@ public final class CompoundTag extends Tag {
|
||||
*
|
||||
* @return true if the tag contains the given key
|
||||
*/
|
||||
public boolean containsKey(final String key) {
|
||||
return this.value.containsKey(key);
|
||||
public boolean containsKey(final String key)
|
||||
{
|
||||
return value.containsKey(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, Tag> getValue() {
|
||||
return this.value;
|
||||
public Map<String, Tag> getValue()
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -55,7 +60,8 @@ public final class CompoundTag extends 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);
|
||||
}
|
||||
|
||||
@ -64,8 +70,9 @@ public final class CompoundTag extends Tag {
|
||||
*
|
||||
* @return the builder
|
||||
*/
|
||||
public CompoundTagBuilder createBuilder() {
|
||||
return new CompoundTagBuilder(new HashMap<String, Tag>(this.value));
|
||||
public CompoundTagBuilder createBuilder()
|
||||
{
|
||||
return new CompoundTagBuilder(new HashMap<String, Tag>(value));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -76,11 +83,15 @@ public final class CompoundTag extends Tag {
|
||||
*
|
||||
* @return a byte array
|
||||
*/
|
||||
public byte[] getByteArray(final String key) {
|
||||
final Tag tag = this.value.get(key);
|
||||
if (tag instanceof ByteArrayTag) {
|
||||
public byte[] getByteArray(final String key)
|
||||
{
|
||||
final Tag tag = value.get(key);
|
||||
if (tag instanceof ByteArrayTag)
|
||||
{
|
||||
return ((ByteArrayTag) tag).getValue();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return new byte[0];
|
||||
}
|
||||
}
|
||||
@ -93,11 +104,15 @@ public final class CompoundTag extends Tag {
|
||||
*
|
||||
* @return a byte
|
||||
*/
|
||||
public byte getByte(final String key) {
|
||||
final Tag tag = this.value.get(key);
|
||||
if (tag instanceof ByteTag) {
|
||||
public byte getByte(final String key)
|
||||
{
|
||||
final Tag tag = value.get(key);
|
||||
if (tag instanceof ByteTag)
|
||||
{
|
||||
return ((ByteTag) tag).getValue();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return (byte) 0;
|
||||
}
|
||||
}
|
||||
@ -110,11 +125,15 @@ public final class CompoundTag extends Tag {
|
||||
*
|
||||
* @return a double
|
||||
*/
|
||||
public double getDouble(final String key) {
|
||||
final Tag tag = this.value.get(key);
|
||||
if (tag instanceof DoubleTag) {
|
||||
public double getDouble(final String key)
|
||||
{
|
||||
final Tag tag = value.get(key);
|
||||
if (tag instanceof DoubleTag)
|
||||
{
|
||||
return ((DoubleTag) tag).getValue();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -127,21 +146,35 @@ public final class CompoundTag extends Tag {
|
||||
*
|
||||
* @return a double
|
||||
*/
|
||||
public double asDouble(final String key) {
|
||||
final Tag tag = this.value.get(key);
|
||||
if (tag instanceof ByteTag) {
|
||||
public double asDouble(final String key)
|
||||
{
|
||||
final Tag tag = value.get(key);
|
||||
if (tag instanceof ByteTag)
|
||||
{
|
||||
return ((ByteTag) tag).getValue();
|
||||
} else if (tag instanceof ShortTag) {
|
||||
}
|
||||
else if (tag instanceof ShortTag)
|
||||
{
|
||||
return ((ShortTag) tag).getValue();
|
||||
} else if (tag instanceof IntTag) {
|
||||
}
|
||||
else if (tag instanceof IntTag)
|
||||
{
|
||||
return ((IntTag) tag).getValue();
|
||||
} else if (tag instanceof LongTag) {
|
||||
}
|
||||
else if (tag instanceof LongTag)
|
||||
{
|
||||
return ((LongTag) tag).getValue();
|
||||
} else if (tag instanceof FloatTag) {
|
||||
}
|
||||
else if (tag instanceof FloatTag)
|
||||
{
|
||||
return ((FloatTag) tag).getValue();
|
||||
} else if (tag instanceof DoubleTag) {
|
||||
}
|
||||
else if (tag instanceof DoubleTag)
|
||||
{
|
||||
return ((DoubleTag) tag).getValue();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -154,11 +187,15 @@ public final class CompoundTag extends Tag {
|
||||
*
|
||||
* @return a float
|
||||
*/
|
||||
public float getFloat(final String key) {
|
||||
final Tag tag = this.value.get(key);
|
||||
if (tag instanceof FloatTag) {
|
||||
public float getFloat(final String key)
|
||||
{
|
||||
final Tag tag = value.get(key);
|
||||
if (tag instanceof FloatTag)
|
||||
{
|
||||
return ((FloatTag) tag).getValue();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -171,11 +208,15 @@ public final class CompoundTag extends Tag {
|
||||
*
|
||||
* @return an int array
|
||||
*/
|
||||
public int[] getIntArray(final String key) {
|
||||
final Tag tag = this.value.get(key);
|
||||
if (tag instanceof IntArrayTag) {
|
||||
public int[] getIntArray(final String key)
|
||||
{
|
||||
final Tag tag = value.get(key);
|
||||
if (tag instanceof IntArrayTag)
|
||||
{
|
||||
return ((IntArrayTag) tag).getValue();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return new int[0];
|
||||
}
|
||||
}
|
||||
@ -188,11 +229,15 @@ public final class CompoundTag extends Tag {
|
||||
*
|
||||
* @return an int
|
||||
*/
|
||||
public int getInt(final String key) {
|
||||
final Tag tag = this.value.get(key);
|
||||
if (tag instanceof IntTag) {
|
||||
public int getInt(final String key)
|
||||
{
|
||||
final Tag tag = value.get(key);
|
||||
if (tag instanceof IntTag)
|
||||
{
|
||||
return ((IntTag) tag).getValue();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -205,21 +250,35 @@ public final class CompoundTag extends Tag {
|
||||
*
|
||||
* @return an int
|
||||
*/
|
||||
public int asInt(final String key) {
|
||||
final Tag tag = this.value.get(key);
|
||||
if (tag instanceof ByteTag) {
|
||||
public int asInt(final String key)
|
||||
{
|
||||
final Tag tag = value.get(key);
|
||||
if (tag instanceof ByteTag)
|
||||
{
|
||||
return ((ByteTag) tag).getValue();
|
||||
} else if (tag instanceof ShortTag) {
|
||||
}
|
||||
else if (tag instanceof ShortTag)
|
||||
{
|
||||
return ((ShortTag) tag).getValue();
|
||||
} else if (tag instanceof IntTag) {
|
||||
}
|
||||
else if (tag instanceof IntTag)
|
||||
{
|
||||
return ((IntTag) tag).getValue();
|
||||
} else if (tag instanceof LongTag) {
|
||||
}
|
||||
else if (tag instanceof LongTag)
|
||||
{
|
||||
return ((LongTag) tag).getValue().intValue();
|
||||
} else if (tag instanceof FloatTag) {
|
||||
}
|
||||
else if (tag instanceof FloatTag)
|
||||
{
|
||||
return ((FloatTag) tag).getValue().intValue();
|
||||
} else if (tag instanceof DoubleTag) {
|
||||
}
|
||||
else if (tag instanceof DoubleTag)
|
||||
{
|
||||
return ((DoubleTag) tag).getValue().intValue();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -232,11 +291,15 @@ public final class CompoundTag extends Tag {
|
||||
*
|
||||
* @return a list of tags
|
||||
*/
|
||||
public List<Tag> getList(final String key) {
|
||||
final Tag tag = this.value.get(key);
|
||||
if (tag instanceof ListTag) {
|
||||
public List<Tag> getList(final String key)
|
||||
{
|
||||
final Tag tag = value.get(key);
|
||||
if (tag instanceof ListTag)
|
||||
{
|
||||
return ((ListTag) tag).getValue();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
@ -249,11 +312,15 @@ public final class CompoundTag extends Tag {
|
||||
*
|
||||
* @return a tag list instance
|
||||
*/
|
||||
public ListTag getListTag(final String key) {
|
||||
final Tag tag = this.value.get(key);
|
||||
if (tag instanceof ListTag) {
|
||||
public ListTag getListTag(final String key)
|
||||
{
|
||||
final Tag tag = value.get(key);
|
||||
if (tag instanceof ListTag)
|
||||
{
|
||||
return (ListTag) tag;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return new ListTag(key, StringTag.class, Collections.<Tag> emptyList());
|
||||
}
|
||||
}
|
||||
@ -270,16 +337,23 @@ public final class CompoundTag extends Tag {
|
||||
* @return a list of tags
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
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) {
|
||||
public <T extends Tag> List<T> getList(final String key, final Class<T> listType)
|
||||
{
|
||||
final Tag tag = value.get(key);
|
||||
if (tag instanceof ListTag)
|
||||
{
|
||||
final ListTag listTag = (ListTag) tag;
|
||||
if (listTag.getType().equals(listType)) {
|
||||
if (listTag.getType().equals(listType))
|
||||
{
|
||||
return (List<T>) listTag.getValue();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return Collections.emptyList();
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
@ -292,11 +366,15 @@ public final class CompoundTag extends Tag {
|
||||
*
|
||||
* @return a long
|
||||
*/
|
||||
public long getLong(final String key) {
|
||||
final Tag tag = this.value.get(key);
|
||||
if (tag instanceof LongTag) {
|
||||
public long getLong(final String key)
|
||||
{
|
||||
final Tag tag = value.get(key);
|
||||
if (tag instanceof LongTag)
|
||||
{
|
||||
return ((LongTag) tag).getValue();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0L;
|
||||
}
|
||||
}
|
||||
@ -309,21 +387,35 @@ public final class CompoundTag extends Tag {
|
||||
*
|
||||
* @return a long
|
||||
*/
|
||||
public long asLong(final String key) {
|
||||
final Tag tag = this.value.get(key);
|
||||
if (tag instanceof ByteTag) {
|
||||
public long asLong(final String key)
|
||||
{
|
||||
final Tag tag = value.get(key);
|
||||
if (tag instanceof ByteTag)
|
||||
{
|
||||
return ((ByteTag) tag).getValue();
|
||||
} else if (tag instanceof ShortTag) {
|
||||
}
|
||||
else if (tag instanceof ShortTag)
|
||||
{
|
||||
return ((ShortTag) tag).getValue();
|
||||
} else if (tag instanceof IntTag) {
|
||||
}
|
||||
else if (tag instanceof IntTag)
|
||||
{
|
||||
return ((IntTag) tag).getValue();
|
||||
} else if (tag instanceof LongTag) {
|
||||
}
|
||||
else if (tag instanceof LongTag)
|
||||
{
|
||||
return ((LongTag) tag).getValue();
|
||||
} else if (tag instanceof FloatTag) {
|
||||
}
|
||||
else if (tag instanceof FloatTag)
|
||||
{
|
||||
return ((FloatTag) tag).getValue().longValue();
|
||||
} else if (tag instanceof DoubleTag) {
|
||||
}
|
||||
else if (tag instanceof DoubleTag)
|
||||
{
|
||||
return ((DoubleTag) tag).getValue().longValue();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0L;
|
||||
}
|
||||
}
|
||||
@ -336,11 +428,15 @@ public final class CompoundTag extends Tag {
|
||||
*
|
||||
* @return a short
|
||||
*/
|
||||
public short getShort(final String key) {
|
||||
final Tag tag = this.value.get(key);
|
||||
if (tag instanceof ShortTag) {
|
||||
public short getShort(final String key)
|
||||
{
|
||||
final Tag tag = value.get(key);
|
||||
if (tag instanceof ShortTag)
|
||||
{
|
||||
return ((ShortTag) tag).getValue();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -353,25 +449,32 @@ public final class CompoundTag extends Tag {
|
||||
*
|
||||
* @return a string
|
||||
*/
|
||||
public String getString(final String key) {
|
||||
final Tag tag = this.value.get(key);
|
||||
if (tag instanceof StringTag) {
|
||||
public String getString(final String key)
|
||||
{
|
||||
final Tag tag = value.get(key);
|
||||
if (tag instanceof StringTag)
|
||||
{
|
||||
return ((StringTag) tag).getValue();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
public String toString()
|
||||
{
|
||||
final String name = getName();
|
||||
String append = "";
|
||||
if ((name != null) && !name.equals("")) {
|
||||
append = "(\"" + this.getName() + "\")";
|
||||
if ((name != null) && !name.equals(""))
|
||||
{
|
||||
append = "(\"" + getName() + "\")";
|
||||
}
|
||||
final StringBuilder bldr = new StringBuilder();
|
||||
bldr.append("TAG_Compound").append(append).append(": ").append(this.value.size()).append(" entries\r\n{\r\n");
|
||||
for (final Map.Entry<String, Tag> entry : this.value.entrySet()) {
|
||||
bldr.append("TAG_Compound").append(append).append(": ").append(value.size()).append(" entries\r\n{\r\n");
|
||||
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("}");
|
||||
|
@ -8,14 +8,16 @@ import java.util.Map;
|
||||
/**
|
||||
* Helps create compound tags.
|
||||
*/
|
||||
public class CompoundTagBuilder {
|
||||
public class CompoundTagBuilder
|
||||
{
|
||||
private final Map<String, Tag> entries;
|
||||
|
||||
/**
|
||||
* Create a new instance.
|
||||
*/
|
||||
CompoundTagBuilder() {
|
||||
this.entries = new HashMap<String, Tag>();
|
||||
CompoundTagBuilder()
|
||||
{
|
||||
entries = new HashMap<String, Tag>();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -23,9 +25,10 @@ public class CompoundTagBuilder {
|
||||
*
|
||||
* @param value the value
|
||||
*/
|
||||
CompoundTagBuilder(final Map<String, Tag> value) {
|
||||
CompoundTagBuilder(final Map<String, Tag> value)
|
||||
{
|
||||
checkNotNull(value);
|
||||
this.entries = value;
|
||||
entries = value;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -33,7 +36,8 @@ public class CompoundTagBuilder {
|
||||
*
|
||||
* @return a new builder
|
||||
*/
|
||||
public static CompoundTagBuilder create() {
|
||||
public static CompoundTagBuilder create()
|
||||
{
|
||||
return new CompoundTagBuilder();
|
||||
}
|
||||
|
||||
@ -45,10 +49,11 @@ public class CompoundTagBuilder {
|
||||
*
|
||||
* @return this object
|
||||
*/
|
||||
public CompoundTagBuilder put(final String key, final Tag value) {
|
||||
public CompoundTagBuilder put(final String key, final Tag value)
|
||||
{
|
||||
checkNotNull(key);
|
||||
checkNotNull(value);
|
||||
this.entries.put(key, value);
|
||||
entries.put(key, value);
|
||||
return this;
|
||||
}
|
||||
|
||||
@ -60,7 +65,8 @@ public class CompoundTagBuilder {
|
||||
*
|
||||
* @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));
|
||||
}
|
||||
|
||||
@ -72,7 +78,8 @@ public class CompoundTagBuilder {
|
||||
*
|
||||
* @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));
|
||||
}
|
||||
|
||||
@ -84,7 +91,8 @@ public class CompoundTagBuilder {
|
||||
*
|
||||
* @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));
|
||||
}
|
||||
|
||||
@ -96,7 +104,8 @@ public class CompoundTagBuilder {
|
||||
*
|
||||
* @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));
|
||||
}
|
||||
|
||||
@ -108,7 +117,8 @@ public class CompoundTagBuilder {
|
||||
*
|
||||
* @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));
|
||||
}
|
||||
|
||||
@ -120,7 +130,8 @@ public class CompoundTagBuilder {
|
||||
*
|
||||
* @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));
|
||||
}
|
||||
|
||||
@ -132,7 +143,8 @@ public class CompoundTagBuilder {
|
||||
*
|
||||
* @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));
|
||||
}
|
||||
|
||||
@ -144,7 +156,8 @@ public class CompoundTagBuilder {
|
||||
*
|
||||
* @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));
|
||||
}
|
||||
|
||||
@ -156,7 +169,8 @@ public class CompoundTagBuilder {
|
||||
*
|
||||
* @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));
|
||||
}
|
||||
|
||||
@ -167,9 +181,11 @@ public class CompoundTagBuilder {
|
||||
*
|
||||
* @return this object
|
||||
*/
|
||||
public CompoundTagBuilder putAll(final Map<String, ? extends Tag> value) {
|
||||
public CompoundTagBuilder putAll(final Map<String, ? extends Tag> 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());
|
||||
}
|
||||
return this;
|
||||
@ -180,8 +196,9 @@ public class CompoundTagBuilder {
|
||||
*
|
||||
* @return the new compound tag
|
||||
*/
|
||||
public CompoundTag build() {
|
||||
return new CompoundTag(new HashMap<String, Tag>(this.entries));
|
||||
public CompoundTag build()
|
||||
{
|
||||
return new CompoundTag(new HashMap<String, Tag>(entries));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -191,7 +208,8 @@ public class CompoundTagBuilder {
|
||||
*
|
||||
* @return the created compound tag
|
||||
*/
|
||||
public CompoundTag build(final String name) {
|
||||
return new CompoundTag(name, new HashMap<String, Tag>(this.entries));
|
||||
public CompoundTag build(final String name)
|
||||
{
|
||||
return new CompoundTag(name, new HashMap<String, Tag>(entries));
|
||||
}
|
||||
}
|
||||
|
@ -3,7 +3,8 @@ package com.intellectualcrafters.jnbt;
|
||||
/**
|
||||
* The {@code TAG_Double} tag.
|
||||
*/
|
||||
public final class DoubleTag extends Tag {
|
||||
public final class DoubleTag extends Tag
|
||||
{
|
||||
private final double value;
|
||||
|
||||
/**
|
||||
@ -11,7 +12,8 @@ public final class DoubleTag extends Tag {
|
||||
*
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public DoubleTag(final double value) {
|
||||
public DoubleTag(final double value)
|
||||
{
|
||||
super();
|
||||
this.value = value;
|
||||
}
|
||||
@ -22,23 +24,27 @@ public final class DoubleTag extends Tag {
|
||||
* @param name the name 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);
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Double getValue() {
|
||||
return this.value;
|
||||
public Double getValue()
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
public String toString()
|
||||
{
|
||||
final String name = getName();
|
||||
String append = "";
|
||||
if ((name != null) && !name.equals("")) {
|
||||
append = "(\"" + this.getName() + "\")";
|
||||
if ((name != null) && !name.equals(""))
|
||||
{
|
||||
append = "(\"" + getName() + "\")";
|
||||
}
|
||||
return "TAG_Double" + append + ": " + this.value;
|
||||
return "TAG_Double" + append + ": " + value;
|
||||
}
|
||||
}
|
||||
|
@ -3,21 +3,25 @@ package com.intellectualcrafters.jnbt;
|
||||
/**
|
||||
* The {@code TAG_End} tag.
|
||||
*/
|
||||
public final class EndTag extends Tag {
|
||||
public final class EndTag extends Tag
|
||||
{
|
||||
/**
|
||||
* Creates the tag.
|
||||
*/
|
||||
public EndTag() {
|
||||
public EndTag()
|
||||
{
|
||||
super();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getValue() {
|
||||
public Object getValue()
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
public String toString()
|
||||
{
|
||||
return "TAG_End";
|
||||
}
|
||||
}
|
||||
|
@ -3,7 +3,8 @@ package com.intellectualcrafters.jnbt;
|
||||
/**
|
||||
* The {@code TAG_Float} tag.
|
||||
*/
|
||||
public final class FloatTag extends Tag {
|
||||
public final class FloatTag extends Tag
|
||||
{
|
||||
private final float value;
|
||||
|
||||
/**
|
||||
@ -11,7 +12,8 @@ public final class FloatTag extends Tag {
|
||||
*
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public FloatTag(final float value) {
|
||||
public FloatTag(final float value)
|
||||
{
|
||||
super();
|
||||
this.value = value;
|
||||
}
|
||||
@ -22,23 +24,27 @@ public final class FloatTag extends Tag {
|
||||
* @param name the name 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);
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Float getValue() {
|
||||
return this.value;
|
||||
public Float getValue()
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
public String toString()
|
||||
{
|
||||
final String name = getName();
|
||||
String append = "";
|
||||
if ((name != null) && !name.equals("")) {
|
||||
append = "(\"" + this.getName() + "\")";
|
||||
if ((name != null) && !name.equals(""))
|
||||
{
|
||||
append = "(\"" + getName() + "\")";
|
||||
}
|
||||
return "TAG_Float" + append + ": " + this.value;
|
||||
return "TAG_Float" + append + ": " + value;
|
||||
}
|
||||
}
|
||||
|
@ -5,7 +5,8 @@ import static com.google.common.base.Preconditions.checkNotNull;
|
||||
/**
|
||||
* The {@code TAG_Int_Array} tag.
|
||||
*/
|
||||
public final class IntArrayTag extends Tag {
|
||||
public final class IntArrayTag extends Tag
|
||||
{
|
||||
private final int[] value;
|
||||
|
||||
/**
|
||||
@ -13,7 +14,8 @@ public final class IntArrayTag extends Tag {
|
||||
*
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public IntArrayTag(final int[] value) {
|
||||
public IntArrayTag(final int[] value)
|
||||
{
|
||||
super();
|
||||
checkNotNull(value);
|
||||
this.value = value;
|
||||
@ -25,31 +27,37 @@ public final class IntArrayTag extends Tag {
|
||||
* @param name the name 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);
|
||||
checkNotNull(value);
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int[] getValue() {
|
||||
return this.value;
|
||||
public int[] getValue()
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
public String toString()
|
||||
{
|
||||
final StringBuilder hex = new StringBuilder();
|
||||
for (final int b : this.value) {
|
||||
for (final int b : value)
|
||||
{
|
||||
final String hexDigits = Integer.toHexString(b).toUpperCase();
|
||||
if (hexDigits.length() == 1) {
|
||||
if (hexDigits.length() == 1)
|
||||
{
|
||||
hex.append("0");
|
||||
}
|
||||
hex.append(hexDigits).append(" ");
|
||||
}
|
||||
final String name = getName();
|
||||
String append = "";
|
||||
if ((name != null) && !name.equals("")) {
|
||||
append = "(\"" + this.getName() + "\")";
|
||||
if ((name != null) && !name.equals(""))
|
||||
{
|
||||
append = "(\"" + getName() + "\")";
|
||||
}
|
||||
return "TAG_Int_Array" + append + ": " + hex;
|
||||
}
|
||||
|
@ -3,7 +3,8 @@ package com.intellectualcrafters.jnbt;
|
||||
/**
|
||||
* The {@code TAG_Int} tag.
|
||||
*/
|
||||
public final class IntTag extends Tag {
|
||||
public final class IntTag extends Tag
|
||||
{
|
||||
private final int value;
|
||||
|
||||
/**
|
||||
@ -11,7 +12,8 @@ public final class IntTag extends Tag {
|
||||
*
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public IntTag(final int value) {
|
||||
public IntTag(final int value)
|
||||
{
|
||||
super();
|
||||
this.value = value;
|
||||
}
|
||||
@ -22,23 +24,27 @@ public final class IntTag extends Tag {
|
||||
* @param name the name 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);
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer getValue() {
|
||||
return this.value;
|
||||
public Integer getValue()
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
public String toString()
|
||||
{
|
||||
final String name = getName();
|
||||
String append = "";
|
||||
if ((name != null) && !name.equals("")) {
|
||||
append = "(\"" + this.getName() + "\")";
|
||||
if ((name != null) && !name.equals(""))
|
||||
{
|
||||
append = "(\"" + getName() + "\")";
|
||||
}
|
||||
return "TAG_Int" + append + ": " + this.value;
|
||||
return "TAG_Int" + append + ": " + value;
|
||||
}
|
||||
}
|
||||
|
@ -6,11 +6,11 @@ import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.NoSuchElementException;
|
||||
|
||||
|
||||
/**
|
||||
* 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 List<Tag> value;
|
||||
|
||||
@ -20,7 +20,8 @@ public final class ListTag extends Tag {
|
||||
* @param type the type of 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();
|
||||
checkNotNull(value);
|
||||
this.type = type;
|
||||
@ -34,7 +35,8 @@ public final class ListTag extends Tag {
|
||||
* @param type the type of 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);
|
||||
checkNotNull(value);
|
||||
this.type = type;
|
||||
@ -46,13 +48,15 @@ public final class ListTag extends Tag {
|
||||
*
|
||||
* @return The type of item in this list.
|
||||
*/
|
||||
public Class<? extends Tag> getType() {
|
||||
return this.type;
|
||||
public Class<? extends Tag> getType()
|
||||
{
|
||||
return type;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Tag> getValue() {
|
||||
return this.value;
|
||||
public List<Tag> getValue()
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -62,7 +66,8 @@ public final class ListTag extends 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);
|
||||
}
|
||||
|
||||
@ -73,10 +78,14 @@ public final class ListTag extends Tag {
|
||||
*
|
||||
* @return the tag or null
|
||||
*/
|
||||
public Tag getIfExists(final int index) {
|
||||
try {
|
||||
return this.value.get(index);
|
||||
} catch (final NoSuchElementException e) {
|
||||
public Tag getIfExists(final int index)
|
||||
{
|
||||
try
|
||||
{
|
||||
return value.get(index);
|
||||
}
|
||||
catch (final NoSuchElementException e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@ -89,11 +98,15 @@ public final class ListTag extends Tag {
|
||||
*
|
||||
* @return a byte array
|
||||
*/
|
||||
public byte[] getByteArray(final int index) {
|
||||
public byte[] getByteArray(final int index)
|
||||
{
|
||||
final Tag tag = getIfExists(index);
|
||||
if (tag instanceof ByteArrayTag) {
|
||||
if (tag instanceof ByteArrayTag)
|
||||
{
|
||||
return ((ByteArrayTag) tag).getValue();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return new byte[0];
|
||||
}
|
||||
}
|
||||
@ -106,11 +119,15 @@ public final class ListTag extends Tag {
|
||||
*
|
||||
* @return a byte
|
||||
*/
|
||||
public byte getByte(final int index) {
|
||||
public byte getByte(final int index)
|
||||
{
|
||||
final Tag tag = getIfExists(index);
|
||||
if (tag instanceof ByteTag) {
|
||||
if (tag instanceof ByteTag)
|
||||
{
|
||||
return ((ByteTag) tag).getValue();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return (byte) 0;
|
||||
}
|
||||
}
|
||||
@ -123,11 +140,15 @@ public final class ListTag extends Tag {
|
||||
*
|
||||
* @return a double
|
||||
*/
|
||||
public double getDouble(final int index) {
|
||||
public double getDouble(final int index)
|
||||
{
|
||||
final Tag tag = getIfExists(index);
|
||||
if (tag instanceof DoubleTag) {
|
||||
if (tag instanceof DoubleTag)
|
||||
{
|
||||
return ((DoubleTag) tag).getValue();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -140,21 +161,35 @@ public final class ListTag extends Tag {
|
||||
*
|
||||
* @return a double
|
||||
*/
|
||||
public double asDouble(final int index) {
|
||||
public double asDouble(final int index)
|
||||
{
|
||||
final Tag tag = getIfExists(index);
|
||||
if (tag instanceof ByteTag) {
|
||||
if (tag instanceof ByteTag)
|
||||
{
|
||||
return ((ByteTag) tag).getValue();
|
||||
} else if (tag instanceof ShortTag) {
|
||||
}
|
||||
else if (tag instanceof ShortTag)
|
||||
{
|
||||
return ((ShortTag) tag).getValue();
|
||||
} else if (tag instanceof IntTag) {
|
||||
}
|
||||
else if (tag instanceof IntTag)
|
||||
{
|
||||
return ((IntTag) tag).getValue();
|
||||
} else if (tag instanceof LongTag) {
|
||||
}
|
||||
else if (tag instanceof LongTag)
|
||||
{
|
||||
return ((LongTag) tag).getValue();
|
||||
} else if (tag instanceof FloatTag) {
|
||||
}
|
||||
else if (tag instanceof FloatTag)
|
||||
{
|
||||
return ((FloatTag) tag).getValue();
|
||||
} else if (tag instanceof DoubleTag) {
|
||||
}
|
||||
else if (tag instanceof DoubleTag)
|
||||
{
|
||||
return ((DoubleTag) tag).getValue();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -167,11 +202,15 @@ public final class ListTag extends Tag {
|
||||
*
|
||||
* @return a float
|
||||
*/
|
||||
public float getFloat(final int index) {
|
||||
public float getFloat(final int index)
|
||||
{
|
||||
final Tag tag = getIfExists(index);
|
||||
if (tag instanceof FloatTag) {
|
||||
if (tag instanceof FloatTag)
|
||||
{
|
||||
return ((FloatTag) tag).getValue();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -184,11 +223,15 @@ public final class ListTag extends Tag {
|
||||
*
|
||||
* @return an int array
|
||||
*/
|
||||
public int[] getIntArray(final int index) {
|
||||
public int[] getIntArray(final int index)
|
||||
{
|
||||
final Tag tag = getIfExists(index);
|
||||
if (tag instanceof IntArrayTag) {
|
||||
if (tag instanceof IntArrayTag)
|
||||
{
|
||||
return ((IntArrayTag) tag).getValue();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return new int[0];
|
||||
}
|
||||
}
|
||||
@ -201,11 +244,15 @@ public final class ListTag extends Tag {
|
||||
*
|
||||
* @return an int
|
||||
*/
|
||||
public int getInt(final int index) {
|
||||
public int getInt(final int index)
|
||||
{
|
||||
final Tag tag = getIfExists(index);
|
||||
if (tag instanceof IntTag) {
|
||||
if (tag instanceof IntTag)
|
||||
{
|
||||
return ((IntTag) tag).getValue();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -218,21 +265,35 @@ public final class ListTag extends Tag {
|
||||
*
|
||||
* @return an int
|
||||
*/
|
||||
public int asInt(final int index) {
|
||||
public int asInt(final int index)
|
||||
{
|
||||
final Tag tag = getIfExists(index);
|
||||
if (tag instanceof ByteTag) {
|
||||
if (tag instanceof ByteTag)
|
||||
{
|
||||
return ((ByteTag) tag).getValue();
|
||||
} else if (tag instanceof ShortTag) {
|
||||
}
|
||||
else if (tag instanceof ShortTag)
|
||||
{
|
||||
return ((ShortTag) tag).getValue();
|
||||
} else if (tag instanceof IntTag) {
|
||||
}
|
||||
else if (tag instanceof IntTag)
|
||||
{
|
||||
return ((IntTag) tag).getValue();
|
||||
} else if (tag instanceof LongTag) {
|
||||
}
|
||||
else if (tag instanceof LongTag)
|
||||
{
|
||||
return ((LongTag) tag).getValue().intValue();
|
||||
} else if (tag instanceof FloatTag) {
|
||||
}
|
||||
else if (tag instanceof FloatTag)
|
||||
{
|
||||
return ((FloatTag) tag).getValue().intValue();
|
||||
} else if (tag instanceof DoubleTag) {
|
||||
}
|
||||
else if (tag instanceof DoubleTag)
|
||||
{
|
||||
return ((DoubleTag) tag).getValue().intValue();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -245,11 +306,15 @@ public final class ListTag extends Tag {
|
||||
*
|
||||
* @return a list of tags
|
||||
*/
|
||||
public List<Tag> getList(final int index) {
|
||||
public List<Tag> getList(final int index)
|
||||
{
|
||||
final Tag tag = getIfExists(index);
|
||||
if (tag instanceof ListTag) {
|
||||
if (tag instanceof ListTag)
|
||||
{
|
||||
return ((ListTag) tag).getValue();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
@ -262,11 +327,15 @@ public final class ListTag extends Tag {
|
||||
*
|
||||
* @return a tag list instance
|
||||
*/
|
||||
public ListTag getListTag(final int index) {
|
||||
public ListTag getListTag(final int index)
|
||||
{
|
||||
final Tag tag = getIfExists(index);
|
||||
if (tag instanceof ListTag) {
|
||||
if (tag instanceof ListTag)
|
||||
{
|
||||
return (ListTag) tag;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return new ListTag(StringTag.class, Collections.<Tag> emptyList());
|
||||
}
|
||||
}
|
||||
@ -283,16 +352,23 @@ public final class ListTag extends Tag {
|
||||
* @return a list of tags
|
||||
*/
|
||||
@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);
|
||||
if (tag instanceof ListTag) {
|
||||
if (tag instanceof ListTag)
|
||||
{
|
||||
final ListTag listTag = (ListTag) tag;
|
||||
if (listTag.getType().equals(listType)) {
|
||||
if (listTag.getType().equals(listType))
|
||||
{
|
||||
return (List<T>) listTag.getValue();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return Collections.emptyList();
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
@ -305,11 +381,15 @@ public final class ListTag extends Tag {
|
||||
*
|
||||
* @return a long
|
||||
*/
|
||||
public long getLong(final int index) {
|
||||
public long getLong(final int index)
|
||||
{
|
||||
final Tag tag = getIfExists(index);
|
||||
if (tag instanceof LongTag) {
|
||||
if (tag instanceof LongTag)
|
||||
{
|
||||
return ((LongTag) tag).getValue();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0L;
|
||||
}
|
||||
}
|
||||
@ -322,21 +402,35 @@ public final class ListTag extends Tag {
|
||||
*
|
||||
* @return a long
|
||||
*/
|
||||
public long asLong(final int index) {
|
||||
public long asLong(final int index)
|
||||
{
|
||||
final Tag tag = getIfExists(index);
|
||||
if (tag instanceof ByteTag) {
|
||||
if (tag instanceof ByteTag)
|
||||
{
|
||||
return ((ByteTag) tag).getValue();
|
||||
} else if (tag instanceof ShortTag) {
|
||||
}
|
||||
else if (tag instanceof ShortTag)
|
||||
{
|
||||
return ((ShortTag) tag).getValue();
|
||||
} else if (tag instanceof IntTag) {
|
||||
}
|
||||
else if (tag instanceof IntTag)
|
||||
{
|
||||
return ((IntTag) tag).getValue();
|
||||
} else if (tag instanceof LongTag) {
|
||||
}
|
||||
else if (tag instanceof LongTag)
|
||||
{
|
||||
return ((LongTag) tag).getValue();
|
||||
} else if (tag instanceof FloatTag) {
|
||||
}
|
||||
else if (tag instanceof FloatTag)
|
||||
{
|
||||
return ((FloatTag) tag).getValue().longValue();
|
||||
} else if (tag instanceof DoubleTag) {
|
||||
}
|
||||
else if (tag instanceof DoubleTag)
|
||||
{
|
||||
return ((DoubleTag) tag).getValue().longValue();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -349,11 +443,15 @@ public final class ListTag extends Tag {
|
||||
*
|
||||
* @return a short
|
||||
*/
|
||||
public short getShort(final int index) {
|
||||
public short getShort(final int index)
|
||||
{
|
||||
final Tag tag = getIfExists(index);
|
||||
if (tag instanceof ShortTag) {
|
||||
if (tag instanceof ShortTag)
|
||||
{
|
||||
return ((ShortTag) tag).getValue();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -366,25 +464,32 @@ public final class ListTag extends Tag {
|
||||
*
|
||||
* @return a string
|
||||
*/
|
||||
public String getString(final int index) {
|
||||
public String getString(final int index)
|
||||
{
|
||||
final Tag tag = getIfExists(index);
|
||||
if (tag instanceof StringTag) {
|
||||
if (tag instanceof StringTag)
|
||||
{
|
||||
return ((StringTag) tag).getValue();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
public String toString()
|
||||
{
|
||||
final String name = getName();
|
||||
String append = "";
|
||||
if ((name != null) && !name.equals("")) {
|
||||
append = "(\"" + this.getName() + "\")";
|
||||
if ((name != null) && !name.equals(""))
|
||||
{
|
||||
append = "(\"" + getName() + "\")";
|
||||
}
|
||||
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");
|
||||
for (final Tag t : this.value) {
|
||||
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 : value)
|
||||
{
|
||||
bldr.append(" ").append(t.toString().replaceAll("\r\n", "\r\n ")).append("\r\n");
|
||||
}
|
||||
bldr.append("}");
|
||||
|
@ -10,7 +10,8 @@ import java.util.List;
|
||||
/**
|
||||
* Helps create list tags.
|
||||
*/
|
||||
public class ListTagBuilder {
|
||||
public class ListTagBuilder
|
||||
{
|
||||
private final Class<? extends Tag> type;
|
||||
private final List<Tag> entries;
|
||||
|
||||
@ -19,42 +20,42 @@ public class ListTagBuilder {
|
||||
*
|
||||
* @param type of tag contained in this list
|
||||
*/
|
||||
ListTagBuilder(final Class<? extends Tag> type) {
|
||||
ListTagBuilder(final Class<? extends Tag> type)
|
||||
{
|
||||
checkNotNull(type);
|
||||
this.type = type;
|
||||
this.entries = new ArrayList<Tag>();
|
||||
entries = new ArrayList<Tag>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new builder instance.
|
||||
*
|
||||
*
|
||||
* @param type
|
||||
*
|
||||
* @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);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new builder instance.
|
||||
*
|
||||
*
|
||||
* @param entries
|
||||
* @param <T>
|
||||
*
|
||||
* @return a new builder
|
||||
*/
|
||||
@SafeVarargs
|
||||
public static <T extends Tag> ListTagBuilder createWith(final T... entries) {
|
||||
public static <T extends Tag> ListTagBuilder createWith(final T... entries)
|
||||
{
|
||||
checkNotNull(entries);
|
||||
if (entries.length == 0) {
|
||||
throw new IllegalArgumentException("This method needs an array of at least one entry");
|
||||
}
|
||||
if (entries.length == 0) { throw new IllegalArgumentException("This method needs an array of at least one entry"); }
|
||||
final Class<? extends Tag> type = entries[0].getClass();
|
||||
for (int i = 1; i < entries.length; i++) {
|
||||
if (!type.isInstance(entries[i])) {
|
||||
throw new IllegalArgumentException("An array of different tag types was provided");
|
||||
}
|
||||
for (int i = 1; i < entries.length; i++)
|
||||
{
|
||||
if (!type.isInstance(entries[i])) { throw new IllegalArgumentException("An array of different tag types was provided"); }
|
||||
}
|
||||
final ListTagBuilder builder = new ListTagBuilder(type);
|
||||
builder.addAll(Arrays.asList(entries));
|
||||
@ -68,12 +69,11 @@ public class ListTagBuilder {
|
||||
*
|
||||
* @return this object
|
||||
*/
|
||||
public ListTagBuilder add(final Tag value) {
|
||||
public ListTagBuilder add(final Tag value)
|
||||
{
|
||||
checkNotNull(value);
|
||||
if (!this.type.isInstance(value)) {
|
||||
throw new IllegalArgumentException(value.getClass().getCanonicalName() + " is not of expected type " + this.type.getCanonicalName());
|
||||
}
|
||||
this.entries.add(value);
|
||||
if (!type.isInstance(value)) { throw new IllegalArgumentException(value.getClass().getCanonicalName() + " is not of expected type " + type.getCanonicalName()); }
|
||||
entries.add(value);
|
||||
return this;
|
||||
}
|
||||
|
||||
@ -84,9 +84,11 @@ public class ListTagBuilder {
|
||||
*
|
||||
* @return this object
|
||||
*/
|
||||
public ListTagBuilder addAll(final Collection<? extends Tag> value) {
|
||||
public ListTagBuilder addAll(final Collection<? extends Tag> value)
|
||||
{
|
||||
checkNotNull(value);
|
||||
for (final Tag v : value) {
|
||||
for (final Tag v : value)
|
||||
{
|
||||
add(v);
|
||||
}
|
||||
return this;
|
||||
@ -97,8 +99,9 @@ public class ListTagBuilder {
|
||||
*
|
||||
* @return the new list tag
|
||||
*/
|
||||
public ListTag build() {
|
||||
return new ListTag(this.type, new ArrayList<Tag>(this.entries));
|
||||
public ListTag build()
|
||||
{
|
||||
return new ListTag(type, new ArrayList<Tag>(entries));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -108,7 +111,8 @@ public class ListTagBuilder {
|
||||
*
|
||||
* @return the created list tag
|
||||
*/
|
||||
public ListTag build(final String name) {
|
||||
return new ListTag(name, this.type, new ArrayList<Tag>(this.entries));
|
||||
public ListTag build(final String name)
|
||||
{
|
||||
return new ListTag(name, type, new ArrayList<Tag>(entries));
|
||||
}
|
||||
}
|
||||
|
@ -3,7 +3,8 @@ package com.intellectualcrafters.jnbt;
|
||||
/**
|
||||
* The {@code TAG_Long} tag.
|
||||
*/
|
||||
public final class LongTag extends Tag {
|
||||
public final class LongTag extends Tag
|
||||
{
|
||||
private final long value;
|
||||
|
||||
/**
|
||||
@ -11,7 +12,8 @@ public final class LongTag extends Tag {
|
||||
*
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public LongTag(final long value) {
|
||||
public LongTag(final long value)
|
||||
{
|
||||
super();
|
||||
this.value = value;
|
||||
}
|
||||
@ -22,23 +24,27 @@ public final class LongTag extends Tag {
|
||||
* @param name the name 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);
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Long getValue() {
|
||||
return this.value;
|
||||
public Long getValue()
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
public String toString()
|
||||
{
|
||||
final String name = getName();
|
||||
String append = "";
|
||||
if ((name != null) && !name.equals("")) {
|
||||
append = "(\"" + this.getName() + "\")";
|
||||
if ((name != null) && !name.equals(""))
|
||||
{
|
||||
append = "(\"" + getName() + "\")";
|
||||
}
|
||||
return "TAG_Long" + append + ": " + this.value;
|
||||
return "TAG_Long" + append + ": " + value;
|
||||
}
|
||||
}
|
||||
|
@ -25,15 +25,17 @@ import java.nio.charset.Charset;
|
||||
/**
|
||||
* 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 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.
|
||||
*/
|
||||
private NBTConstants() {
|
||||
}
|
||||
private NBTConstants()
|
||||
{}
|
||||
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
public static Class<? extends Tag> getClassFromType(final int id) {
|
||||
switch (id) {
|
||||
public static Class<? extends Tag> getClassFromType(final int id)
|
||||
{
|
||||
switch (id)
|
||||
{
|
||||
case TYPE_END:
|
||||
return EndTag.class;
|
||||
case TYPE_BYTE:
|
||||
|
@ -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
|
||||
* 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 int count;
|
||||
|
||||
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
public NBTInputStream(final InputStream is) throws IOException {
|
||||
public NBTInputStream(final InputStream is) throws IOException
|
||||
{
|
||||
this.is = new DataInputStream(is);
|
||||
}
|
||||
|
||||
@ -37,10 +39,11 @@ public final class NBTInputStream implements Closeable {
|
||||
*
|
||||
* @throws IOException if an I/O error occurs.
|
||||
*/
|
||||
public Tag readTag() throws IOException {
|
||||
public Tag readTag() throws IOException
|
||||
{
|
||||
return readTag(0, Integer.MAX_VALUE);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
public Tag readTag(int maxDepth) throws IOException {
|
||||
public Tag readTag(final int maxDepth) throws IOException
|
||||
{
|
||||
return readTag(0, maxDepth);
|
||||
}
|
||||
|
||||
@ -61,16 +65,20 @@ public final class NBTInputStream implements Closeable {
|
||||
*
|
||||
* @throws IOException if an I/O error occurs.
|
||||
*/
|
||||
private Tag readTag(final int depth, int maxDepth) throws IOException {
|
||||
if ((count++) > maxDepth) throw new IOException("Exceeds max depth: " + count);
|
||||
final int type = this.is.readByte() & 0xFF;
|
||||
private Tag readTag(final int depth, final int maxDepth) throws IOException
|
||||
{
|
||||
if ((count++) > maxDepth) { throw new IOException("Exceeds max depth: " + count); }
|
||||
final int type = is.readByte() & 0xFF;
|
||||
String name;
|
||||
if (type != NBTConstants.TYPE_END) {
|
||||
final int nameLength = this.is.readShort() & 0xFFFF;
|
||||
if (type != NBTConstants.TYPE_END)
|
||||
{
|
||||
final int nameLength = is.readShort() & 0xFFFF;
|
||||
final byte[] nameBytes = new byte[nameLength];
|
||||
this.is.readFully(nameBytes);
|
||||
is.readFully(nameBytes);
|
||||
name = new String(nameBytes, NBTConstants.CHARSET);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
name = "";
|
||||
}
|
||||
return readTagPayload(type, name, depth, maxDepth);
|
||||
@ -87,84 +95,96 @@ public final class NBTInputStream implements Closeable {
|
||||
*
|
||||
* @throws IOException if an I/O error occurs.
|
||||
*/
|
||||
private Tag readTagPayload(final int type, final String name, final int depth, int maxDepth) throws IOException {
|
||||
if ((count++) > maxDepth) throw new IOException("Exceeds max depth: " + count);
|
||||
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); }
|
||||
count++;
|
||||
switch (type) {
|
||||
switch (type)
|
||||
{
|
||||
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.");
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return new EndTag();
|
||||
}
|
||||
case NBTConstants.TYPE_BYTE:
|
||||
return new ByteTag(name, this.is.readByte());
|
||||
return new ByteTag(name, is.readByte());
|
||||
case NBTConstants.TYPE_SHORT:
|
||||
return new ShortTag(name, this.is.readShort());
|
||||
return new ShortTag(name, is.readShort());
|
||||
case NBTConstants.TYPE_INT:
|
||||
return new IntTag(name, this.is.readInt());
|
||||
return new IntTag(name, is.readInt());
|
||||
case NBTConstants.TYPE_LONG:
|
||||
return new LongTag(name, this.is.readLong());
|
||||
return new LongTag(name, is.readLong());
|
||||
case NBTConstants.TYPE_FLOAT:
|
||||
return new FloatTag(name, this.is.readFloat());
|
||||
return new FloatTag(name, is.readFloat());
|
||||
case NBTConstants.TYPE_DOUBLE:
|
||||
return new DoubleTag(name, this.is.readDouble());
|
||||
return new DoubleTag(name, is.readDouble());
|
||||
case NBTConstants.TYPE_BYTE_ARRAY:
|
||||
int length = this.is.readInt();
|
||||
|
||||
int length = is.readInt();
|
||||
|
||||
// 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];
|
||||
this.is.readFully(bytes);
|
||||
is.readFully(bytes);
|
||||
return new ByteArrayTag(name, bytes);
|
||||
case NBTConstants.TYPE_STRING:
|
||||
length = this.is.readShort();
|
||||
|
||||
length = is.readShort();
|
||||
|
||||
// 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];
|
||||
this.is.readFully(bytes);
|
||||
is.readFully(bytes);
|
||||
return new StringTag(name, new String(bytes, NBTConstants.CHARSET));
|
||||
case NBTConstants.TYPE_LIST:
|
||||
final int childType = this.is.readByte();
|
||||
length = this.is.readInt();
|
||||
|
||||
final int childType = is.readByte();
|
||||
length = is.readInt();
|
||||
|
||||
// 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>();
|
||||
for (int i = 0; i < length; ++i) {
|
||||
for (int i = 0; i < length; ++i)
|
||||
{
|
||||
final Tag tag = readTagPayload(childType, "", depth + 1, maxDepth);
|
||||
if (tag instanceof EndTag) {
|
||||
throw new IOException("TAG_End not permitted in a list.");
|
||||
}
|
||||
if (tag instanceof EndTag) { throw new IOException("TAG_End not permitted in a list."); }
|
||||
tagList.add(tag);
|
||||
}
|
||||
return new ListTag(name, NBTUtils.getTypeClass(childType), tagList);
|
||||
case NBTConstants.TYPE_COMPOUND:
|
||||
final Map<String, Tag> tagMap = new HashMap<String, Tag>();
|
||||
while (true) {
|
||||
while (true)
|
||||
{
|
||||
final Tag tag = readTag(depth + 1, maxDepth);
|
||||
if (tag instanceof EndTag) {
|
||||
if (tag instanceof EndTag)
|
||||
{
|
||||
break;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
tagMap.put(tag.getName(), tag);
|
||||
}
|
||||
}
|
||||
return new CompoundTag(name, tagMap);
|
||||
case NBTConstants.TYPE_INT_ARRAY:
|
||||
length = this.is.readInt();
|
||||
length = is.readInt();
|
||||
// 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];
|
||||
for (int i = 0; i < length; i++) {
|
||||
data[i] = this.is.readInt();
|
||||
for (int i = 0; i < length; i++)
|
||||
{
|
||||
data[i] = is.readInt();
|
||||
}
|
||||
return new IntArrayTag(name, data);
|
||||
default:
|
||||
@ -173,7 +193,8 @@ public final class NBTInputStream implements Closeable {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() throws IOException {
|
||||
this.is.close();
|
||||
public void close() throws IOException
|
||||
{
|
||||
is.close();
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
* 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
|
||||
* </p>
|
||||
*
|
||||
* @author Graham Edgecombe
|
||||
*/
|
||||
public final class NBTOutputStream implements Closeable {
|
||||
public final class NBTOutputStream implements Closeable
|
||||
{
|
||||
/**
|
||||
* The output stream.
|
||||
*/
|
||||
@ -48,7 +49,8 @@ public final class NBTOutputStream implements Closeable {
|
||||
*
|
||||
* @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);
|
||||
}
|
||||
|
||||
@ -59,16 +61,15 @@ public final class NBTOutputStream implements Closeable {
|
||||
*
|
||||
* @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 String name = tag.getName();
|
||||
final byte[] nameBytes = name.getBytes(NBTConstants.CHARSET);
|
||||
this.os.writeByte(type);
|
||||
this.os.writeShort(nameBytes.length);
|
||||
this.os.write(nameBytes);
|
||||
if (type == NBTConstants.TYPE_END) {
|
||||
throw new IOException("Named TAG_End not permitted.");
|
||||
}
|
||||
os.writeByte(type);
|
||||
os.writeShort(nameBytes.length);
|
||||
os.write(nameBytes);
|
||||
if (type == NBTConstants.TYPE_END) { throw new IOException("Named TAG_End not permitted."); }
|
||||
writeTagPayload(tag);
|
||||
}
|
||||
|
||||
@ -79,9 +80,11 @@ public final class NBTOutputStream implements Closeable {
|
||||
*
|
||||
* @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());
|
||||
switch (type) {
|
||||
switch (type)
|
||||
{
|
||||
case NBTConstants.TYPE_END:
|
||||
writeEndTagPayload((EndTag) tag);
|
||||
break;
|
||||
@ -130,8 +133,9 @@ public final class NBTOutputStream implements Closeable {
|
||||
*
|
||||
* @throws IOException if an I/O error occurs.
|
||||
*/
|
||||
private void writeByteTagPayload(final ByteTag tag) throws IOException {
|
||||
this.os.writeByte(tag.getValue());
|
||||
private void writeByteTagPayload(final ByteTag tag) throws IOException
|
||||
{
|
||||
os.writeByte(tag.getValue());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -141,10 +145,11 @@ public final class NBTOutputStream implements Closeable {
|
||||
*
|
||||
* @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();
|
||||
this.os.writeInt(bytes.length);
|
||||
this.os.write(bytes);
|
||||
os.writeInt(bytes.length);
|
||||
os.write(bytes);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -154,11 +159,13 @@ public final class NBTOutputStream implements Closeable {
|
||||
*
|
||||
* @throws IOException if an I/O error occurs.
|
||||
*/
|
||||
private void writeCompoundTagPayload(final CompoundTag tag) throws IOException {
|
||||
for (final Tag childTag : tag.getValue().values()) {
|
||||
private void writeCompoundTagPayload(final CompoundTag tag) throws IOException
|
||||
{
|
||||
for (final Tag childTag : tag.getValue().values())
|
||||
{
|
||||
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.
|
||||
*/
|
||||
private void writeListTagPayload(final ListTag tag) throws IOException {
|
||||
private void writeListTagPayload(final ListTag tag) throws IOException
|
||||
{
|
||||
final Class<? extends Tag> clazz = tag.getType();
|
||||
final List<Tag> tags = tag.getValue();
|
||||
final int size = tags.size();
|
||||
this.os.writeByte(NBTUtils.getTypeCode(clazz));
|
||||
this.os.writeInt(size);
|
||||
for (final Tag tag1 : tags) {
|
||||
os.writeByte(NBTUtils.getTypeCode(clazz));
|
||||
os.writeInt(size);
|
||||
for (final Tag tag1 : tags)
|
||||
{
|
||||
writeTagPayload(tag1);
|
||||
}
|
||||
}
|
||||
@ -186,10 +195,11 @@ public final class NBTOutputStream implements Closeable {
|
||||
*
|
||||
* @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);
|
||||
this.os.writeShort(bytes.length);
|
||||
this.os.write(bytes);
|
||||
os.writeShort(bytes.length);
|
||||
os.write(bytes);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -199,8 +209,9 @@ public final class NBTOutputStream implements Closeable {
|
||||
*
|
||||
* @throws IOException if an I/O error occurs.
|
||||
*/
|
||||
private void writeDoubleTagPayload(final DoubleTag tag) throws IOException {
|
||||
this.os.writeDouble(tag.getValue());
|
||||
private void writeDoubleTagPayload(final DoubleTag tag) throws IOException
|
||||
{
|
||||
os.writeDouble(tag.getValue());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -210,8 +221,9 @@ public final class NBTOutputStream implements Closeable {
|
||||
*
|
||||
* @throws IOException if an I/O error occurs.
|
||||
*/
|
||||
private void writeFloatTagPayload(final FloatTag tag) throws IOException {
|
||||
this.os.writeFloat(tag.getValue());
|
||||
private void writeFloatTagPayload(final FloatTag tag) throws IOException
|
||||
{
|
||||
os.writeFloat(tag.getValue());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -221,8 +233,9 @@ public final class NBTOutputStream implements Closeable {
|
||||
*
|
||||
* @throws IOException if an I/O error occurs.
|
||||
*/
|
||||
private void writeLongTagPayload(final LongTag tag) throws IOException {
|
||||
this.os.writeLong(tag.getValue());
|
||||
private void writeLongTagPayload(final LongTag tag) throws IOException
|
||||
{
|
||||
os.writeLong(tag.getValue());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -232,8 +245,9 @@ public final class NBTOutputStream implements Closeable {
|
||||
*
|
||||
* @throws IOException if an I/O error occurs.
|
||||
*/
|
||||
private void writeIntTagPayload(final IntTag tag) throws IOException {
|
||||
this.os.writeInt(tag.getValue());
|
||||
private void writeIntTagPayload(final IntTag tag) throws IOException
|
||||
{
|
||||
os.writeInt(tag.getValue());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -243,8 +257,9 @@ public final class NBTOutputStream implements Closeable {
|
||||
*
|
||||
* @throws IOException if an I/O error occurs.
|
||||
*/
|
||||
private void writeShortTagPayload(final ShortTag tag) throws IOException {
|
||||
this.os.writeShort(tag.getValue());
|
||||
private void writeShortTagPayload(final ShortTag tag) throws IOException
|
||||
{
|
||||
os.writeShort(tag.getValue());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -254,28 +269,33 @@ public final class NBTOutputStream implements Closeable {
|
||||
*
|
||||
* @throws IOException if an I/O error occurs.
|
||||
*/
|
||||
private void writeEndTagPayload(final EndTag tag) {
|
||||
private void writeEndTagPayload(final EndTag tag)
|
||||
{
|
||||
/* empty */
|
||||
}
|
||||
|
||||
private void writeIntArrayTagPayload(final IntArrayTag tag) throws IOException {
|
||||
private void writeIntArrayTagPayload(final IntArrayTag tag) throws IOException
|
||||
{
|
||||
final int[] data = tag.getValue();
|
||||
this.os.writeInt(data.length);
|
||||
for (final int element : data) {
|
||||
this.os.writeInt(element);
|
||||
os.writeInt(data.length);
|
||||
for (final int element : data)
|
||||
{
|
||||
os.writeInt(element);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() throws IOException {
|
||||
this.os.close();
|
||||
public void close() throws IOException
|
||||
{
|
||||
os.close();
|
||||
}
|
||||
|
||||
/**
|
||||
* Flush output
|
||||
* @throws IOException
|
||||
* @throws IOException
|
||||
*/
|
||||
public void flush() throws IOException {
|
||||
this.os.flush();
|
||||
public void flush() throws IOException
|
||||
{
|
||||
os.flush();
|
||||
}
|
||||
}
|
||||
|
@ -5,12 +5,13 @@ import java.util.Map;
|
||||
/**
|
||||
* A class which contains NBT-related utility methods.
|
||||
*/
|
||||
public final class NBTUtils {
|
||||
public final class NBTUtils
|
||||
{
|
||||
/**
|
||||
* Default private constructor.
|
||||
*/
|
||||
private NBTUtils() {
|
||||
}
|
||||
private NBTUtils()
|
||||
{}
|
||||
|
||||
/**
|
||||
* Gets the type name of a tag.
|
||||
@ -19,32 +20,58 @@ public final class NBTUtils {
|
||||
*
|
||||
* @return The type name.
|
||||
*/
|
||||
public static String getTypeName(final Class<? extends Tag> clazz) {
|
||||
if (clazz.equals(ByteArrayTag.class)) {
|
||||
public static String getTypeName(final Class<? extends Tag> clazz)
|
||||
{
|
||||
if (clazz.equals(ByteArrayTag.class))
|
||||
{
|
||||
return "TAG_Byte_Array";
|
||||
} else if (clazz.equals(ByteTag.class)) {
|
||||
}
|
||||
else if (clazz.equals(ByteTag.class))
|
||||
{
|
||||
return "TAG_Byte";
|
||||
} else if (clazz.equals(CompoundTag.class)) {
|
||||
}
|
||||
else if (clazz.equals(CompoundTag.class))
|
||||
{
|
||||
return "TAG_Compound";
|
||||
} else if (clazz.equals(DoubleTag.class)) {
|
||||
}
|
||||
else if (clazz.equals(DoubleTag.class))
|
||||
{
|
||||
return "TAG_Double";
|
||||
} else if (clazz.equals(EndTag.class)) {
|
||||
}
|
||||
else if (clazz.equals(EndTag.class))
|
||||
{
|
||||
return "TAG_End";
|
||||
} else if (clazz.equals(FloatTag.class)) {
|
||||
}
|
||||
else if (clazz.equals(FloatTag.class))
|
||||
{
|
||||
return "TAG_Float";
|
||||
} else if (clazz.equals(IntTag.class)) {
|
||||
}
|
||||
else if (clazz.equals(IntTag.class))
|
||||
{
|
||||
return "TAG_Int";
|
||||
} else if (clazz.equals(ListTag.class)) {
|
||||
}
|
||||
else if (clazz.equals(ListTag.class))
|
||||
{
|
||||
return "TAG_List";
|
||||
} else if (clazz.equals(LongTag.class)) {
|
||||
}
|
||||
else if (clazz.equals(LongTag.class))
|
||||
{
|
||||
return "TAG_Long";
|
||||
} else if (clazz.equals(ShortTag.class)) {
|
||||
}
|
||||
else if (clazz.equals(ShortTag.class))
|
||||
{
|
||||
return "TAG_Short";
|
||||
} else if (clazz.equals(StringTag.class)) {
|
||||
}
|
||||
else if (clazz.equals(StringTag.class))
|
||||
{
|
||||
return "TAG_String";
|
||||
} else if (clazz.equals(IntArrayTag.class)) {
|
||||
}
|
||||
else if (clazz.equals(IntArrayTag.class))
|
||||
{
|
||||
return "TAG_Int_Array";
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new IllegalArgumentException("Invalid tag classs (" + clazz.getName() + ").");
|
||||
}
|
||||
}
|
||||
@ -58,32 +85,58 @@ public final class NBTUtils {
|
||||
*
|
||||
* @throws IllegalArgumentException if the tag class is invalid.
|
||||
*/
|
||||
public static int getTypeCode(final Class<? extends Tag> clazz) {
|
||||
if (clazz.equals(ByteArrayTag.class)) {
|
||||
public static int getTypeCode(final Class<? extends Tag> clazz)
|
||||
{
|
||||
if (clazz.equals(ByteArrayTag.class))
|
||||
{
|
||||
return NBTConstants.TYPE_BYTE_ARRAY;
|
||||
} else if (clazz.equals(ByteTag.class)) {
|
||||
}
|
||||
else if (clazz.equals(ByteTag.class))
|
||||
{
|
||||
return NBTConstants.TYPE_BYTE;
|
||||
} else if (clazz.equals(CompoundTag.class)) {
|
||||
}
|
||||
else if (clazz.equals(CompoundTag.class))
|
||||
{
|
||||
return NBTConstants.TYPE_COMPOUND;
|
||||
} else if (clazz.equals(DoubleTag.class)) {
|
||||
}
|
||||
else if (clazz.equals(DoubleTag.class))
|
||||
{
|
||||
return NBTConstants.TYPE_DOUBLE;
|
||||
} else if (clazz.equals(EndTag.class)) {
|
||||
}
|
||||
else if (clazz.equals(EndTag.class))
|
||||
{
|
||||
return NBTConstants.TYPE_END;
|
||||
} else if (clazz.equals(FloatTag.class)) {
|
||||
}
|
||||
else if (clazz.equals(FloatTag.class))
|
||||
{
|
||||
return NBTConstants.TYPE_FLOAT;
|
||||
} else if (clazz.equals(IntTag.class)) {
|
||||
}
|
||||
else if (clazz.equals(IntTag.class))
|
||||
{
|
||||
return NBTConstants.TYPE_INT;
|
||||
} else if (clazz.equals(ListTag.class)) {
|
||||
}
|
||||
else if (clazz.equals(ListTag.class))
|
||||
{
|
||||
return NBTConstants.TYPE_LIST;
|
||||
} else if (clazz.equals(LongTag.class)) {
|
||||
}
|
||||
else if (clazz.equals(LongTag.class))
|
||||
{
|
||||
return NBTConstants.TYPE_LONG;
|
||||
} else if (clazz.equals(ShortTag.class)) {
|
||||
}
|
||||
else if (clazz.equals(ShortTag.class))
|
||||
{
|
||||
return NBTConstants.TYPE_SHORT;
|
||||
} else if (clazz.equals(StringTag.class)) {
|
||||
}
|
||||
else if (clazz.equals(StringTag.class))
|
||||
{
|
||||
return NBTConstants.TYPE_STRING;
|
||||
} else if (clazz.equals(IntArrayTag.class)) {
|
||||
}
|
||||
else if (clazz.equals(IntArrayTag.class))
|
||||
{
|
||||
return NBTConstants.TYPE_INT_ARRAY;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new IllegalArgumentException("Invalid tag classs (" + clazz.getName() + ").");
|
||||
}
|
||||
}
|
||||
@ -97,8 +150,10 @@ public final class NBTUtils {
|
||||
*
|
||||
* @throws IllegalArgumentException if the tag type is invalid.
|
||||
*/
|
||||
public static Class<? extends Tag> getTypeClass(final int type) {
|
||||
switch (type) {
|
||||
public static Class<? extends Tag> getTypeClass(final int type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case NBTConstants.TYPE_END:
|
||||
return EndTag.class;
|
||||
case NBTConstants.TYPE_BYTE:
|
||||
@ -138,14 +193,11 @@ public final class NBTUtils {
|
||||
*
|
||||
* @return child tag
|
||||
*/
|
||||
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");
|
||||
}
|
||||
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"); }
|
||||
final Tag tag = items.get(key);
|
||||
if (!expected.isInstance(tag)) {
|
||||
throw new IllegalArgumentException(key + " tag is not of tag type " + expected.getName());
|
||||
}
|
||||
if (!expected.isInstance(tag)) { throw new IllegalArgumentException(key + " tag is not of tag type " + expected.getName()); }
|
||||
return expected.cast(tag);
|
||||
}
|
||||
}
|
||||
|
@ -23,7 +23,8 @@ package com.intellectualcrafters.jnbt;
|
||||
/**
|
||||
* The {@code TAG_Short} tag.
|
||||
*/
|
||||
public final class ShortTag extends Tag {
|
||||
public final class ShortTag extends Tag
|
||||
{
|
||||
private final short value;
|
||||
|
||||
/**
|
||||
@ -31,7 +32,8 @@ public final class ShortTag extends Tag {
|
||||
*
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public ShortTag(final short value) {
|
||||
public ShortTag(final short value)
|
||||
{
|
||||
super();
|
||||
this.value = value;
|
||||
}
|
||||
@ -42,23 +44,27 @@ public final class ShortTag extends Tag {
|
||||
* @param name the name 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);
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Short getValue() {
|
||||
return this.value;
|
||||
public Short getValue()
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
public String toString()
|
||||
{
|
||||
final String name = getName();
|
||||
String append = "";
|
||||
if ((name != null) && !name.equals("")) {
|
||||
append = "(\"" + this.getName() + "\")";
|
||||
if ((name != null) && !name.equals(""))
|
||||
{
|
||||
append = "(\"" + getName() + "\")";
|
||||
}
|
||||
return "TAG_Short" + append + ": " + this.value;
|
||||
return "TAG_Short" + append + ": " + value;
|
||||
}
|
||||
}
|
||||
|
@ -5,7 +5,8 @@ import static com.google.common.base.Preconditions.checkNotNull;
|
||||
/**
|
||||
* The {@code TAG_String} tag.
|
||||
*/
|
||||
public final class StringTag extends Tag {
|
||||
public final class StringTag extends Tag
|
||||
{
|
||||
private final String value;
|
||||
|
||||
/**
|
||||
@ -13,7 +14,8 @@ public final class StringTag extends Tag {
|
||||
*
|
||||
* @param value the value of the tag
|
||||
*/
|
||||
public StringTag(final String value) {
|
||||
public StringTag(final String value)
|
||||
{
|
||||
super();
|
||||
checkNotNull(value);
|
||||
this.value = value;
|
||||
@ -25,24 +27,28 @@ public final class StringTag extends Tag {
|
||||
* @param name the name 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);
|
||||
checkNotNull(value);
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getValue() {
|
||||
return this.value;
|
||||
public String getValue()
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
public String toString()
|
||||
{
|
||||
final String name = getName();
|
||||
String append = "";
|
||||
if ((name != null) && !name.equals("")) {
|
||||
append = "(\"" + this.getName() + "\")";
|
||||
if ((name != null) && !name.equals(""))
|
||||
{
|
||||
append = "(\"" + getName() + "\")";
|
||||
}
|
||||
return "TAG_String" + append + ": " + this.value;
|
||||
return "TAG_String" + append + ": " + value;
|
||||
}
|
||||
}
|
||||
|
@ -23,13 +23,15 @@ package com.intellectualcrafters.jnbt;
|
||||
/**
|
||||
* Represents a NBT tag.
|
||||
*/
|
||||
public abstract class Tag {
|
||||
public abstract class Tag
|
||||
{
|
||||
private final String name;
|
||||
|
||||
/**
|
||||
* Create a new tag with an empty name.
|
||||
*/
|
||||
Tag() {
|
||||
Tag()
|
||||
{
|
||||
this("");
|
||||
}
|
||||
|
||||
@ -38,8 +40,10 @@ public abstract class Tag {
|
||||
*
|
||||
* @param name the name
|
||||
*/
|
||||
Tag(String name) {
|
||||
if (name == null) {
|
||||
Tag(String name)
|
||||
{
|
||||
if (name == null)
|
||||
{
|
||||
name = "";
|
||||
}
|
||||
this.name = name;
|
||||
@ -50,8 +54,9 @@ public abstract class Tag {
|
||||
*
|
||||
* @return the name of this tag
|
||||
*/
|
||||
public final String getName() {
|
||||
return this.name;
|
||||
public final String getName()
|
||||
{
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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
|
||||
* delimited text. Comma delimited text is a very popular format for data interchange. It is understood by most
|
||||
* 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
|
||||
* 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.
|
||||
*
|
||||
*
|
||||
* 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
|
||||
* JSONObjects can be taken from the names in the first row.
|
||||
*
|
||||
* @author JSON.org
|
||||
* @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.
|
||||
*
|
||||
@ -27,28 +28,32 @@ public class CDL {
|
||||
*
|
||||
* @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 q;
|
||||
StringBuffer sb;
|
||||
do {
|
||||
do
|
||||
{
|
||||
c = x.next();
|
||||
} while ((c == ' ') || (c == '\t'));
|
||||
switch (c) {
|
||||
}
|
||||
while ((c == ' ') || (c == '\t'));
|
||||
switch (c)
|
||||
{
|
||||
case 0:
|
||||
return null;
|
||||
case '"':
|
||||
case '\'':
|
||||
q = c;
|
||||
sb = new StringBuffer();
|
||||
for (;;) {
|
||||
for (;;)
|
||||
{
|
||||
c = x.next();
|
||||
if (c == q) {
|
||||
if (c == q)
|
||||
{
|
||||
break;
|
||||
}
|
||||
if ((c == 0) || (c == '\n') || (c == '\r')) {
|
||||
throw x.syntaxError("Missing close quote '" + q + "'.");
|
||||
}
|
||||
if ((c == 0) || (c == '\n') || (c == '\r')) { throw x.syntaxError("Missing close quote '" + q + "'."); }
|
||||
sb.append(c);
|
||||
}
|
||||
return sb.toString();
|
||||
@ -70,23 +75,24 @@ public class CDL {
|
||||
*
|
||||
* @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();
|
||||
for (;;) {
|
||||
for (;;)
|
||||
{
|
||||
final String value = getValue(x);
|
||||
char c = x.next();
|
||||
if ((value == null) || ((ja.length() == 0) && (value.length() == 0) && (c != ','))) {
|
||||
return null;
|
||||
}
|
||||
if ((value == null) || ((ja.length() == 0) && (value.length() == 0) && (c != ','))) { return null; }
|
||||
ja.put(value);
|
||||
for (;;) {
|
||||
if (c == ',') {
|
||||
for (;;)
|
||||
{
|
||||
if (c == ',')
|
||||
{
|
||||
break;
|
||||
}
|
||||
if (c != ' ') {
|
||||
if ((c == '\n') || (c == '\r') || (c == 0)) {
|
||||
return ja;
|
||||
}
|
||||
if (c != ' ')
|
||||
{
|
||||
if ((c == '\n') || (c == '\r') || (c == 0)) { return ja; }
|
||||
throw x.syntaxError("Bad character '" + c + "' (" + (int) c + ").");
|
||||
}
|
||||
c = x.next();
|
||||
@ -106,7 +112,8 @@ public class CDL {
|
||||
*
|
||||
* @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);
|
||||
return ja != null ? ja.toJSONObject(names) : null;
|
||||
}
|
||||
@ -119,26 +126,35 @@ public class CDL {
|
||||
*
|
||||
* @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();
|
||||
for (int i = 0; i < ja.length(); i += 1) {
|
||||
if (i > 0) {
|
||||
for (int i = 0; i < ja.length(); i += 1)
|
||||
{
|
||||
if (i > 0)
|
||||
{
|
||||
sb.append(',');
|
||||
}
|
||||
final Object object = ja.opt(i);
|
||||
if (object != null) {
|
||||
if (object != null)
|
||||
{
|
||||
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('"');
|
||||
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);
|
||||
if ((c >= ' ') && (c != '"')) {
|
||||
if ((c >= ' ') && (c != '"'))
|
||||
{
|
||||
sb.append(c);
|
||||
}
|
||||
}
|
||||
sb.append('"');
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.append(string);
|
||||
}
|
||||
}
|
||||
@ -156,7 +172,8 @@ public class CDL {
|
||||
*
|
||||
* @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));
|
||||
}
|
||||
|
||||
@ -169,7 +186,8 @@ public class CDL {
|
||||
*
|
||||
* @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);
|
||||
}
|
||||
|
||||
@ -184,7 +202,8 @@ public class CDL {
|
||||
*
|
||||
* @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));
|
||||
}
|
||||
|
||||
@ -199,21 +218,20 @@ public class CDL {
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public static JSONArray toJSONArray(final JSONArray names, final JSONTokener x) throws JSONException {
|
||||
if ((names == null) || (names.length() == 0)) {
|
||||
return null;
|
||||
}
|
||||
public static JSONArray toJSONArray(final JSONArray names, final JSONTokener x) throws JSONException
|
||||
{
|
||||
if ((names == null) || (names.length() == 0)) { return null; }
|
||||
final JSONArray ja = new JSONArray();
|
||||
for (;;) {
|
||||
for (;;)
|
||||
{
|
||||
final JSONObject jo = rowToJSONObject(names, x);
|
||||
if (jo == null) {
|
||||
if (jo == null)
|
||||
{
|
||||
break;
|
||||
}
|
||||
ja.put(jo);
|
||||
}
|
||||
if (ja.length() == 0) {
|
||||
return null;
|
||||
}
|
||||
if (ja.length() == 0) { return null; }
|
||||
return ja;
|
||||
}
|
||||
|
||||
@ -227,13 +245,13 @@ public class CDL {
|
||||
*
|
||||
* @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);
|
||||
if (jo != null) {
|
||||
if (jo != null)
|
||||
{
|
||||
final JSONArray names = jo.names();
|
||||
if (names != null) {
|
||||
return rowToString(names) + toString(names, ja);
|
||||
}
|
||||
if (names != null) { return rowToString(names) + toString(names, ja); }
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@ -249,14 +267,15 @@ public class CDL {
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public static String toString(final JSONArray names, final JSONArray ja) throws JSONException {
|
||||
if ((names == null) || (names.length() == 0)) {
|
||||
return null;
|
||||
}
|
||||
public static String toString(final JSONArray names, final JSONArray ja) throws JSONException
|
||||
{
|
||||
if ((names == null) || (names.length() == 0)) { return null; }
|
||||
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);
|
||||
if (jo != null) {
|
||||
if (jo != null)
|
||||
{
|
||||
sb.append(rowToString(jo.toJSONArray(names)));
|
||||
}
|
||||
}
|
||||
|
@ -27,7 +27,8 @@ package com.intellectualcrafters.json;
|
||||
* @author JSON.org
|
||||
* @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
|
||||
* "%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.
|
||||
*/
|
||||
public static String escape(final String string) {
|
||||
public static String escape(final String string)
|
||||
{
|
||||
char c;
|
||||
final String s = string.trim();
|
||||
final int length = s.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);
|
||||
if ((c < ' ') || (c == '+') || (c == '%') || (c == '=') || (c == ';')) {
|
||||
if ((c < ' ') || (c == '+') || (c == '%') || (c == '=') || (c == ';'))
|
||||
{
|
||||
sb.append('%');
|
||||
sb.append(Character.forDigit((char) ((c >>> 4) & 0x0f), 16));
|
||||
sb.append(Character.forDigit((char) (c & 0x0f), 16));
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.append(c);
|
||||
}
|
||||
}
|
||||
@ -71,7 +77,8 @@ public class Cookie {
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public static JSONObject toJSONObject(final String string) throws JSONException {
|
||||
public static JSONObject toJSONObject(final String string) throws JSONException
|
||||
{
|
||||
String name;
|
||||
final JSONObject jo = new JSONObject();
|
||||
Object value;
|
||||
@ -80,15 +87,22 @@ public class Cookie {
|
||||
x.next('=');
|
||||
jo.put("value", x.nextTo(';'));
|
||||
x.next();
|
||||
while (x.more()) {
|
||||
while (x.more())
|
||||
{
|
||||
name = unescape(x.nextTo("=;"));
|
||||
if (x.next() != '=') {
|
||||
if (name.equals("secure")) {
|
||||
if (x.next() != '=')
|
||||
{
|
||||
if (name.equals("secure"))
|
||||
{
|
||||
value = Boolean.TRUE;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
throw x.syntaxError("Missing '=' in cookie parameter.");
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
value = unescape(x.nextTo(';'));
|
||||
x.next();
|
||||
}
|
||||
@ -108,24 +122,29 @@ public class Cookie {
|
||||
*
|
||||
* @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();
|
||||
sb.append(escape(jo.getString("name")));
|
||||
sb.append("=");
|
||||
sb.append(escape(jo.getString("value")));
|
||||
if (jo.has("expires")) {
|
||||
if (jo.has("expires"))
|
||||
{
|
||||
sb.append(";expires=");
|
||||
sb.append(jo.getString("expires"));
|
||||
}
|
||||
if (jo.has("domain")) {
|
||||
if (jo.has("domain"))
|
||||
{
|
||||
sb.append(";domain=");
|
||||
sb.append(escape(jo.getString("domain")));
|
||||
}
|
||||
if (jo.has("path")) {
|
||||
if (jo.has("path"))
|
||||
{
|
||||
sb.append(";path=");
|
||||
sb.append(escape(jo.getString("path")));
|
||||
}
|
||||
if (jo.optBoolean("secure")) {
|
||||
if (jo.optBoolean("secure"))
|
||||
{
|
||||
sb.append(";secure");
|
||||
}
|
||||
return sb.toString();
|
||||
@ -139,17 +158,23 @@ public class Cookie {
|
||||
*
|
||||
* @return The unescaped string.
|
||||
*/
|
||||
public static String unescape(final String string) {
|
||||
public static String unescape(final String string)
|
||||
{
|
||||
final int length = string.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);
|
||||
if (c == '+') {
|
||||
if (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 e = JSONTokener.dehexchar(string.charAt(i + 2));
|
||||
if ((d >= 0) && (e >= 0)) {
|
||||
if ((d >= 0) && (e >= 0))
|
||||
{
|
||||
c = (char) ((d * 16) + e);
|
||||
i += 2;
|
||||
}
|
||||
|
@ -8,12 +8,13 @@ import java.util.Iterator;
|
||||
* @author JSON.org
|
||||
* @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
|
||||
* from the values by '='. The pairs are separated by ';'. The names and the values will be unescaped, possibly
|
||||
* converting '+' and '%' sequences.
|
||||
*
|
||||
*
|
||||
* To add a cookie to a cooklist, cookielistJSONObject.put(cookieJSONObject.getString("name"),
|
||||
* cookieJSONObject.getString("value"));
|
||||
*
|
||||
@ -23,10 +24,12 @@ public class CookieList {
|
||||
*
|
||||
* @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 JSONTokener x = new JSONTokener(string);
|
||||
while (x.more()) {
|
||||
while (x.more())
|
||||
{
|
||||
final String name = Cookie.unescape(x.nextTo('='));
|
||||
x.next('=');
|
||||
jo.put(name, Cookie.unescape(x.nextTo(';')));
|
||||
@ -46,15 +49,19 @@ public class CookieList {
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public static String toString(final JSONObject jo) throws JSONException {
|
||||
public static String toString(final JSONObject jo) throws JSONException
|
||||
{
|
||||
boolean b = false;
|
||||
final Iterator<String> keys = jo.keys();
|
||||
String string;
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
while (keys.hasNext()) {
|
||||
while (keys.hasNext())
|
||||
{
|
||||
string = keys.next();
|
||||
if (!jo.isNull(string)) {
|
||||
if (b) {
|
||||
if (!jo.isNull(string))
|
||||
{
|
||||
if (b)
|
||||
{
|
||||
sb.append(';');
|
||||
}
|
||||
sb.append(Cookie.escape(string));
|
||||
|
@ -28,31 +28,37 @@ import java.util.Iterator;
|
||||
* @author JSON.org
|
||||
* @version 2014-05-03
|
||||
*/
|
||||
public class HTTP {
|
||||
public class HTTP
|
||||
{
|
||||
/**
|
||||
* Carriage return/line feed.
|
||||
*/
|
||||
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 HTTPTokener x = new HTTPTokener(string);
|
||||
String token;
|
||||
token = x.nextToken();
|
||||
if (token.toUpperCase().startsWith("HTTP")) {
|
||||
if (token.toUpperCase().startsWith("HTTP"))
|
||||
{
|
||||
// Response
|
||||
jo.put("HTTP-Version", token);
|
||||
jo.put("Status-Code", x.nextToken());
|
||||
jo.put("Reason-Phrase", x.nextTo('\0'));
|
||||
x.next();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
// Request
|
||||
jo.put("Method", token);
|
||||
jo.put("Request-URI", x.nextToken());
|
||||
jo.put("HTTP-Version", x.nextToken());
|
||||
}
|
||||
// Fields
|
||||
while (x.more()) {
|
||||
while (x.more())
|
||||
{
|
||||
final String name = x.nextTo(':');
|
||||
x.next(':');
|
||||
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
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
* <pre>
|
||||
* {
|
||||
* Method: "POST" (for example),
|
||||
@ -72,10 +78,10 @@ public class HTTP {
|
||||
* "HTTP-Version": "HTTP/1.1" (for example)
|
||||
* }
|
||||
* </pre>
|
||||
*
|
||||
*
|
||||
* A response header must contain
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
* <pre>
|
||||
* {
|
||||
* "HTTP-Version": "HTTP/1.1" (for example),
|
||||
@ -83,7 +89,7 @@ public class HTTP {
|
||||
* "Reason-Phrase": "OK" (for example)
|
||||
* }
|
||||
* </pre>
|
||||
*
|
||||
*
|
||||
* Any other members of the JSONObject will be output as HTTP fields. The result will end with two CRLF pairs.
|
||||
*
|
||||
* @param jo A JSONObject
|
||||
@ -92,17 +98,21 @@ public class HTTP {
|
||||
*
|
||||
* @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();
|
||||
String string;
|
||||
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(' ');
|
||||
sb.append(jo.getString("Status-Code"));
|
||||
sb.append(' ');
|
||||
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(' ');
|
||||
sb.append('"');
|
||||
@ -110,13 +120,17 @@ public class HTTP {
|
||||
sb.append('"');
|
||||
sb.append(' ');
|
||||
sb.append(jo.getString("HTTP-Version"));
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new JSONException("Not enough material for an HTTP header.");
|
||||
}
|
||||
sb.append(CRLF);
|
||||
while (keys.hasNext()) {
|
||||
while (keys.hasNext())
|
||||
{
|
||||
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(": ");
|
||||
sb.append(jo.getString(string));
|
||||
|
@ -6,13 +6,15 @@ package com.intellectualcrafters.json;
|
||||
* @author JSON.org
|
||||
* @version 2014-05-03
|
||||
*/
|
||||
public class HTTPTokener extends JSONTokener {
|
||||
public class HTTPTokener extends JSONTokener
|
||||
{
|
||||
/**
|
||||
* Construct an HTTPTokener from a string.
|
||||
*
|
||||
* @param string A source string.
|
||||
*/
|
||||
public HTTPTokener(final String string) {
|
||||
public HTTPTokener(final String string)
|
||||
{
|
||||
super(string);
|
||||
}
|
||||
|
||||
@ -23,30 +25,30 @@ public class HTTPTokener extends JSONTokener {
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public String nextToken() throws JSONException {
|
||||
public String nextToken() throws JSONException
|
||||
{
|
||||
char c;
|
||||
char q;
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
do {
|
||||
do
|
||||
{
|
||||
c = next();
|
||||
} while (Character.isWhitespace(c));
|
||||
if ((c == '"') || (c == '\'')) {
|
||||
}
|
||||
while (Character.isWhitespace(c));
|
||||
if ((c == '"') || (c == '\''))
|
||||
{
|
||||
q = c;
|
||||
for (;;) {
|
||||
for (;;)
|
||||
{
|
||||
c = next();
|
||||
if (c < ' ') {
|
||||
throw syntaxError("Unterminated string.");
|
||||
}
|
||||
if (c == q) {
|
||||
return sb.toString();
|
||||
}
|
||||
if (c < ' ') { throw syntaxError("Unterminated string."); }
|
||||
if (c == q) { return sb.toString(); }
|
||||
sb.append(c);
|
||||
}
|
||||
}
|
||||
for (;;) {
|
||||
if ((c == 0) || Character.isWhitespace(c)) {
|
||||
return sb.toString();
|
||||
}
|
||||
for (;;)
|
||||
{
|
||||
if ((c == 0) || Character.isWhitespace(c)) { return sb.toString(); }
|
||||
sb.append(c);
|
||||
c = next();
|
||||
}
|
||||
|
@ -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
|
||||
* these types: <code>Boolean</code>, <code>JSONArray</code>, <code>JSONObject</code>, <code>Number</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.
|
||||
*
|
||||
*
|
||||
* 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
|
||||
* optional values.
|
||||
*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*
|
||||
* 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> <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>
|
||||
@ -56,7 +56,8 @@ import java.util.Map;
|
||||
* @author JSON.org
|
||||
* @version 2014-05-03
|
||||
*/
|
||||
public class JSONArray {
|
||||
public class JSONArray
|
||||
{
|
||||
/**
|
||||
* The arrayList where the JSONArray's properties are kept.
|
||||
*/
|
||||
@ -65,8 +66,9 @@ public class JSONArray {
|
||||
/**
|
||||
* Construct an empty JSONArray.
|
||||
*/
|
||||
public JSONArray() {
|
||||
this.myArrayList = new ArrayList<Object>();
|
||||
public JSONArray()
|
||||
{
|
||||
myArrayList = new ArrayList<Object>();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -76,26 +78,29 @@ public class JSONArray {
|
||||
*
|
||||
* @throws JSONException If there is a syntax error.
|
||||
*/
|
||||
public JSONArray(final JSONTokener x) throws JSONException {
|
||||
public JSONArray(final JSONTokener x) throws JSONException
|
||||
{
|
||||
this();
|
||||
if (x.nextClean() != '[') {
|
||||
throw x.syntaxError("A JSONArray text must start with '['");
|
||||
}
|
||||
if (x.nextClean() != ']') {
|
||||
if (x.nextClean() != '[') { throw x.syntaxError("A JSONArray text must start with '['"); }
|
||||
if (x.nextClean() != ']')
|
||||
{
|
||||
x.back();
|
||||
for (;;) {
|
||||
if (x.nextClean() == ',') {
|
||||
for (;;)
|
||||
{
|
||||
if (x.nextClean() == ',')
|
||||
{
|
||||
x.back();
|
||||
this.myArrayList.add(JSONObject.NULL);
|
||||
} else {
|
||||
x.back();
|
||||
this.myArrayList.add(x.nextValue());
|
||||
myArrayList.add(JSONObject.NULL);
|
||||
}
|
||||
switch (x.nextClean()) {
|
||||
else
|
||||
{
|
||||
x.back();
|
||||
myArrayList.add(x.nextValue());
|
||||
}
|
||||
switch (x.nextClean())
|
||||
{
|
||||
case ',':
|
||||
if (x.nextClean() == ']') {
|
||||
return;
|
||||
}
|
||||
if (x.nextClean() == ']') { return; }
|
||||
x.back();
|
||||
break;
|
||||
case ']':
|
||||
@ -115,7 +120,8 @@ public class JSONArray {
|
||||
*
|
||||
* @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));
|
||||
}
|
||||
|
||||
@ -124,11 +130,14 @@ public class JSONArray {
|
||||
*
|
||||
* @param collection A Collection.
|
||||
*/
|
||||
public JSONArray(final Collection<Object> collection) {
|
||||
this.myArrayList = new ArrayList<Object>();
|
||||
if (collection != null) {
|
||||
for (final Object aCollection : collection) {
|
||||
this.myArrayList.add(JSONObject.wrap(aCollection));
|
||||
public JSONArray(final Collection<Object> collection)
|
||||
{
|
||||
myArrayList = new ArrayList<Object>();
|
||||
if (collection != null)
|
||||
{
|
||||
for (final Object aCollection : collection)
|
||||
{
|
||||
myArrayList.add(JSONObject.wrap(aCollection));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -138,14 +147,19 @@ public class JSONArray {
|
||||
*
|
||||
* @throws JSONException If not an array.
|
||||
*/
|
||||
public JSONArray(final Object array) throws JSONException {
|
||||
public JSONArray(final Object array) throws JSONException
|
||||
{
|
||||
this();
|
||||
if (array.getClass().isArray()) {
|
||||
if (array.getClass().isArray())
|
||||
{
|
||||
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)));
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
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.
|
||||
*/
|
||||
public Object get(final int index) throws JSONException {
|
||||
final Object object = this.opt(index);
|
||||
if (object == null) {
|
||||
throw new JSONException("JSONArray[" + index + "] not found.");
|
||||
}
|
||||
public Object get(final int index) throws JSONException
|
||||
{
|
||||
final Object object = opt(index);
|
||||
if (object == null) { throw new JSONException("JSONArray[" + index + "] not found."); }
|
||||
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.
|
||||
*/
|
||||
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"))) {
|
||||
public boolean getBoolean(final int index) throws JSONException
|
||||
{
|
||||
final Object object = get(index);
|
||||
if (object.equals(Boolean.FALSE) || ((object instanceof String) && ((String) object).equalsIgnoreCase("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.");
|
||||
}
|
||||
|
||||
@ -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.
|
||||
*/
|
||||
public double getDouble(final int index) throws JSONException {
|
||||
final Object object = this.get(index);
|
||||
try {
|
||||
public double getDouble(final int index) throws JSONException
|
||||
{
|
||||
final Object object = get(index);
|
||||
try
|
||||
{
|
||||
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.");
|
||||
}
|
||||
}
|
||||
@ -213,11 +231,15 @@ public class JSONArray {
|
||||
*
|
||||
* @throws JSONException If the key is not found or if the value is not a number.
|
||||
*/
|
||||
public int getInt(final int index) throws JSONException {
|
||||
final Object object = this.get(index);
|
||||
try {
|
||||
public int getInt(final int index) throws JSONException
|
||||
{
|
||||
final Object object = get(index);
|
||||
try
|
||||
{
|
||||
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.");
|
||||
}
|
||||
}
|
||||
@ -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
|
||||
*/
|
||||
public JSONArray getJSONArray(final int index) throws JSONException {
|
||||
final Object object = this.get(index);
|
||||
if (object instanceof JSONArray) {
|
||||
return (JSONArray) object;
|
||||
}
|
||||
public JSONArray getJSONArray(final int index) throws JSONException
|
||||
{
|
||||
final Object object = get(index);
|
||||
if (object instanceof JSONArray) { return (JSONArray) object; }
|
||||
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
|
||||
*/
|
||||
public JSONObject getJSONObject(final int index) throws JSONException {
|
||||
final Object object = this.get(index);
|
||||
if (object instanceof JSONObject) {
|
||||
return (JSONObject) object;
|
||||
}
|
||||
public JSONObject getJSONObject(final int index) throws JSONException
|
||||
{
|
||||
final Object object = get(index);
|
||||
if (object instanceof JSONObject) { return (JSONObject) object; }
|
||||
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.
|
||||
*/
|
||||
public long getLong(final int index) throws JSONException {
|
||||
final Object object = this.get(index);
|
||||
try {
|
||||
public long getLong(final int index) throws JSONException
|
||||
{
|
||||
final Object object = get(index);
|
||||
try
|
||||
{
|
||||
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.");
|
||||
}
|
||||
}
|
||||
@ -283,11 +307,10 @@ public class JSONArray {
|
||||
*
|
||||
* @throws JSONException If there is no string value for the index.
|
||||
*/
|
||||
public String getString(final int index) throws JSONException {
|
||||
final Object object = this.get(index);
|
||||
if (object instanceof String) {
|
||||
return (String) object;
|
||||
}
|
||||
public String getString(final int index) throws JSONException
|
||||
{
|
||||
final Object object = get(index);
|
||||
if (object instanceof String) { return (String) object; }
|
||||
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.
|
||||
*/
|
||||
public boolean isNull(final int index) {
|
||||
return JSONObject.NULL.equals(this.opt(index));
|
||||
public boolean isNull(final int index)
|
||||
{
|
||||
return JSONObject.NULL.equals(opt(index));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -312,14 +336,17 @@ public class JSONArray {
|
||||
*
|
||||
* @throws JSONException If the array contains an invalid number.
|
||||
*/
|
||||
public String join(final String separator) throws JSONException {
|
||||
final int len = this.length();
|
||||
public String join(final String separator) throws JSONException
|
||||
{
|
||||
final int len = length();
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
for (int i = 0; i < len; i += 1) {
|
||||
if (i > 0) {
|
||||
for (int i = 0; i < len; i += 1)
|
||||
{
|
||||
if (i > 0)
|
||||
{
|
||||
sb.append(separator);
|
||||
}
|
||||
sb.append(JSONObject.valueToString(this.myArrayList.get(i)));
|
||||
sb.append(JSONObject.valueToString(myArrayList.get(i)));
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
@ -329,8 +356,9 @@ public class JSONArray {
|
||||
*
|
||||
* @return The length (or size).
|
||||
*/
|
||||
public int length() {
|
||||
return this.myArrayList.size();
|
||||
public int length()
|
||||
{
|
||||
return myArrayList.size();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -340,8 +368,9 @@ public class JSONArray {
|
||||
*
|
||||
* @return An object value, or null if there is no object at that index.
|
||||
*/
|
||||
public Object opt(final int index) {
|
||||
return ((index < 0) || (index >= this.length())) ? null : this.myArrayList.get(index);
|
||||
public Object opt(final int index)
|
||||
{
|
||||
return ((index < 0) || (index >= length())) ? null : myArrayList.get(index);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -352,7 +381,8 @@ public class JSONArray {
|
||||
*
|
||||
* @return The truth.
|
||||
*/
|
||||
public boolean optBoolean(final int index) {
|
||||
public boolean optBoolean(final int index)
|
||||
{
|
||||
return this.optBoolean(index, false);
|
||||
}
|
||||
|
||||
@ -365,10 +395,14 @@ public class JSONArray {
|
||||
*
|
||||
* @return The truth.
|
||||
*/
|
||||
public boolean optBoolean(final int index, final boolean defaultValue) {
|
||||
try {
|
||||
return this.getBoolean(index);
|
||||
} catch (final Exception e) {
|
||||
public boolean optBoolean(final int index, final boolean defaultValue)
|
||||
{
|
||||
try
|
||||
{
|
||||
return getBoolean(index);
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
@ -381,7 +415,8 @@ public class JSONArray {
|
||||
*
|
||||
* @return The value.
|
||||
*/
|
||||
public double optDouble(final int index) {
|
||||
public double optDouble(final int index)
|
||||
{
|
||||
return this.optDouble(index, Double.NaN);
|
||||
}
|
||||
|
||||
@ -394,10 +429,14 @@ public class JSONArray {
|
||||
*
|
||||
* @return The value.
|
||||
*/
|
||||
public double optDouble(final int index, final double defaultValue) {
|
||||
try {
|
||||
return this.getDouble(index);
|
||||
} catch (final Exception e) {
|
||||
public double optDouble(final int index, final double defaultValue)
|
||||
{
|
||||
try
|
||||
{
|
||||
return getDouble(index);
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
@ -410,7 +449,8 @@ public class JSONArray {
|
||||
*
|
||||
* @return The value.
|
||||
*/
|
||||
public int optInt(final int index) {
|
||||
public int optInt(final int index)
|
||||
{
|
||||
return this.optInt(index, 0);
|
||||
}
|
||||
|
||||
@ -423,10 +463,14 @@ public class JSONArray {
|
||||
*
|
||||
* @return The value.
|
||||
*/
|
||||
public int optInt(final int index, final int defaultValue) {
|
||||
try {
|
||||
return this.getInt(index);
|
||||
} catch (final Exception e) {
|
||||
public int optInt(final int index, final int defaultValue)
|
||||
{
|
||||
try
|
||||
{
|
||||
return getInt(index);
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
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.
|
||||
*/
|
||||
public JSONArray optJSONArray(final int index) {
|
||||
final Object o = this.opt(index);
|
||||
public JSONArray optJSONArray(final int index)
|
||||
{
|
||||
final Object o = opt(index);
|
||||
return o instanceof JSONArray ? (JSONArray) o : null;
|
||||
}
|
||||
|
||||
@ -451,8 +496,9 @@ public class JSONArray {
|
||||
*
|
||||
* @return A JSONObject value.
|
||||
*/
|
||||
public JSONObject optJSONObject(final int index) {
|
||||
final Object o = this.opt(index);
|
||||
public JSONObject optJSONObject(final int index)
|
||||
{
|
||||
final Object o = opt(index);
|
||||
return o instanceof JSONObject ? (JSONObject) o : null;
|
||||
}
|
||||
|
||||
@ -464,7 +510,8 @@ public class JSONArray {
|
||||
*
|
||||
* @return The value.
|
||||
*/
|
||||
public long optLong(final int index) {
|
||||
public long optLong(final int index)
|
||||
{
|
||||
return this.optLong(index, 0);
|
||||
}
|
||||
|
||||
@ -477,10 +524,14 @@ public class JSONArray {
|
||||
*
|
||||
* @return The value.
|
||||
*/
|
||||
public long optLong(final int index, final long defaultValue) {
|
||||
try {
|
||||
return this.getLong(index);
|
||||
} catch (final Exception e) {
|
||||
public long optLong(final int index, final long defaultValue)
|
||||
{
|
||||
try
|
||||
{
|
||||
return getLong(index);
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
@ -493,7 +544,8 @@ public class JSONArray {
|
||||
*
|
||||
* @return A String value.
|
||||
*/
|
||||
public String optString(final int index) {
|
||||
public String optString(final int index)
|
||||
{
|
||||
return this.optString(index, "");
|
||||
}
|
||||
|
||||
@ -505,8 +557,9 @@ public class JSONArray {
|
||||
*
|
||||
* @return A String value.
|
||||
*/
|
||||
public String optString(final int index, final String defaultValue) {
|
||||
final Object object = this.opt(index);
|
||||
public String optString(final int index, final String defaultValue)
|
||||
{
|
||||
final Object object = opt(index);
|
||||
return JSONObject.NULL.equals(object) ? defaultValue : object.toString();
|
||||
}
|
||||
|
||||
@ -517,7 +570,8 @@ public class JSONArray {
|
||||
*
|
||||
* @return this.
|
||||
*/
|
||||
public JSONArray put(final boolean value) {
|
||||
public JSONArray put(final boolean value)
|
||||
{
|
||||
this.put(value ? Boolean.TRUE : Boolean.FALSE);
|
||||
return this;
|
||||
}
|
||||
@ -529,7 +583,8 @@ public class JSONArray {
|
||||
*
|
||||
* @return this.
|
||||
*/
|
||||
public JSONArray put(final Collection<Object> value) {
|
||||
public JSONArray put(final Collection<Object> value)
|
||||
{
|
||||
this.put(new JSONArray(value));
|
||||
return this;
|
||||
}
|
||||
@ -543,7 +598,8 @@ public class JSONArray {
|
||||
*
|
||||
* @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;
|
||||
JSONObject.testValidity(d);
|
||||
this.put(d);
|
||||
@ -557,7 +613,8 @@ public class JSONArray {
|
||||
*
|
||||
* @return this.
|
||||
*/
|
||||
public JSONArray put(final int value) {
|
||||
public JSONArray put(final int value)
|
||||
{
|
||||
this.put(new Integer(value));
|
||||
return this;
|
||||
}
|
||||
@ -569,7 +626,8 @@ public class JSONArray {
|
||||
*
|
||||
* @return this.
|
||||
*/
|
||||
public JSONArray put(final long value) {
|
||||
public JSONArray put(final long value)
|
||||
{
|
||||
this.put(new Long(value));
|
||||
return this;
|
||||
}
|
||||
@ -581,7 +639,8 @@ public class JSONArray {
|
||||
*
|
||||
* @return this.
|
||||
*/
|
||||
public JSONArray put(final Map<String, Object> value) {
|
||||
public JSONArray put(final Map<String, Object> value)
|
||||
{
|
||||
this.put(new JSONObject(value));
|
||||
return this;
|
||||
}
|
||||
@ -594,8 +653,9 @@ public class JSONArray {
|
||||
*
|
||||
* @return this.
|
||||
*/
|
||||
public JSONArray put(final Object value) {
|
||||
this.myArrayList.add(value);
|
||||
public JSONArray put(final Object value)
|
||||
{
|
||||
myArrayList.add(value);
|
||||
return this;
|
||||
}
|
||||
|
||||
@ -610,7 +670,8 @@ public class JSONArray {
|
||||
*
|
||||
* @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);
|
||||
return this;
|
||||
}
|
||||
@ -625,7 +686,8 @@ public class JSONArray {
|
||||
*
|
||||
* @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));
|
||||
return this;
|
||||
}
|
||||
@ -641,7 +703,8 @@ public class JSONArray {
|
||||
*
|
||||
* @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));
|
||||
return this;
|
||||
}
|
||||
@ -657,7 +720,8 @@ public class JSONArray {
|
||||
*
|
||||
* @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));
|
||||
return this;
|
||||
}
|
||||
@ -673,7 +737,8 @@ public class JSONArray {
|
||||
*
|
||||
* @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));
|
||||
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.
|
||||
*/
|
||||
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));
|
||||
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.
|
||||
*/
|
||||
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);
|
||||
if (index < 0) {
|
||||
throw new JSONException("JSONArray[" + index + "] not found.");
|
||||
if (index < 0) { throw new JSONException("JSONArray[" + index + "] not found."); }
|
||||
if (index < length())
|
||||
{
|
||||
myArrayList.set(index, value);
|
||||
}
|
||||
if (index < this.length()) {
|
||||
this.myArrayList.set(index, value);
|
||||
} else {
|
||||
while (index != this.length()) {
|
||||
else
|
||||
{
|
||||
while (index != length())
|
||||
{
|
||||
this.put(JSONObject.NULL);
|
||||
}
|
||||
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.
|
||||
*/
|
||||
public Object remove(final int index) {
|
||||
return (index >= 0) && (index < this.length()) ? this.myArrayList.remove(index) : null;
|
||||
public Object remove(final int index)
|
||||
{
|
||||
return (index >= 0) && (index < length()) ? myArrayList.remove(index) : null;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -739,28 +809,24 @@ public class JSONArray {
|
||||
*
|
||||
* @return true if they are equal
|
||||
*/
|
||||
public boolean similar(final Object other) {
|
||||
if (!(other instanceof JSONArray)) {
|
||||
return false;
|
||||
}
|
||||
final int len = this.length();
|
||||
if (len != ((JSONArray) other).length()) {
|
||||
return false;
|
||||
}
|
||||
for (int i = 0; i < len; i += 1) {
|
||||
final Object valueThis = this.get(i);
|
||||
public boolean similar(final Object other)
|
||||
{
|
||||
if (!(other instanceof JSONArray)) { return false; }
|
||||
final int len = length();
|
||||
if (len != ((JSONArray) other).length()) { return false; }
|
||||
for (int i = 0; i < len; i += 1)
|
||||
{
|
||||
final Object valueThis = get(i);
|
||||
final Object valueOther = ((JSONArray) other).get(i);
|
||||
if (valueThis instanceof JSONObject) {
|
||||
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;
|
||||
if (valueThis instanceof JSONObject)
|
||||
{
|
||||
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; }
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@ -774,13 +840,13 @@ public class JSONArray {
|
||||
*
|
||||
* @throws JSONException If any of the names are null.
|
||||
*/
|
||||
public JSONObject toJSONObject(final JSONArray names) throws JSONException {
|
||||
if ((names == null) || (names.length() == 0) || (this.length() == 0)) {
|
||||
return null;
|
||||
}
|
||||
public JSONObject toJSONObject(final JSONArray names) throws JSONException
|
||||
{
|
||||
if ((names == null) || (names.length() == 0) || (length() == 0)) { return null; }
|
||||
final JSONObject jo = new JSONObject();
|
||||
for (int i = 0; i < names.length(); i += 1) {
|
||||
jo.put(names.getString(i), this.opt(i));
|
||||
for (int i = 0; i < names.length(); i += 1)
|
||||
{
|
||||
jo.put(names.getString(i), opt(i));
|
||||
}
|
||||
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
|
||||
* produce a syntactically correct JSON text then null will be returned instead. This could occur if the array
|
||||
* contains an invalid number.
|
||||
*
|
||||
*
|
||||
* Warning: This method assumes that the data structure is acyclical.
|
||||
*
|
||||
* @return a printable, displayable, transmittable representation of the array.
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
try {
|
||||
public String toString()
|
||||
{
|
||||
try
|
||||
{
|
||||
return this.toString(0);
|
||||
} catch (final Exception e) {
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@ -815,29 +885,32 @@ public class JSONArray {
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public String toString(final int indentFactor) throws JSONException {
|
||||
public String toString(final int indentFactor) throws JSONException
|
||||
{
|
||||
final StringWriter sw = new StringWriter();
|
||||
synchronized (sw.getBuffer()) {
|
||||
synchronized (sw.getBuffer())
|
||||
{
|
||||
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.
|
||||
*
|
||||
*
|
||||
* Warning: This method assumes that the data structure is acyclical.
|
||||
*
|
||||
* @return The writer.
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public Writer write(final Writer writer) throws JSONException {
|
||||
public Writer write(final Writer writer) throws JSONException
|
||||
{
|
||||
return this.write(writer, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* @param indentFactor The number of spaces to add to each level of indentation.
|
||||
@ -847,34 +920,45 @@ public class JSONArray {
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
Writer write(final Writer writer, final int indentFactor, final int indent) throws JSONException {
|
||||
try {
|
||||
Writer write(final Writer writer, final int indentFactor, final int indent) throws JSONException
|
||||
{
|
||||
try
|
||||
{
|
||||
boolean commanate = false;
|
||||
final int length = this.length();
|
||||
final int length = length();
|
||||
writer.write('[');
|
||||
if (length == 1) {
|
||||
JSONObject.writeValue(writer, this.myArrayList.get(0), indentFactor, indent);
|
||||
} else if (length != 0) {
|
||||
if (length == 1)
|
||||
{
|
||||
JSONObject.writeValue(writer, myArrayList.get(0), indentFactor, indent);
|
||||
}
|
||||
else if (length != 0)
|
||||
{
|
||||
final int newindent = indent + indentFactor;
|
||||
for (int i = 0; i < length; i += 1) {
|
||||
if (commanate) {
|
||||
for (int i = 0; i < length; i += 1)
|
||||
{
|
||||
if (commanate)
|
||||
{
|
||||
writer.write(',');
|
||||
}
|
||||
if (indentFactor > 0) {
|
||||
if (indentFactor > 0)
|
||||
{
|
||||
writer.write('\n');
|
||||
}
|
||||
JSONObject.indent(writer, newindent);
|
||||
JSONObject.writeValue(writer, this.myArrayList.get(i), indentFactor, newindent);
|
||||
JSONObject.writeValue(writer, myArrayList.get(i), indentFactor, newindent);
|
||||
commanate = true;
|
||||
}
|
||||
if (indentFactor > 0) {
|
||||
if (indentFactor > 0)
|
||||
{
|
||||
writer.write('\n');
|
||||
}
|
||||
JSONObject.indent(writer, indent);
|
||||
}
|
||||
writer.write(']');
|
||||
return writer;
|
||||
} catch (final IOException e) {
|
||||
}
|
||||
catch (final IOException e)
|
||||
{
|
||||
throw new JSONException(e);
|
||||
}
|
||||
}
|
||||
|
@ -6,7 +6,8 @@ package com.intellectualcrafters.json;
|
||||
* @author JSON.org
|
||||
* @version 2014-05-03
|
||||
*/
|
||||
public class JSONException extends RuntimeException {
|
||||
public class JSONException extends RuntimeException
|
||||
{
|
||||
private static final long serialVersionUID = 0;
|
||||
private Throwable cause;
|
||||
|
||||
@ -15,7 +16,8 @@ public class JSONException extends RuntimeException {
|
||||
*
|
||||
* @param message Detail about the reason for the exception.
|
||||
*/
|
||||
public JSONException(final String message) {
|
||||
public JSONException(final String message)
|
||||
{
|
||||
super(message);
|
||||
}
|
||||
|
||||
@ -24,7 +26,8 @@ public class JSONException extends RuntimeException {
|
||||
*
|
||||
* @param cause The cause.
|
||||
*/
|
||||
public JSONException(final Throwable cause) {
|
||||
public JSONException(final Throwable cause)
|
||||
{
|
||||
super(cause.getMessage());
|
||||
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.
|
||||
*/
|
||||
@Override
|
||||
public Throwable getCause() {
|
||||
return this.cause;
|
||||
public Throwable getCause()
|
||||
{
|
||||
return cause;
|
||||
}
|
||||
}
|
||||
|
@ -9,7 +9,8 @@ import java.util.Iterator;
|
||||
* @author JSON.org
|
||||
* @version 2014-05-03
|
||||
*/
|
||||
public class JSONML {
|
||||
public class JSONML
|
||||
{
|
||||
/**
|
||||
* Parse XML values and store them in a JSONArray.
|
||||
*
|
||||
@ -21,7 +22,8 @@ public class JSONML {
|
||||
*
|
||||
* @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;
|
||||
char c;
|
||||
String closeTag = null;
|
||||
@ -35,149 +37,188 @@ public class JSONML {
|
||||
// <![ ... ]]>
|
||||
// <! ... >
|
||||
// <? ... ?>
|
||||
while (true) {
|
||||
if (!x.more()) {
|
||||
throw x.syntaxError("Bad XML");
|
||||
}
|
||||
while (true)
|
||||
{
|
||||
if (!x.more()) { throw x.syntaxError("Bad XML"); }
|
||||
token = x.nextContent();
|
||||
if (token == XML.LT) {
|
||||
if (token == XML.LT)
|
||||
{
|
||||
token = x.nextToken();
|
||||
if (token instanceof Character) {
|
||||
if (token == XML.SLASH) {
|
||||
if (token instanceof Character)
|
||||
{
|
||||
if (token == XML.SLASH)
|
||||
{
|
||||
// Close tag </
|
||||
token = x.nextToken();
|
||||
if (!(token instanceof String)) {
|
||||
throw new JSONException("Expected a closing name instead of '" + token + "'.");
|
||||
}
|
||||
if (x.nextToken() != XML.GT) {
|
||||
throw x.syntaxError("Misshaped close tag");
|
||||
}
|
||||
if (!(token instanceof String)) { throw new JSONException("Expected a closing name instead of '" + token + "'."); }
|
||||
if (x.nextToken() != XML.GT) { throw x.syntaxError("Misshaped close tag"); }
|
||||
return token;
|
||||
} else if (token == XML.BANG) {
|
||||
}
|
||||
else if (token == XML.BANG)
|
||||
{
|
||||
// <!
|
||||
c = x.next();
|
||||
if (c == '-') {
|
||||
if (x.next() == '-') {
|
||||
if (c == '-')
|
||||
{
|
||||
if (x.next() == '-')
|
||||
{
|
||||
x.skipPast("-->");
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
x.back();
|
||||
}
|
||||
} else if (c == '[') {
|
||||
}
|
||||
else if (c == '[')
|
||||
{
|
||||
token = x.nextToken();
|
||||
if (token.equals("CDATA") && (x.next() == '[')) {
|
||||
if (ja != null) {
|
||||
if (token.equals("CDATA") && (x.next() == '['))
|
||||
{
|
||||
if (ja != null)
|
||||
{
|
||||
ja.put(x.nextCDATA());
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
throw x.syntaxError("Expected 'CDATA['");
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
i = 1;
|
||||
do {
|
||||
do
|
||||
{
|
||||
token = x.nextMeta();
|
||||
if (token == null) {
|
||||
if (token == null)
|
||||
{
|
||||
throw x.syntaxError("Missing '>' after '<!'.");
|
||||
} else if (token == XML.LT) {
|
||||
}
|
||||
else if (token == XML.LT)
|
||||
{
|
||||
i += 1;
|
||||
} else if (token == XML.GT) {
|
||||
}
|
||||
else if (token == XML.GT)
|
||||
{
|
||||
i -= 1;
|
||||
}
|
||||
} while (i > 0);
|
||||
}
|
||||
while (i > 0);
|
||||
}
|
||||
} else if (token == XML.QUEST) {
|
||||
}
|
||||
else if (token == XML.QUEST)
|
||||
{
|
||||
// <?
|
||||
x.skipPast("?>");
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
throw x.syntaxError("Misshaped tag");
|
||||
}
|
||||
// Open tag <
|
||||
} else {
|
||||
if (!(token instanceof String)) {
|
||||
throw x.syntaxError("Bad tagName '" + token + "'.");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!(token instanceof String)) { throw x.syntaxError("Bad tagName '" + token + "'."); }
|
||||
tagName = (String) token;
|
||||
newja = new JSONArray();
|
||||
newjo = new JSONObject();
|
||||
if (arrayForm) {
|
||||
if (arrayForm)
|
||||
{
|
||||
newja.put(tagName);
|
||||
if (ja != null) {
|
||||
if (ja != null)
|
||||
{
|
||||
ja.put(newja);
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
newjo.put("tagName", tagName);
|
||||
if (ja != null) {
|
||||
if (ja != null)
|
||||
{
|
||||
ja.put(newjo);
|
||||
}
|
||||
}
|
||||
token = null;
|
||||
for (;;) {
|
||||
if (token == null) {
|
||||
for (;;)
|
||||
{
|
||||
if (token == null)
|
||||
{
|
||||
token = x.nextToken();
|
||||
}
|
||||
if (token == null) {
|
||||
throw x.syntaxError("Misshaped tag");
|
||||
}
|
||||
if (!(token instanceof String)) {
|
||||
if (token == null) { throw x.syntaxError("Misshaped tag"); }
|
||||
if (!(token instanceof String))
|
||||
{
|
||||
break;
|
||||
}
|
||||
// attribute = value
|
||||
attribute = (String) token;
|
||||
if (!arrayForm && ("tagName".equals(attribute) || "childNode".equals(attribute))) {
|
||||
throw x.syntaxError("Reserved attribute.");
|
||||
}
|
||||
if (!arrayForm && ("tagName".equals(attribute) || "childNode".equals(attribute))) { throw x.syntaxError("Reserved attribute."); }
|
||||
token = x.nextToken();
|
||||
if (token == XML.EQ) {
|
||||
if (token == XML.EQ)
|
||||
{
|
||||
token = x.nextToken();
|
||||
if (!(token instanceof String)) {
|
||||
throw x.syntaxError("Missing value");
|
||||
}
|
||||
if (!(token instanceof String)) { throw x.syntaxError("Missing value"); }
|
||||
newjo.accumulate(attribute, XML.stringToValue((String) token));
|
||||
token = null;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
newjo.accumulate(attribute, "");
|
||||
}
|
||||
}
|
||||
if (arrayForm && (newjo.length() > 0)) {
|
||||
if (arrayForm && (newjo.length() > 0))
|
||||
{
|
||||
newja.put(newjo);
|
||||
}
|
||||
// Empty tag <.../>
|
||||
if (token == XML.SLASH) {
|
||||
if (x.nextToken() != XML.GT) {
|
||||
throw x.syntaxError("Misshaped tag");
|
||||
}
|
||||
if (ja == null) {
|
||||
if (arrayForm) {
|
||||
if (token == XML.SLASH)
|
||||
{
|
||||
if (x.nextToken() != XML.GT) { throw x.syntaxError("Misshaped tag"); }
|
||||
if (ja == null)
|
||||
{
|
||||
if (arrayForm)
|
||||
{
|
||||
return newja;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return newjo;
|
||||
}
|
||||
}
|
||||
// Content, between <...> and </...>
|
||||
} else {
|
||||
if (token != XML.GT) {
|
||||
throw x.syntaxError("Misshaped tag");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (token != XML.GT) { throw x.syntaxError("Misshaped tag"); }
|
||||
closeTag = (String) parse(x, arrayForm, newja);
|
||||
if (closeTag != null) {
|
||||
if (!closeTag.equals(tagName)) {
|
||||
throw x.syntaxError("Mismatched '" + tagName + "' and '" + closeTag + "'");
|
||||
}
|
||||
if (closeTag != null)
|
||||
{
|
||||
if (!closeTag.equals(tagName)) { throw x.syntaxError("Mismatched '" + tagName + "' and '" + closeTag + "'"); }
|
||||
tagName = null;
|
||||
if (!arrayForm && (newja.length() > 0)) {
|
||||
if (!arrayForm && (newja.length() > 0))
|
||||
{
|
||||
newjo.put("childNodes", newja);
|
||||
}
|
||||
if (ja == null) {
|
||||
if (arrayForm) {
|
||||
if (ja == null)
|
||||
{
|
||||
if (arrayForm)
|
||||
{
|
||||
return newja;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return newjo;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (ja != null) {
|
||||
}
|
||||
else
|
||||
{
|
||||
if (ja != null)
|
||||
{
|
||||
ja.put(token instanceof String ? XML.stringToValue((String) token) : token);
|
||||
}
|
||||
}
|
||||
@ -195,7 +236,8 @@ public class JSONML {
|
||||
*
|
||||
* @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));
|
||||
}
|
||||
|
||||
@ -212,7 +254,8 @@ public class JSONML {
|
||||
*
|
||||
* @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);
|
||||
}
|
||||
|
||||
@ -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
|
||||
* 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.
|
||||
*
|
||||
*
|
||||
* Comments, prologs, DTDs, and <code><[ [ ]]></code> are ignored.
|
||||
*
|
||||
* @param x An XMLTokener of the XML source text.
|
||||
@ -230,7 +273,8 @@ public class JSONML {
|
||||
*
|
||||
* @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);
|
||||
}
|
||||
|
||||
@ -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
|
||||
* 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.
|
||||
*
|
||||
*
|
||||
* Comments, prologs, DTDs, and <code><[ [ ]]></code> are ignored.
|
||||
*
|
||||
* @param string The XML source text.
|
||||
@ -248,7 +292,8 @@ public class JSONML {
|
||||
*
|
||||
* @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));
|
||||
}
|
||||
|
||||
@ -261,7 +306,8 @@ public class JSONML {
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public static String toString(final JSONArray ja) throws JSONException {
|
||||
public static String toString(final JSONArray ja) throws JSONException
|
||||
{
|
||||
int i;
|
||||
JSONObject jo;
|
||||
String key;
|
||||
@ -278,16 +324,19 @@ public class JSONML {
|
||||
sb.append('<');
|
||||
sb.append(tagName);
|
||||
object = ja.opt(1);
|
||||
if (object instanceof JSONObject) {
|
||||
if (object instanceof JSONObject)
|
||||
{
|
||||
i = 2;
|
||||
jo = (JSONObject) object;
|
||||
// Emit the attributes
|
||||
keys = jo.keys();
|
||||
while (keys.hasNext()) {
|
||||
while (keys.hasNext())
|
||||
{
|
||||
key = keys.next();
|
||||
XML.noSpace(key);
|
||||
value = jo.optString(key);
|
||||
if (value != null) {
|
||||
if (value != null)
|
||||
{
|
||||
sb.append(' ');
|
||||
sb.append(XML.escape(key));
|
||||
sb.append('=');
|
||||
@ -296,29 +345,42 @@ public class JSONML {
|
||||
sb.append('"');
|
||||
}
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
i = 1;
|
||||
}
|
||||
// Emit content in body
|
||||
length = ja.length();
|
||||
if (i >= length) {
|
||||
if (i >= length)
|
||||
{
|
||||
sb.append('/');
|
||||
sb.append('>');
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.append('>');
|
||||
do {
|
||||
do
|
||||
{
|
||||
object = ja.get(i);
|
||||
i += 1;
|
||||
if (object != null) {
|
||||
if (object instanceof String) {
|
||||
if (object != null)
|
||||
{
|
||||
if (object instanceof String)
|
||||
{
|
||||
sb.append(XML.escape(object.toString()));
|
||||
} else if (object instanceof JSONObject) {
|
||||
}
|
||||
else if (object instanceof JSONObject)
|
||||
{
|
||||
sb.append(toString((JSONObject) object));
|
||||
} else if (object instanceof JSONArray) {
|
||||
}
|
||||
else if (object instanceof JSONArray)
|
||||
{
|
||||
sb.append(toString((JSONArray) object));
|
||||
}
|
||||
}
|
||||
} while (i < length);
|
||||
}
|
||||
while (i < length);
|
||||
sb.append('<');
|
||||
sb.append('/');
|
||||
sb.append(tagName);
|
||||
@ -338,7 +400,8 @@ public class JSONML {
|
||||
*
|
||||
* @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();
|
||||
int i;
|
||||
JSONArray ja;
|
||||
@ -350,21 +413,22 @@ public class JSONML {
|
||||
String value;
|
||||
// Emit <tagName
|
||||
tagName = jo.optString("tagName");
|
||||
if (tagName == null) {
|
||||
return XML.escape(jo.toString());
|
||||
}
|
||||
if (tagName == null) { return XML.escape(jo.toString()); }
|
||||
XML.noSpace(tagName);
|
||||
tagName = XML.escape(tagName);
|
||||
sb.append('<');
|
||||
sb.append(tagName);
|
||||
// Emit the attributes
|
||||
keys = jo.keys();
|
||||
while (keys.hasNext()) {
|
||||
while (keys.hasNext())
|
||||
{
|
||||
key = keys.next();
|
||||
if (!"tagName".equals(key) && !"childNodes".equals(key)) {
|
||||
if (!"tagName".equals(key) && !"childNodes".equals(key))
|
||||
{
|
||||
XML.noSpace(key);
|
||||
value = jo.optString(key);
|
||||
if (value != null) {
|
||||
if (value != null)
|
||||
{
|
||||
sb.append(' ');
|
||||
sb.append(XML.escape(key));
|
||||
sb.append('=');
|
||||
@ -376,22 +440,34 @@ public class JSONML {
|
||||
}
|
||||
// Emit content in body
|
||||
ja = jo.optJSONArray("childNodes");
|
||||
if (ja == null) {
|
||||
if (ja == null)
|
||||
{
|
||||
sb.append('/');
|
||||
sb.append('>');
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.append('>');
|
||||
length = ja.length();
|
||||
for (i = 0; i < length; i += 1) {
|
||||
for (i = 0; i < length; i += 1)
|
||||
{
|
||||
object = ja.get(i);
|
||||
if (object != null) {
|
||||
if (object instanceof String) {
|
||||
if (object != null)
|
||||
{
|
||||
if (object instanceof String)
|
||||
{
|
||||
sb.append(XML.escape(object.toString()));
|
||||
} else if (object instanceof JSONObject) {
|
||||
}
|
||||
else if (object instanceof JSONObject)
|
||||
{
|
||||
sb.append(toString((JSONObject) object));
|
||||
} else if (object instanceof JSONArray) {
|
||||
}
|
||||
else if (object instanceof JSONArray)
|
||||
{
|
||||
sb.append(toString((JSONArray) object));
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.append(object.toString());
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -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
|
||||
* 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.
|
||||
*
|
||||
|
@ -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
|
||||
* syntax rules. No whitespace is added, so the results are ready for transmission or storage. Each instance of
|
||||
* 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>
|
||||
* 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
|
||||
* values. All of these methods return the JSONWriter instance, permitting cascade style. For example,
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
* <pre>
|
||||
* myString = new JSONStringer().object().key("JSON").value("Hello,
|
||||
* World!").endObject().toString();
|
||||
* </pre>
|
||||
*
|
||||
*
|
||||
* which produces the string
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
* <pre>
|
||||
* {"JSON":"Hello, World!"}
|
||||
* </pre>
|
||||
*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*
|
||||
* This can sometimes be easier than using a JSONObject to build a string.
|
||||
*
|
||||
* @author JSON.org
|
||||
* @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.
|
||||
*/
|
||||
public JSONStringer() {
|
||||
public JSONStringer()
|
||||
{
|
||||
super(new StringWriter());
|
||||
}
|
||||
|
||||
@ -49,7 +51,8 @@ public class JSONStringer extends JSONWriter {
|
||||
* @return The JSON text.
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
return this.mode == 'd' ? this.writer.toString() : null;
|
||||
public String toString()
|
||||
{
|
||||
return mode == 'd' ? writer.toString() : null;
|
||||
}
|
||||
}
|
||||
|
@ -14,7 +14,8 @@ import java.io.StringReader;
|
||||
* @author JSON.org
|
||||
* @version 2014-05-03
|
||||
*/
|
||||
public class JSONTokener {
|
||||
public class JSONTokener
|
||||
{
|
||||
private final Reader reader;
|
||||
private long character;
|
||||
private boolean eof;
|
||||
@ -28,14 +29,15 @@ public class JSONTokener {
|
||||
*
|
||||
* @param reader A reader.
|
||||
*/
|
||||
public JSONTokener(final Reader reader) {
|
||||
public JSONTokener(final Reader reader)
|
||||
{
|
||||
this.reader = reader.markSupported() ? reader : new BufferedReader(reader);
|
||||
this.eof = false;
|
||||
this.usePrevious = false;
|
||||
this.previous = 0;
|
||||
this.index = 0;
|
||||
this.character = 1;
|
||||
this.line = 1;
|
||||
eof = false;
|
||||
usePrevious = false;
|
||||
previous = 0;
|
||||
index = 0;
|
||||
character = 1;
|
||||
line = 1;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -43,7 +45,8 @@ public class JSONTokener {
|
||||
*
|
||||
* @param inputStream The source.
|
||||
*/
|
||||
public JSONTokener(final InputStream inputStream) throws JSONException {
|
||||
public JSONTokener(final InputStream inputStream) throws JSONException
|
||||
{
|
||||
this(new InputStreamReader(inputStream));
|
||||
}
|
||||
|
||||
@ -52,7 +55,8 @@ public class JSONTokener {
|
||||
*
|
||||
* @param s A source string.
|
||||
*/
|
||||
public JSONTokener(final String s) {
|
||||
public JSONTokener(final String 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.
|
||||
*/
|
||||
public static int dehexchar(final char c) {
|
||||
if ((c >= '0') && (c <= '9')) {
|
||||
return c - '0';
|
||||
}
|
||||
if ((c >= 'A') && (c <= 'F')) {
|
||||
return c - ('A' - 10);
|
||||
}
|
||||
if ((c >= 'a') && (c <= 'f')) {
|
||||
return c - ('a' - 10);
|
||||
}
|
||||
public static int dehexchar(final char c)
|
||||
{
|
||||
if ((c >= '0') && (c <= '9')) { return c - '0'; }
|
||||
if ((c >= 'A') && (c <= 'F')) { return c - ('A' - 10); }
|
||||
if ((c >= 'a') && (c <= 'f')) { return c - ('a' - 10); }
|
||||
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
|
||||
* before attempting to parse the next number or identifier.
|
||||
*/
|
||||
public void back() throws JSONException {
|
||||
if (this.usePrevious || (this.index <= 0)) {
|
||||
throw new JSONException("Stepping back two steps is not supported");
|
||||
}
|
||||
this.index -= 1;
|
||||
this.character -= 1;
|
||||
this.usePrevious = true;
|
||||
this.eof = false;
|
||||
public void back() throws JSONException
|
||||
{
|
||||
if (usePrevious || (index <= 0)) { throw new JSONException("Stepping back two steps is not supported"); }
|
||||
index -= 1;
|
||||
character -= 1;
|
||||
usePrevious = true;
|
||||
eof = false;
|
||||
}
|
||||
|
||||
public boolean end() {
|
||||
return this.eof && !this.usePrevious;
|
||||
public boolean end()
|
||||
{
|
||||
return eof && !usePrevious;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -99,12 +98,11 @@ public class JSONTokener {
|
||||
*
|
||||
* @return true if not yet at the end of the source.
|
||||
*/
|
||||
public boolean more() throws JSONException {
|
||||
public boolean more() throws JSONException
|
||||
{
|
||||
this.next();
|
||||
if (this.end()) {
|
||||
return false;
|
||||
}
|
||||
this.back();
|
||||
if (end()) { return false; }
|
||||
back();
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -113,34 +111,47 @@ public class JSONTokener {
|
||||
*
|
||||
* @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;
|
||||
if (this.usePrevious) {
|
||||
this.usePrevious = false;
|
||||
c = this.previous;
|
||||
} else {
|
||||
try {
|
||||
c = this.reader.read();
|
||||
} catch (final IOException exception) {
|
||||
if (usePrevious)
|
||||
{
|
||||
usePrevious = false;
|
||||
c = previous;
|
||||
}
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
c = reader.read();
|
||||
}
|
||||
catch (final IOException exception)
|
||||
{
|
||||
throw new JSONException(exception);
|
||||
}
|
||||
if (c <= 0) { // End of stream
|
||||
this.eof = true;
|
||||
if (c <= 0)
|
||||
{ // End of stream
|
||||
eof = true;
|
||||
c = 0;
|
||||
}
|
||||
}
|
||||
this.index += 1;
|
||||
if (this.previous == '\r') {
|
||||
this.line += 1;
|
||||
this.character = c == '\n' ? 0 : 1;
|
||||
} else if (c == '\n') {
|
||||
this.line += 1;
|
||||
this.character = 0;
|
||||
} else {
|
||||
this.character += 1;
|
||||
index += 1;
|
||||
if (previous == '\r')
|
||||
{
|
||||
line += 1;
|
||||
character = c == '\n' ? 0 : 1;
|
||||
}
|
||||
this.previous = (char) c;
|
||||
return this.previous;
|
||||
else if (c == '\n')
|
||||
{
|
||||
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.
|
||||
*/
|
||||
public char next(final char c) throws JSONException {
|
||||
public char next(final char c) throws JSONException
|
||||
{
|
||||
final char n = this.next();
|
||||
if (n != c) {
|
||||
throw this.syntaxError("Expected '" + c + "' and instead saw '" + n + "'");
|
||||
}
|
||||
if (n != c) { throw syntaxError("Expected '" + c + "' and instead saw '" + 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.
|
||||
*/
|
||||
public String next(final int n) throws JSONException {
|
||||
if (n == 0) {
|
||||
return "";
|
||||
}
|
||||
public String next(final int n) throws JSONException
|
||||
{
|
||||
if (n == 0) { return ""; }
|
||||
final char[] chars = new char[n];
|
||||
int pos = 0;
|
||||
while (pos < n) {
|
||||
while (pos < n)
|
||||
{
|
||||
chars[pos] = this.next();
|
||||
if (this.end()) {
|
||||
throw this.syntaxError("Substring bounds error");
|
||||
}
|
||||
if (end()) { throw syntaxError("Substring bounds error"); }
|
||||
pos += 1;
|
||||
}
|
||||
return new String(chars);
|
||||
@ -192,12 +200,12 @@ public class JSONTokener {
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public char nextClean() throws JSONException {
|
||||
for (;;) {
|
||||
public char nextClean() throws JSONException
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
final char c = this.next();
|
||||
if ((c == 0) || (c > ' ')) {
|
||||
return c;
|
||||
}
|
||||
if ((c == 0) || (c > ' ')) { return c; }
|
||||
}
|
||||
}
|
||||
|
||||
@ -212,19 +220,23 @@ public class JSONTokener {
|
||||
*
|
||||
* @throws JSONException Unterminated string.
|
||||
*/
|
||||
public String nextString(final char quote) throws JSONException {
|
||||
public String nextString(final char quote) throws JSONException
|
||||
{
|
||||
char c;
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
for (;;) {
|
||||
for (;;)
|
||||
{
|
||||
c = this.next();
|
||||
switch (c) {
|
||||
switch (c)
|
||||
{
|
||||
case 0:
|
||||
case '\n':
|
||||
case '\r':
|
||||
throw this.syntaxError("Unterminated string");
|
||||
throw syntaxError("Unterminated string");
|
||||
case '\\':
|
||||
c = this.next();
|
||||
switch (c) {
|
||||
switch (c)
|
||||
{
|
||||
case 'b':
|
||||
sb.append('\b');
|
||||
break;
|
||||
@ -250,13 +262,11 @@ public class JSONTokener {
|
||||
sb.append(c);
|
||||
break;
|
||||
default:
|
||||
throw this.syntaxError("Illegal escape.");
|
||||
throw syntaxError("Illegal escape.");
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (c == quote) {
|
||||
return sb.toString();
|
||||
}
|
||||
if (c == quote) { return sb.toString(); }
|
||||
sb.append(c);
|
||||
}
|
||||
}
|
||||
@ -269,13 +279,17 @@ public class JSONTokener {
|
||||
*
|
||||
* @return A string.
|
||||
*/
|
||||
public String nextTo(final char delimiter) throws JSONException {
|
||||
public String nextTo(final char delimiter) throws JSONException
|
||||
{
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
for (;;) {
|
||||
for (;;)
|
||||
{
|
||||
final char c = this.next();
|
||||
if ((c == delimiter) || (c == 0) || (c == '\n') || (c == '\r')) {
|
||||
if (c != 0) {
|
||||
this.back();
|
||||
if ((c == delimiter) || (c == 0) || (c == '\n') || (c == '\r'))
|
||||
{
|
||||
if (c != 0)
|
||||
{
|
||||
back();
|
||||
}
|
||||
return sb.toString().trim();
|
||||
}
|
||||
@ -291,14 +305,18 @@ public class JSONTokener {
|
||||
*
|
||||
* @return A string, trimmed.
|
||||
*/
|
||||
public String nextTo(final String delimiters) throws JSONException {
|
||||
public String nextTo(final String delimiters) throws JSONException
|
||||
{
|
||||
char c;
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
for (;;) {
|
||||
for (;;)
|
||||
{
|
||||
c = this.next();
|
||||
if ((delimiters.indexOf(c) >= 0) || (c == 0) || (c == '\n') || (c == '\r')) {
|
||||
if (c != 0) {
|
||||
this.back();
|
||||
if ((delimiters.indexOf(c) >= 0) || (c == 0) || (c == '\n') || (c == '\r'))
|
||||
{
|
||||
if (c != 0)
|
||||
{
|
||||
back();
|
||||
}
|
||||
return sb.toString().trim();
|
||||
}
|
||||
@ -314,18 +332,20 @@ public class JSONTokener {
|
||||
*
|
||||
* @throws JSONException If syntax error.
|
||||
*/
|
||||
public Object nextValue() throws JSONException {
|
||||
char c = this.nextClean();
|
||||
public Object nextValue() throws JSONException
|
||||
{
|
||||
char c = nextClean();
|
||||
String string;
|
||||
switch (c) {
|
||||
switch (c)
|
||||
{
|
||||
case '"':
|
||||
case '\'':
|
||||
return this.nextString(c);
|
||||
return nextString(c);
|
||||
case '{':
|
||||
this.back();
|
||||
back();
|
||||
return new JSONObject(this);
|
||||
case '[':
|
||||
this.back();
|
||||
back();
|
||||
return new JSONArray(this);
|
||||
}
|
||||
/*
|
||||
@ -336,15 +356,14 @@ public class JSONTokener {
|
||||
* formatting character.
|
||||
*/
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
while ((c >= ' ') && (",:]}/\\\"[{;=#".indexOf(c) < 0)) {
|
||||
while ((c >= ' ') && (",:]}/\\\"[{;=#".indexOf(c) < 0))
|
||||
{
|
||||
sb.append(c);
|
||||
c = this.next();
|
||||
}
|
||||
this.back();
|
||||
back();
|
||||
string = sb.toString().trim();
|
||||
if ("".equals(string)) {
|
||||
throw this.syntaxError("Missing value");
|
||||
}
|
||||
if ("".equals(string)) { throw syntaxError("Missing value"); }
|
||||
return JSONObject.stringToValue(string);
|
||||
}
|
||||
|
||||
@ -356,27 +375,34 @@ public class JSONTokener {
|
||||
*
|
||||
* @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;
|
||||
try {
|
||||
final long startIndex = this.index;
|
||||
final long startCharacter = this.character;
|
||||
final long startLine = this.line;
|
||||
this.reader.mark(1000000);
|
||||
do {
|
||||
try
|
||||
{
|
||||
final long startIndex = index;
|
||||
final long startCharacter = character;
|
||||
final long startLine = line;
|
||||
reader.mark(1000000);
|
||||
do
|
||||
{
|
||||
c = this.next();
|
||||
if (c == 0) {
|
||||
this.reader.reset();
|
||||
this.index = startIndex;
|
||||
this.character = startCharacter;
|
||||
this.line = startLine;
|
||||
if (c == 0)
|
||||
{
|
||||
reader.reset();
|
||||
index = startIndex;
|
||||
character = startCharacter;
|
||||
line = startLine;
|
||||
return c;
|
||||
}
|
||||
} while (c != to);
|
||||
} catch (final IOException exception) {
|
||||
}
|
||||
while (c != to);
|
||||
}
|
||||
catch (final IOException exception)
|
||||
{
|
||||
throw new JSONException(exception);
|
||||
}
|
||||
this.back();
|
||||
back();
|
||||
return c;
|
||||
}
|
||||
|
||||
@ -387,8 +413,9 @@ public class JSONTokener {
|
||||
*
|
||||
* @return A JSONException object, suitable for throwing
|
||||
*/
|
||||
public JSONException syntaxError(final String message) {
|
||||
return new JSONException(message + this.toString());
|
||||
public JSONException syntaxError(final String message)
|
||||
{
|
||||
return new JSONException(message + toString());
|
||||
}
|
||||
|
||||
/**
|
||||
@ -397,7 +424,8 @@ public class JSONTokener {
|
||||
* @return " at {index} [character {character} line {line}]"
|
||||
*/
|
||||
@Override
|
||||
public String toString() {
|
||||
return " at " + this.index + " [character " + this.character + " line " + this.line + "]";
|
||||
public String toString()
|
||||
{
|
||||
return " at " + index + " [character " + character + " line " + line + "]";
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
* syntax rules. No whitespace is added, so the results are ready for transmission or storage. Each instance of
|
||||
* 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>
|
||||
* 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
|
||||
* values. All of these methods return the JSONWriter instance, permitting a cascade style. For example,
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
* <pre>
|
||||
* new JSONWriter(myWriter).object().key("JSON").value("Hello, World!").endObject();
|
||||
* </pre>
|
||||
*
|
||||
*
|
||||
* which writes
|
||||
*
|
||||
*
|
||||
*
|
||||
*
|
||||
* <pre>
|
||||
* {"JSON":"Hello, World!"}
|
||||
* </pre>
|
||||
*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*
|
||||
* This can sometimes be easier than using a JSONObject to build a string.
|
||||
*
|
||||
* @author JSON.org
|
||||
* @version 2011-11-24
|
||||
*/
|
||||
public class JSONWriter {
|
||||
public class JSONWriter
|
||||
{
|
||||
private static final int maxdepth = 200;
|
||||
/**
|
||||
* 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.
|
||||
*/
|
||||
public JSONWriter(final Writer w) {
|
||||
this.comma = false;
|
||||
this.mode = 'i';
|
||||
this.stack = new JSONObject[maxdepth];
|
||||
this.top = 0;
|
||||
this.writer = w;
|
||||
public JSONWriter(final Writer w)
|
||||
{
|
||||
comma = false;
|
||||
mode = 'i';
|
||||
stack = new JSONObject[maxdepth];
|
||||
top = 0;
|
||||
writer = w;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -76,23 +78,28 @@ public class JSONWriter {
|
||||
*
|
||||
* @throws JSONException If the value is out of sequence.
|
||||
*/
|
||||
private JSONWriter append(final String string) throws JSONException {
|
||||
if (string == null) {
|
||||
throw new JSONException("Null pointer");
|
||||
}
|
||||
if ((this.mode == 'o') || (this.mode == 'a')) {
|
||||
try {
|
||||
if (this.comma && (this.mode == 'a')) {
|
||||
this.writer.write(',');
|
||||
private JSONWriter append(final String string) throws JSONException
|
||||
{
|
||||
if (string == null) { throw new JSONException("Null pointer"); }
|
||||
if ((mode == 'o') || (mode == 'a'))
|
||||
{
|
||||
try
|
||||
{
|
||||
if (comma && (mode == 'a'))
|
||||
{
|
||||
writer.write(',');
|
||||
}
|
||||
this.writer.write(string);
|
||||
} catch (final IOException e) {
|
||||
writer.write(string);
|
||||
}
|
||||
catch (final IOException e)
|
||||
{
|
||||
throw new JSONException(e);
|
||||
}
|
||||
if (this.mode == 'o') {
|
||||
this.mode = 'k';
|
||||
if (mode == 'o')
|
||||
{
|
||||
mode = 'k';
|
||||
}
|
||||
this.comma = true;
|
||||
comma = true;
|
||||
return this;
|
||||
}
|
||||
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
|
||||
* a key or after the end of the outermost array or object).
|
||||
*/
|
||||
public JSONWriter array() throws JSONException {
|
||||
if ((this.mode == 'i') || (this.mode == 'o') || (this.mode == 'a')) {
|
||||
this.push(null);
|
||||
this.append("[");
|
||||
this.comma = false;
|
||||
public JSONWriter array() throws JSONException
|
||||
{
|
||||
if ((mode == 'i') || (mode == 'o') || (mode == 'a'))
|
||||
{
|
||||
push(null);
|
||||
append("[");
|
||||
comma = false;
|
||||
return this;
|
||||
}
|
||||
throw new JSONException("Misplaced array.");
|
||||
@ -127,17 +136,19 @@ public class JSONWriter {
|
||||
*
|
||||
* @throws JSONException If unbalanced.
|
||||
*/
|
||||
private JSONWriter end(final char mode, final char c) throws JSONException {
|
||||
if (this.mode != mode) {
|
||||
throw new JSONException(mode == 'a' ? "Misplaced endArray." : "Misplaced endObject.");
|
||||
private JSONWriter end(final char mode, final char c) throws JSONException
|
||||
{
|
||||
if (this.mode != mode) { throw new JSONException(mode == 'a' ? "Misplaced endArray." : "Misplaced endObject."); }
|
||||
pop(mode);
|
||||
try
|
||||
{
|
||||
writer.write(c);
|
||||
}
|
||||
this.pop(mode);
|
||||
try {
|
||||
this.writer.write(c);
|
||||
} catch (final IOException e) {
|
||||
catch (final IOException e)
|
||||
{
|
||||
throw new JSONException(e);
|
||||
}
|
||||
this.comma = true;
|
||||
comma = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
@ -148,8 +159,9 @@ public class JSONWriter {
|
||||
*
|
||||
* @throws JSONException If incorrectly nested.
|
||||
*/
|
||||
public JSONWriter endArray() throws JSONException {
|
||||
return this.end('a', ']');
|
||||
public JSONWriter endArray() throws JSONException
|
||||
{
|
||||
return end('a', ']');
|
||||
}
|
||||
|
||||
/**
|
||||
@ -159,8 +171,9 @@ public class JSONWriter {
|
||||
*
|
||||
* @throws JSONException If incorrectly nested.
|
||||
*/
|
||||
public JSONWriter endObject() throws JSONException {
|
||||
return this.end('k', '}');
|
||||
public JSONWriter endObject() throws JSONException
|
||||
{
|
||||
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
|
||||
* null.
|
||||
*/
|
||||
public JSONWriter key(final String string) throws JSONException {
|
||||
if (string == null) {
|
||||
throw new JSONException("Null key.");
|
||||
}
|
||||
if (this.mode == 'k') {
|
||||
try {
|
||||
this.stack[this.top - 1].putOnce(string, Boolean.TRUE);
|
||||
if (this.comma) {
|
||||
this.writer.write(',');
|
||||
public JSONWriter key(final String string) throws JSONException
|
||||
{
|
||||
if (string == null) { throw new JSONException("Null key."); }
|
||||
if (mode == 'k')
|
||||
{
|
||||
try
|
||||
{
|
||||
stack[top - 1].putOnce(string, Boolean.TRUE);
|
||||
if (comma)
|
||||
{
|
||||
writer.write(',');
|
||||
}
|
||||
this.writer.write(JSONObject.quote(string));
|
||||
this.writer.write(':');
|
||||
this.comma = false;
|
||||
this.mode = 'o';
|
||||
writer.write(JSONObject.quote(string));
|
||||
writer.write(':');
|
||||
comma = false;
|
||||
mode = 'o';
|
||||
return this;
|
||||
} catch (final IOException e) {
|
||||
}
|
||||
catch (final IOException 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
|
||||
* a key or after the end of the outermost array or object).
|
||||
*/
|
||||
public JSONWriter object() throws JSONException {
|
||||
if (this.mode == 'i') {
|
||||
this.mode = 'o';
|
||||
public JSONWriter object() throws JSONException
|
||||
{
|
||||
if (mode == 'i')
|
||||
{
|
||||
mode = 'o';
|
||||
}
|
||||
if ((this.mode == 'o') || (this.mode == 'a')) {
|
||||
this.append("{");
|
||||
this.push(new JSONObject());
|
||||
this.comma = false;
|
||||
if ((mode == 'o') || (mode == 'a'))
|
||||
{
|
||||
append("{");
|
||||
push(new JSONObject());
|
||||
comma = false;
|
||||
return this;
|
||||
}
|
||||
throw new JSONException("Misplaced object.");
|
||||
@ -225,16 +245,13 @@ public class JSONWriter {
|
||||
*
|
||||
* @throws JSONException If nesting is wrong.
|
||||
*/
|
||||
private void pop(final char c) throws JSONException {
|
||||
if (this.top <= 0) {
|
||||
throw new JSONException("Nesting error.");
|
||||
}
|
||||
final char m = this.stack[this.top - 1] == null ? 'a' : 'k';
|
||||
if (m != c) {
|
||||
throw new JSONException("Nesting error.");
|
||||
}
|
||||
this.top -= 1;
|
||||
this.mode = this.top == 0 ? 'd' : this.stack[this.top - 1] == null ? 'a' : 'k';
|
||||
private void pop(final char c) throws JSONException
|
||||
{
|
||||
if (top <= 0) { throw new JSONException("Nesting error."); }
|
||||
final char m = stack[top - 1] == null ? 'a' : 'k';
|
||||
if (m != c) { throw new JSONException("Nesting error."); }
|
||||
top -= 1;
|
||||
mode = top == 0 ? 'd' : stack[top - 1] == null ? 'a' : 'k';
|
||||
}
|
||||
|
||||
/**
|
||||
@ -244,13 +261,12 @@ public class JSONWriter {
|
||||
*
|
||||
* @throws JSONException If nesting is too deep.
|
||||
*/
|
||||
private void push(final JSONObject jo) throws JSONException {
|
||||
if (this.top >= maxdepth) {
|
||||
throw new JSONException("Nesting too deep.");
|
||||
}
|
||||
this.stack[this.top] = jo;
|
||||
this.mode = jo == null ? 'a' : 'k';
|
||||
this.top += 1;
|
||||
private void push(final JSONObject jo) throws JSONException
|
||||
{
|
||||
if (top >= maxdepth) { throw new JSONException("Nesting too deep."); }
|
||||
stack[top] = jo;
|
||||
mode = jo == null ? 'a' : 'k';
|
||||
top += 1;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -262,8 +278,9 @@ public class JSONWriter {
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public JSONWriter value(final boolean b) throws JSONException {
|
||||
return this.append(b ? "true" : "false");
|
||||
public JSONWriter value(final boolean b) throws JSONException
|
||||
{
|
||||
return append(b ? "true" : "false");
|
||||
}
|
||||
|
||||
/**
|
||||
@ -275,7 +292,8 @@ public class JSONWriter {
|
||||
*
|
||||
* @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));
|
||||
}
|
||||
|
||||
@ -288,8 +306,9 @@ public class JSONWriter {
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public JSONWriter value(final long l) throws JSONException {
|
||||
return this.append(Long.toString(l));
|
||||
public JSONWriter value(final long l) throws JSONException
|
||||
{
|
||||
return append(Long.toString(l));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -302,7 +321,8 @@ public class JSONWriter {
|
||||
*
|
||||
* @throws JSONException If the value is out of sequence.
|
||||
*/
|
||||
public JSONWriter value(final Object object) throws JSONException {
|
||||
return this.append(JSONObject.valueToString(object));
|
||||
public JSONWriter value(final Object object) throws JSONException
|
||||
{
|
||||
return append(JSONObject.valueToString(object));
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
* 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.
|
||||
*
|
||||
*
|
||||
* 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
|
||||
* to UTF-8.
|
||||
*
|
||||
*
|
||||
* 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,
|
||||
* 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,
|
||||
* Osmanya, Pahlavi, Parthian, Phags-Pa, Phoenician, Samaritan, Sharada, Sinhala, Sora Sompeng, Tagalog, Tagbanwa,
|
||||
* 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
|
||||
* 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
|
||||
* great inventions. While Kim is more efficient, it is not clear that it is worth the expense of transition.
|
||||
*
|
||||
* @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.
|
||||
*/
|
||||
@ -51,23 +52,26 @@ public class Kim {
|
||||
* @param from The index of the first byte.
|
||||
* @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
|
||||
// using a
|
||||
// modified Fletcher code.
|
||||
int sum = 1;
|
||||
int value;
|
||||
this.hashcode = 0;
|
||||
this.length = thru - from;
|
||||
if (this.length > 0) {
|
||||
this.bytes = new byte[this.length];
|
||||
for (int at = 0; at < this.length; at += 1) {
|
||||
hashcode = 0;
|
||||
length = thru - from;
|
||||
if (length > 0)
|
||||
{
|
||||
this.bytes = new byte[length];
|
||||
for (int at = 0; at < length; at += 1)
|
||||
{
|
||||
value = bytes[at + from] & 0xFF;
|
||||
sum += value;
|
||||
this.hashcode += sum;
|
||||
hashcode += sum;
|
||||
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 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);
|
||||
}
|
||||
|
||||
@ -88,7 +93,8 @@ public class Kim {
|
||||
* @param from The point at which to take 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);
|
||||
}
|
||||
|
||||
@ -99,78 +105,92 @@ public class Kim {
|
||||
*
|
||||
* @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();
|
||||
this.hashcode = 0;
|
||||
this.length = 0;
|
||||
hashcode = 0;
|
||||
length = 0;
|
||||
// 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.
|
||||
if (stringLength > 0) {
|
||||
for (int i = 0; i < stringLength; i += 1) {
|
||||
if (stringLength > 0)
|
||||
{
|
||||
for (int i = 0; i < stringLength; i += 1)
|
||||
{
|
||||
final int c = string.charAt(i);
|
||||
if (c <= 0x7F) {
|
||||
this.length += 1;
|
||||
} else if (c <= 0x3FFF) {
|
||||
this.length += 2;
|
||||
} else {
|
||||
if ((c >= 0xD800) && (c <= 0xDFFF)) {
|
||||
if (c <= 0x7F)
|
||||
{
|
||||
length += 1;
|
||||
}
|
||||
else if (c <= 0x3FFF)
|
||||
{
|
||||
length += 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((c >= 0xD800) && (c <= 0xDFFF))
|
||||
{
|
||||
i += 1;
|
||||
final int d = string.charAt(i);
|
||||
if ((c > 0xDBFF) || (d < 0xDC00) || (d > 0xDFFF)) {
|
||||
throw new JSONException("Bad UTF16");
|
||||
}
|
||||
if ((c > 0xDBFF) || (d < 0xDC00) || (d > 0xDFFF)) { throw new JSONException("Bad UTF16"); }
|
||||
}
|
||||
this.length += 3;
|
||||
length += 3;
|
||||
}
|
||||
}
|
||||
// Second pass: Allocate a byte array and fill that array with the
|
||||
// conversion
|
||||
// while computing the hashcode.
|
||||
this.bytes = new byte[this.length];
|
||||
bytes = new byte[length];
|
||||
int at = 0;
|
||||
int b;
|
||||
int sum = 1;
|
||||
for (int i = 0; i < stringLength; i += 1) {
|
||||
for (int i = 0; i < stringLength; i += 1)
|
||||
{
|
||||
int character = string.charAt(i);
|
||||
if (character <= 0x7F) {
|
||||
this.bytes[at] = (byte) character;
|
||||
if (character <= 0x7F)
|
||||
{
|
||||
bytes[at] = (byte) character;
|
||||
sum += character;
|
||||
this.hashcode += sum;
|
||||
hashcode += sum;
|
||||
at += 1;
|
||||
} else if (character <= 0x3FFF) {
|
||||
}
|
||||
else if (character <= 0x3FFF)
|
||||
{
|
||||
b = 0x80 | (character >>> 7);
|
||||
this.bytes[at] = (byte) b;
|
||||
bytes[at] = (byte) b;
|
||||
sum += b;
|
||||
this.hashcode += sum;
|
||||
hashcode += sum;
|
||||
at += 1;
|
||||
b = character & 0x7F;
|
||||
this.bytes[at] = (byte) b;
|
||||
bytes[at] = (byte) b;
|
||||
sum += b;
|
||||
this.hashcode += sum;
|
||||
hashcode += sum;
|
||||
at += 1;
|
||||
} else {
|
||||
if ((character >= 0xD800) && (character <= 0xDBFF)) {
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((character >= 0xD800) && (character <= 0xDBFF))
|
||||
{
|
||||
i += 1;
|
||||
character = (((character & 0x3FF) << 10) | (string.charAt(i) & 0x3FF)) + 65536;
|
||||
}
|
||||
b = 0x80 | (character >>> 14);
|
||||
this.bytes[at] = (byte) b;
|
||||
bytes[at] = (byte) b;
|
||||
sum += b;
|
||||
this.hashcode += sum;
|
||||
hashcode += sum;
|
||||
at += 1;
|
||||
b = 0x80 | ((character >>> 7) & 0xFF);
|
||||
this.bytes[at] = (byte) b;
|
||||
bytes[at] = (byte) b;
|
||||
sum += b;
|
||||
this.hashcode += sum;
|
||||
hashcode += sum;
|
||||
at += 1;
|
||||
b = character & 0x7F;
|
||||
this.bytes[at] = (byte) b;
|
||||
bytes[at] = (byte) b;
|
||||
sum += b;
|
||||
this.hashcode += sum;
|
||||
hashcode += sum;
|
||||
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.
|
||||
*/
|
||||
public static int characterSize(final int character) throws JSONException {
|
||||
if ((character < 0) || (character > 0x10FFFF)) {
|
||||
throw new JSONException("Bad character " + character);
|
||||
}
|
||||
public static int characterSize(final int character) throws JSONException
|
||||
{
|
||||
if ((character < 0) || (character > 0x10FFFF)) { throw new JSONException("Bad character " + character); }
|
||||
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.
|
||||
* @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);
|
||||
if ((c & 0x80) == 0) {
|
||||
return c;
|
||||
}
|
||||
if ((c & 0x80) == 0) { return c; }
|
||||
int character;
|
||||
final int c1 = get(at + 1);
|
||||
if ((c1 & 0x80) == 0) {
|
||||
if ((c1 & 0x80) == 0)
|
||||
{
|
||||
character = ((c & 0x7F) << 7) | c1;
|
||||
if (character > 0x7F) {
|
||||
return character;
|
||||
}
|
||||
} else {
|
||||
if (character > 0x7F) { return character; }
|
||||
}
|
||||
else
|
||||
{
|
||||
final int c2 = get(at + 2);
|
||||
character = ((c & 0x7F) << 14) | ((c1 & 0x7F) << 7) | c2;
|
||||
if (((c2 & 0x80) == 0) && (character > 0x3FFF) && (character <= 0x10FFFF) && ((character < 0xD800) || (character > 0xDFFF))) {
|
||||
return character;
|
||||
}
|
||||
if (((c2 & 0x80) == 0) && (character > 0x3FFF) && (character <= 0x10FFFF) && ((character < 0xD800) || (character > 0xDFFF))) { return character; }
|
||||
}
|
||||
throw new JSONException("Bad character at " + at);
|
||||
}
|
||||
@ -229,9 +246,10 @@ public class Kim {
|
||||
*
|
||||
* @return The position immediately after the copy.
|
||||
*/
|
||||
public int copy(final byte[] bytes, final int at) {
|
||||
System.arraycopy(this.bytes, 0, bytes, at, this.length);
|
||||
return at + this.length;
|
||||
public int copy(final byte[] bytes, final int at)
|
||||
{
|
||||
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.
|
||||
*/
|
||||
@Override
|
||||
public boolean equals(final Object obj) {
|
||||
if (!(obj instanceof Kim)) {
|
||||
return false;
|
||||
}
|
||||
public boolean equals(final Object obj)
|
||||
{
|
||||
if (!(obj instanceof Kim)) { return false; }
|
||||
final Kim that = (Kim) obj;
|
||||
if (this == that) {
|
||||
return true;
|
||||
}
|
||||
if (this.hashcode != that.hashcode) {
|
||||
return false;
|
||||
}
|
||||
return java.util.Arrays.equals(this.bytes, that.bytes);
|
||||
if (this == that) { return true; }
|
||||
if (hashcode != that.hashcode) { return false; }
|
||||
return java.util.Arrays.equals(bytes, that.bytes);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -265,19 +278,19 @@ public class Kim {
|
||||
*
|
||||
* @throws JSONException if there is no byte at that position.
|
||||
*/
|
||||
public int get(final int at) throws JSONException {
|
||||
if ((at < 0) || (at > this.length)) {
|
||||
throw new JSONException("Bad character at " + at);
|
||||
}
|
||||
return (this.bytes[at]) & 0xFF;
|
||||
public int get(final int at) throws JSONException
|
||||
{
|
||||
if ((at < 0) || (at > length)) { throw new JSONException("Bad character at " + at); }
|
||||
return (bytes[at]) & 0xFF;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a hash code value for the kim.
|
||||
*/
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return this.hashcode;
|
||||
public int hashCode()
|
||||
{
|
||||
return hashcode;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -289,25 +302,31 @@ public class Kim {
|
||||
* @throws JSONException if the kim is not valid.
|
||||
*/
|
||||
@Override
|
||||
public String toString() throws JSONException {
|
||||
if (this.string == null) {
|
||||
public String toString() throws JSONException
|
||||
{
|
||||
if (string == null)
|
||||
{
|
||||
int c;
|
||||
int length = 0;
|
||||
final char chars[] = new char[this.length];
|
||||
for (int at = 0; at < this.length; at += characterSize(c)) {
|
||||
c = this.characterAt(at);
|
||||
if (c < 0x10000) {
|
||||
for (int at = 0; at < this.length; at += characterSize(c))
|
||||
{
|
||||
c = characterAt(at);
|
||||
if (c < 0x10000)
|
||||
{
|
||||
chars[length] = (char) c;
|
||||
length += 1;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
chars[length] = (char) (0xD800 | ((c - 0x10000) >>> 10));
|
||||
length += 1;
|
||||
chars[length] = (char) (0xDC00 | (c & 0x03FF));
|
||||
length += 1;
|
||||
}
|
||||
}
|
||||
this.string = new String(chars, 0, length);
|
||||
string = new String(chars, 0, length);
|
||||
}
|
||||
return this.string;
|
||||
return string;
|
||||
}
|
||||
}
|
||||
|
@ -30,7 +30,8 @@ import java.util.Properties;
|
||||
* @author JSON.org
|
||||
* @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.
|
||||
*
|
||||
@ -40,11 +41,14 @@ public class Property {
|
||||
*
|
||||
* @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();
|
||||
if ((properties != null) && !properties.isEmpty()) {
|
||||
if ((properties != null) && !properties.isEmpty())
|
||||
{
|
||||
final Enumeration enumProperties = properties.propertyNames();
|
||||
while (enumProperties.hasMoreElements()) {
|
||||
while (enumProperties.hasMoreElements())
|
||||
{
|
||||
final String name = (String) enumProperties.nextElement();
|
||||
jo.put(name, properties.getProperty(name));
|
||||
}
|
||||
@ -61,11 +65,14 @@ public class Property {
|
||||
*
|
||||
* @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();
|
||||
if (jo != null) {
|
||||
if (jo != null)
|
||||
{
|
||||
final Iterator<String> keys = jo.keys();
|
||||
while (keys.hasNext()) {
|
||||
while (keys.hasNext())
|
||||
{
|
||||
final String name = keys.next();
|
||||
properties.put(name, jo.getString(name));
|
||||
}
|
||||
|
@ -8,7 +8,8 @@ import java.util.Iterator;
|
||||
* @author JSON.org
|
||||
* @version 2014-05-03
|
||||
*/
|
||||
public class XML {
|
||||
public class XML
|
||||
{
|
||||
public static final Character AMP = '&';
|
||||
public static final Character APOS = '\'';
|
||||
public static final Character BANG = '!';
|
||||
@ -19,11 +20,14 @@ public class XML {
|
||||
public static final Character QUOT = '"';
|
||||
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());
|
||||
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);
|
||||
switch (c) {
|
||||
switch (c)
|
||||
{
|
||||
case '&':
|
||||
sb.append("&");
|
||||
break;
|
||||
@ -53,16 +57,14 @@ public class XML {
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public static void noSpace(final String string) throws JSONException {
|
||||
public static void noSpace(final String string) throws JSONException
|
||||
{
|
||||
int i;
|
||||
final int length = string.length();
|
||||
if (length == 0) {
|
||||
throw new JSONException("Empty string.");
|
||||
}
|
||||
for (i = 0; i < length; i += 1) {
|
||||
if (Character.isWhitespace(string.charAt(i))) {
|
||||
throw new JSONException("'" + string + "' contains a space character.");
|
||||
}
|
||||
if (length == 0) { throw new JSONException("Empty string."); }
|
||||
for (i = 0; i < length; i += 1)
|
||||
{
|
||||
if (Character.isWhitespace(string.charAt(i))) { throw new JSONException("'" + string + "' contains a space character."); }
|
||||
}
|
||||
}
|
||||
|
||||
@ -77,7 +79,8 @@ public class XML {
|
||||
*
|
||||
* @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;
|
||||
int i;
|
||||
JSONObject jsonobject = null;
|
||||
@ -95,20 +98,28 @@ public class XML {
|
||||
// <<
|
||||
token = x.nextToken();
|
||||
// <!
|
||||
if (token == BANG) {
|
||||
if (token == BANG)
|
||||
{
|
||||
c = x.next();
|
||||
if (c == '-') {
|
||||
if (x.next() == '-') {
|
||||
if (c == '-')
|
||||
{
|
||||
if (x.next() == '-')
|
||||
{
|
||||
x.skipPast("-->");
|
||||
return false;
|
||||
}
|
||||
x.back();
|
||||
} else if (c == '[') {
|
||||
}
|
||||
else if (c == '[')
|
||||
{
|
||||
token = x.nextToken();
|
||||
if ("CDATA".equals(token)) {
|
||||
if (x.next() == '[') {
|
||||
if ("CDATA".equals(token))
|
||||
{
|
||||
if (x.next() == '[')
|
||||
{
|
||||
string = x.nextCDATA();
|
||||
if (string.length() > 0) {
|
||||
if (string.length() > 0)
|
||||
{
|
||||
context.accumulate("content", string);
|
||||
}
|
||||
return false;
|
||||
@ -117,99 +128,130 @@ public class XML {
|
||||
throw x.syntaxError("Expected 'CDATA['");
|
||||
}
|
||||
i = 1;
|
||||
do {
|
||||
do
|
||||
{
|
||||
token = x.nextMeta();
|
||||
if (token == null) {
|
||||
if (token == null)
|
||||
{
|
||||
throw x.syntaxError("Missing '>' after '<!'.");
|
||||
} else if (token == LT) {
|
||||
}
|
||||
else if (token == LT)
|
||||
{
|
||||
i += 1;
|
||||
} else if (token == GT) {
|
||||
}
|
||||
else if (token == GT)
|
||||
{
|
||||
i -= 1;
|
||||
}
|
||||
} while (i > 0);
|
||||
}
|
||||
while (i > 0);
|
||||
return false;
|
||||
} else if (token == QUEST) {
|
||||
}
|
||||
else if (token == QUEST)
|
||||
{
|
||||
// <?
|
||||
x.skipPast("?>");
|
||||
return false;
|
||||
} else if (token == SLASH) {
|
||||
}
|
||||
else if (token == SLASH)
|
||||
{
|
||||
// Close tag </
|
||||
token = x.nextToken();
|
||||
if (name == null) {
|
||||
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 (name == null) { 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"); }
|
||||
return true;
|
||||
} else if (token instanceof Character) {
|
||||
}
|
||||
else if (token instanceof Character)
|
||||
{
|
||||
throw x.syntaxError("Misshaped tag");
|
||||
// Open tag <
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
tagName = (String) token;
|
||||
token = null;
|
||||
jsonobject = new JSONObject();
|
||||
for (;;) {
|
||||
if (token == null) {
|
||||
for (;;)
|
||||
{
|
||||
if (token == null)
|
||||
{
|
||||
token = x.nextToken();
|
||||
}
|
||||
// attribute = value
|
||||
if (token instanceof String) {
|
||||
if (token instanceof String)
|
||||
{
|
||||
string = (String) token;
|
||||
token = x.nextToken();
|
||||
if (token == EQ) {
|
||||
if (token == EQ)
|
||||
{
|
||||
token = x.nextToken();
|
||||
if (!(token instanceof String)) {
|
||||
throw x.syntaxError("Missing value");
|
||||
}
|
||||
if (!(token instanceof String)) { throw x.syntaxError("Missing value"); }
|
||||
jsonobject.accumulate(string, XML.stringToValue((String) token));
|
||||
token = null;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
jsonobject.accumulate(string, "");
|
||||
}
|
||||
// Empty tag <.../>
|
||||
} else if (token == SLASH) {
|
||||
if (x.nextToken() != GT) {
|
||||
throw x.syntaxError("Misshaped tag");
|
||||
}
|
||||
if (jsonobject.length() > 0) {
|
||||
}
|
||||
else if (token == SLASH)
|
||||
{
|
||||
if (x.nextToken() != GT) { throw x.syntaxError("Misshaped tag"); }
|
||||
if (jsonobject.length() > 0)
|
||||
{
|
||||
context.accumulate(tagName, jsonobject);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
context.accumulate(tagName, "");
|
||||
}
|
||||
return false;
|
||||
// Content, between <...> and </...>
|
||||
} else if (token == GT) {
|
||||
for (;;) {
|
||||
}
|
||||
else if (token == GT)
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
token = x.nextContent();
|
||||
if (token == null) {
|
||||
if (tagName != null) {
|
||||
throw x.syntaxError("Unclosed tag " + tagName);
|
||||
}
|
||||
if (token == null)
|
||||
{
|
||||
if (tagName != null) { throw x.syntaxError("Unclosed tag " + tagName); }
|
||||
return false;
|
||||
} else if (token instanceof String) {
|
||||
}
|
||||
else if (token instanceof String)
|
||||
{
|
||||
string = (String) token;
|
||||
if (string.length() > 0) {
|
||||
if (string.length() > 0)
|
||||
{
|
||||
jsonobject.accumulate("content", XML.stringToValue(string));
|
||||
}
|
||||
// Nested element
|
||||
} else if (token == LT) {
|
||||
if (parse(x, jsonobject, tagName)) {
|
||||
if (jsonobject.length() == 0) {
|
||||
}
|
||||
else if (token == LT)
|
||||
{
|
||||
if (parse(x, jsonobject, tagName))
|
||||
{
|
||||
if (jsonobject.length() == 0)
|
||||
{
|
||||
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"));
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
context.accumulate(tagName, jsonobject);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
throw x.syntaxError("Misshaped tag");
|
||||
}
|
||||
}
|
||||
@ -225,43 +267,42 @@ public class XML {
|
||||
*
|
||||
* @return A simple JSON value.
|
||||
*/
|
||||
public static Object stringToValue(final String string) {
|
||||
if ("true".equalsIgnoreCase(string)) {
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
if ("false".equalsIgnoreCase(string)) {
|
||||
return Boolean.FALSE;
|
||||
}
|
||||
if ("null".equalsIgnoreCase(string)) {
|
||||
return JSONObject.NULL;
|
||||
}
|
||||
public static Object stringToValue(final String string)
|
||||
{
|
||||
if ("true".equalsIgnoreCase(string)) { return Boolean.TRUE; }
|
||||
if ("false".equalsIgnoreCase(string)) { 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
|
||||
// as a
|
||||
// Double. If that doesn't work, return the string.
|
||||
try {
|
||||
try
|
||||
{
|
||||
final char initial = string.charAt(0);
|
||||
if ((initial == '-') || ((initial >= '0') && (initial <= '9'))) {
|
||||
if ((initial == '-') || ((initial >= '0') && (initial <= '9')))
|
||||
{
|
||||
final Long value = new Long(string);
|
||||
if (value.toString().equals(string)) {
|
||||
return value;
|
||||
}
|
||||
if (value.toString().equals(string)) { return value; }
|
||||
}
|
||||
} catch (final Exception ignore) {
|
||||
try {
|
||||
}
|
||||
catch (final Exception ignore)
|
||||
{
|
||||
try
|
||||
{
|
||||
final Double value = new Double(string);
|
||||
if (value.toString().equals(string)) {
|
||||
return value;
|
||||
}
|
||||
} catch (final Exception ignoreAlso) {
|
||||
if (value.toString().equals(string)) { return value; }
|
||||
}
|
||||
catch (final Exception ignoreAlso)
|
||||
{}
|
||||
}
|
||||
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 XMLTokener x = new XMLTokener(string);
|
||||
while (x.more() && x.skipPast("<")) {
|
||||
while (x.more() && x.skipPast("<"))
|
||||
{
|
||||
parse(x, jo, null);
|
||||
}
|
||||
return jo;
|
||||
@ -276,7 +317,8 @@ public class XML {
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public static String toString(final Object object) throws JSONException {
|
||||
public static String toString(final Object object) throws JSONException
|
||||
{
|
||||
return toString(object, null);
|
||||
}
|
||||
|
||||
@ -290,7 +332,8 @@ public class XML {
|
||||
*
|
||||
* @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();
|
||||
int i;
|
||||
JSONArray ja;
|
||||
@ -300,9 +343,11 @@ public class XML {
|
||||
int length;
|
||||
String string;
|
||||
Object value;
|
||||
if (object instanceof JSONObject) {
|
||||
if (object instanceof JSONObject)
|
||||
{
|
||||
// Emit <tagName>
|
||||
if (tagName != null) {
|
||||
if (tagName != null)
|
||||
{
|
||||
sb.append('<');
|
||||
sb.append(tagName);
|
||||
sb.append('>');
|
||||
@ -310,34 +355,46 @@ public class XML {
|
||||
// Loop thru the keys.
|
||||
jo = (JSONObject) object;
|
||||
keys = jo.keys();
|
||||
while (keys.hasNext()) {
|
||||
while (keys.hasNext())
|
||||
{
|
||||
key = keys.next();
|
||||
value = jo.opt(key);
|
||||
if (value == null) {
|
||||
if (value == null)
|
||||
{
|
||||
value = "";
|
||||
}
|
||||
string = value instanceof String ? (String) value : null;
|
||||
// Emit content in body
|
||||
if ("content".equals(key)) {
|
||||
if (value instanceof JSONArray) {
|
||||
if ("content".equals(key))
|
||||
{
|
||||
if (value instanceof JSONArray)
|
||||
{
|
||||
ja = (JSONArray) value;
|
||||
length = ja.length();
|
||||
for (i = 0; i < length; i += 1) {
|
||||
if (i > 0) {
|
||||
for (i = 0; i < length; i += 1)
|
||||
{
|
||||
if (i > 0)
|
||||
{
|
||||
sb.append('\n');
|
||||
}
|
||||
sb.append(escape(ja.get(i).toString()));
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.append(escape(value.toString()));
|
||||
}
|
||||
// Emit an array of similar keys
|
||||
} else if (value instanceof JSONArray) {
|
||||
}
|
||||
else if (value instanceof JSONArray)
|
||||
{
|
||||
ja = (JSONArray) value;
|
||||
length = ja.length();
|
||||
for (i = 0; i < length; i += 1) {
|
||||
for (i = 0; i < length; i += 1)
|
||||
{
|
||||
value = ja.get(i);
|
||||
if (value instanceof JSONArray) {
|
||||
if (value instanceof JSONArray)
|
||||
{
|
||||
sb.append('<');
|
||||
sb.append(key);
|
||||
sb.append('>');
|
||||
@ -345,20 +402,27 @@ public class XML {
|
||||
sb.append("</");
|
||||
sb.append(key);
|
||||
sb.append('>');
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.append(toString(value, key));
|
||||
}
|
||||
}
|
||||
} else if ("".equals(value)) {
|
||||
}
|
||||
else if ("".equals(value))
|
||||
{
|
||||
sb.append('<');
|
||||
sb.append(key);
|
||||
sb.append("/>");
|
||||
// Emit a new tag <k>
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.append(toString(value, key));
|
||||
}
|
||||
}
|
||||
if (tagName != null) {
|
||||
if (tagName != null)
|
||||
{
|
||||
// Emit the </tagname> close tag
|
||||
sb.append("</");
|
||||
sb.append(tagName);
|
||||
@ -368,18 +432,25 @@ public class XML {
|
||||
// XML does not have good support for arrays. If an array appears in
|
||||
// a place
|
||||
// where XML is lacking, synthesize an <array> element.
|
||||
} else {
|
||||
if (object.getClass().isArray()) {
|
||||
}
|
||||
else
|
||||
{
|
||||
if (object.getClass().isArray())
|
||||
{
|
||||
object = new JSONArray(object);
|
||||
}
|
||||
if (object instanceof JSONArray) {
|
||||
if (object instanceof JSONArray)
|
||||
{
|
||||
ja = (JSONArray) object;
|
||||
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));
|
||||
}
|
||||
return sb.toString();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
string = (object == null) ? "null" : escape(object.toString());
|
||||
return (tagName == null) ? "\"" + string + "\"" : (string.length() == 0) ? "<" + tagName + "/>" : "<" + tagName + ">" + string + "</" + tagName + ">";
|
||||
}
|
||||
|
@ -6,12 +6,14 @@ package com.intellectualcrafters.json;
|
||||
* @author JSON.org
|
||||
* @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.
|
||||
*/
|
||||
public static final java.util.HashMap<String, Character> entity;
|
||||
static {
|
||||
static
|
||||
{
|
||||
entity = new java.util.HashMap<String, Character>(8);
|
||||
entity.put("amp", XML.AMP);
|
||||
entity.put("apos", XML.APOS);
|
||||
@ -25,7 +27,8 @@ public class XMLTokener extends JSONTokener {
|
||||
*
|
||||
* @param s A source string.
|
||||
*/
|
||||
public XMLTokener(final String s) {
|
||||
public XMLTokener(final String s)
|
||||
{
|
||||
super(s);
|
||||
}
|
||||
|
||||
@ -36,18 +39,19 @@ public class XMLTokener extends JSONTokener {
|
||||
*
|
||||
* @throws JSONException If the <code>]]></code> is not found.
|
||||
*/
|
||||
public String nextCDATA() throws JSONException {
|
||||
public String nextCDATA() throws JSONException
|
||||
{
|
||||
char c;
|
||||
int i;
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
for (;;) {
|
||||
for (;;)
|
||||
{
|
||||
c = next();
|
||||
if (end()) {
|
||||
throw syntaxError("Unclosed CDATA");
|
||||
}
|
||||
if (end()) { throw syntaxError("Unclosed CDATA"); }
|
||||
sb.append(c);
|
||||
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);
|
||||
return sb.toString();
|
||||
}
|
||||
@ -62,27 +66,31 @@ public class XMLTokener extends JSONTokener {
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public Object nextContent() throws JSONException {
|
||||
public Object nextContent() throws JSONException
|
||||
{
|
||||
char c;
|
||||
StringBuilder sb;
|
||||
do {
|
||||
do
|
||||
{
|
||||
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();
|
||||
for (;;) {
|
||||
if ((c == '<') || (c == 0)) {
|
||||
for (;;)
|
||||
{
|
||||
if ((c == '<') || (c == 0))
|
||||
{
|
||||
back();
|
||||
return sb.toString().trim();
|
||||
}
|
||||
if (c == '&') {
|
||||
if (c == '&')
|
||||
{
|
||||
sb.append(nextEntity(c));
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.append(c);
|
||||
}
|
||||
c = next();
|
||||
@ -99,15 +107,22 @@ public class XMLTokener extends JSONTokener {
|
||||
*
|
||||
* @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();
|
||||
for (;;) {
|
||||
for (;;)
|
||||
{
|
||||
final char c = next();
|
||||
if (Character.isLetterOrDigit(c) || (c == '#')) {
|
||||
if (Character.isLetterOrDigit(c) || (c == '#'))
|
||||
{
|
||||
sb.append(Character.toLowerCase(c));
|
||||
} else if (c == ';') {
|
||||
}
|
||||
else if (c == ';')
|
||||
{
|
||||
break;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
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.
|
||||
*/
|
||||
public Object nextMeta() throws JSONException {
|
||||
public Object nextMeta() throws JSONException
|
||||
{
|
||||
char c;
|
||||
char q;
|
||||
do {
|
||||
do
|
||||
{
|
||||
c = next();
|
||||
} while (Character.isWhitespace(c));
|
||||
switch (c) {
|
||||
}
|
||||
while (Character.isWhitespace(c));
|
||||
switch (c)
|
||||
{
|
||||
case 0:
|
||||
throw syntaxError("Misshaped meta tag");
|
||||
case '<':
|
||||
@ -148,22 +167,19 @@ public class XMLTokener extends JSONTokener {
|
||||
case '"':
|
||||
case '\'':
|
||||
q = c;
|
||||
for (;;) {
|
||||
for (;;)
|
||||
{
|
||||
c = next();
|
||||
if (c == 0) {
|
||||
throw syntaxError("Unterminated string");
|
||||
}
|
||||
if (c == q) {
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
if (c == 0) { throw syntaxError("Unterminated string"); }
|
||||
if (c == q) { return Boolean.TRUE; }
|
||||
}
|
||||
default:
|
||||
for (;;) {
|
||||
for (;;)
|
||||
{
|
||||
c = next();
|
||||
if (Character.isWhitespace(c)) {
|
||||
return Boolean.TRUE;
|
||||
}
|
||||
switch (c) {
|
||||
if (Character.isWhitespace(c)) { return Boolean.TRUE; }
|
||||
switch (c)
|
||||
{
|
||||
case 0:
|
||||
case '<':
|
||||
case '>':
|
||||
@ -188,14 +204,18 @@ public class XMLTokener extends JSONTokener {
|
||||
*
|
||||
* @throws JSONException If the XML is not well formed.
|
||||
*/
|
||||
public Object nextToken() throws JSONException {
|
||||
public Object nextToken() throws JSONException
|
||||
{
|
||||
char c;
|
||||
char q;
|
||||
StringBuilder sb;
|
||||
do {
|
||||
do
|
||||
{
|
||||
c = next();
|
||||
} while (Character.isWhitespace(c));
|
||||
switch (c) {
|
||||
}
|
||||
while (Character.isWhitespace(c));
|
||||
switch (c)
|
||||
{
|
||||
case 0:
|
||||
throw syntaxError("Misshaped element");
|
||||
case '<':
|
||||
@ -215,30 +235,30 @@ public class XMLTokener extends JSONTokener {
|
||||
case '\'':
|
||||
q = c;
|
||||
sb = new StringBuilder();
|
||||
for (;;) {
|
||||
for (;;)
|
||||
{
|
||||
c = next();
|
||||
if (c == 0) {
|
||||
throw syntaxError("Unterminated string");
|
||||
}
|
||||
if (c == q) {
|
||||
return sb.toString();
|
||||
}
|
||||
if (c == '&') {
|
||||
if (c == 0) { throw syntaxError("Unterminated string"); }
|
||||
if (c == q) { return sb.toString(); }
|
||||
if (c == '&')
|
||||
{
|
||||
sb.append(nextEntity(c));
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.append(c);
|
||||
}
|
||||
}
|
||||
default:
|
||||
// Name
|
||||
sb = new StringBuilder();
|
||||
for (;;) {
|
||||
for (;;)
|
||||
{
|
||||
sb.append(c);
|
||||
c = next();
|
||||
if (Character.isWhitespace(c)) {
|
||||
return sb.toString();
|
||||
}
|
||||
switch (c) {
|
||||
if (Character.isWhitespace(c)) { return sb.toString(); }
|
||||
switch (c)
|
||||
{
|
||||
case 0:
|
||||
return sb.toString();
|
||||
case '>':
|
||||
@ -267,7 +287,8 @@ public class XMLTokener extends JSONTokener {
|
||||
*
|
||||
* @throws JSONException
|
||||
*/
|
||||
public boolean skipPast(final String to) throws JSONException {
|
||||
public boolean skipPast(final String to) throws JSONException
|
||||
{
|
||||
boolean b;
|
||||
char c;
|
||||
int i;
|
||||
@ -279,44 +300,44 @@ public class XMLTokener extends JSONTokener {
|
||||
* First fill the circle buffer with as many characters as are in the
|
||||
* 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();
|
||||
if (c == 0) {
|
||||
return false;
|
||||
}
|
||||
if (c == 0) { return false; }
|
||||
circle[i] = c;
|
||||
}
|
||||
/* We will loop, possibly for all of the remaining characters. */
|
||||
for (;;) {
|
||||
for (;;)
|
||||
{
|
||||
j = offset;
|
||||
b = true;
|
||||
/* Compare the circle buffer with the to string. */
|
||||
for (i = 0; i < length; i += 1) {
|
||||
if (circle[j] != to.charAt(i)) {
|
||||
for (i = 0; i < length; i += 1)
|
||||
{
|
||||
if (circle[j] != to.charAt(i))
|
||||
{
|
||||
b = false;
|
||||
break;
|
||||
}
|
||||
j += 1;
|
||||
if (j >= length) {
|
||||
if (j >= length)
|
||||
{
|
||||
j -= length;
|
||||
}
|
||||
}
|
||||
/* If we exit the loop with b intact, then victory is ours. */
|
||||
if (b) {
|
||||
return true;
|
||||
}
|
||||
if (b) { return true; }
|
||||
/* Get the next character. If there isn't one, then defeat is ours. */
|
||||
c = next();
|
||||
if (c == 0) {
|
||||
return false;
|
||||
}
|
||||
if (c == 0) { return false; }
|
||||
/*
|
||||
* Shove the character in the circle buffer and advance the
|
||||
* circle offset. The offset is mod n.
|
||||
*/
|
||||
circle[offset] = c;
|
||||
offset += 1;
|
||||
if (offset >= length) {
|
||||
if (offset >= length)
|
||||
{
|
||||
offset -= length;
|
||||
}
|
||||
}
|
||||
|
@ -16,29 +16,29 @@ import com.intellectualcrafters.plot.util.SchematicHandler;
|
||||
import com.intellectualcrafters.plot.util.SetupUtils;
|
||||
import com.intellectualcrafters.plot.util.TaskManager;
|
||||
import com.intellectualcrafters.plot.util.UUIDHandlerImplementation;
|
||||
import com.sk89q.worldedit.WorldEdit;
|
||||
|
||||
public interface IPlotMain {
|
||||
|
||||
public interface IPlotMain
|
||||
{
|
||||
|
||||
/**
|
||||
* Log a message to console
|
||||
* @param message
|
||||
*/
|
||||
void log(String message);
|
||||
void log(final String message);
|
||||
|
||||
/**
|
||||
* Get the `PlotSquared` directory (e.g. /plugins/PlotSquared or /mods/PlotSquared)
|
||||
* @return
|
||||
*/
|
||||
File getDirectory();
|
||||
|
||||
|
||||
/**
|
||||
* Wrap a player into a PlotPlayer object
|
||||
* @param obj
|
||||
* @return
|
||||
*/
|
||||
PlotPlayer wrapPlayer(Object obj);
|
||||
|
||||
PlotPlayer wrapPlayer(final Object obj);
|
||||
|
||||
/**
|
||||
* Disable the implementation
|
||||
* - If a full disable isn't feasibly, just disable what it can
|
||||
@ -50,32 +50,32 @@ public interface IPlotMain {
|
||||
* @return
|
||||
*/
|
||||
int[] getPluginVersion();
|
||||
|
||||
|
||||
/**
|
||||
* Get the version of Minecraft that is running
|
||||
* (used to check what protocols and such are supported)
|
||||
* @return
|
||||
*/
|
||||
int[] getServerVersion();
|
||||
|
||||
|
||||
/**
|
||||
* Get the nms package prefix
|
||||
* @return
|
||||
*/
|
||||
String getNMSPackage();
|
||||
|
||||
|
||||
/**
|
||||
* Get the schematic handler
|
||||
* @return
|
||||
*/
|
||||
SchematicHandler initSchematicHandler();
|
||||
|
||||
|
||||
/**
|
||||
* Get the schematic handler
|
||||
* @return
|
||||
*/
|
||||
ChatManager initChatManager();
|
||||
|
||||
|
||||
/**
|
||||
* The task manager will run and manage minecraft tasks
|
||||
* @return
|
||||
@ -116,7 +116,7 @@ public interface IPlotMain {
|
||||
* Register the WorldEdit hook
|
||||
*/
|
||||
boolean initWorldEdit();
|
||||
|
||||
|
||||
/**
|
||||
* Register TNT related events (if TNT protection is enabled)
|
||||
*/
|
||||
@ -133,7 +133,7 @@ public interface IPlotMain {
|
||||
* @return
|
||||
*/
|
||||
BlockManager initBlockManager();
|
||||
|
||||
|
||||
/**
|
||||
* Get the EventUtil class
|
||||
* @return
|
||||
@ -157,24 +157,24 @@ public interface IPlotMain {
|
||||
* @return
|
||||
*/
|
||||
HybridUtils initHybridUtils();
|
||||
|
||||
|
||||
/**
|
||||
* Start the metrics task
|
||||
*/
|
||||
void startMetrics();
|
||||
|
||||
|
||||
/**
|
||||
* If a world is already loaded, set the generator (use NMS if required)
|
||||
* @param world
|
||||
*/
|
||||
void setGenerator(String world);
|
||||
void setGenerator(final String world);
|
||||
|
||||
/**
|
||||
* Get the UUIDHandlerImplementation which will cache and provide UUIDs
|
||||
* @return
|
||||
*/
|
||||
UUIDHandlerImplementation initUUIDHandler();
|
||||
|
||||
|
||||
/**
|
||||
* Get the InventoryUtil class (used for implementation specific inventory guis)
|
||||
* @return
|
||||
@ -186,12 +186,12 @@ public interface IPlotMain {
|
||||
* @return
|
||||
*/
|
||||
boolean initPlotMeConverter();
|
||||
|
||||
|
||||
/**
|
||||
* Unregister a PlotPlayer from cache e.g. if they have logged off
|
||||
* @param player
|
||||
*/
|
||||
void unregister(PlotPlayer player);
|
||||
void unregister(final PlotPlayer player);
|
||||
|
||||
/**
|
||||
* Get the generator wrapper for a world (world) and generator (name)
|
||||
@ -199,7 +199,7 @@ public interface IPlotMain {
|
||||
* @param name
|
||||
* @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
|
||||
@ -216,7 +216,7 @@ public interface IPlotMain {
|
||||
* @return
|
||||
*/
|
||||
String getServerName();
|
||||
|
||||
|
||||
/**
|
||||
* Get the class that will manage player titles
|
||||
* @return
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -32,71 +32,82 @@ import com.intellectualcrafters.plot.util.EventUtil;
|
||||
import com.intellectualcrafters.plot.util.MainUtil;
|
||||
import com.intellectualcrafters.plot.util.Permissions;
|
||||
import com.intellectualcrafters.plot.util.UUIDHandler;
|
||||
import com.plotsquared.bukkit.uuid.SQLUUIDHandler;
|
||||
import com.plotsquared.general.commands.Argument;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "add",
|
||||
aliases = {"a"},
|
||||
description = "Allow a user to build while you are online",
|
||||
usage = "/plot add <player>",
|
||||
category = CommandCategory.ACTIONS,
|
||||
permission = "plots.add",
|
||||
requiredType = RequiredType.NONE
|
||||
)
|
||||
public class Add extends SubCommand {
|
||||
command = "add",
|
||||
aliases = { "a" },
|
||||
description = "Allow a user to build while you are online",
|
||||
usage = "/plot add <player>",
|
||||
category = CommandCategory.ACTIONS,
|
||||
permission = "plots.add",
|
||||
requiredType = RequiredType.NONE)
|
||||
public class Add extends SubCommand
|
||||
{
|
||||
|
||||
public Add() {
|
||||
public Add()
|
||||
{
|
||||
requiredArguments = new Argument[] {
|
||||
Argument.PlayerName
|
||||
Argument.PlayerName
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(PlotPlayer plr, String[] args) {
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
final Location loc = plr.getLocation();
|
||||
final Plot plot = MainUtil.getPlot(loc);
|
||||
if (plot == null) {
|
||||
return !sendMessage(plr, C.NOT_IN_PLOT);
|
||||
}
|
||||
if (!plot.hasOwner()) {
|
||||
if (plot == null) { return !sendMessage(plr, C.NOT_IN_PLOT); }
|
||||
if (!plot.hasOwner())
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.PLOT_UNOWNED);
|
||||
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);
|
||||
return true;
|
||||
}
|
||||
UUID uuid;
|
||||
if (args[0].equalsIgnoreCase("*")) {
|
||||
if (args[0].equalsIgnoreCase("*"))
|
||||
{
|
||||
uuid = DBFunc.everyone;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
// TODO have a runnable for fetch
|
||||
uuid = UUIDHandler.getUUID(args[0], null);
|
||||
}
|
||||
if (uuid == null) {
|
||||
if (uuid == null)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[0]);
|
||||
return false;
|
||||
}
|
||||
if (plot.isOwner(uuid)) {
|
||||
if (plot.isOwner(uuid))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.ALREADY_OWNER);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (plot.getMembers().contains(uuid)) {
|
||||
|
||||
if (plot.getMembers().contains(uuid))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.ALREADY_ADDED);
|
||||
return false;
|
||||
}
|
||||
if (plot.removeTrusted(uuid)) {
|
||||
if (plot.removeTrusted(uuid))
|
||||
{
|
||||
plot.addMember(uuid);
|
||||
}
|
||||
else {
|
||||
if (plot.getMembers().size() + plot.getTrusted().size() >= PS.get().getPlotWorld(plot.world).MAX_PLOT_MEMBERS) {
|
||||
else
|
||||
{
|
||||
if ((plot.getMembers().size() + plot.getTrusted().size()) >= PS.get().getPlotWorld(plot.world).MAX_PLOT_MEMBERS)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.PLOT_MAX_MEMBERS);
|
||||
return false;
|
||||
}
|
||||
if (plot.getDenied().contains(uuid)) {
|
||||
if (plot.getDenied().contains(uuid))
|
||||
{
|
||||
plot.removeDenied(uuid);
|
||||
}
|
||||
plot.addMember(uuid);
|
||||
|
@ -29,84 +29,102 @@ import com.intellectualcrafters.plot.object.PlotCluster;
|
||||
import com.intellectualcrafters.plot.object.PlotId;
|
||||
import com.intellectualcrafters.plot.object.PlotPlayer;
|
||||
import com.intellectualcrafters.plot.object.PlotWorld;
|
||||
import com.intellectualcrafters.plot.util.ClusterManager;
|
||||
import com.intellectualcrafters.plot.util.EconHandler;
|
||||
import com.intellectualcrafters.plot.util.MainUtil;
|
||||
import com.intellectualcrafters.plot.util.Permissions;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "auto",
|
||||
permission = "plots.auto",
|
||||
category = CommandCategory.CLAIMING,
|
||||
requiredType = RequiredType.NONE,
|
||||
description = "Claim the nearest plot",
|
||||
aliases = {"a"},
|
||||
usage = "/plot auto"
|
||||
)
|
||||
public class Auto extends SubCommand {
|
||||
command = "auto",
|
||||
permission = "plots.auto",
|
||||
category = CommandCategory.CLAIMING,
|
||||
requiredType = RequiredType.NONE,
|
||||
description = "Claim the nearest plot",
|
||||
aliases = { "a" },
|
||||
usage = "/plot auto")
|
||||
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 absY = Math.abs(id.y);
|
||||
if (absX > absY) {
|
||||
if (id.x > 0) {
|
||||
if (absX > absY)
|
||||
{
|
||||
if (id.x > 0)
|
||||
{
|
||||
return new PlotId(id.x, id.y + 1);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
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);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return new PlotId(id.x + 1, id.y);
|
||||
}
|
||||
} else {
|
||||
if (id.x.equals(id.y) && (id.x > 0)) {
|
||||
return new PlotId(id.x, id.y + step);
|
||||
}
|
||||
if (id.x == absX) {
|
||||
return new PlotId(id.x, id.y + 1);
|
||||
}
|
||||
if (id.y == absY) {
|
||||
return new PlotId(id.x, id.y - 1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (id.x.equals(id.y) && (id.x > 0)) { return new PlotId(id.x, id.y + step); }
|
||||
if (id.x == absX) { 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);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(PlotPlayer plr, String[] args) {
|
||||
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
|
||||
String world;
|
||||
int size_x = 1;
|
||||
int size_z = 1;
|
||||
String schematic = "";
|
||||
if (PS.get().getPlotWorlds().size() == 1) {
|
||||
if (PS.get().getPlotWorlds().size() == 1)
|
||||
{
|
||||
world = PS.get().getPlotWorlds().iterator().next();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
world = plr.getLocation().getWorld();
|
||||
if (!PS.get().isPlotWorld(world)) {
|
||||
if (!PS.get().isPlotWorld(world))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NOT_IN_PLOT_WORLD);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (args.length > 0) {
|
||||
if (Permissions.hasPermission(plr, "plots.auto.mega")) {
|
||||
try {
|
||||
if (args.length > 0)
|
||||
{
|
||||
if (Permissions.hasPermission(plr, "plots.auto.mega"))
|
||||
{
|
||||
try
|
||||
{
|
||||
final String[] split = args[0].split(",");
|
||||
size_x = Integer.parseInt(split[0]);
|
||||
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");
|
||||
}
|
||||
if ((size_x > 4) || (size_z > 4)) {
|
||||
if ((size_x > 4) || (size_z > 4))
|
||||
{
|
||||
MainUtil.sendMessage(plr, "&cError: size>4");
|
||||
}
|
||||
if (args.length > 1) {
|
||||
if (args.length > 1)
|
||||
{
|
||||
schematic = args[1];
|
||||
}
|
||||
} catch (final Exception e) {
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
size_x = 1;
|
||||
size_z = 1;
|
||||
schematic = args[0];
|
||||
@ -114,32 +132,42 @@ public class Auto extends SubCommand {
|
||||
// "&cError: Invalid size (X,Y)");
|
||||
// return false;
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
schematic = args[0];
|
||||
// PlayerFunctions.sendMessage(plr, C.NO_PERMISSION);
|
||||
// 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 + "");
|
||||
return false;
|
||||
}
|
||||
final int currentPlots = Settings.GLOBAL_LIMIT ? MainUtil.getPlayerPlotCount(plr) : MainUtil.getPlayerPlotCount(world, plr);
|
||||
final int diff = currentPlots - MainUtil.getAllowedPlots(plr);
|
||||
if ((diff + (size_x * size_z)) > 0) {
|
||||
if (diff < 0) {
|
||||
if ((diff + (size_x * size_z)) > 0)
|
||||
{
|
||||
if (diff < 0)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.CANT_CLAIM_MORE_PLOTS_NUM, (-diff) + "");
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.CANT_CLAIM_MORE_PLOTS);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
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;
|
||||
cost = (size_x * size_z) * cost;
|
||||
if (cost > 0d) {
|
||||
if (EconHandler.manager.getMoney(plr) < cost) {
|
||||
if (cost > 0d)
|
||||
{
|
||||
if (EconHandler.manager.getMoney(plr) < cost)
|
||||
{
|
||||
sendMessage(plr, C.CANNOT_AFFORD_PLOT, "" + cost);
|
||||
return true;
|
||||
}
|
||||
@ -147,13 +175,16 @@ public class Auto extends SubCommand {
|
||||
sendMessage(plr, C.REMOVED_BALANCE, cost + "");
|
||||
}
|
||||
}
|
||||
if (!schematic.equals("")) {
|
||||
if (!schematic.equals(""))
|
||||
{
|
||||
// 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);
|
||||
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);
|
||||
return true;
|
||||
}
|
||||
@ -161,15 +192,15 @@ public class Auto extends SubCommand {
|
||||
}
|
||||
final String worldname = world;
|
||||
final PlotWorld plotworld = PS.get().getPlotWorld(worldname);
|
||||
if (plotworld.TYPE == 2) {
|
||||
if (plotworld.TYPE == 2)
|
||||
{
|
||||
final Location loc = plr.getLocation();
|
||||
final Plot plot = MainUtil.getPlot(new Location(worldname, loc.getX(), loc.getY(), loc.getZ()));
|
||||
if (plot == null) {
|
||||
return sendMessage(plr, C.NOT_IN_PLOT);
|
||||
}
|
||||
if (plot == null) { return sendMessage(plr, C.NOT_IN_PLOT); }
|
||||
final PlotCluster cluster = plot.getCluster();
|
||||
// Must be standing in a cluster
|
||||
if (cluster == null) {
|
||||
if (cluster == null)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER);
|
||||
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 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 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);
|
||||
return true;
|
||||
}
|
||||
@ -194,40 +227,50 @@ public class Auto extends SubCommand {
|
||||
return false;
|
||||
}
|
||||
boolean br = false;
|
||||
if ((size_x == 1) && (size_z == 1)) {
|
||||
while (!br) {
|
||||
if ((size_x == 1) && (size_z == 1))
|
||||
{
|
||||
while (!br)
|
||||
{
|
||||
final Plot plot = MainUtil.getPlot(worldname, getLastPlot(worldname));
|
||||
if (MainUtil.canClaim(plr, plot)) {
|
||||
if (MainUtil.canClaim(plr, plot))
|
||||
{
|
||||
Claim.claimPlot(plr, plot, true, true);
|
||||
br = true;
|
||||
}
|
||||
MainUtil.lastPlot.put(worldname, getNextPlot(getLastPlot(worldname), 1));
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
boolean lastPlot = true;
|
||||
while (!br) {
|
||||
while (!br)
|
||||
{
|
||||
final PlotId start = getNextPlot(getLastPlot(worldname), 1);
|
||||
// Checking if the current set of plots is a viable option.
|
||||
MainUtil.lastPlot.put(worldname, start);
|
||||
if (lastPlot) {
|
||||
}
|
||||
if ((PS.get().getPlot(worldname, start) != null) && (PS.get().getPlot(worldname, start).owner != null)) {
|
||||
if (lastPlot)
|
||||
{}
|
||||
if ((PS.get().getPlot(worldname, start) != null) && (PS.get().getPlot(worldname, start).owner != null))
|
||||
{
|
||||
continue;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
lastPlot = false;
|
||||
}
|
||||
final PlotId end = new PlotId((start.x + size_x) - 1, (start.y + size_z) - 1);
|
||||
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++) {
|
||||
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++)
|
||||
{
|
||||
final Plot plot = MainUtil.getPlot(worldname, new PlotId(i, j));
|
||||
final boolean teleport = ((i == end.x) && (j == end.y));
|
||||
Claim.claimPlot(plr, plot, teleport, true);
|
||||
}
|
||||
}
|
||||
if (!MainUtil.mergePlots(worldname, MainUtil.getPlotSelectionIds(start, end), true, true)) {
|
||||
return false;
|
||||
}
|
||||
if (!MainUtil.mergePlots(worldname, MainUtil.getPlotSelectionIds(start, end), true, true)) { return false; }
|
||||
br = true;
|
||||
}
|
||||
}
|
||||
@ -236,8 +279,10 @@ public class Auto extends SubCommand {
|
||||
return true;
|
||||
}
|
||||
|
||||
public PlotId getLastPlot(final String world) {
|
||||
if ((MainUtil.lastPlot == null) || !MainUtil.lastPlot.containsKey(world)) {
|
||||
public PlotId getLastPlot(final String world)
|
||||
{
|
||||
if ((MainUtil.lastPlot == null) || !MainUtil.lastPlot.containsKey(world))
|
||||
{
|
||||
MainUtil.lastPlot.put(world, new PlotId(0, 0));
|
||||
}
|
||||
return MainUtil.lastPlot.get(world);
|
||||
|
@ -21,67 +21,65 @@
|
||||
package com.intellectualcrafters.plot.commands;
|
||||
|
||||
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.Plot;
|
||||
import com.intellectualcrafters.plot.object.PlotAnalysis;
|
||||
import com.intellectualcrafters.plot.object.PlotPlayer;
|
||||
import com.intellectualcrafters.plot.object.RunnableVal;
|
||||
import com.intellectualcrafters.plot.util.BO3Handler;
|
||||
import com.intellectualcrafters.plot.util.BlockManager;
|
||||
import com.intellectualcrafters.plot.util.MainUtil;
|
||||
import com.intellectualcrafters.plot.util.Permissions;
|
||||
import com.intellectualcrafters.plot.util.UUIDHandler;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "bo3",
|
||||
aliases = {"bo2"},
|
||||
description = "Mark a plot as done",
|
||||
permission = "plots.bo3",
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE
|
||||
)
|
||||
public class BO3 extends SubCommand {
|
||||
command = "bo3",
|
||||
aliases = { "bo2" },
|
||||
description = "Mark a plot as done",
|
||||
permission = "plots.bo3",
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE)
|
||||
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 import <file>");
|
||||
}
|
||||
|
||||
|
||||
@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 Plot plot = MainUtil.getPlot(loc);
|
||||
if (plot == null || !plot.hasOwner()) {
|
||||
return !sendMessage(plr, C.NOT_IN_PLOT);
|
||||
}
|
||||
if ((!plot.isOwner(plr.getUUID())) && !Permissions.hasPermission(plr, "plots.admin.command.bo3")) {
|
||||
if ((plot == null) || !plot.hasOwner()) { return !sendMessage(plr, C.NOT_IN_PLOT); }
|
||||
if ((!plot.isOwner(plr.getUUID())) && !Permissions.hasPermission(plr, "plots.admin.command.bo3"))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NO_PLOT_PERMS);
|
||||
return false;
|
||||
}
|
||||
if (args.length == 0) {
|
||||
if (args.length == 0)
|
||||
{
|
||||
noArgs(plr);
|
||||
return false;
|
||||
}
|
||||
switch (args[0].toLowerCase()) {
|
||||
switch (args[0].toLowerCase())
|
||||
{
|
||||
case "output":
|
||||
case "save":
|
||||
case "export": {
|
||||
case "export":
|
||||
{
|
||||
return BO3Handler.saveBO3(plr, plot);
|
||||
}
|
||||
case "paste":
|
||||
case "load":
|
||||
case "import":
|
||||
case "input": {
|
||||
case "input":
|
||||
{
|
||||
// TODO NOT IMPLEMENTED YET
|
||||
MainUtil.sendMessage(plr, "NOT IMPLEMENTED YET!!!");
|
||||
return false;
|
||||
}
|
||||
default: {
|
||||
default:
|
||||
{
|
||||
noArgs(plr);
|
||||
return false;
|
||||
}
|
||||
|
@ -38,83 +38,78 @@ import com.intellectualcrafters.plot.util.UUIDHandler;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "buy",
|
||||
aliases = {"b"},
|
||||
description = "Buy the plot you are standing on",
|
||||
usage = "/plot buy",
|
||||
permission = "plots.buy",
|
||||
category = CommandCategory.CLAIMING,
|
||||
requiredType = RequiredType.NONE
|
||||
)
|
||||
public class Buy extends SubCommand {
|
||||
command = "buy",
|
||||
aliases = { "b" },
|
||||
description = "Buy the plot you are standing on",
|
||||
usage = "/plot buy",
|
||||
permission = "plots.buy",
|
||||
category = CommandCategory.CLAIMING,
|
||||
requiredType = RequiredType.NONE)
|
||||
public class Buy extends SubCommand
|
||||
{
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String ... args) {
|
||||
|
||||
if (EconHandler.manager == null) {
|
||||
return sendMessage(plr, C.ECON_DISABLED);
|
||||
}
|
||||
public boolean onCommand(final PlotPlayer plr, final String... args)
|
||||
{
|
||||
|
||||
if (EconHandler.manager == null) { return sendMessage(plr, C.ECON_DISABLED); }
|
||||
final Location loc = plr.getLocation();
|
||||
final String world = loc.getWorld();
|
||||
if (!PS.get().isPlotWorld(world)) {
|
||||
return sendMessage(plr, C.NOT_IN_PLOT_WORLD);
|
||||
}
|
||||
if (!PS.get().isPlotWorld(world)) { return sendMessage(plr, C.NOT_IN_PLOT_WORLD); }
|
||||
Plot plot;
|
||||
if (args.length > 0) {
|
||||
try {
|
||||
if (args.length > 0)
|
||||
{
|
||||
try
|
||||
{
|
||||
final String[] split = args[0].split(";");
|
||||
final PlotId id = new PlotId(Integer.parseInt(split[0]), Integer.parseInt(split[1]));
|
||||
plot = MainUtil.getPlot(world, id);
|
||||
} catch (final Exception e) {
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
return sendMessage(plr, C.NOT_VALID_PLOT_ID);
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
plot = MainUtil.getPlot(loc);
|
||||
}
|
||||
if (plot == null) {
|
||||
return sendMessage(plr, C.NOT_IN_PLOT);
|
||||
}
|
||||
if (plot == null) { return sendMessage(plr, C.NOT_IN_PLOT); }
|
||||
final int currentPlots = Settings.GLOBAL_LIMIT ? MainUtil.getPlayerPlotCount(plr) : MainUtil.getPlayerPlotCount(world, plr);
|
||||
if (currentPlots >= MainUtil.getAllowedPlots(plr)) {
|
||||
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 (currentPlots >= MainUtil.getAllowedPlots(plr)) { 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); }
|
||||
final Flag flag = FlagManager.getPlotFlag(plot, "price");
|
||||
if (flag == null) {
|
||||
return sendMessage(plr, C.NOT_FOR_SALE);
|
||||
}
|
||||
if (flag == null) { return sendMessage(plr, C.NOT_FOR_SALE); }
|
||||
double initPrice = (double) flag.getValue();
|
||||
double price = initPrice;
|
||||
final PlotId id = plot.id;
|
||||
final PlotId id2 = MainUtil.getTopPlot(plot).id;
|
||||
final int size = MainUtil.getPlotSelectionIds(id, id2).size();
|
||||
final PlotWorld plotworld = PS.get().getPlotWorld(world);
|
||||
if (plotworld.USE_ECONOMY) {
|
||||
if (plotworld.USE_ECONOMY)
|
||||
{
|
||||
price += plotworld.PLOT_PRICE * size;
|
||||
initPrice += plotworld.SELL_PRICE * size;
|
||||
}
|
||||
if ((EconHandler.manager != null) && (price > 0d)) {
|
||||
if (EconHandler.manager.getMoney(plr) < price) {
|
||||
return sendMessage(plr, C.CANNOT_AFFORD_PLOT, "" + price);
|
||||
}
|
||||
if ((EconHandler.manager != null) && (price > 0d))
|
||||
{
|
||||
if (EconHandler.manager.getMoney(plr) < price) { return sendMessage(plr, C.CANNOT_AFFORD_PLOT, "" + price); }
|
||||
EconHandler.manager.withdrawMoney(plr, price);
|
||||
sendMessage(plr, C.REMOVED_BALANCE, price + "");
|
||||
EconHandler.manager.depositMoney(UUIDHandler.getUUIDWrapper().getOfflinePlayer(plot.owner), initPrice);
|
||||
final PlotPlayer owner = UUIDHandler.getPlayer(plot.owner);
|
||||
if (owner != null) {
|
||||
if (owner != null)
|
||||
{
|
||||
sendMessage(plr, C.PLOT_SOLD, plot.id + "", plr.getName(), initPrice + "");
|
||||
}
|
||||
FlagManager.removePlotFlag(plot, "price");
|
||||
}
|
||||
Plot top = MainUtil.getTopPlot(plot);
|
||||
|
||||
for (PlotId myId : MainUtil.getPlotSelectionIds(plot.id, top.id)) {
|
||||
Plot myPlot = MainUtil.getPlot(plot.world, myId);
|
||||
final Plot top = MainUtil.getTopPlot(plot);
|
||||
|
||||
for (final PlotId myId : MainUtil.getPlotSelectionIds(plot.id, top.id))
|
||||
{
|
||||
final Plot myPlot = MainUtil.getPlot(plot.world, myId);
|
||||
myPlot.owner = plr.getUUID();
|
||||
DBFunc.setOwner(plot, myPlot.owner);
|
||||
}
|
||||
|
@ -1,23 +1,21 @@
|
||||
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.PlotWorld;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "chat",
|
||||
description = "Toggle plot chat on or off",
|
||||
usage = "/plot chat [on|off]",
|
||||
permission = "plots.chat",
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE
|
||||
)
|
||||
public class Chat extends SubCommand {
|
||||
command = "chat",
|
||||
description = "Toggle plot chat on or off",
|
||||
usage = "/plot chat [on|off]",
|
||||
permission = "plots.chat",
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE)
|
||||
public class Chat extends SubCommand
|
||||
{
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer player, final String ... args) {
|
||||
return MainCommand.onCommand(player, "plot", new String[] {"toggle", "chat"});
|
||||
public boolean onCommand(final PlotPlayer player, final String... args)
|
||||
{
|
||||
return MainCommand.onCommand(player, "plot", new String[] { "toggle", "chat" });
|
||||
}
|
||||
}
|
||||
|
@ -37,53 +37,64 @@ import com.intellectualcrafters.plot.util.SchematicHandler.Schematic;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "claim",
|
||||
aliases = {"c"},
|
||||
description = "Claim the current plot you're standing on",
|
||||
category = CommandCategory.CLAIMING,
|
||||
requiredType = RequiredType.NONE,
|
||||
permission = "plots.claim",
|
||||
usage = "/plot claim"
|
||||
)
|
||||
public class Claim extends SubCommand {
|
||||
command = "claim",
|
||||
aliases = { "c" },
|
||||
description = "Claim the current plot you're standing on",
|
||||
category = CommandCategory.CLAIMING,
|
||||
requiredType = RequiredType.NONE,
|
||||
permission = "plots.claim",
|
||||
usage = "/plot claim")
|
||||
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);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
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; }
|
||||
final boolean result = EventUtil.manager.callClaim(player, plot, false);
|
||||
if (result) {
|
||||
if (result)
|
||||
{
|
||||
MainUtil.createPlot(player.getUUID(), plot);
|
||||
MainUtil.setSign(player.getName(), plot);
|
||||
MainUtil.sendMessage(player, C.CLAIMED);
|
||||
final Location loc = player.getLocation();
|
||||
if (teleport) {
|
||||
if (teleport)
|
||||
{
|
||||
MainUtil.teleportPlayer(player, loc, plot);
|
||||
}
|
||||
final String world = plot.world;
|
||||
final PlotWorld plotworld = PS.get().getPlotWorld(world);
|
||||
final Plot plot2 = PS.get().getPlot(world, plot.id);
|
||||
if (plotworld.SCHEMATIC_ON_CLAIM) {
|
||||
if (plotworld.SCHEMATIC_ON_CLAIM)
|
||||
{
|
||||
Schematic sch;
|
||||
if (schematic.equals("")) {
|
||||
if (schematic.equals(""))
|
||||
{
|
||||
sch = SchematicHandler.manager.getSchematic(plotworld.SCHEMATIC_FILE);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
sch = SchematicHandler.manager.getSchematic(schematic);
|
||||
if (sch == null) {
|
||||
if (sch == null)
|
||||
{
|
||||
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
|
||||
public void run() {
|
||||
if (value) {
|
||||
public void run()
|
||||
{
|
||||
if (value)
|
||||
{
|
||||
MainUtil.sendMessage(player, C.SCHEMATIC_PASTE_SUCCESS);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
MainUtil.sendMessage(player, C.SCHEMATIC_PASTE_FAILED);
|
||||
}
|
||||
}
|
||||
@ -95,43 +106,38 @@ public class Claim extends SubCommand {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String ... args) {
|
||||
|
||||
public boolean onCommand(final PlotPlayer plr, final String... args)
|
||||
{
|
||||
|
||||
String schematic = "";
|
||||
if (args.length >= 1) {
|
||||
if (args.length >= 1)
|
||||
{
|
||||
schematic = args[0];
|
||||
}
|
||||
final Location loc = plr.getLocation();
|
||||
final Plot plot = MainUtil.getPlot(loc);
|
||||
if (plot == null) {
|
||||
return sendMessage(plr, C.NOT_IN_PLOT);
|
||||
}
|
||||
if (plot == null) { return sendMessage(plr, C.NOT_IN_PLOT); }
|
||||
final int currentPlots = Settings.GLOBAL_LIMIT ? MainUtil.getPlayerPlotCount(plr) : MainUtil.getPlayerPlotCount(loc.getWorld(), plr);
|
||||
if (currentPlots >= MainUtil.getAllowedPlots(plr)) {
|
||||
return sendMessage(plr, C.CANT_CLAIM_MORE_PLOTS);
|
||||
}
|
||||
if (!MainUtil.canClaim(plr, plot)) {
|
||||
return sendMessage(plr, C.PLOT_IS_CLAIMED);
|
||||
}
|
||||
if (currentPlots >= MainUtil.getAllowedPlots(plr)) { return sendMessage(plr, C.CANT_CLAIM_MORE_PLOTS); }
|
||||
if (!MainUtil.canClaim(plr, plot)) { return sendMessage(plr, C.PLOT_IS_CLAIMED); }
|
||||
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;
|
||||
if (cost > 0d) {
|
||||
if (EconHandler.manager.getMoney(plr) < cost) {
|
||||
return sendMessage(plr, C.CANNOT_AFFORD_PLOT, "" + cost);
|
||||
}
|
||||
if (cost > 0d)
|
||||
{
|
||||
if (EconHandler.manager.getMoney(plr) < cost) { return sendMessage(plr, C.CANNOT_AFFORD_PLOT, "" + cost); }
|
||||
EconHandler.manager.withdrawMoney(plr, cost);
|
||||
sendMessage(plr, C.REMOVED_BALANCE, cost + "");
|
||||
}
|
||||
}
|
||||
if (!schematic.equals("")) {
|
||||
if (world.SCHEMATIC_CLAIM_SPECIFY) {
|
||||
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")) {
|
||||
return sendMessage(plr, C.NO_SCHEMATIC_PERMISSION, schematic);
|
||||
}
|
||||
if (!schematic.equals(""))
|
||||
{
|
||||
if (world.SCHEMATIC_CLAIM_SPECIFY)
|
||||
{
|
||||
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")) { return sendMessage(plr,
|
||||
C.NO_SCHEMATIC_PERMISSION, schematic); }
|
||||
}
|
||||
}
|
||||
return claimPlot(plr, plot, false, schematic, false) || sendMessage(plr, C.PLOT_NOT_CLAIMED);
|
||||
|
@ -38,86 +38,105 @@ import com.intellectualcrafters.plot.util.UUIDHandler;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "clear",
|
||||
description = "Clear a plot",
|
||||
permission = "plots.clear",
|
||||
category = CommandCategory.ACTIONS,
|
||||
usage = "/plot clear [id]"
|
||||
)
|
||||
public class Clear extends SubCommand {
|
||||
command = "clear",
|
||||
description = "Clear a plot",
|
||||
permission = "plots.clear",
|
||||
category = CommandCategory.ACTIONS,
|
||||
usage = "/plot clear [id]")
|
||||
public class Clear extends SubCommand
|
||||
{
|
||||
|
||||
@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 Plot plot;
|
||||
if (args.length == 2) {
|
||||
PlotId id = PlotId.fromString(args[0]);
|
||||
if (id == null) {
|
||||
if (args[1].equalsIgnoreCase("mine")) {
|
||||
Set<Plot> plots = PS.get().getPlots(plr);
|
||||
if (plots.size() == 0) {
|
||||
if (args.length == 2)
|
||||
{
|
||||
final PlotId id = PlotId.fromString(args[0]);
|
||||
if (id == null)
|
||||
{
|
||||
if (args[1].equalsIgnoreCase("mine"))
|
||||
{
|
||||
final Set<Plot> plots = PS.get().getPlots(plr);
|
||||
if (plots.size() == 0)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NO_PLOTS);
|
||||
return false;
|
||||
}
|
||||
plot = plots.iterator().next();
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot clear [X;Z|mine]");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
plot = MainUtil.getPlot(loc.getWorld(), id);
|
||||
}
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
plot = MainUtil.getPlot(loc);
|
||||
}
|
||||
if (plot == null) {
|
||||
if (plot == null)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot clear [X;Z|mine]");
|
||||
return sendMessage(plr, C.NOT_IN_PLOT);
|
||||
}
|
||||
// if (!MainUtil.getTopPlot(plot).equals(MainUtil.getBottomPlot(plot))) {
|
||||
// return sendMessage(plr, C.UNLINK_REQUIRED);
|
||||
// }
|
||||
if (((plot == null) || !plot.hasOwner() || !plot.isOwner(UUIDHandler.getUUID(plr))) && !Permissions.hasPermission(plr, "plots.admin.command.clear")) {
|
||||
return sendMessage(plr, C.NO_PLOT_PERMS);
|
||||
}
|
||||
// if (!MainUtil.getTopPlot(plot).equals(MainUtil.getBottomPlot(plot))) {
|
||||
// return sendMessage(plr, C.UNLINK_REQUIRED);
|
||||
// }
|
||||
if (((plot == null) || !plot.hasOwner() || !plot.isOwner(UUIDHandler.getUUID(plr))) && !Permissions.hasPermission(plr, "plots.admin.command.clear")) { return sendMessage(plr, C.NO_PLOT_PERMS); }
|
||||
assert plot != null;
|
||||
if (MainUtil.runners.containsKey(plot)) {
|
||||
if (MainUtil.runners.containsKey(plot))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER);
|
||||
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);
|
||||
return false;
|
||||
}
|
||||
Runnable runnable = new Runnable() {
|
||||
final Runnable runnable = new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run() {
|
||||
public void run()
|
||||
{
|
||||
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
|
||||
public void run() {
|
||||
public void run()
|
||||
{
|
||||
// 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");
|
||||
}
|
||||
if (FlagManager.getPlotFlag(plot, "analysis") != null) {
|
||||
if (FlagManager.getPlotFlag(plot, "analysis") != null)
|
||||
{
|
||||
FlagManager.removePlotFlag(plot, "analysis");
|
||||
}
|
||||
MainUtil.sendMessage(plr, C.CLEARING_DONE, "" + (System.currentTimeMillis() - start));
|
||||
}
|
||||
});
|
||||
if (!result) {
|
||||
if (!result)
|
||||
{
|
||||
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);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
TaskManager.runTask(runnable);
|
||||
}
|
||||
return true;
|
||||
|
@ -53,60 +53,77 @@ import com.intellectualcrafters.plot.util.UUIDHandler;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "cluster",
|
||||
aliases = {"clusters"},
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE,
|
||||
permission = "plots.cluster",
|
||||
description = "Manage a plot cluster"
|
||||
)
|
||||
public class Cluster extends SubCommand {
|
||||
command = "cluster",
|
||||
aliases = { "clusters" },
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE,
|
||||
permission = "plots.cluster",
|
||||
description = "Manage a plot cluster")
|
||||
public class Cluster extends SubCommand
|
||||
{
|
||||
|
||||
@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
|
||||
if (args.length == 0) {
|
||||
if (args.length == 0)
|
||||
{
|
||||
// return arguments
|
||||
MainUtil.sendMessage(plr, C.CLUSTER_AVAILABLE_ARGS);
|
||||
return false;
|
||||
}
|
||||
final String sub = args[0].toLowerCase();
|
||||
switch (sub) {
|
||||
switch (sub)
|
||||
{
|
||||
case "l":
|
||||
case "list": {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.list")) {
|
||||
case "list":
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.list"))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.list");
|
||||
return false;
|
||||
}
|
||||
if (args.length != 1) {
|
||||
if (args.length != 1)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster list");
|
||||
return false;
|
||||
}
|
||||
final HashSet<PlotCluster> clusters = ClusterManager.getClusters(plr.getLocation().getWorld());
|
||||
MainUtil.sendMessage(plr, C.CLUSTER_LIST_HEADING, clusters.size() + "");
|
||||
for (final PlotCluster cluster : clusters) {
|
||||
for (final PlotCluster cluster : clusters)
|
||||
{
|
||||
// Ignore unmanaged clusters
|
||||
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);
|
||||
} 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);
|
||||
} 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);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.CLUSTER_LIST_ELEMENT, cluster.toString());
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
case "c":
|
||||
case "create": {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.create")) {
|
||||
case "create":
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.create"))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.create");
|
||||
return false;
|
||||
}
|
||||
if (args.length != 4) {
|
||||
if (args.length != 4)
|
||||
{
|
||||
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.CLUSTER_CURRENT_PLOTID, "" + id);
|
||||
@ -115,37 +132,46 @@ public class Cluster extends SubCommand {
|
||||
// check pos1 / pos2
|
||||
PlotId pos1 = MainUtil.parseId(args[2]);
|
||||
PlotId pos2 = MainUtil.parseId(args[3]);
|
||||
if ((pos1 == null) || (pos2 == null)) {
|
||||
if ((pos1 == null) || (pos2 == null))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NOT_VALID_PLOT_ID);
|
||||
return false;
|
||||
}
|
||||
// check if name is taken
|
||||
final String name = args[1];
|
||||
for (final PlotCluster cluster : ClusterManager.getClusters(plr.getLocation().getWorld())) {
|
||||
if (name.equals(cluster.getName())) {
|
||||
for (final PlotCluster cluster : ClusterManager.getClusters(plr.getLocation().getWorld()))
|
||||
{
|
||||
if (name.equals(cluster.getName()))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.ALIAS_IS_TAKEN);
|
||||
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));
|
||||
pos2 = new PlotId(Math.max(pos1.x, pos2.x), Math.max(pos1.y, pos2.y));
|
||||
}
|
||||
//check if overlap
|
||||
String world = plr.getLocation().getWorld();
|
||||
final String world = plr.getLocation().getWorld();
|
||||
final PlotClusterId id = new PlotClusterId(pos1, pos2);
|
||||
final HashSet<PlotCluster> intersects = ClusterManager.getIntersects(world, id);
|
||||
if ((intersects.size() > 0)) {
|
||||
if ((intersects.size() > 0))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.CLUSTER_INTERSECTION, intersects.size() + "");
|
||||
return false;
|
||||
}
|
||||
// Check if it occupies existing plots
|
||||
Set<Plot> plots = MainUtil.getPlotSelectionOwned(world, pos1, pos2);
|
||||
if (plots.size() > 0) {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.create.other")) {
|
||||
UUID uuid = plr.getUUID();
|
||||
for (Plot plot : plots) {
|
||||
if (!plot.isOwner(uuid)) {
|
||||
final Set<Plot> plots = MainUtil.getPlotSelectionOwned(world, pos1, pos2);
|
||||
if (plots.size() > 0)
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.create.other"))
|
||||
{
|
||||
final UUID uuid = plr.getUUID();
|
||||
for (final Plot plot : plots)
|
||||
{
|
||||
if (!plot.isOwner(uuid))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.create.other");
|
||||
return false;
|
||||
}
|
||||
@ -155,64 +181,76 @@ public class Cluster extends SubCommand {
|
||||
// Check allowed cluster size
|
||||
final PlotCluster cluster = new PlotCluster(world, pos1, pos2, UUIDHandler.getUUID(plr));
|
||||
int current;
|
||||
if (Settings.GLOBAL_LIMIT) {
|
||||
if (Settings.GLOBAL_LIMIT)
|
||||
{
|
||||
current = ClusterManager.getPlayerClusterCount(plr);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
current = ClusterManager.getPlayerClusterCount(world, plr);
|
||||
}
|
||||
int allowed = Permissions.hasPermissionRange(plr, "plots.cluster", Settings.MAX_PLOTS);
|
||||
if (current + cluster.getArea() > allowed) {
|
||||
final int allowed = Permissions.hasPermissionRange(plr, "plots.cluster", Settings.MAX_PLOTS);
|
||||
if ((current + cluster.getArea()) > allowed)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster." + (current + cluster.getArea()));
|
||||
return false;
|
||||
}
|
||||
// Set the generator (if applicable)
|
||||
PlotWorld plotworld = PS.get().getPlotWorld(world);
|
||||
if (plotworld == null) {
|
||||
final PlotWorld plotworld = PS.get().getPlotWorld(world);
|
||||
if (plotworld == null)
|
||||
{
|
||||
PS.get().config.createSection("worlds." + world);
|
||||
PS.get().loadWorld(world, PS.get().IMP.getGenerator(world, null));
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
String gen_string = PS.get().config.getString("worlds." + world + "." + "generator.plugin");
|
||||
if (gen_string == null) {
|
||||
if (gen_string == null)
|
||||
{
|
||||
gen_string = "PlotSquared";
|
||||
}
|
||||
PlotGenerator<?> wrapper = PS.get().IMP.getGenerator(world, gen_string);
|
||||
if (wrapper.isFull()) {
|
||||
final PlotGenerator<?> wrapper = PS.get().IMP.getGenerator(world, gen_string);
|
||||
if (wrapper.isFull())
|
||||
{
|
||||
wrapper.augment(cluster, plotworld);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.SETUP_INVALID_GENERATOR, StringMan.join(SetupUtils.generators.keySet(), ","));
|
||||
return false;
|
||||
}
|
||||
// BukkitPlotGenerator generator;
|
||||
// if (gen_string == null) {
|
||||
// generator = new HybridGen(world);
|
||||
// } else {
|
||||
// ChunkGenerator chunkgen = (ChunkGenerator) PS.get().IMP.getGenerator(world, gen_string).generator;
|
||||
// if (chunkgen instanceof BukkitPlotGenerator) {
|
||||
// generator = (BukkitPlotGenerator) chunkgen;
|
||||
// }
|
||||
// else {
|
||||
// MainUtil.sendMessage(plr, C.SETUP_INVALID_GENERATOR, StringMan.join(SetupUtils.generators.keySet(), ","));
|
||||
// return false;
|
||||
// }
|
||||
// }
|
||||
// new AugmentedPopulator(world, generator, cluster, plotworld.TERRAIN == 2, plotworld.TERRAIN != 2);
|
||||
// BukkitPlotGenerator generator;
|
||||
// if (gen_string == null) {
|
||||
// generator = new HybridGen(world);
|
||||
// } else {
|
||||
// ChunkGenerator chunkgen = (ChunkGenerator) PS.get().IMP.getGenerator(world, gen_string).generator;
|
||||
// if (chunkgen instanceof BukkitPlotGenerator) {
|
||||
// generator = (BukkitPlotGenerator) chunkgen;
|
||||
// }
|
||||
// else {
|
||||
// MainUtil.sendMessage(plr, C.SETUP_INVALID_GENERATOR, StringMan.join(SetupUtils.generators.keySet(), ","));
|
||||
// return false;
|
||||
// }
|
||||
// }
|
||||
// new AugmentedPopulator(world, generator, cluster, plotworld.TERRAIN == 2, plotworld.TERRAIN != 2);
|
||||
}
|
||||
// create cluster
|
||||
cluster.settings.setAlias(name);
|
||||
DBFunc.createCluster(world, cluster);
|
||||
if (!ClusterManager.clusters.containsKey(world)) {
|
||||
if (!ClusterManager.clusters.containsKey(world))
|
||||
{
|
||||
ClusterManager.clusters.put(world, new HashSet<PlotCluster>());
|
||||
}
|
||||
ClusterManager.clusters.get(world).add(cluster);
|
||||
// Add any existing plots to the current cluster
|
||||
for (Plot plot : plots) {
|
||||
if (plot.hasOwner()) {
|
||||
Flag flag = new Flag(FlagManager.getFlag("cluster"), cluster);
|
||||
for (final Plot plot : plots)
|
||||
{
|
||||
if (plot.hasOwner())
|
||||
{
|
||||
final Flag flag = new Flag(FlagManager.getFlag("cluster"), cluster);
|
||||
FlagManager.addPlotFlag(plot, flag);
|
||||
if (!cluster.isAdded(plot.owner)) {
|
||||
if (!cluster.isAdded(plot.owner))
|
||||
{
|
||||
cluster.invited.add(plot.owner);
|
||||
DBFunc.setInvited(world, cluster, plot.owner);
|
||||
}
|
||||
@ -223,50 +261,65 @@ public class Cluster extends SubCommand {
|
||||
}
|
||||
case "disband":
|
||||
case "del":
|
||||
case "delete": {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.delete")) {
|
||||
case "delete":
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.delete"))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.delete");
|
||||
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]");
|
||||
return false;
|
||||
}
|
||||
PlotCluster cluster;
|
||||
if (args.length == 2) {
|
||||
if (args.length == 2)
|
||||
{
|
||||
cluster = ClusterManager.getCluster(plr.getLocation().getWorld(), args[1]);
|
||||
if (cluster == null) {
|
||||
if (cluster == null)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.INVALID_CLUSTER, args[1]);
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
cluster = ClusterManager.getCluster(plr.getLocation());
|
||||
if (cluster == null) {
|
||||
if (cluster == null)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (!cluster.owner.equals(UUIDHandler.getUUID(plr))) {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.delete.other")) {
|
||||
if (!cluster.owner.equals(UUIDHandler.getUUID(plr)))
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.delete.other"))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.delete.other");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
final PlotWorld plotworld = PS.get().getPlotWorld(plr.getLocation().getWorld());
|
||||
if (plotworld.TYPE == 2) {
|
||||
if (plotworld.TYPE == 2)
|
||||
{
|
||||
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);
|
||||
if (cluster.equals(other)) {
|
||||
if (cluster.equals(other))
|
||||
{
|
||||
toRemove.add(plot);
|
||||
}
|
||||
}
|
||||
for (final Plot plot : toRemove) {
|
||||
for (final Plot plot : toRemove)
|
||||
{
|
||||
plot.unclaim();
|
||||
}
|
||||
}
|
||||
DBFunc.delete(cluster);
|
||||
if (plotworld.TYPE == 2) {
|
||||
if (plotworld.TYPE == 2)
|
||||
{
|
||||
SetupUtils.manager.removePopulator(plr.getLocation().getWorld(), cluster);
|
||||
}
|
||||
ClusterManager.last = null;
|
||||
@ -276,36 +329,44 @@ public class Cluster extends SubCommand {
|
||||
return true;
|
||||
}
|
||||
case "res":
|
||||
case "resize": {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.resize")) {
|
||||
case "resize":
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.resize"))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.resize");
|
||||
return false;
|
||||
}
|
||||
if (args.length != 3) {
|
||||
if (args.length != 3)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster resize <pos1> <pos2>");
|
||||
return false;
|
||||
}
|
||||
// check pos1 / pos2
|
||||
PlotId pos1 = MainUtil.parseId(args[1]);
|
||||
PlotId pos2 = MainUtil.parseId(args[2]);
|
||||
if ((pos1 == null) || (pos2 == null)) {
|
||||
if ((pos1 == null) || (pos2 == null))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NOT_VALID_PLOT_ID);
|
||||
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));
|
||||
pos2 = new PlotId(Math.max(pos1.x, pos2.x), Math.max(pos1.y, pos2.y));
|
||||
}
|
||||
// check if in cluster
|
||||
Location loc = plr.getLocation();
|
||||
String world = loc.getWorld();
|
||||
final Location loc = plr.getLocation();
|
||||
final String world = loc.getWorld();
|
||||
final PlotCluster cluster = ClusterManager.getCluster(loc);
|
||||
if (cluster == null) {
|
||||
if (cluster == null)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER);
|
||||
return false;
|
||||
}
|
||||
if (!cluster.hasHelperRights(UUIDHandler.getUUID(plr))) {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.resize.other")) {
|
||||
if (!cluster.hasHelperRights(UUIDHandler.getUUID(plr)))
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.resize.other"))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.resize.other");
|
||||
return false;
|
||||
}
|
||||
@ -313,46 +374,56 @@ public class Cluster extends SubCommand {
|
||||
//check if overlap
|
||||
final PlotClusterId id = new PlotClusterId(pos1, pos2);
|
||||
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) + "");
|
||||
return false;
|
||||
}
|
||||
HashSet<Plot> existing = MainUtil.getPlotSelectionOwned(world, cluster.getP1(), cluster.getP2());
|
||||
HashSet<Plot> newplots = MainUtil.getPlotSelectionOwned(world, pos1, pos2);
|
||||
HashSet<Plot> removed = ((HashSet<Plot>) existing.clone());
|
||||
final HashSet<Plot> existing = MainUtil.getPlotSelectionOwned(world, cluster.getP1(), cluster.getP2());
|
||||
final HashSet<Plot> newplots = MainUtil.getPlotSelectionOwned(world, pos1, pos2);
|
||||
final HashSet<Plot> removed = ((HashSet<Plot>) existing.clone());
|
||||
removed.removeAll(newplots);
|
||||
// Check expand / shrink
|
||||
if (removed.size() > 0) {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.resize.shrink")) {
|
||||
if (removed.size() > 0)
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.resize.shrink"))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.resize.shrink");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
newplots.removeAll(existing);
|
||||
if (newplots.size() > 0) {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.resize.expand")) {
|
||||
if (newplots.size() > 0)
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.resize.expand"))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.resize.expand");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// Check allowed cluster size
|
||||
int current;
|
||||
if (Settings.GLOBAL_LIMIT) {
|
||||
if (Settings.GLOBAL_LIMIT)
|
||||
{
|
||||
current = ClusterManager.getPlayerClusterCount(plr);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
current = ClusterManager.getPlayerClusterCount(world, plr);
|
||||
}
|
||||
current -= cluster.getArea() + (1 + pos2.x - pos1.x) * (1 + pos2.y - pos1.y);
|
||||
int allowed = Permissions.hasPermissionRange(plr, "plots.cluster", Settings.MAX_PLOTS);
|
||||
if (current + cluster.getArea() > allowed) {
|
||||
current -= cluster.getArea() + (((1 + pos2.x) - pos1.x) * ((1 + pos2.y) - pos1.y));
|
||||
final int allowed = Permissions.hasPermissionRange(plr, "plots.cluster", Settings.MAX_PLOTS);
|
||||
if ((current + cluster.getArea()) > allowed)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster." + (current + cluster.getArea()));
|
||||
return false;
|
||||
}
|
||||
for (Plot plot : removed) {
|
||||
for (final Plot plot : removed)
|
||||
{
|
||||
FlagManager.removePlotFlag(plot, "cluster");
|
||||
}
|
||||
for (Plot plot : newplots) {
|
||||
for (final Plot plot : newplots)
|
||||
{
|
||||
FlagManager.addPlotFlag(plot, new Flag(FlagManager.getFlag("cluster"), cluster));
|
||||
}
|
||||
// resize cluster
|
||||
@ -362,76 +433,95 @@ public class Cluster extends SubCommand {
|
||||
}
|
||||
case "reg":
|
||||
case "regenerate":
|
||||
case "regen": {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.delete")) {
|
||||
case "regen":
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.delete"))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.regen");
|
||||
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]");
|
||||
return false;
|
||||
}
|
||||
PlotCluster cluster;
|
||||
if (args.length == 2) {
|
||||
if (args.length == 2)
|
||||
{
|
||||
cluster = ClusterManager.getCluster(plr.getLocation().getWorld(), args[1]);
|
||||
if (cluster == null) {
|
||||
if (cluster == null)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.INVALID_CLUSTER, args[1]);
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
cluster = ClusterManager.getCluster(plr.getLocation());
|
||||
if (cluster == null) {
|
||||
if (cluster == null)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (!cluster.owner.equals(UUIDHandler.getUUID(plr))) {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.regen.other")) {
|
||||
if (!cluster.owner.equals(UUIDHandler.getUUID(plr)))
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.regen.other"))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.regen.other");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
long start = System.currentTimeMillis();
|
||||
final long start = System.currentTimeMillis();
|
||||
ClusterManager.regenCluster(cluster);
|
||||
MainUtil.sendMessage(plr, C.CLUSTER_REGENERATED, (System.currentTimeMillis() - start) + "");
|
||||
return true;
|
||||
}
|
||||
case "add":
|
||||
case "inv":
|
||||
case "invite": {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.invite")) {
|
||||
case "invite":
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.invite"))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.invite");
|
||||
return false;
|
||||
}
|
||||
if (args.length != 2) {
|
||||
if (args.length != 2)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster invite <player>");
|
||||
return false;
|
||||
}
|
||||
// check if in cluster
|
||||
final PlotCluster cluster = ClusterManager.getCluster(plr.getLocation());
|
||||
if (cluster == null) {
|
||||
if (cluster == null)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER);
|
||||
return false;
|
||||
}
|
||||
if (!cluster.hasHelperRights(UUIDHandler.getUUID(plr))) {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.invite.other")) {
|
||||
if (!cluster.hasHelperRights(UUIDHandler.getUUID(plr)))
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.invite.other"))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.invite.other");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// check uuid
|
||||
final UUID uuid = UUIDHandler.getUUID(args[1], null);
|
||||
if (uuid == null) {
|
||||
if (uuid == null)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[2]);
|
||||
return false;
|
||||
}
|
||||
if (!cluster.isAdded(uuid)) {
|
||||
if (!cluster.isAdded(uuid))
|
||||
{
|
||||
// add the user if not added
|
||||
cluster.invited.add(uuid);
|
||||
final String world = plr.getLocation().getWorld();
|
||||
DBFunc.setInvited(world, cluster, uuid);
|
||||
final PlotPlayer player = UUIDHandler.getPlayer(uuid);
|
||||
if (player != null) {
|
||||
if (player != null)
|
||||
{
|
||||
MainUtil.sendMessage(player, C.CLUSTER_INVITED, cluster.getName());
|
||||
}
|
||||
}
|
||||
@ -440,51 +530,63 @@ public class Cluster extends SubCommand {
|
||||
}
|
||||
case "k":
|
||||
case "remove":
|
||||
case "kick": {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.kick")) {
|
||||
case "kick":
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.kick"))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.kick");
|
||||
return false;
|
||||
}
|
||||
if (args.length != 2) {
|
||||
if (args.length != 2)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster kick <player>");
|
||||
return false;
|
||||
}
|
||||
final PlotCluster cluster = ClusterManager.getCluster(plr.getLocation());
|
||||
if (cluster == null) {
|
||||
if (cluster == null)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER);
|
||||
return false;
|
||||
}
|
||||
if (!cluster.hasHelperRights(UUIDHandler.getUUID(plr))) {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.kick.other")) {
|
||||
if (!cluster.hasHelperRights(UUIDHandler.getUUID(plr)))
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.kick.other"))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.kick.other");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// check uuid
|
||||
final UUID uuid = UUIDHandler.getUUID(args[1], null);
|
||||
if (uuid == null) {
|
||||
if (uuid == null)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[1]);
|
||||
return false;
|
||||
}
|
||||
// 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());
|
||||
return false;
|
||||
}
|
||||
if (cluster.helpers.contains(uuid)) {
|
||||
if (cluster.helpers.contains(uuid))
|
||||
{
|
||||
cluster.helpers.remove(uuid);
|
||||
DBFunc.removeHelper(cluster, uuid);
|
||||
}
|
||||
cluster.invited.remove(uuid);
|
||||
DBFunc.removeInvited(cluster, uuid);
|
||||
final PlotPlayer player = UUIDHandler.getPlayer(uuid);
|
||||
if (player != null) {
|
||||
if (player != null)
|
||||
{
|
||||
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);
|
||||
if ((current != null) && current.equals(cluster)) {
|
||||
final String world = plr.getLocation().getWorld();
|
||||
if ((current != null) && current.equals(cluster))
|
||||
{
|
||||
plr.getLocation().getWorld();
|
||||
plot.unclaim();
|
||||
}
|
||||
}
|
||||
@ -492,49 +594,62 @@ public class Cluster extends SubCommand {
|
||||
return true;
|
||||
}
|
||||
case "quit":
|
||||
case "leave": {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.leave")) {
|
||||
case "leave":
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.leave"))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.leave");
|
||||
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]");
|
||||
return false;
|
||||
}
|
||||
PlotCluster cluster;
|
||||
if (args.length == 2) {
|
||||
if (args.length == 2)
|
||||
{
|
||||
cluster = ClusterManager.getCluster(plr.getLocation().getWorld(), args[1]);
|
||||
if (cluster == null) {
|
||||
if (cluster == null)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.INVALID_CLUSTER, args[1]);
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
cluster = ClusterManager.getCluster(plr.getLocation());
|
||||
if (cluster == null) {
|
||||
if (cluster == null)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
final UUID uuid = UUIDHandler.getUUID(plr);
|
||||
if (!cluster.isAdded(uuid)) {
|
||||
if (!cluster.isAdded(uuid))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.CLUSTER_NOT_ADDED);
|
||||
return false;
|
||||
}
|
||||
if (uuid.equals(cluster.owner)) {
|
||||
if (uuid.equals(cluster.owner))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.CLUSTER_CANNOT_LEAVE);
|
||||
return false;
|
||||
}
|
||||
if (cluster.helpers.contains(uuid)) {
|
||||
if (cluster.helpers.contains(uuid))
|
||||
{
|
||||
cluster.helpers.remove(uuid);
|
||||
DBFunc.removeHelper(cluster, uuid);
|
||||
}
|
||||
cluster.invited.remove(uuid);
|
||||
DBFunc.removeInvited(cluster, uuid);
|
||||
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);
|
||||
if ((current != null) && current.equals(cluster)) {
|
||||
final String world = plr.getLocation().getWorld();
|
||||
if ((current != null) && current.equals(cluster))
|
||||
{
|
||||
plr.getLocation().getWorld();
|
||||
plot.unclaim();
|
||||
}
|
||||
}
|
||||
@ -542,31 +657,38 @@ public class Cluster extends SubCommand {
|
||||
}
|
||||
case "admin":
|
||||
case "helper":
|
||||
case "helpers": {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.helpers")) {
|
||||
case "helpers":
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.helpers"))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.helpers");
|
||||
return false;
|
||||
}
|
||||
if (args.length != 3) {
|
||||
if (args.length != 3)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster helpers <add|remove> <player>");
|
||||
return false;
|
||||
}
|
||||
final PlotCluster cluster = ClusterManager.getCluster(plr.getLocation());
|
||||
if (cluster == null) {
|
||||
if (cluster == null)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER);
|
||||
return false;
|
||||
}
|
||||
final UUID uuid = UUIDHandler.getUUID(args[2], null);
|
||||
if (uuid == null) {
|
||||
if (uuid == null)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[2]);
|
||||
return false;
|
||||
}
|
||||
if (args[1].toLowerCase().equals("add")) {
|
||||
if (args[1].toLowerCase().equals("add"))
|
||||
{
|
||||
cluster.helpers.add(uuid);
|
||||
DBFunc.setHelper(cluster, uuid);
|
||||
return MainUtil.sendMessage(plr, C.CLUSTER_ADDED_HELPER);
|
||||
}
|
||||
if (args[1].toLowerCase().equals("remove")) {
|
||||
if (args[1].toLowerCase().equals("remove"))
|
||||
{
|
||||
cluster.helpers.remove(uuid);
|
||||
DBFunc.removeHelper(cluster, uuid);
|
||||
return MainUtil.sendMessage(plr, C.CLUSTER_REMOVED_HELPER);
|
||||
@ -576,23 +698,29 @@ public class Cluster extends SubCommand {
|
||||
}
|
||||
case "spawn":
|
||||
case "home":
|
||||
case "tp": {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.tp")) {
|
||||
case "tp":
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.tp"))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.tp");
|
||||
return false;
|
||||
}
|
||||
if (args.length != 2) {
|
||||
if (args.length != 2)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot cluster tp <name>");
|
||||
return false;
|
||||
}
|
||||
final PlotCluster cluster = ClusterManager.getCluster(plr.getLocation().getWorld(), args[1]);
|
||||
if (cluster == null) {
|
||||
if (cluster == null)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.INVALID_CLUSTER, args[1]);
|
||||
return false;
|
||||
}
|
||||
final UUID uuid = UUIDHandler.getUUID(plr);
|
||||
if (!cluster.isAdded(uuid)) {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.tp.other")) {
|
||||
if (!cluster.isAdded(uuid))
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.tp.other"))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.tp.other");
|
||||
return false;
|
||||
}
|
||||
@ -603,32 +731,41 @@ public class Cluster extends SubCommand {
|
||||
case "i":
|
||||
case "info":
|
||||
case "show":
|
||||
case "information": {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.info")) {
|
||||
case "information":
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.info"))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.info");
|
||||
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]");
|
||||
return false;
|
||||
}
|
||||
PlotCluster cluster;
|
||||
if (args.length == 2) {
|
||||
if (args.length == 2)
|
||||
{
|
||||
cluster = ClusterManager.getCluster(plr.getLocation().getWorld(), args[1]);
|
||||
if (cluster == null) {
|
||||
if (cluster == null)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.INVALID_CLUSTER, args[1]);
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
cluster = ClusterManager.getCluster(plr.getLocation());
|
||||
if (cluster == null) {
|
||||
if (cluster == null)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
final String id = cluster.toString();
|
||||
String owner = UUIDHandler.getName(cluster.owner);
|
||||
if (owner == null) {
|
||||
if (owner == null)
|
||||
{
|
||||
owner = "unknown";
|
||||
}
|
||||
final String name = cluster.getName();
|
||||
@ -645,22 +782,28 @@ public class Cluster extends SubCommand {
|
||||
}
|
||||
case "sh":
|
||||
case "setspawn":
|
||||
case "sethome": {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.sethome")) {
|
||||
case "sethome":
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.sethome"))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.sethome");
|
||||
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");
|
||||
return false;
|
||||
}
|
||||
final PlotCluster cluster = ClusterManager.getCluster(plr.getLocation());
|
||||
if (cluster == null) {
|
||||
if (cluster == null)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NOT_IN_CLUSTER);
|
||||
return false;
|
||||
}
|
||||
if (!cluster.hasHelperRights(UUIDHandler.getUUID(plr))) {
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.sethome.other")) {
|
||||
if (!cluster.hasHelperRights(UUIDHandler.getUUID(plr)))
|
||||
{
|
||||
if (!Permissions.hasPermission(plr, "plots.cluster.sethome.other"))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.cluster.sethome.other");
|
||||
return false;
|
||||
}
|
||||
|
@ -1,58 +1,59 @@
|
||||
package com.intellectualcrafters.plot.commands;
|
||||
|
||||
/**
|
||||
* CommandCategory
|
||||
*
|
||||
* @author Citymonstret
|
||||
* @author Empire92
|
||||
*/
|
||||
public enum CommandCategory {
|
||||
/**
|
||||
* Claiming Commands
|
||||
*
|
||||
* Such as: /plot claim
|
||||
*/
|
||||
CLAIMING("Claiming"),
|
||||
/**
|
||||
* Teleportation Commands
|
||||
*
|
||||
* Such as: /plot visit
|
||||
*/
|
||||
TELEPORT("Teleportation"),
|
||||
/**
|
||||
* Action Commands
|
||||
*
|
||||
* Such as: /plot clear
|
||||
*/
|
||||
ACTIONS("Actions"),
|
||||
/**
|
||||
* Information Commands
|
||||
*
|
||||
* Such as: /plot info
|
||||
*/
|
||||
INFO("Information"),
|
||||
/**
|
||||
* Debug Commands
|
||||
*
|
||||
* Such as: /plot debug
|
||||
*/
|
||||
DEBUG("Debug");
|
||||
/**
|
||||
* The category name (Readable)
|
||||
*/
|
||||
private final String name;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param name readable name
|
||||
*/
|
||||
CommandCategory(final String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return this.name;
|
||||
}
|
||||
}
|
||||
package com.intellectualcrafters.plot.commands;
|
||||
|
||||
/**
|
||||
* CommandCategory
|
||||
*
|
||||
*/
|
||||
public enum CommandCategory
|
||||
{
|
||||
/**
|
||||
* Claiming Commands
|
||||
*
|
||||
* Such as: /plot claim
|
||||
*/
|
||||
CLAIMING("Claiming"),
|
||||
/**
|
||||
* Teleportation Commands
|
||||
*
|
||||
* Such as: /plot visit
|
||||
*/
|
||||
TELEPORT("Teleportation"),
|
||||
/**
|
||||
* Action Commands
|
||||
*
|
||||
* Such as: /plot clear
|
||||
*/
|
||||
ACTIONS("Actions"),
|
||||
/**
|
||||
* Information Commands
|
||||
*
|
||||
* Such as: /plot info
|
||||
*/
|
||||
INFO("Information"),
|
||||
/**
|
||||
* Debug Commands
|
||||
*
|
||||
* Such as: /plot debug
|
||||
*/
|
||||
DEBUG("Debug");
|
||||
/**
|
||||
* The category name (Readable)
|
||||
*/
|
||||
private final String name;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param name readable name
|
||||
*/
|
||||
CommandCategory(final String name)
|
||||
{
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return name;
|
||||
}
|
||||
}
|
||||
|
@ -1,52 +1,54 @@
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// PlotSquared - A plot manager and world generator for the Bukkit API /
|
||||
// Copyright (c) 2014 IntellectualSites/IntellectualCrafters /
|
||||
// /
|
||||
// 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 /
|
||||
// the Free Software Foundation; either version 3 of the License, or /
|
||||
// (at your option) any later version. /
|
||||
// /
|
||||
// This program is distributed in the hope that it will be useful, /
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of /
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /
|
||||
// GNU General Public License for more details. /
|
||||
// /
|
||||
// You should have received a copy of the GNU General Public License /
|
||||
// along with this program; if not, write to the Free Software Foundation, /
|
||||
// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA /
|
||||
// /
|
||||
// You can contact us via: support@intellectualsites.com /
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
package com.intellectualcrafters.plot.commands;
|
||||
|
||||
import com.intellectualcrafters.plot.object.PlotPlayer;
|
||||
import com.intellectualcrafters.plot.util.Permissions;
|
||||
|
||||
/**
|
||||
* Created by Citymonstret on 2014-08-03.
|
||||
*
|
||||
* @author Citymonstret
|
||||
*/
|
||||
public class CommandPermission {
|
||||
/**
|
||||
* Permission Node
|
||||
*/
|
||||
public final String permission;
|
||||
|
||||
/**
|
||||
* @param permission Command Permission
|
||||
*/
|
||||
public CommandPermission(final String permission) {
|
||||
this.permission = permission.toLowerCase();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param player Does the player have the permission?
|
||||
*
|
||||
* @return true of player has the required permission node
|
||||
*/
|
||||
public boolean hasPermission(final PlotPlayer player) {
|
||||
return Permissions.hasPermission(player, this.permission);
|
||||
}
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// PlotSquared - A plot manager and world generator for the Bukkit API /
|
||||
// Copyright (c) 2014 IntellectualSites/IntellectualCrafters /
|
||||
// /
|
||||
// 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 /
|
||||
// the Free Software Foundation; either version 3 of the License, or /
|
||||
// (at your option) any later version. /
|
||||
// /
|
||||
// This program is distributed in the hope that it will be useful, /
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of /
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the /
|
||||
// GNU General Public License for more details. /
|
||||
// /
|
||||
// You should have received a copy of the GNU General Public License /
|
||||
// along with this program; if not, write to the Free Software Foundation, /
|
||||
// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA /
|
||||
// /
|
||||
// You can contact us via: support@intellectualsites.com /
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
package com.intellectualcrafters.plot.commands;
|
||||
|
||||
import com.intellectualcrafters.plot.object.PlotPlayer;
|
||||
import com.intellectualcrafters.plot.util.Permissions;
|
||||
|
||||
/**
|
||||
* Created by Citymonstret on 2014-08-03.
|
||||
*
|
||||
*/
|
||||
public class CommandPermission
|
||||
{
|
||||
/**
|
||||
* Permission Node
|
||||
*/
|
||||
public final String permission;
|
||||
|
||||
/**
|
||||
* @param permission Command Permission
|
||||
*/
|
||||
public CommandPermission(final String permission)
|
||||
{
|
||||
this.permission = permission.toLowerCase();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param player Does the player have the permission?
|
||||
*
|
||||
* @return true of player has the required permission node
|
||||
*/
|
||||
public boolean hasPermission(final PlotPlayer player)
|
||||
{
|
||||
return Permissions.hasPermission(player, permission);
|
||||
}
|
||||
}
|
||||
|
@ -36,56 +36,66 @@ import com.intellectualcrafters.plot.util.UUIDHandler;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "comment",
|
||||
aliases = {"msg"},
|
||||
description = "Comment on a plot",
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE,
|
||||
permission = "plots.comment"
|
||||
)
|
||||
public class Comment extends SubCommand {
|
||||
command = "comment",
|
||||
aliases = { "msg" },
|
||||
description = "Comment on a plot",
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE,
|
||||
permission = "plots.comment")
|
||||
public class Comment extends SubCommand
|
||||
{
|
||||
|
||||
@Override
|
||||
public boolean onCommand(PlotPlayer player, String[] args) {
|
||||
if (args.length < 2) {
|
||||
sendMessage(player, C.COMMENT_SYNTAX, StringMan.join(CommentManager.inboxes.keySet(),"|"));
|
||||
public boolean onCommand(final PlotPlayer player, final String[] args)
|
||||
{
|
||||
if (args.length < 2)
|
||||
{
|
||||
sendMessage(player, C.COMMENT_SYNTAX, StringMan.join(CommentManager.inboxes.keySet(), "|"));
|
||||
return false;
|
||||
}
|
||||
CommentInbox inbox = CommentManager.inboxes.get(args[0].toLowerCase());
|
||||
if (inbox == null) {
|
||||
sendMessage(player, C.COMMENT_SYNTAX, StringMan.join(CommentManager.inboxes.keySet(),"|"));
|
||||
final CommentInbox inbox = CommentManager.inboxes.get(args[0].toLowerCase());
|
||||
if (inbox == null)
|
||||
{
|
||||
sendMessage(player, C.COMMENT_SYNTAX, StringMan.join(CommentManager.inboxes.keySet(), "|"));
|
||||
return false;
|
||||
}
|
||||
Plot plot;
|
||||
Location loc = player.getLocation();
|
||||
PlotId id = PlotId.fromString(args[1]);
|
||||
final Location loc = player.getLocation();
|
||||
final PlotId id = PlotId.fromString(args[1]);
|
||||
int index;
|
||||
if (id != null) {
|
||||
if (args.length < 4) {
|
||||
sendMessage(player, C.COMMENT_SYNTAX, StringMan.join(CommentManager.inboxes.keySet(),"|"));
|
||||
if (id != null)
|
||||
{
|
||||
if (args.length < 4)
|
||||
{
|
||||
sendMessage(player, C.COMMENT_SYNTAX, StringMan.join(CommentManager.inboxes.keySet(), "|"));
|
||||
return false;
|
||||
}
|
||||
index = 2;
|
||||
plot = MainUtil.getPlot(loc.getWorld(), id);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
index = 1;
|
||||
plot = MainUtil.getPlot(loc);
|
||||
}
|
||||
if (!inbox.canWrite(plot, player)) {
|
||||
if (!inbox.canWrite(plot, player))
|
||||
{
|
||||
sendMessage(player, C.NO_PERM_INBOX, "");
|
||||
return false;
|
||||
}
|
||||
String message = StringMan.join(Arrays.copyOfRange(args,index, args.length), " ");
|
||||
PlotComment comment = new PlotComment(loc.getWorld(), id, message, player.getName(), inbox.toString(), System.currentTimeMillis());
|
||||
boolean result = inbox.addComment(plot, comment);
|
||||
if (!result) {
|
||||
final String message = StringMan.join(Arrays.copyOfRange(args, index, args.length), " ");
|
||||
final PlotComment comment = new PlotComment(loc.getWorld(), id, message, player.getName(), inbox.toString(), System.currentTimeMillis());
|
||||
final boolean result = inbox.addComment(plot, comment);
|
||||
if (!result)
|
||||
{
|
||||
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;
|
||||
}
|
||||
for (PlotPlayer pp : UUIDHandler.getPlayers().values()) {
|
||||
if (pp.getAttribute("chatspy")) {
|
||||
for (final PlotPlayer pp : UUIDHandler.getPlayers().values())
|
||||
{
|
||||
if (pp.getAttribute("chatspy"))
|
||||
{
|
||||
MainUtil.sendMessage(pp, "/plot comment " + StringMan.join(args, " "));
|
||||
}
|
||||
}
|
||||
|
@ -36,42 +36,51 @@ import com.intellectualcrafters.plot.util.MathMan;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "condense",
|
||||
permission = "plots.admin",
|
||||
description = "Condense a plotworld",
|
||||
category = CommandCategory.DEBUG,
|
||||
requiredType = RequiredType.CONSOLE
|
||||
)
|
||||
public class Condense extends SubCommand {
|
||||
command = "condense",
|
||||
permission = "plots.admin",
|
||||
description = "Condense a plotworld",
|
||||
category = CommandCategory.DEBUG,
|
||||
requiredType = RequiredType.CONSOLE)
|
||||
public class Condense extends SubCommand
|
||||
{
|
||||
|
||||
public static boolean TASK = false;
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, String ... args) {
|
||||
if ((args.length != 2) && (args.length != 3)) {
|
||||
public boolean onCommand(final PlotPlayer plr, final String... args)
|
||||
{
|
||||
if ((args.length != 2) && (args.length != 3))
|
||||
{
|
||||
MainUtil.sendMessage(plr, "/plot condense <world> <start|stop|info> [radius]");
|
||||
return false;
|
||||
}
|
||||
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");
|
||||
return false;
|
||||
}
|
||||
switch (args[1].toLowerCase()) {
|
||||
case "start": {
|
||||
if (args.length == 2) {
|
||||
switch (args[1].toLowerCase())
|
||||
{
|
||||
case "start":
|
||||
{
|
||||
if (args.length == 2)
|
||||
{
|
||||
MainUtil.sendMessage(plr, "/plot condense " + worldname + " start <radius>");
|
||||
return false;
|
||||
}
|
||||
if (TASK) {
|
||||
if (TASK)
|
||||
{
|
||||
MainUtil.sendMessage(plr, "TASK ALREADY STARTED");
|
||||
return false;
|
||||
}
|
||||
if (args.length == 2) {
|
||||
if (args.length == 2)
|
||||
{
|
||||
MainUtil.sendMessage(plr, "/plot condense " + worldname + " start <radius>");
|
||||
return false;
|
||||
}
|
||||
if (!MathMan.isInteger(args[2])) {
|
||||
if (!MathMan.isInteger(args[2]))
|
||||
{
|
||||
MainUtil.sendMessage(plr, "INVALID RADIUS");
|
||||
return false;
|
||||
}
|
||||
@ -79,61 +88,76 @@ public class Condense extends SubCommand {
|
||||
final Collection<Plot> plots = PS.get().getPlotsInWorld(worldname);
|
||||
final int size = plots.size();
|
||||
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");
|
||||
return false;
|
||||
}
|
||||
final List<PlotId> to_move = new ArrayList<>(getPlots(plots, radius));
|
||||
final List<PlotId> free = new ArrayList<>();
|
||||
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);
|
||||
if (!plot.hasOwner()) {
|
||||
if (!plot.hasOwner())
|
||||
{
|
||||
free.add(plot.id);
|
||||
}
|
||||
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");
|
||||
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
|
||||
public void run() {
|
||||
if (!TASK) {
|
||||
public void run()
|
||||
{
|
||||
if (!TASK)
|
||||
{
|
||||
MainUtil.sendMessage(plr, "CONDENSE TASK CANCELLED");
|
||||
return;
|
||||
}
|
||||
to_move.remove(0);
|
||||
free.remove(0);
|
||||
int index = 0;
|
||||
for (final PlotId id : to_move) {
|
||||
for (final PlotId id : to_move)
|
||||
{
|
||||
final Plot plot = MainUtil.getPlot(worldname, id);
|
||||
if (plot.hasOwner()) {
|
||||
if (plot.hasOwner())
|
||||
{
|
||||
break;
|
||||
}
|
||||
index++;
|
||||
}
|
||||
for (int i = 0; i < index; i++) {
|
||||
for (int i = 0; i < index; i++)
|
||||
{
|
||||
to_move.remove(0);
|
||||
}
|
||||
index = 0;
|
||||
for (final PlotId id : free) {
|
||||
for (final PlotId id : free)
|
||||
{
|
||||
final Plot plot = MainUtil.getPlot(worldname, id);
|
||||
if (!plot.hasOwner()) {
|
||||
if (!plot.hasOwner())
|
||||
{
|
||||
break;
|
||||
}
|
||||
index++;
|
||||
}
|
||||
for (int i = 0; i < index; i++) {
|
||||
for (int i = 0; i < index; i++)
|
||||
{
|
||||
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.");
|
||||
TASK = false;
|
||||
return;
|
||||
}
|
||||
if (free.size() == 0) {
|
||||
if (free.size() == 0)
|
||||
{
|
||||
MainUtil.sendMessage(plr, "TASK FAILED. NO FREE PLOTS FOUND!");
|
||||
TASK = false;
|
||||
return;
|
||||
@ -146,8 +170,10 @@ public class Condense extends SubCommand {
|
||||
MainUtil.sendMessage(plr, "TASK STARTED...");
|
||||
return true;
|
||||
}
|
||||
case "stop": {
|
||||
if (!TASK) {
|
||||
case "stop":
|
||||
{
|
||||
if (!TASK)
|
||||
{
|
||||
MainUtil.sendMessage(plr, "TASK ALREADY STOPPED");
|
||||
return false;
|
||||
}
|
||||
@ -155,12 +181,15 @@ public class Condense extends SubCommand {
|
||||
MainUtil.sendMessage(plr, "TASK STOPPED");
|
||||
return true;
|
||||
}
|
||||
case "info": {
|
||||
if (args.length == 2) {
|
||||
case "info":
|
||||
{
|
||||
if (args.length == 2)
|
||||
{
|
||||
MainUtil.sendMessage(plr, "/plot condense " + worldname + " info <radius>");
|
||||
return false;
|
||||
}
|
||||
if (!MathMan.isInteger(args[2])) {
|
||||
if (!MathMan.isInteger(args[2]))
|
||||
{
|
||||
MainUtil.sendMessage(plr, "INVALID RADIUS");
|
||||
return false;
|
||||
}
|
||||
@ -168,7 +197,8 @@ public class Condense extends SubCommand {
|
||||
final Collection<Plot> plots = PS.get().getPlotsInWorld(worldname);
|
||||
final int size = plots.size();
|
||||
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");
|
||||
return false;
|
||||
}
|
||||
@ -189,10 +219,13 @@ public class Condense extends SubCommand {
|
||||
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<>();
|
||||
for (final Plot plot : plots) {
|
||||
if ((plot.id.x > radius) || (plot.id.x < -radius) || (plot.id.y > radius) || (plot.id.y < -radius)) {
|
||||
for (final Plot plot : plots)
|
||||
{
|
||||
if ((plot.id.x > radius) || (plot.id.x < -radius) || (plot.id.y > radius) || (plot.id.y < -radius))
|
||||
{
|
||||
outside.add(plot.id);
|
||||
}
|
||||
}
|
||||
|
@ -20,7 +20,6 @@
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
package com.intellectualcrafters.plot.commands;
|
||||
|
||||
|
||||
import com.intellectualcrafters.plot.config.C;
|
||||
import com.intellectualcrafters.plot.object.CmdInstance;
|
||||
import com.intellectualcrafters.plot.object.PlotPlayer;
|
||||
@ -30,26 +29,29 @@ import com.intellectualcrafters.plot.util.TaskManager;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "confirm",
|
||||
permission = "plots.use",
|
||||
description = "Confirm an action",
|
||||
category = CommandCategory.ACTIONS
|
||||
)
|
||||
public class Confirm extends SubCommand {
|
||||
command = "confirm",
|
||||
permission = "plots.use",
|
||||
description = "Confirm an action",
|
||||
category = CommandCategory.ACTIONS)
|
||||
public class Confirm extends SubCommand
|
||||
{
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String ... args) {
|
||||
CmdInstance command = CmdConfirm.getPending(plr);
|
||||
if (command == null) {
|
||||
MainUtil.sendMessage(plr, C.FAILED_CONFIRM);
|
||||
return false;
|
||||
}
|
||||
CmdConfirm.removePending(plr);
|
||||
if (System.currentTimeMillis() - command.timestamp > 20000) {
|
||||
MainUtil.sendMessage(plr, C.FAILED_CONFIRM);
|
||||
return false;
|
||||
}
|
||||
TaskManager.runTask(command.command);
|
||||
return true;
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String... args)
|
||||
{
|
||||
final CmdInstance command = CmdConfirm.getPending(plr);
|
||||
if (command == null)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.FAILED_CONFIRM);
|
||||
return false;
|
||||
}
|
||||
CmdConfirm.removePending(plr);
|
||||
if ((System.currentTimeMillis() - command.timestamp) > 20000)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.FAILED_CONFIRM);
|
||||
return false;
|
||||
}
|
||||
TaskManager.runTask(command.command);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -22,49 +22,46 @@ package com.intellectualcrafters.plot.commands;
|
||||
|
||||
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.Plot;
|
||||
import com.intellectualcrafters.plot.object.PlotAnalysis;
|
||||
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.Permissions;
|
||||
import com.intellectualcrafters.plot.util.UUIDHandler;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "continue",
|
||||
description = "Continue a plot that was previously marked as done",
|
||||
permission = "plots.continue",
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE
|
||||
)
|
||||
public class Continue extends SubCommand {
|
||||
command = "continue",
|
||||
description = "Continue a plot that was previously marked as done",
|
||||
permission = "plots.continue",
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE)
|
||||
public class Continue extends SubCommand
|
||||
{
|
||||
|
||||
@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 Plot plot = MainUtil.getPlot(loc);
|
||||
if (plot == null || !plot.hasOwner()) {
|
||||
return !sendMessage(plr, C.NOT_IN_PLOT);
|
||||
}
|
||||
if ((!plot.isOwner(plr.getUUID())) && !Permissions.hasPermission(plr, "plots.admin.command.continue")) {
|
||||
if ((plot == null) || !plot.hasOwner()) { return !sendMessage(plr, C.NOT_IN_PLOT); }
|
||||
if ((!plot.isOwner(plr.getUUID())) && !Permissions.hasPermission(plr, "plots.admin.command.continue"))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NO_PLOT_PERMS);
|
||||
return false;
|
||||
}
|
||||
if (!plot.getSettings().flags.containsKey("done")) {
|
||||
if (!plot.getSettings().flags.containsKey("done"))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.DONE_NOT_DONE);
|
||||
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");
|
||||
return false;
|
||||
}
|
||||
if (MainUtil.runners.containsKey(plot)) {
|
||||
if (MainUtil.runners.containsKey(plot))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER);
|
||||
return false;
|
||||
}
|
||||
|
@ -31,53 +31,61 @@ import com.plotsquared.general.commands.Argument;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "copy",
|
||||
permission = "plots.copy",
|
||||
aliases = {"copypaste"},
|
||||
category = CommandCategory.ACTIONS,
|
||||
description = "Copy a plot",
|
||||
usage = "/plot copy <X;Z>",
|
||||
requiredType = RequiredType.NONE
|
||||
)
|
||||
public class Copy extends SubCommand {
|
||||
command = "copy",
|
||||
permission = "plots.copy",
|
||||
aliases = { "copypaste" },
|
||||
category = CommandCategory.ACTIONS,
|
||||
description = "Copy a plot",
|
||||
usage = "/plot copy <X;Z>",
|
||||
requiredType = RequiredType.NONE)
|
||||
public class Copy extends SubCommand
|
||||
{
|
||||
|
||||
public Copy() {
|
||||
public Copy()
|
||||
{
|
||||
requiredArguments = new Argument[] {
|
||||
Argument.PlotID
|
||||
Argument.PlotID
|
||||
};
|
||||
}
|
||||
|
||||
@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 Plot plot1 = MainUtil.getPlot(loc);
|
||||
if (plot1 == null) {
|
||||
return !MainUtil.sendMessage(plr, C.NOT_IN_PLOT);
|
||||
}
|
||||
if (!plot1.isAdded(plr.getUUID()) && !Permissions.hasPermission(plr, C.PERMISSION_ADMIN.s())) {
|
||||
if (plot1 == null) { return !MainUtil.sendMessage(plr, C.NOT_IN_PLOT); }
|
||||
if (!plot1.isAdded(plr.getUUID()) && !Permissions.hasPermission(plr, C.PERMISSION_ADMIN.s()))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NO_PLOT_PERMS);
|
||||
return false;
|
||||
}
|
||||
final String world = loc.getWorld();
|
||||
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.COMMAND_SYNTAX, "/plot copy <X;Z>");
|
||||
return false;
|
||||
}
|
||||
if (plot1.id.equals(plot2)) {
|
||||
if (plot1.id.equals(plot2))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NOT_VALID_PLOT_ID);
|
||||
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot copy <X;Z>");
|
||||
return false;
|
||||
}
|
||||
if (MainUtil.copy(world, plot1.id, plot2, new Runnable() {
|
||||
if (MainUtil.copy(world, plot1.id, plot2, new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run() {
|
||||
public void run()
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.COPY_SUCCESS);
|
||||
}
|
||||
})) {
|
||||
}))
|
||||
{
|
||||
return true;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.REQUIRES_UNOWNED);
|
||||
return false;
|
||||
}
|
||||
|
@ -31,26 +31,23 @@ import com.intellectualcrafters.plot.util.MainUtil;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "createroadschematic",
|
||||
aliases = {"crs"},
|
||||
category = CommandCategory.DEBUG,
|
||||
requiredType = RequiredType.NONE,
|
||||
permission = "plots.createroadschematic",
|
||||
description = "Add a road schematic to your world using the roads around your current plot",
|
||||
usage = "/plot createroadschematic"
|
||||
)
|
||||
public class CreateRoadSchematic extends SubCommand {
|
||||
command = "createroadschematic",
|
||||
aliases = { "crs" },
|
||||
category = CommandCategory.DEBUG,
|
||||
requiredType = RequiredType.NONE,
|
||||
permission = "plots.createroadschematic",
|
||||
description = "Add a road schematic to your world using the roads around your current plot",
|
||||
usage = "/plot createroadschematic")
|
||||
public class CreateRoadSchematic extends SubCommand
|
||||
{
|
||||
|
||||
@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 Plot plot = MainUtil.getPlot(loc);
|
||||
if (plot == null) {
|
||||
return sendMessage(player, C.NOT_IN_PLOT);
|
||||
}
|
||||
if (!(PS.get().getPlotWorld(loc.getWorld()) instanceof HybridPlotWorld)) {
|
||||
return sendMessage(player, C.NOT_IN_PLOT_WORLD);
|
||||
}
|
||||
if (plot == null) { return sendMessage(player, C.NOT_IN_PLOT); }
|
||||
if (!(PS.get().getPlotWorld(loc.getWorld()) instanceof HybridPlotWorld)) { return sendMessage(player, C.NOT_IN_PLOT_WORLD); }
|
||||
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");
|
||||
return true;
|
||||
|
@ -3,12 +3,10 @@ package com.intellectualcrafters.plot.commands;
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import com.intellectualcrafters.plot.PS;
|
||||
import com.intellectualcrafters.plot.config.Settings;
|
||||
import com.intellectualcrafters.plot.database.DBFunc;
|
||||
import com.intellectualcrafters.plot.database.MySQL;
|
||||
import com.intellectualcrafters.plot.database.SQLManager;
|
||||
@ -21,35 +19,45 @@ import com.intellectualcrafters.plot.util.TaskManager;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "database",
|
||||
aliases = {"convert"},
|
||||
category = CommandCategory.DEBUG,
|
||||
permission = "plots.database",
|
||||
description = "Convert/Backup Storage",
|
||||
requiredType = RequiredType.CONSOLE,
|
||||
usage = "/plots database [world] <sqlite|mysql|import>"
|
||||
|
||||
)
|
||||
public class Database extends SubCommand {
|
||||
command = "database",
|
||||
aliases = { "convert" },
|
||||
category = CommandCategory.DEBUG,
|
||||
permission = "plots.database",
|
||||
description = "Convert/Backup Storage",
|
||||
requiredType = RequiredType.CONSOLE,
|
||||
usage = "/plots database [world] <sqlite|mysql|import>"
|
||||
|
||||
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
|
||||
public void run() {
|
||||
try {
|
||||
public void run()
|
||||
{
|
||||
try
|
||||
{
|
||||
final ArrayList<Plot> ps = new ArrayList<>();
|
||||
for (final Plot p : plots) {
|
||||
for (final Plot p : plots)
|
||||
{
|
||||
ps.add(p);
|
||||
}
|
||||
MainUtil.sendMessage(player, "&6Starting...");
|
||||
manager.createPlotsAndData(ps, new Runnable() {
|
||||
manager.createPlotsAndData(ps, new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run() {
|
||||
public void run()
|
||||
{
|
||||
MainUtil.sendMessage(player, "&6Database conversion finished!");
|
||||
manager.close();
|
||||
}
|
||||
});
|
||||
} catch (final Exception e) {
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
MainUtil.sendMessage(player, "Failed to insert plot objects, see stacktrace for info");
|
||||
e.printStackTrace();
|
||||
}
|
||||
@ -58,42 +66,54 @@ public class Database extends SubCommand {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer player, String[] args) {
|
||||
if (args.length < 1) {
|
||||
public boolean onCommand(final PlotPlayer player, String[] args)
|
||||
{
|
||||
if (args.length < 1)
|
||||
{
|
||||
MainUtil.sendMessage(player, "/plot database [world] <sqlite|mysql>");
|
||||
return false;
|
||||
}
|
||||
ArrayList<Plot> plots;
|
||||
if (PS.get().isPlotWorld(args[0])) {
|
||||
if (PS.get().isPlotWorld(args[0]))
|
||||
{
|
||||
plots = PS.get().sortPlotsByTemp(PS.get().getPlotsInWorld(args[0]));
|
||||
args = Arrays.copyOfRange(args, 1, args.length);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
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, "[arg] indicates an optional argument");
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
try
|
||||
{
|
||||
com.intellectualcrafters.plot.database.Database implementation;
|
||||
String prefix = "";
|
||||
switch (args[0].toLowerCase()) {
|
||||
case "import": {
|
||||
if (args.length < 2) {
|
||||
switch (args[0].toLowerCase())
|
||||
{
|
||||
case "import":
|
||||
{
|
||||
if (args.length < 2)
|
||||
{
|
||||
MainUtil.sendMessage(player, "/plot database import [sqlite file] [prefix]");
|
||||
return false;
|
||||
}
|
||||
MainUtil.sendMessage(player, "&6Starting...");
|
||||
implementation = new SQLite(PS.get().IMP.getDirectory() + File.separator + args[1] + ".db");
|
||||
SQLManager manager = new SQLManager(implementation, (args.length == 3) ? args[2] : "", true);
|
||||
ConcurrentHashMap<String, ConcurrentHashMap<PlotId, Plot>> map = manager.getPlots();
|
||||
final SQLManager manager = new SQLManager(implementation, (args.length == 3) ? args[2] : "", true);
|
||||
final ConcurrentHashMap<String, ConcurrentHashMap<PlotId, Plot>> map = manager.getPlots();
|
||||
plots = new ArrayList<Plot>();
|
||||
for (Entry<String, ConcurrentHashMap<PlotId, Plot>> entry : map.entrySet()) {
|
||||
for (Entry<PlotId, Plot> entry2 : entry.getValue().entrySet()) {
|
||||
Plot plot = entry2.getValue();
|
||||
if (PS.get().getPlot(plot.world, plot.id) != null) {
|
||||
for (final Entry<String, ConcurrentHashMap<PlotId, Plot>> entry : map.entrySet())
|
||||
{
|
||||
for (final Entry<PlotId, Plot> entry2 : entry.getValue().entrySet())
|
||||
{
|
||||
final Plot plot = entry2.getValue();
|
||||
if (PS.get().getPlot(plot.world, plot.id) != null)
|
||||
{
|
||||
MainUtil.sendMessage(player, "Skipping duplicate plot: " + plot + " | id=" + plot.temp);
|
||||
continue;
|
||||
}
|
||||
@ -101,43 +121,44 @@ public class Database extends SubCommand {
|
||||
plots.add(entry2.getValue());
|
||||
}
|
||||
}
|
||||
DBFunc.createPlotsAndData(plots, new Runnable() {
|
||||
DBFunc.createPlotsAndData(plots, new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run() {
|
||||
public void run()
|
||||
{
|
||||
MainUtil.sendMessage(player, "&6Database conversion finished!");
|
||||
}
|
||||
});
|
||||
return true;
|
||||
}
|
||||
case "mysql":
|
||||
if (args.length < 6) {
|
||||
return MainUtil.sendMessage(player, "/plot database mysql [host] [port] [username] [password] [database] {prefix}");
|
||||
}
|
||||
if (args.length < 6) { return MainUtil.sendMessage(player, "/plot database mysql [host] [port] [username] [password] [database] {prefix}"); }
|
||||
final String host = args[1];
|
||||
final String port = args[2];
|
||||
final String username = args[3];
|
||||
final String password = args[4];
|
||||
final String database = args[5];
|
||||
if (args.length > 6) {
|
||||
if (args.length > 6)
|
||||
{
|
||||
prefix = args[6];
|
||||
}
|
||||
implementation = new MySQL(host, port, database, username, password);
|
||||
break;
|
||||
case "sqlite":
|
||||
if (args.length < 2) {
|
||||
return MainUtil.sendMessage(player, "/plot database sqlite [file]");
|
||||
}
|
||||
if (args.length < 2) { return MainUtil.sendMessage(player, "/plot database sqlite [file]"); }
|
||||
implementation = new SQLite(PS.get().IMP.getDirectory() + File.separator + args[1] + ".db");
|
||||
break;
|
||||
default:
|
||||
return MainUtil.sendMessage(player, "/plot database [sqlite/mysql]");
|
||||
}
|
||||
try {
|
||||
try
|
||||
{
|
||||
final SQLManager manager = new SQLManager(implementation, prefix, true);
|
||||
insertPlots(manager, plots, player);
|
||||
return true;
|
||||
}
|
||||
catch (Exception e) {
|
||||
catch (final Exception e)
|
||||
{
|
||||
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 ===");
|
||||
e.printStackTrace();
|
||||
@ -146,7 +167,8 @@ public class Database extends SubCommand {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
catch (final Exception e)
|
||||
{
|
||||
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 ===");
|
||||
e.printStackTrace();
|
||||
|
@ -28,19 +28,22 @@ import com.intellectualcrafters.plot.util.MainUtil;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "debug",
|
||||
category = CommandCategory.DEBUG,
|
||||
description = "Show debug information",
|
||||
usage = "/plot debug [msg]",
|
||||
permission = "plots.admin"
|
||||
)
|
||||
public class Debug extends SubCommand {
|
||||
command = "debug",
|
||||
category = CommandCategory.DEBUG,
|
||||
description = "Show debug information",
|
||||
usage = "/plot debug [msg]",
|
||||
permission = "plots.admin")
|
||||
public class Debug extends SubCommand
|
||||
{
|
||||
|
||||
@Override
|
||||
public boolean onCommand(PlotPlayer plr, String[] args) {
|
||||
if ((args.length > 0) && args[0].equalsIgnoreCase("msg")) {
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
if ((args.length > 0) && args[0].equalsIgnoreCase("msg"))
|
||||
{
|
||||
final StringBuilder msg = new StringBuilder();
|
||||
for (final C c : C.values()) {
|
||||
for (final C c : C.values())
|
||||
{
|
||||
msg.append(c.s()).append("\n");
|
||||
}
|
||||
MainUtil.sendMessage(plr, msg.toString());
|
||||
@ -56,7 +59,8 @@ public class Debug extends SubCommand {
|
||||
}
|
||||
{
|
||||
final StringBuilder worlds = new StringBuilder("");
|
||||
for (final String world : PS.get().getPlotWorlds()) {
|
||||
for (final String world : PS.get().getPlotWorlds())
|
||||
{
|
||||
worlds.append(world).append(" ");
|
||||
}
|
||||
information.append(header);
|
||||
@ -77,11 +81,13 @@ public class Debug extends SubCommand {
|
||||
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";
|
||||
}
|
||||
|
||||
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";
|
||||
}
|
||||
}
|
||||
|
@ -9,24 +9,28 @@ import com.intellectualcrafters.plot.object.PlotPlayer;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "debugallowunsafe",
|
||||
description = "Allow unsafe actions until toggled off",
|
||||
usage = "/plot debugallowunsafe",
|
||||
category = CommandCategory.DEBUG,
|
||||
requiredType = RequiredType.NONE,
|
||||
permission = "plots.debugallowunsafe"
|
||||
)
|
||||
public class DebugAllowUnsafe extends SubCommand {
|
||||
command = "debugallowunsafe",
|
||||
description = "Allow unsafe actions until toggled off",
|
||||
usage = "/plot debugallowunsafe",
|
||||
category = CommandCategory.DEBUG,
|
||||
requiredType = RequiredType.NONE,
|
||||
permission = "plots.debugallowunsafe")
|
||||
public class DebugAllowUnsafe extends SubCommand
|
||||
{
|
||||
|
||||
public static final List<UUID> unsafeAllowed = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String ... args) {
|
||||
|
||||
if (unsafeAllowed.contains(plr.getUUID())) {
|
||||
public boolean onCommand(final PlotPlayer plr, final String... args)
|
||||
{
|
||||
|
||||
if (unsafeAllowed.contains(plr.getUUID()))
|
||||
{
|
||||
unsafeAllowed.remove(plr.getUUID());
|
||||
sendMessage(plr, C.DEBUGALLOWUNSAFE_OFF);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
unsafeAllowed.add(plr.getUUID());
|
||||
sendMessage(plr, C.DEBUGALLOWUNSAFE_ON);
|
||||
}
|
||||
|
@ -43,25 +43,29 @@ import com.intellectualcrafters.plot.util.UUIDHandler;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
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",
|
||||
category = CommandCategory.DEBUG,
|
||||
requiredType = RequiredType.CONSOLE,
|
||||
permission = "plots.debugclaimtest"
|
||||
)
|
||||
public class DebugClaimTest extends SubCommand {
|
||||
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",
|
||||
category = CommandCategory.DEBUG,
|
||||
requiredType = RequiredType.CONSOLE,
|
||||
permission = "plots.debugclaimtest")
|
||||
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, "");
|
||||
}
|
||||
|
||||
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);
|
||||
if (result) {
|
||||
if (result)
|
||||
{
|
||||
MainUtil.createPlot(player.getUUID(), plot);
|
||||
MainUtil.setSign(player.getName(), plot);
|
||||
MainUtil.sendMessage(player, C.CLAIMED);
|
||||
if (teleport) {
|
||||
if (teleport)
|
||||
{
|
||||
MainUtil.teleportPlayer(player, player.getLocation(), plot);
|
||||
}
|
||||
}
|
||||
@ -69,81 +73,103 @@ public class DebugClaimTest extends SubCommand {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(PlotPlayer plr, 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}");
|
||||
}
|
||||
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}"); }
|
||||
final String world = args[0];
|
||||
if (!BlockManager.manager.isWorld(world) || !PS.get().isPlotWorld(world)) {
|
||||
return !MainUtil.sendMessage(null, "&cInvalid plot world!");
|
||||
}
|
||||
if (!BlockManager.manager.isWorld(world) || !PS.get().isPlotWorld(world)) { return !MainUtil.sendMessage(null, "&cInvalid plot world!"); }
|
||||
PlotId min, max;
|
||||
try {
|
||||
final String[] split1 = args[1].split(";");
|
||||
final String[] split2 = args[2].split(";");
|
||||
try
|
||||
{
|
||||
args[1].split(";");
|
||||
args[2].split(";");
|
||||
min = PlotId.fromString(args[1]);
|
||||
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: Found an excess of 250,000 chunks. Limiting search radius... (~3.8 min)");
|
||||
final PlotManager manager = PS.get().getPlotManager(world);
|
||||
final PlotWorld plotworld = PS.get().getPlotWorld(world);
|
||||
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);
|
||||
if (PS.get().getPlot(world, plot.id) != null) {
|
||||
if (PS.get().getPlot(world, plot.id) != null)
|
||||
{
|
||||
MainUtil.sendMessage(null, " - &cDB Already contains: " + plot.id);
|
||||
continue;
|
||||
}
|
||||
final Location loc = manager.getSignLoc(plotworld, plot);
|
||||
final ChunkLoc chunk = new ChunkLoc(loc.getX() >> 4, loc.getZ() >> 4);
|
||||
final boolean result = ChunkManager.manager.loadChunk(world, chunk, false);
|
||||
if (!result) {
|
||||
if (!result)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
final String[] lines = BlockManager.manager.getSign(loc);
|
||||
if (lines != null) {
|
||||
if (lines != null)
|
||||
{
|
||||
String line = lines[2];
|
||||
if ((line != null) && (line.length() > 2)) {
|
||||
if ((line != null) && (line.length() > 2))
|
||||
{
|
||||
line = line.substring(2);
|
||||
final BiMap<StringWrapper, UUID> map = UUIDHandler.getUuidMap();
|
||||
UUID uuid = (map.get(new StringWrapper(line)));
|
||||
if (uuid == null) {
|
||||
for (final StringWrapper string : map.keySet()) {
|
||||
if (string.value.toLowerCase().startsWith(line.toLowerCase())) {
|
||||
if (uuid == null)
|
||||
{
|
||||
for (final StringWrapper string : map.keySet())
|
||||
{
|
||||
if (string.value.toLowerCase().startsWith(line.toLowerCase()))
|
||||
{
|
||||
uuid = map.get(string);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (uuid == null) {
|
||||
if (uuid == null)
|
||||
{
|
||||
uuid = UUIDHandler.getUUID(line, null);
|
||||
}
|
||||
if (uuid != null) {
|
||||
if (uuid != null)
|
||||
{
|
||||
MainUtil.sendMessage(null, " - &aFound plot: " + plot.id + " : " + line);
|
||||
plot.owner = uuid;
|
||||
plots.add(plot);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
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!");
|
||||
DBFunc.createPlotsAndData(plots, new Runnable() {
|
||||
DBFunc.createPlotsAndData(plots, new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run() {
|
||||
public void run()
|
||||
{
|
||||
MainUtil.sendMessage(null, "&6Database update finished!");
|
||||
}
|
||||
});
|
||||
for (final Plot plot : plots) {
|
||||
for (final Plot plot : plots)
|
||||
{
|
||||
PS.get().updatePlot(plot);
|
||||
}
|
||||
MainUtil.sendMessage(null, "&3Sign Block&8->&3PlotSquared&8: &7Complete!");
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
MainUtil.sendMessage(null, "No plots were found for the given search.");
|
||||
}
|
||||
return true;
|
||||
|
@ -33,36 +33,34 @@ import com.intellectualcrafters.plot.util.UUIDHandler;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "debugclear",
|
||||
aliases = {"fastclear"},
|
||||
description = "Clear a plot using a fast experiment algorithm",
|
||||
category = CommandCategory.DEBUG
|
||||
)
|
||||
public class DebugClear extends SubCommand {
|
||||
command = "debugclear",
|
||||
aliases = { "fastclear" },
|
||||
description = "Clear a plot using a fast experiment algorithm",
|
||||
category = CommandCategory.DEBUG)
|
||||
public class DebugClear extends SubCommand
|
||||
{
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, String[] args) {
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
final Location loc = plr.getLocation();
|
||||
final Plot plot = MainUtil.getPlot(loc);
|
||||
if ((plot == null) || !(PS.get().getPlotWorld(loc.getWorld()) instanceof SquarePlotWorld)) {
|
||||
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 ((plot == null) || !(PS.get().getPlotWorld(loc.getWorld()) instanceof SquarePlotWorld)) { 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); }
|
||||
final Location pos1 = MainUtil.getPlotBottomLoc(loc.getWorld(), plot.id).add(1, 0, 1);
|
||||
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);
|
||||
return false;
|
||||
}
|
||||
MainUtil.runners.put(plot, 1);
|
||||
ChunkManager.manager.regenerateRegion(pos1, pos2, new Runnable() {
|
||||
ChunkManager.manager.regenerateRegion(pos1, pos2, new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run() {
|
||||
public void run()
|
||||
{
|
||||
MainUtil.runners.remove(plot);
|
||||
MainUtil.sendMessage(plr, "&aDone!");
|
||||
}
|
||||
|
@ -65,7 +65,6 @@ import com.intellectualcrafters.plot.util.EventUtil;
|
||||
import com.intellectualcrafters.plot.util.ExpireManager;
|
||||
import com.intellectualcrafters.plot.util.MainUtil;
|
||||
import com.intellectualcrafters.plot.util.MathMan;
|
||||
import com.intellectualcrafters.plot.util.Permissions;
|
||||
import com.intellectualcrafters.plot.util.SchematicHandler;
|
||||
import com.intellectualcrafters.plot.util.SetupUtils;
|
||||
import com.intellectualcrafters.plot.util.StringMan;
|
||||
@ -73,61 +72,67 @@ import com.intellectualcrafters.plot.util.TaskManager;
|
||||
import com.intellectualcrafters.plot.util.UUIDHandler;
|
||||
import com.plotsquared.bukkit.util.BukkitHybridUtils;
|
||||
import com.plotsquared.general.commands.Command;
|
||||
import com.plotsquared.general.commands.CommandCaller;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "debugexec",
|
||||
permission = "plots.admin",
|
||||
description = "Mutli-purpose debug command",
|
||||
aliases = {"exec"},
|
||||
category = CommandCategory.DEBUG
|
||||
)
|
||||
public class DebugExec extends SubCommand {
|
||||
command = "debugexec",
|
||||
permission = "plots.admin",
|
||||
description = "Mutli-purpose debug command",
|
||||
aliases = { "exec" },
|
||||
category = CommandCategory.DEBUG)
|
||||
public class DebugExec extends SubCommand
|
||||
{
|
||||
|
||||
private ScriptEngine engine;
|
||||
private Bindings scope;
|
||||
|
||||
public DebugExec() {
|
||||
try {
|
||||
File file = new File(PS.get().IMP.getDirectory(), "scripts" + File.separator + "start.js");
|
||||
if (file.exists()) {
|
||||
|
||||
public DebugExec()
|
||||
{
|
||||
try
|
||||
{
|
||||
final File file = new File(PS.get().IMP.getDirectory(), "scripts" + File.separator + "start.js");
|
||||
if (file.exists())
|
||||
{
|
||||
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"));
|
||||
scope.put("THIS", this);
|
||||
scope.put("PlotPlayer", ConsolePlayer.getConsole());
|
||||
engine.eval(script, scope);
|
||||
final 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"));
|
||||
scope.put("THIS", this);
|
||||
scope.put("PlotPlayer", ConsolePlayer.getConsole());
|
||||
engine.eval(script, scope);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
}
|
||||
catch (final Exception e)
|
||||
{}
|
||||
}
|
||||
|
||||
public ScriptEngine getEngine() {
|
||||
|
||||
public ScriptEngine getEngine()
|
||||
{
|
||||
return engine;
|
||||
}
|
||||
|
||||
public Bindings getScope() {
|
||||
|
||||
public Bindings getScope()
|
||||
{
|
||||
return scope;
|
||||
}
|
||||
|
||||
public void init() {
|
||||
if (engine != null) {
|
||||
return;
|
||||
}
|
||||
|
||||
public void init()
|
||||
{
|
||||
if (engine != null) { return; }
|
||||
engine = (new ScriptEngineManager(null)).getEngineByName("nashorn");
|
||||
if (engine == null) {
|
||||
if (engine == null)
|
||||
{
|
||||
engine = (new ScriptEngineManager(null)).getEngineByName("JavaScript");
|
||||
}
|
||||
ScriptContext context = new SimpleScriptContext();
|
||||
final ScriptContext context = new SimpleScriptContext();
|
||||
scope = context.getBindings(ScriptContext.ENGINE_SCOPE);
|
||||
|
||||
|
||||
// stuff
|
||||
scope.put("MainUtil", new MainUtil());
|
||||
scope.put("Settings", new Settings());
|
||||
scope.put("StringMan", new StringMan());
|
||||
scope.put("MathMan", new MathMan());
|
||||
scope.put("FlagManager", new FlagManager());
|
||||
|
||||
|
||||
// Classes
|
||||
scope.put("Location", Location.class);
|
||||
scope.put("PlotBlock", PlotBlock.class);
|
||||
@ -135,7 +140,7 @@ public class DebugExec extends SubCommand {
|
||||
scope.put("PlotId", PlotId.class);
|
||||
scope.put("Runnable", Runnable.class);
|
||||
scope.put("RunnableVal", RunnableVal.class);
|
||||
|
||||
|
||||
// Instances
|
||||
scope.put("PS", PS.get());
|
||||
scope.put("TaskManager", PS.get().TASK);
|
||||
@ -152,112 +157,143 @@ public class DebugExec extends SubCommand {
|
||||
scope.put("HybridUtils", HybridUtils.manager);
|
||||
scope.put("IMP", PS.get().IMP);
|
||||
scope.put("MainCommand", MainCommand.getInstance());
|
||||
|
||||
|
||||
// enums
|
||||
for (Enum<?> value : C.values()) {
|
||||
for (final Enum<?> value : C.values())
|
||||
{
|
||||
scope.put("C_" + value.name(), value);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@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");
|
||||
if (args.length > 0) {
|
||||
if (args.length > 0)
|
||||
{
|
||||
final String arg = args[0].toLowerCase();
|
||||
String script;
|
||||
boolean async = false;
|
||||
switch (arg) {
|
||||
case "analyze": {
|
||||
Plot plot = MainUtil.getPlot(player.getLocation());
|
||||
if (plot == null) {
|
||||
switch (arg)
|
||||
{
|
||||
case "analyze":
|
||||
{
|
||||
final Plot plot = MainUtil.getPlot(player.getLocation());
|
||||
if (plot == null)
|
||||
{
|
||||
MainUtil.sendMessage(player, C.NOT_IN_PLOT);
|
||||
return false;
|
||||
}
|
||||
PlotAnalysis analysis = plot.getComplexity();
|
||||
if (analysis != null) {
|
||||
int complexity = analysis.getComplexity();
|
||||
final PlotAnalysis analysis = plot.getComplexity();
|
||||
if (analysis != null)
|
||||
{
|
||||
final int complexity = analysis.getComplexity();
|
||||
MainUtil.sendMessage(player, "Changes: " + analysis.changes);
|
||||
MainUtil.sendMessage(player, "Complexity: " + complexity);
|
||||
return true;
|
||||
}
|
||||
MainUtil.sendMessage(player, "$1Starting task...");
|
||||
HybridUtils.manager.analyzePlot(plot, new RunnableVal<PlotAnalysis>() {
|
||||
HybridUtils.manager.analyzePlot(plot, new RunnableVal<PlotAnalysis>()
|
||||
{
|
||||
@Override
|
||||
public void run() {
|
||||
public void run()
|
||||
{
|
||||
MainUtil.sendMessage(player, "$1Done: $2use $3/plot debugexec analyze$2 for more information");
|
||||
}
|
||||
});
|
||||
return true;
|
||||
}
|
||||
case "calibrate-analysis": {
|
||||
if (args.length != 2) {
|
||||
case "calibrate-analysis":
|
||||
{
|
||||
if (args.length != 2)
|
||||
{
|
||||
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)");
|
||||
return false;
|
||||
}
|
||||
double threshold;
|
||||
try {
|
||||
try
|
||||
{
|
||||
threshold = Integer.parseInt(args[1]) / 100d;
|
||||
}
|
||||
catch (NumberFormatException e) {
|
||||
catch (final NumberFormatException e)
|
||||
{
|
||||
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");
|
||||
return false;
|
||||
}
|
||||
PlotAnalysis.calcOptimalModifiers(new Runnable() {
|
||||
PlotAnalysis.calcOptimalModifiers(new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run() {
|
||||
public void run()
|
||||
{
|
||||
MainUtil.sendMessage(player, "$1Thank you for calibrating PlotSquared plot expiry");
|
||||
}
|
||||
}, threshold);
|
||||
return true;
|
||||
}
|
||||
case "stop-expire": {
|
||||
if (ExpireManager.task != -1) {
|
||||
case "stop-expire":
|
||||
{
|
||||
if (ExpireManager.task != -1)
|
||||
{
|
||||
PS.get().TASK.cancelTask(ExpireManager.task);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return MainUtil.sendMessage(player, "Task already halted");
|
||||
}
|
||||
ExpireManager.task = -1;
|
||||
return MainUtil.sendMessage(player, "Cancelled task.");
|
||||
}
|
||||
case "remove-flag": {
|
||||
if (args.length != 2) {
|
||||
case "remove-flag":
|
||||
{
|
||||
if (args.length != 2)
|
||||
{
|
||||
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot debugexec remove-flag <flag>");
|
||||
return false;
|
||||
}
|
||||
String flag = args[1];
|
||||
for (Plot plot : PS.get().getPlots()) {
|
||||
if (FlagManager.getPlotFlag(plot, flag) != null) {
|
||||
final String flag = args[1];
|
||||
for (final Plot plot : PS.get().getPlots())
|
||||
{
|
||||
if (FlagManager.getPlotFlag(plot, flag) != null)
|
||||
{
|
||||
FlagManager.removePlotFlag(plot, flag);
|
||||
}
|
||||
}
|
||||
return MainUtil.sendMessage(player, "Cleared flag: " + flag);
|
||||
return MainUtil.sendMessage(player, "Cleared flag: " + flag);
|
||||
}
|
||||
case "start-rgar": {
|
||||
if (args.length != 2) {
|
||||
case "start-rgar":
|
||||
{
|
||||
if (args.length != 2)
|
||||
{
|
||||
MainUtil.sendMessage(player, "&cInvalid syntax: /plot debugexec start-rgar <world>");
|
||||
return false;
|
||||
}
|
||||
boolean result;
|
||||
if (!PS.get().isPlotWorld(args[1])) {
|
||||
if (!PS.get().isPlotWorld(args[1]))
|
||||
{
|
||||
MainUtil.sendMessage(player, C.NOT_VALID_PLOT_WORLD, args[1]);
|
||||
return false;
|
||||
}
|
||||
if (BukkitHybridUtils.regions != null) {
|
||||
result = ((BukkitHybridUtils)(HybridUtils.manager)).scheduleRoadUpdate(args[1], BukkitHybridUtils.regions, 0);
|
||||
if (HybridUtils.regions != null)
|
||||
{
|
||||
result = ((BukkitHybridUtils) (HybridUtils.manager)).scheduleRoadUpdate(args[1], HybridUtils.regions, 0);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
result = HybridUtils.manager.scheduleRoadUpdate(args[1], 0);
|
||||
}
|
||||
if (!result) {
|
||||
if (!result)
|
||||
{
|
||||
MainUtil.sendMessage(player, "&cCannot schedule mass schematic update! (Is one already in progress?)");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
case "stop-rgar": {
|
||||
if (!HybridUtils.UPDATE) {
|
||||
case "stop-rgar":
|
||||
{
|
||||
if (!HybridUtils.UPDATE)
|
||||
{
|
||||
MainUtil.sendMessage(player, "&cTASK NOT RUNNING!");
|
||||
return false;
|
||||
}
|
||||
@ -265,55 +301,53 @@ public class DebugExec extends SubCommand {
|
||||
MainUtil.sendMessage(player, "&cCancelling task... (please wait)");
|
||||
return true;
|
||||
}
|
||||
case "start-expire": {
|
||||
if (ExpireManager.task == -1) {
|
||||
case "start-expire":
|
||||
{
|
||||
if (ExpireManager.task == -1)
|
||||
{
|
||||
ExpireManager.runTask();
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return MainUtil.sendMessage(player, "Plot expiry task already started");
|
||||
}
|
||||
return MainUtil.sendMessage(player, "Started plot expiry task");
|
||||
}
|
||||
case "update-expired": {
|
||||
if (args.length > 1) {
|
||||
case "update-expired":
|
||||
{
|
||||
if (args.length > 1)
|
||||
{
|
||||
final String world = args[1];
|
||||
if (!BlockManager.manager.isWorld(world)) {
|
||||
return MainUtil.sendMessage(player, "Invalid world: " + args[1]);
|
||||
}
|
||||
if (!BlockManager.manager.isWorld(world)) { return MainUtil.sendMessage(player, "Invalid world: " + args[1]); }
|
||||
MainUtil.sendMessage(player, "Updating expired plot list");
|
||||
ExpireManager.updateExpired(args[1]);
|
||||
return true;
|
||||
}
|
||||
return MainUtil.sendMessage(player, "Use /plot debugexec update-expired <world>");
|
||||
}
|
||||
case "show-expired": {
|
||||
if (args.length > 1) {
|
||||
case "show-expired":
|
||||
{
|
||||
if (args.length > 1)
|
||||
{
|
||||
final String world = args[1];
|
||||
if (!BlockManager.manager.isWorld(world)) {
|
||||
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 (!BlockManager.manager.isWorld(world)) { return MainUtil.sendMessage(player, "Invalid 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() + "):");
|
||||
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));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return MainUtil.sendMessage(player, "Use /plot debugexec show-expired <world>");
|
||||
}
|
||||
case "seen": {
|
||||
if (args.length != 2) {
|
||||
return MainUtil.sendMessage(player, "Use /plot debugexec seen <player>");
|
||||
}
|
||||
case "seen":
|
||||
{
|
||||
if (args.length != 2) { return MainUtil.sendMessage(player, "Use /plot debugexec seen <player>"); }
|
||||
final UUID uuid = UUIDHandler.getUUID(args[1], null);
|
||||
if (uuid == null) {
|
||||
return MainUtil.sendMessage(player, "player not found: " + args[1]);
|
||||
}
|
||||
if (uuid == null) { return MainUtil.sendMessage(player, "player not found: " + args[1]); }
|
||||
final OfflinePlotPlayer op = UUIDHandler.getUUIDWrapper().getOfflinePlayer(uuid);
|
||||
if ((op == null) || (op.getLastPlayed() == 0)) {
|
||||
return MainUtil.sendMessage(player, "player hasn't connected before: " + args[1]);
|
||||
}
|
||||
if ((op == null) || (op.getLastPlayed() == 0)) { return MainUtil.sendMessage(player, "player hasn't connected before: " + args[1]); }
|
||||
final Timestamp stamp = new Timestamp(op.getLastPlayed());
|
||||
final Date date = new Date(stamp.getTime());
|
||||
MainUtil.sendMessage(player, "PLAYER: " + args[1]);
|
||||
@ -323,34 +357,40 @@ public class DebugExec extends SubCommand {
|
||||
MainUtil.sendMessage(player, "Local: " + date.toLocaleString());
|
||||
return true;
|
||||
}
|
||||
case "trim-check": {
|
||||
if (args.length != 2) {
|
||||
case "trim-check":
|
||||
{
|
||||
if (args.length != 2)
|
||||
{
|
||||
MainUtil.sendMessage(player, "Use /plot debugexec trim-check <world>");
|
||||
MainUtil.sendMessage(player, "&7 - Generates a list of regions to trim");
|
||||
return MainUtil.sendMessage(player, "&7 - Run after plot expiry has run");
|
||||
}
|
||||
final String world = args[1];
|
||||
if (!BlockManager.manager.isWorld(world) || !PS.get().isPlotWorld(args[1])) {
|
||||
return MainUtil.sendMessage(player, "Invalid world: " + args[1]);
|
||||
}
|
||||
if (!BlockManager.manager.isWorld(world) || !PS.get().isPlotWorld(args[1])) { return MainUtil.sendMessage(player, "Invalid world: " + args[1]); }
|
||||
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
|
||||
public void run() {
|
||||
public void run()
|
||||
{
|
||||
Trim.sendMessage("Processing is complete! Here's how many chunks would be deleted:");
|
||||
Trim.sendMessage(" - MCA #: " + empty.size());
|
||||
Trim.sendMessage(" - CHUNKS: " + (empty.size() * 1024) + " (max)");
|
||||
Trim.sendMessage("Exporting log for manual approval...");
|
||||
final File file = new File(PS.get().IMP.getDirectory() + File.separator + "trim.txt");
|
||||
PrintWriter writer;
|
||||
try {
|
||||
try
|
||||
{
|
||||
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.close();
|
||||
Trim.sendMessage("File saved to 'plugins/PlotSquared/trim.txt'");
|
||||
} catch (final FileNotFoundException e) {
|
||||
}
|
||||
catch (final FileNotFoundException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
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");
|
||||
}
|
||||
});
|
||||
if (!result) {
|
||||
if (!result)
|
||||
{
|
||||
MainUtil.sendMessage(player, "Trim task already started!");
|
||||
}
|
||||
return result;
|
||||
@ -368,90 +409,120 @@ public class DebugExec extends SubCommand {
|
||||
case "h":
|
||||
case "he":
|
||||
case "?":
|
||||
case "help": {
|
||||
case "help":
|
||||
{
|
||||
MainUtil.sendMessage(player, "Possible sub commands: /plot debugexec <" + StringMan.join(allowed_params, "|") + ">");
|
||||
return false;
|
||||
}
|
||||
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"));
|
||||
Command<PlotPlayer> subcommand = new Command<PlotPlayer>(args[1].split("\\.")[0]) {
|
||||
@Override
|
||||
public boolean onCommand(PlotPlayer plr, String[] args) {
|
||||
try {
|
||||
scope.put("PlotPlayer", plr);
|
||||
scope.put("args", args);
|
||||
engine.eval(cmd, scope);
|
||||
return true;
|
||||
} catch (ScriptException e) {
|
||||
e.printStackTrace();
|
||||
MainUtil.sendMessage(player, C.COMMAND_WENT_WRONG);
|
||||
return false;
|
||||
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"));
|
||||
final Command<PlotPlayer> subcommand = new Command<PlotPlayer>(args[1].split("\\.")[0])
|
||||
{
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
try
|
||||
{
|
||||
scope.put("PlotPlayer", plr);
|
||||
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);
|
||||
return true;
|
||||
};
|
||||
MainCommand.getInstance().addCommand(subcommand);
|
||||
return true;
|
||||
}
|
||||
catch (Exception e) {
|
||||
catch (final Exception e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot debugexec addcmd <file>");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
case "runasync": {
|
||||
case "runasync":
|
||||
{
|
||||
async = true;
|
||||
}
|
||||
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"));
|
||||
if (args.length > 2) {
|
||||
HashMap<String, String> replacements = new HashMap<>();
|
||||
for (int i = 2; i < args.length; i++) {
|
||||
replacements.put("%s" + (i-2), args[i]);
|
||||
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"));
|
||||
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);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
}
|
||||
catch (final IOException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
default:
|
||||
{
|
||||
script = StringMan.join(args, " ");
|
||||
}
|
||||
}
|
||||
if (!ConsolePlayer.isConsole(player)) {
|
||||
if (!ConsolePlayer.isConsole(player))
|
||||
{
|
||||
MainUtil.sendMessage(player, C.NOT_CONSOLE);
|
||||
return false;
|
||||
}
|
||||
init();
|
||||
scope.put("PlotPlayer", player);
|
||||
PS.debug("> " + script);
|
||||
try {
|
||||
if (async) {
|
||||
try
|
||||
{
|
||||
if (async)
|
||||
{
|
||||
final String toExec = script;
|
||||
TaskManager.runTaskAsync(new Runnable() {
|
||||
TaskManager.runTaskAsync(new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run() {
|
||||
long start = System.currentTimeMillis();
|
||||
try {
|
||||
public void run()
|
||||
{
|
||||
final long start = System.currentTimeMillis();
|
||||
try
|
||||
{
|
||||
engine.eval(toExec, scope);
|
||||
} catch (ScriptException e) {
|
||||
}
|
||||
catch (final ScriptException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
PS.log("> " + (System.currentTimeMillis() - start) + "ms");
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
long start = System.currentTimeMillis();
|
||||
else
|
||||
{
|
||||
final long start = System.currentTimeMillis();
|
||||
engine.eval(script, scope);
|
||||
PS.log("> " + (System.currentTimeMillis() - start) + "ms");
|
||||
}
|
||||
return true;
|
||||
} catch (ScriptException e) {
|
||||
}
|
||||
catch (final ScriptException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
|
@ -32,36 +32,39 @@ import com.intellectualcrafters.plot.util.TaskManager;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "fill",
|
||||
permission = "plots.fill",
|
||||
description = "Fill or surround a plot in bedrock",
|
||||
usage = "/plot fill",
|
||||
aliases = {"debugfill"},
|
||||
category = CommandCategory.DEBUG,
|
||||
requiredType = RequiredType.NONE
|
||||
)
|
||||
public class DebugFill extends SubCommand {
|
||||
command = "fill",
|
||||
permission = "plots.fill",
|
||||
description = "Fill or surround a plot in bedrock",
|
||||
usage = "/plot fill",
|
||||
aliases = { "debugfill" },
|
||||
category = CommandCategory.DEBUG,
|
||||
requiredType = RequiredType.NONE)
|
||||
public class DebugFill extends SubCommand
|
||||
{
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer player, final String ... args) {
|
||||
if (args.length != 1 || (!args[0].equalsIgnoreCase("outline") && !args[0].equalsIgnoreCase("all"))) {
|
||||
public boolean onCommand(final PlotPlayer player, final String... args)
|
||||
{
|
||||
if ((args.length != 1) || (!args[0].equalsIgnoreCase("outline") && !args[0].equalsIgnoreCase("all")))
|
||||
{
|
||||
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot fill <outline|all>");
|
||||
return true;
|
||||
}
|
||||
final Location loc = player.getLocation();
|
||||
final Plot plot = MainUtil.getPlot(loc);
|
||||
if (plot == null) {
|
||||
return !sendMessage(player, C.NOT_IN_PLOT);
|
||||
}
|
||||
if (!plot.hasOwner()) {
|
||||
if (plot == null) { return !sendMessage(player, C.NOT_IN_PLOT); }
|
||||
if (!plot.hasOwner())
|
||||
{
|
||||
MainUtil.sendMessage(player, C.PLOT_UNOWNED);
|
||||
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);
|
||||
return true;
|
||||
}
|
||||
if (MainUtil.runners.containsKey(plot)) {
|
||||
if (MainUtil.runners.containsKey(plot))
|
||||
{
|
||||
MainUtil.sendMessage(player, C.WAIT_FOR_TIMER);
|
||||
return false;
|
||||
}
|
||||
@ -69,89 +72,119 @@ public class DebugFill extends SubCommand {
|
||||
final Location top = MainUtil.getPlotTopLoc(plot.world, plot.id);
|
||||
MainUtil.sendMessage(player, "&cPreparing task");
|
||||
MainUtil.runners.put(plot, 1);
|
||||
SetBlockQueue.addNotify(new Runnable() {
|
||||
SetBlockQueue.addNotify(new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run() {
|
||||
TaskManager.runTaskAsync(new Runnable() {
|
||||
public void run()
|
||||
{
|
||||
TaskManager.runTaskAsync(new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run() {
|
||||
public void run()
|
||||
{
|
||||
MainUtil.sendMessage(player, "&7 - Starting");
|
||||
if (args[0].equalsIgnoreCase("all")) {
|
||||
if (args[0].equalsIgnoreCase("all"))
|
||||
{
|
||||
int height = 255;
|
||||
PlotBlock block = new PlotBlock((short) 7, (byte) 0);
|
||||
PlotBlock air = new PlotBlock((short) 0, (byte) 0);
|
||||
if (args.length > 2) {
|
||||
try {
|
||||
final PlotBlock air = new PlotBlock((short) 0, (byte) 0);
|
||||
if (args.length > 2)
|
||||
{
|
||||
try
|
||||
{
|
||||
block = new PlotBlock(Short.parseShort(args[1]), (byte) 0);
|
||||
if (args.length == 3) {
|
||||
if (args.length == 3)
|
||||
{
|
||||
height = Integer.parseInt(args[2]);
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
catch (final Exception e)
|
||||
{
|
||||
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot fill all <id> <height>");
|
||||
MainUtil.runners.remove(plot);
|
||||
return;
|
||||
}
|
||||
}
|
||||
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 y = 0; y <= height; y++)
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
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 y = height + 1; y <= 255; y++)
|
||||
{
|
||||
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.addNotify(new Runnable() {
|
||||
SetBlockQueue.addNotify(new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run() {
|
||||
public void run()
|
||||
{
|
||||
MainUtil.runners.remove(plot);
|
||||
MainUtil.sendMessage(player, "&aFill task complete!");
|
||||
}
|
||||
});
|
||||
}
|
||||
else if (args[0].equals("outline")) {
|
||||
else if (args[0].equals("outline"))
|
||||
{
|
||||
int x, z;
|
||||
z = bottom.getZ();
|
||||
for (x = bottom.getX(); x <= (top.getX() - 1); x++) {
|
||||
for (int y = 1; y <= 255; y++) {
|
||||
for (x = bottom.getX(); x <= (top.getX() - 1); x++)
|
||||
{
|
||||
for (int y = 1; y <= 255; y++)
|
||||
{
|
||||
SetBlockQueue.setBlock(plot.world, x, y, z, 7);
|
||||
}
|
||||
}
|
||||
x = top.getX();
|
||||
for (z = bottom.getZ(); z <= (top.getZ() - 1); z++) {
|
||||
for (int y = 1; y <= 255; y++) {
|
||||
for (z = bottom.getZ(); z <= (top.getZ() - 1); z++)
|
||||
{
|
||||
for (int y = 1; y <= 255; y++)
|
||||
{
|
||||
SetBlockQueue.setBlock(plot.world, x, y, z, 7);
|
||||
}
|
||||
}
|
||||
z = top.getZ();
|
||||
for (x = top.getX(); x >= (bottom.getX() + 1); x--) {
|
||||
for (int y = 1; y <= 255; y++) {
|
||||
for (x = top.getX(); x >= (bottom.getX() + 1); x--)
|
||||
{
|
||||
for (int y = 1; y <= 255; y++)
|
||||
{
|
||||
SetBlockQueue.setBlock(plot.world, x, y, z, 7);
|
||||
}
|
||||
}
|
||||
x = bottom.getX();
|
||||
for (z = top.getZ(); z >= (bottom.getZ() + 1); z--) {
|
||||
for (int y = 1; y <= 255; y++) {
|
||||
for (z = top.getZ(); z >= (bottom.getZ() + 1); z--)
|
||||
{
|
||||
for (int y = 1; y <= 255; y++)
|
||||
{
|
||||
SetBlockQueue.setBlock(plot.world, x, y, z, 7);
|
||||
}
|
||||
}
|
||||
SetBlockQueue.addNotify(new Runnable() {
|
||||
SetBlockQueue.addNotify(new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run() {
|
||||
public void run()
|
||||
{
|
||||
MainUtil.sendMessage(player, "&aWalls complete! The ceiling will take a while :(");
|
||||
bottom.setY(255);
|
||||
top.add(1,0,1);
|
||||
top.add(1, 0, 1);
|
||||
SetBlockQueue.setSlow(true);
|
||||
MainUtil.setSimpleCuboidAsync(plot.world, bottom, top, new PlotBlock((short) 7, (byte) 0));
|
||||
SetBlockQueue.addNotify(new Runnable() {
|
||||
SetBlockQueue.addNotify(new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run() {
|
||||
public void run()
|
||||
{
|
||||
MainUtil.runners.remove(plot);
|
||||
MainUtil.sendMessage(player, "&aFill task complete!");
|
||||
SetBlockQueue.setSlow(false);
|
||||
|
@ -37,40 +37,47 @@ import com.plotsquared.general.commands.Argument;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "debugfixflags",
|
||||
usage = "/plot debugfixflags <world>",
|
||||
permission = "plots.debugfixflags",
|
||||
description = "Attempt to fix all flags for a world",
|
||||
requiredType = RequiredType.CONSOLE,
|
||||
category = CommandCategory.DEBUG
|
||||
)
|
||||
public class DebugFixFlags extends SubCommand {
|
||||
command = "debugfixflags",
|
||||
usage = "/plot debugfixflags <world>",
|
||||
permission = "plots.debugfixflags",
|
||||
description = "Attempt to fix all flags for a world",
|
||||
requiredType = RequiredType.CONSOLE,
|
||||
category = CommandCategory.DEBUG)
|
||||
public class DebugFixFlags extends SubCommand
|
||||
{
|
||||
|
||||
public DebugFixFlags() {
|
||||
public DebugFixFlags()
|
||||
{
|
||||
requiredArguments = new Argument[] {
|
||||
Argument.String
|
||||
Argument.String
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(PlotPlayer plr, String[] args) {
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
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]);
|
||||
return false;
|
||||
}
|
||||
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;
|
||||
Iterator<Entry<String, Flag>> i = flags.entrySet().iterator();
|
||||
final Iterator<Entry<String, Flag>> i = flags.entrySet().iterator();
|
||||
boolean changed = false;
|
||||
while (i.hasNext()) {
|
||||
if (FlagManager.getFlag(i.next().getKey()) == null) {
|
||||
while (i.hasNext())
|
||||
{
|
||||
if (FlagManager.getFlag(i.next().getKey()) == null)
|
||||
{
|
||||
changed = true;
|
||||
i.remove();
|
||||
}
|
||||
}
|
||||
if (changed) {
|
||||
if (changed)
|
||||
{
|
||||
DBFunc.setFlags(plot, plot.getSettings().flags.values());
|
||||
}
|
||||
}
|
||||
|
@ -28,22 +28,26 @@ import com.intellectualcrafters.plot.object.PlotPlayer;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "debugloadtest",
|
||||
permission = "plots.debugloadtest",
|
||||
description = "This debug command will force the reload of all plots in the DB",
|
||||
usage = "/plot debugloadtest",
|
||||
category = CommandCategory.DEBUG,
|
||||
requiredType = RequiredType.CONSOLE
|
||||
)
|
||||
public class DebugLoadTest extends SubCommand {
|
||||
command = "debugloadtest",
|
||||
permission = "plots.debugloadtest",
|
||||
description = "This debug command will force the reload of all plots in the DB",
|
||||
usage = "/plot debugloadtest",
|
||||
category = CommandCategory.DEBUG,
|
||||
requiredType = RequiredType.CONSOLE)
|
||||
public class DebugLoadTest extends SubCommand
|
||||
{
|
||||
|
||||
@Override
|
||||
public boolean onCommand(PlotPlayer plr, String[] args) {
|
||||
try {
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
try
|
||||
{
|
||||
final Field fPlots = PS.class.getDeclaredField("plots");
|
||||
fPlots.setAccessible(true);
|
||||
fPlots.set(null, DBFunc.getPlots());
|
||||
} catch (final Exception e) {
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
PS.debug("&3===FAILED&3===");
|
||||
e.printStackTrace();
|
||||
PS.debug("&3===END OF STACKTRACE===");
|
||||
|
@ -15,30 +15,37 @@ import com.plotsquared.bukkit.BukkitMain;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "debugpaste",
|
||||
aliases = {"dp"},
|
||||
usage = "/plot debugpaste",
|
||||
description = "Upload settings.yml & latest.log to hastebin",
|
||||
permission = "plots.debugpaste",
|
||||
category = CommandCategory.DEBUG
|
||||
)
|
||||
public class DebugPaste extends SubCommand {
|
||||
command = "debugpaste",
|
||||
aliases = { "dp" },
|
||||
usage = "/plot debugpaste",
|
||||
description = "Upload settings.yml & latest.log to hastebin",
|
||||
permission = "plots.debugpaste",
|
||||
category = CommandCategory.DEBUG)
|
||||
public class DebugPaste extends SubCommand
|
||||
{
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, String[] args) {
|
||||
TaskManager.runTaskAsync(new Runnable() {
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
TaskManager.runTaskAsync(new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
String settingsYML = HastebinUtility.upload(PS.get().configFile);
|
||||
public void run()
|
||||
{
|
||||
try
|
||||
{
|
||||
final String settingsYML = HastebinUtility.upload(PS.get().configFile);
|
||||
String latestLOG;
|
||||
try {
|
||||
try
|
||||
{
|
||||
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");
|
||||
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("links.settings_yml: '").append(settingsYML).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("online_mode: ").append(Bukkit.getServer().getOnlineMode()).append("\n");
|
||||
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\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.max: ").append(runtime.maxMemory()).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("\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));
|
||||
} catch (IOException e) {
|
||||
}
|
||||
catch (final IOException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
@ -35,44 +35,49 @@ import com.intellectualcrafters.plot.util.MathMan;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "debugroadregen",
|
||||
usage = "/plot debugroadregen",
|
||||
requiredType = RequiredType.NONE,
|
||||
description = "Regenerate all roads based on the road schematic",
|
||||
category = CommandCategory.DEBUG,
|
||||
permission = "plots.debugroadregen"
|
||||
)
|
||||
public class DebugRoadRegen extends SubCommand {
|
||||
command = "debugroadregen",
|
||||
usage = "/plot debugroadregen",
|
||||
requiredType = RequiredType.NONE,
|
||||
description = "Regenerate all roads based on the road schematic",
|
||||
category = CommandCategory.DEBUG,
|
||||
permission = "plots.debugroadregen")
|
||||
public class DebugRoadRegen extends SubCommand
|
||||
{
|
||||
|
||||
@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 String world = loc.getWorld();
|
||||
PlotWorld plotworld = PS.get().getPlotWorld(world);
|
||||
if (!(plotworld instanceof HybridPlotWorld)) {
|
||||
return sendMessage(player, C.NOT_IN_PLOT_WORLD);
|
||||
}
|
||||
Plot plot = player.getCurrentPlot();
|
||||
if (plot == null) {
|
||||
final PlotWorld plotworld = PS.get().getPlotWorld(world);
|
||||
if (!(plotworld instanceof HybridPlotWorld)) { return sendMessage(player, C.NOT_IN_PLOT_WORLD); }
|
||||
final Plot plot = player.getCurrentPlot();
|
||||
if (plot == null)
|
||||
{
|
||||
final ChunkLoc chunk = new ChunkLoc(loc.getX() >> 4, loc.getZ() >> 4);
|
||||
int extend = 0;
|
||||
if (args.length == 1) {
|
||||
if (MathMan.isInteger(args[0])) {
|
||||
try {
|
||||
if (args.length == 1)
|
||||
{
|
||||
if (MathMan.isInteger(args[0]))
|
||||
{
|
||||
try
|
||||
{
|
||||
extend = Integer.parseInt(args[0]);
|
||||
}
|
||||
catch (Exception e) {
|
||||
catch (final Exception e)
|
||||
{
|
||||
C.NOT_VALID_NUMBER.send(player, "(0, <EXTEND HEIGHT>)");
|
||||
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, "&cTo regenerate all roads: /plot regenallroads");
|
||||
}
|
||||
else {
|
||||
HybridPlotManager manager = (HybridPlotManager) PS.get().getPlotManager(world);
|
||||
else
|
||||
{
|
||||
final HybridPlotManager manager = (HybridPlotManager) PS.get().getPlotManager(world);
|
||||
manager.createRoadEast(plotworld, plot);
|
||||
manager.createRoadSouth(plotworld, plot);
|
||||
manager.createRoadSouthEast(plotworld, plot);
|
||||
|
@ -30,23 +30,26 @@ import com.intellectualcrafters.plot.util.MainUtil;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "debugsavetest",
|
||||
permission = "plots.debugsavetest",
|
||||
category = CommandCategory.DEBUG,
|
||||
requiredType = RequiredType.CONSOLE,
|
||||
usage = "/plot debugsavetest",
|
||||
description = "This command will force the recreation of all plots in the DB"
|
||||
)
|
||||
public class DebugSaveTest extends SubCommand {
|
||||
command = "debugsavetest",
|
||||
permission = "plots.debugsavetest",
|
||||
category = CommandCategory.DEBUG,
|
||||
requiredType = RequiredType.CONSOLE,
|
||||
usage = "/plot debugsavetest",
|
||||
description = "This command will force the recreation of all plots in the DB")
|
||||
public class DebugSaveTest extends SubCommand
|
||||
{
|
||||
|
||||
@Override
|
||||
public boolean onCommand(PlotPlayer plr, String[] args) {
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
final ArrayList<Plot> plots = new ArrayList<Plot>();
|
||||
plots.addAll(PS.get().getPlots());
|
||||
MainUtil.sendMessage(null, "&6Starting `DEBUGSAVETEST`");
|
||||
DBFunc.createPlotsAndData(plots, new Runnable() {
|
||||
DBFunc.createPlotsAndData(plots, new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run() {
|
||||
public void run()
|
||||
{
|
||||
MainUtil.sendMessage(null, "&6Database sync finished!");
|
||||
}
|
||||
});
|
||||
|
@ -36,7 +36,6 @@ import org.bukkit.Bukkit;
|
||||
|
||||
import com.intellectualcrafters.plot.PS;
|
||||
import com.intellectualcrafters.plot.config.C;
|
||||
import com.intellectualcrafters.plot.config.Settings;
|
||||
import com.intellectualcrafters.plot.database.AbstractDB;
|
||||
import com.intellectualcrafters.plot.database.DBFunc;
|
||||
import com.intellectualcrafters.plot.object.OfflinePlotPlayer;
|
||||
@ -55,54 +54,64 @@ import com.plotsquared.general.commands.Argument;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "uuidconvert",
|
||||
permission = "plots.admin",
|
||||
description = "Debug UUID conversion",
|
||||
usage = "/plot uuidconvert <lower|offline|online>",
|
||||
requiredType = RequiredType.CONSOLE,
|
||||
category = CommandCategory.DEBUG
|
||||
)
|
||||
public class DebugUUID extends SubCommand {
|
||||
command = "uuidconvert",
|
||||
permission = "plots.admin",
|
||||
description = "Debug UUID conversion",
|
||||
usage = "/plot uuidconvert <lower|offline|online>",
|
||||
requiredType = RequiredType.CONSOLE,
|
||||
category = CommandCategory.DEBUG)
|
||||
public class DebugUUID extends SubCommand
|
||||
{
|
||||
|
||||
public DebugUUID() {
|
||||
public DebugUUID()
|
||||
{
|
||||
requiredArguments = new Argument[] {
|
||||
Argument.String
|
||||
Argument.String
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args) {
|
||||
PlotPlayer player = null;
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
final PlotPlayer player = null;
|
||||
|
||||
final UUIDWrapper currentUUIDWrapper = UUIDHandler.getUUIDWrapper();
|
||||
final UUIDWrapper newWrapper;
|
||||
|
||||
switch (args[0].toLowerCase()) {
|
||||
case "lower": {
|
||||
|
||||
switch (args[0].toLowerCase())
|
||||
{
|
||||
case "lower":
|
||||
{
|
||||
newWrapper = new LowerOfflineUUIDWrapper();
|
||||
break;
|
||||
}
|
||||
case "offline": {
|
||||
case "offline":
|
||||
{
|
||||
newWrapper = new OfflineUUIDWrapper();
|
||||
break;
|
||||
}
|
||||
case "online": {
|
||||
case "online":
|
||||
{
|
||||
newWrapper = new DefaultUUIDWrapper();
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
try {
|
||||
Class<?> clazz = Class.forName(args[0]);
|
||||
default:
|
||||
{
|
||||
try
|
||||
{
|
||||
final Class<?> clazz = Class.forName(args[0]);
|
||||
newWrapper = (UUIDWrapper) clazz.newInstance();
|
||||
}
|
||||
catch (Exception e) {
|
||||
catch (final Exception e)
|
||||
{
|
||||
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot uuidconvert <lower|offline|online>");
|
||||
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, "&cBe aware of the following!");
|
||||
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 :)");
|
||||
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!");
|
||||
return false;
|
||||
}
|
||||
MainUtil.sendConsoleMessage("&6Beginning UUID mode conversion");
|
||||
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.");
|
||||
}
|
||||
|
||||
|
||||
MainUtil.sendConsoleMessage("&7 - Initializing map");
|
||||
|
||||
|
||||
final HashMap<UUID, UUID> uCMap = new HashMap<UUID, UUID>();
|
||||
final HashMap<UUID, UUID> uCReverse = new HashMap<UUID, UUID>();
|
||||
|
||||
|
||||
MainUtil.sendConsoleMessage("&7 - Collecting playerdata");
|
||||
|
||||
final HashSet<String> worlds = new HashSet<>();
|
||||
@ -136,212 +147,269 @@ public class DebugUUID extends SubCommand {
|
||||
worlds.add("world");
|
||||
final HashSet<UUID> uuids = 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");
|
||||
String[] dat = playerdataFolder.list(new FilenameFilter() {
|
||||
String[] dat = playerdataFolder.list(new FilenameFilter()
|
||||
{
|
||||
@Override
|
||||
public boolean accept(final File f, final String s) {
|
||||
public boolean accept(final File f, final String s)
|
||||
{
|
||||
return s.endsWith(".dat");
|
||||
}
|
||||
});
|
||||
if (dat != null) {
|
||||
for (final String current : dat) {
|
||||
if (dat != null)
|
||||
{
|
||||
for (final String current : dat)
|
||||
{
|
||||
final String s = current.replaceAll(".dat$", "");
|
||||
try {
|
||||
try
|
||||
{
|
||||
final UUID uuid = UUID.fromString(s);
|
||||
uuids.add(uuid);
|
||||
} catch (final Exception e) {
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.PREFIX.s() + "Invalid playerdata: " + current);
|
||||
}
|
||||
}
|
||||
}
|
||||
final File playersFolder = new File(worldname + File.separator + "players");
|
||||
dat = playersFolder.list(new FilenameFilter() {
|
||||
dat = playersFolder.list(new FilenameFilter()
|
||||
{
|
||||
@Override
|
||||
public boolean accept(final File f, final String s) {
|
||||
public boolean accept(final File f, final String s)
|
||||
{
|
||||
return s.endsWith(".dat");
|
||||
}
|
||||
});
|
||||
if (dat != null) {
|
||||
for (final String current : dat) {
|
||||
if (dat != null)
|
||||
{
|
||||
for (final String current : dat)
|
||||
{
|
||||
names.add(current.replaceAll(".dat$", ""));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
MainUtil.sendConsoleMessage("&7 - Populating map");
|
||||
UUID uuid2;
|
||||
final UUIDWrapper wrapper = new DefaultUUIDWrapper();
|
||||
for (UUID uuid : uuids) {
|
||||
try {
|
||||
for (UUID uuid : uuids)
|
||||
{
|
||||
try
|
||||
{
|
||||
final OfflinePlotPlayer op = wrapper.getOfflinePlayer(uuid);
|
||||
uuid = currentUUIDWrapper.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);
|
||||
uCReverse.put(uuid2, uuid);
|
||||
}
|
||||
} catch (final Throwable e) {
|
||||
}
|
||||
catch (final Throwable e)
|
||||
{
|
||||
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);
|
||||
uuid2 = newWrapper.getUUID(name);
|
||||
if (!uuid.equals(uuid2)) {
|
||||
if (!uuid.equals(uuid2))
|
||||
{
|
||||
uCMap.put(uuid, uuid2);
|
||||
uCReverse.put(uuid2, uuid);
|
||||
}
|
||||
}
|
||||
if (uCMap.size() == 0) {
|
||||
if (uCMap.size() == 0)
|
||||
{
|
||||
MainUtil.sendConsoleMessage("&c - Error! Attempting to repopulate");
|
||||
for (OfflinePlotPlayer op : currentUUIDWrapper.getOfflinePlayers()) {
|
||||
if (op.getLastPlayed() != 0) {
|
||||
// String name = op.getName();
|
||||
// StringWrapper wrap = new StringWrapper(name);
|
||||
UUID uuid = currentUUIDWrapper.getUUID(op);
|
||||
for (final OfflinePlotPlayer op : currentUUIDWrapper.getOfflinePlayers())
|
||||
{
|
||||
if (op.getLastPlayed() != 0)
|
||||
{
|
||||
// String name = op.getName();
|
||||
// StringWrapper wrap = new StringWrapper(name);
|
||||
final UUID uuid = currentUUIDWrapper.getUUID(op);
|
||||
uuid2 = newWrapper.getUUID(op);
|
||||
if (!uuid.equals(uuid2)) {
|
||||
if (!uuid.equals(uuid2))
|
||||
{
|
||||
uCMap.put(uuid, uuid2);
|
||||
uCReverse.put(uuid2, uuid);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (uCMap.size() == 0) {
|
||||
if (uCMap.size() == 0)
|
||||
{
|
||||
MainUtil.sendConsoleMessage("&cError. Failed to collect UUIDs!");
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
MainUtil.sendConsoleMessage("&a - Successfully repopulated");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
MainUtil.sendConsoleMessage("&7 - Replacing cache");
|
||||
TaskManager.runTaskAsync(new Runnable() {
|
||||
TaskManager.runTaskAsync(new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run() {
|
||||
for (Entry<UUID, UUID> entry : uCMap.entrySet()) {
|
||||
String name = UUIDHandler.getName(entry.getKey());
|
||||
if (name != null) {
|
||||
public void run()
|
||||
{
|
||||
for (final Entry<UUID, UUID> entry : uCMap.entrySet())
|
||||
{
|
||||
final String name = UUIDHandler.getName(entry.getKey());
|
||||
if (name != null)
|
||||
{
|
||||
UUIDHandler.add(new StringWrapper(name), entry.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
MainUtil.sendConsoleMessage("&7 - Scanning for applicable files (uuids.txt)");
|
||||
|
||||
File file = new File(PS.get().IMP.getDirectory(), "uuids.txt");
|
||||
if (file.exists()) {
|
||||
try {
|
||||
List<String> lines = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8);
|
||||
for (String line : lines) {
|
||||
try {
|
||||
|
||||
final File file = new File(PS.get().IMP.getDirectory(), "uuids.txt");
|
||||
if (file.exists())
|
||||
{
|
||||
try
|
||||
{
|
||||
final List<String> lines = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8);
|
||||
for (String line : lines)
|
||||
{
|
||||
try
|
||||
{
|
||||
line = line.trim();
|
||||
if (line.length() == 0) {
|
||||
if (line.length() == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
line = line.replaceAll("[\\|][0-9]+[\\|][0-9]+[\\|]", "");
|
||||
String[] split = line.split("\\|");
|
||||
String name = split[0];
|
||||
if (name.length() == 0 || name.length() > 16 || !StringMan.isAlphanumericUnd(name)) {
|
||||
final String[] split = line.split("\\|");
|
||||
final String name = split[0];
|
||||
if ((name.length() == 0) || (name.length() > 16) || !StringMan.isAlphanumericUnd(name))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
UUID old = currentUUIDWrapper.getUUID(name);
|
||||
if (old == null) {
|
||||
final UUID old = currentUUIDWrapper.getUUID(name);
|
||||
if (old == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
UUID now = newWrapper.getUUID(name);
|
||||
final UUID now = newWrapper.getUUID(name);
|
||||
UUIDHandler.add(new StringWrapper(name), now);
|
||||
uCMap.put(old, now);
|
||||
uCReverse.put(now, old);
|
||||
}
|
||||
catch (Exception e2) {
|
||||
catch (final Exception e2)
|
||||
{
|
||||
e2.printStackTrace();
|
||||
}
|
||||
}
|
||||
} catch (IOException e) {
|
||||
}
|
||||
catch (final IOException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
MainUtil.sendConsoleMessage("&7 - Replacing wrapper");
|
||||
UUIDHandler.setUUIDWrapper(newWrapper);
|
||||
|
||||
|
||||
MainUtil.sendConsoleMessage("&7 - Updating plot objects");
|
||||
|
||||
for (Plot plot : PS.get().getPlotsRaw()) {
|
||||
UUID value = uCMap.get(plot.owner);
|
||||
if (value != null) {
|
||||
for (final Plot plot : PS.get().getPlotsRaw())
|
||||
{
|
||||
final UUID value = uCMap.get(plot.owner);
|
||||
if (value != null)
|
||||
{
|
||||
plot.owner = value;
|
||||
}
|
||||
plot.getTrusted().clear();
|
||||
plot.getMembers().clear();
|
||||
plot.getDenied().clear();
|
||||
}
|
||||
|
||||
|
||||
MainUtil.sendConsoleMessage("&7 - Deleting database");
|
||||
final AbstractDB database = DBFunc.dbManager;
|
||||
boolean result = database.deleteTables();
|
||||
final boolean result = database.deleteTables();
|
||||
|
||||
MainUtil.sendConsoleMessage("&7 - Creating tables");
|
||||
|
||||
try {
|
||||
|
||||
try
|
||||
{
|
||||
database.createTables();
|
||||
if (!result) {
|
||||
if (!result)
|
||||
{
|
||||
MainUtil.sendConsoleMessage("&cConversion failed! Attempting recovery");
|
||||
for (Plot plot : PS.get().getPlots()) {
|
||||
UUID value = uCReverse.get(plot.owner);
|
||||
if (value != null) {
|
||||
for (final Plot plot : PS.get().getPlots())
|
||||
{
|
||||
final UUID value = uCReverse.get(plot.owner);
|
||||
if (value != null)
|
||||
{
|
||||
plot.owner = value;
|
||||
}
|
||||
}
|
||||
database.createPlotsAndData(new ArrayList<>(PS.get().getPlots()), new Runnable() {
|
||||
database.createPlotsAndData(new ArrayList<>(PS.get().getPlots()), new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run() {
|
||||
public void run()
|
||||
{
|
||||
MainUtil.sendMessage(null, "&6Recovery was successful!");
|
||||
}
|
||||
});
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
catch (final Exception e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
return;
|
||||
}
|
||||
|
||||
if (newWrapper instanceof OfflineUUIDWrapper) {
|
||||
|
||||
if (newWrapper instanceof OfflineUUIDWrapper)
|
||||
{
|
||||
PS.get().config.set("UUID.force-lowercase", false);
|
||||
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.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.offline", false);
|
||||
}
|
||||
try {
|
||||
try
|
||||
{
|
||||
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("&7 - Populating tables");
|
||||
|
||||
TaskManager.runTaskAsync(new Runnable() {
|
||||
|
||||
TaskManager.runTaskAsync(new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run() {
|
||||
ArrayList<Plot> plots = new ArrayList<>(PS.get().getPlots());
|
||||
database.createPlotsAndData(plots, new Runnable() {
|
||||
public void run()
|
||||
{
|
||||
final ArrayList<Plot> plots = new ArrayList<>(PS.get().getPlots());
|
||||
database.createPlotsAndData(plots, new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run() {
|
||||
public void run()
|
||||
{
|
||||
MainUtil.sendConsoleMessage("&aConversion complete!");
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
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");
|
||||
}
|
||||
|
@ -36,66 +36,73 @@ import com.intellectualcrafters.plot.util.UUIDHandler;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "delete",
|
||||
permission = "plots.delete",
|
||||
description = "Delete a plot",
|
||||
usage = "/plot delete",
|
||||
aliases = {"dispose", "del"},
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE
|
||||
)
|
||||
public class Delete extends SubCommand {
|
||||
command = "delete",
|
||||
permission = "plots.delete",
|
||||
description = "Delete a plot",
|
||||
usage = "/plot delete",
|
||||
aliases = { "dispose", "del" },
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE)
|
||||
public class Delete extends SubCommand
|
||||
{
|
||||
|
||||
@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 Plot plot = MainUtil.getPlot(loc);
|
||||
if (plot == null) {
|
||||
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 (plot == null) { 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); }
|
||||
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);
|
||||
return false;
|
||||
}
|
||||
Runnable runnable = new Runnable() {
|
||||
final Runnable runnable = new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run() {
|
||||
if ((EconHandler.manager != null) && pWorld.USE_ECONOMY && plot.hasOwner() && plot.isOwner(UUIDHandler.getUUID(plr))) {
|
||||
public void run()
|
||||
{
|
||||
if ((EconHandler.manager != null) && pWorld.USE_ECONOMY && plot.hasOwner() && plot.isOwner(UUIDHandler.getUUID(plr)))
|
||||
{
|
||||
final double c = pWorld.SELL_PRICE;
|
||||
if (c > 0d) {
|
||||
if (c > 0d)
|
||||
{
|
||||
EconHandler.manager.depositMoney(plr, c);
|
||||
sendMessage(plr, C.ADDED_BALANCE, c + "");
|
||||
}
|
||||
}
|
||||
if (plot.unclaim()) {
|
||||
if (plot.unclaim())
|
||||
{
|
||||
final long start = System.currentTimeMillis();
|
||||
final boolean result = MainUtil.clearAsPlayer(plot, true, new Runnable() {
|
||||
final boolean result = MainUtil.clearAsPlayer(plot, true, new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run() {
|
||||
public void run()
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.CLEARING_DONE, "" + (System.currentTimeMillis() - start));
|
||||
}
|
||||
});
|
||||
if (!result) {
|
||||
if (!result)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER);
|
||||
}
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
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);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
TaskManager.runTask(runnable);
|
||||
}
|
||||
return true;
|
||||
|
@ -37,57 +37,68 @@ import com.plotsquared.general.commands.Argument;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "deny",
|
||||
aliases = {"d"},
|
||||
description = "Deny a user from a plot",
|
||||
usage = "/plot deny <player>",
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE
|
||||
)
|
||||
public class Deny extends SubCommand {
|
||||
command = "deny",
|
||||
aliases = { "d" },
|
||||
description = "Deny a user from a plot",
|
||||
usage = "/plot deny <player>",
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE)
|
||||
public class Deny extends SubCommand
|
||||
{
|
||||
|
||||
public Deny() {
|
||||
public Deny()
|
||||
{
|
||||
requiredArguments = new Argument[] {
|
||||
Argument.PlayerName
|
||||
Argument.PlayerName
|
||||
};
|
||||
}
|
||||
|
||||
@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 Plot plot = MainUtil.getPlot(loc);
|
||||
if (plot == null) {
|
||||
return !sendMessage(plr, C.NOT_IN_PLOT);
|
||||
}
|
||||
if ((plot == null) || !plot.hasOwner()) {
|
||||
if (plot == null) { return !sendMessage(plr, C.NOT_IN_PLOT); }
|
||||
if ((plot == null) || !plot.hasOwner())
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.PLOT_UNOWNED);
|
||||
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);
|
||||
return true;
|
||||
}
|
||||
UUID uuid;
|
||||
if (args[0].equalsIgnoreCase("*")) {
|
||||
if (args[0].equalsIgnoreCase("*"))
|
||||
{
|
||||
uuid = DBFunc.everyone;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
uuid = UUIDHandler.getUUID(args[0], null);
|
||||
}
|
||||
if (uuid == null) {
|
||||
if (UUIDHandler.implementation instanceof SQLUUIDHandler) {
|
||||
if (uuid == null)
|
||||
{
|
||||
if (UUIDHandler.implementation instanceof SQLUUIDHandler)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.INVALID_PLAYER_WAIT, args[0]);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[0]);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
if (plot.isOwner(uuid)) {
|
||||
if (plot.isOwner(uuid))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.ALREADY_OWNER);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (plot.getDenied().contains(uuid)) {
|
||||
|
||||
if (plot.getDenied().contains(uuid))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.ALREADY_ADDED);
|
||||
return false;
|
||||
}
|
||||
@ -96,15 +107,18 @@ public class Deny extends SubCommand {
|
||||
plot.addDenied(uuid);
|
||||
EventUtil.manager.callDenied(plr, plot, uuid, true);
|
||||
MainUtil.sendMessage(plr, C.DENIED_ADDED);
|
||||
if (!uuid.equals(DBFunc.everyone)) {
|
||||
if (!uuid.equals(DBFunc.everyone))
|
||||
{
|
||||
handleKick(uuid, plot);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void handleKick(final UUID uuid, final Plot plot) {
|
||||
PlotPlayer pp = UUIDHandler.getPlayer(uuid);
|
||||
if (pp != null && plot.equals(MainUtil.getPlot(pp.getLocation()))) {
|
||||
private void handleKick(final UUID uuid, final Plot plot)
|
||||
{
|
||||
final PlotPlayer pp = UUIDHandler.getPlayer(uuid);
|
||||
if ((pp != null) && plot.equals(MainUtil.getPlot(pp.getLocation())))
|
||||
{
|
||||
pp.teleport(BlockManager.manager.getSpawn(pp.getLocation().getWorld()));
|
||||
MainUtil.sendMessage(pp, C.YOU_GOT_DENIED);
|
||||
}
|
||||
|
@ -30,53 +30,57 @@ import com.intellectualcrafters.plot.object.Plot;
|
||||
import com.intellectualcrafters.plot.object.PlotAnalysis;
|
||||
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.Permissions;
|
||||
import com.intellectualcrafters.plot.util.UUIDHandler;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "done",
|
||||
aliases = {"submit"},
|
||||
description = "Mark a plot as done",
|
||||
permission = "plots.done",
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE
|
||||
)
|
||||
public class Done extends SubCommand {
|
||||
command = "done",
|
||||
aliases = { "submit" },
|
||||
description = "Mark a plot as done",
|
||||
permission = "plots.done",
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE)
|
||||
public class Done extends SubCommand
|
||||
{
|
||||
|
||||
@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 Plot plot = MainUtil.getPlot(loc);
|
||||
if (plot == null || !plot.hasOwner()) {
|
||||
return !sendMessage(plr, C.NOT_IN_PLOT);
|
||||
}
|
||||
if ((!plot.isOwner(plr.getUUID())) && !Permissions.hasPermission(plr, "plots.admin.command.done")) {
|
||||
if ((plot == null) || !plot.hasOwner()) { return !sendMessage(plr, C.NOT_IN_PLOT); }
|
||||
if ((!plot.isOwner(plr.getUUID())) && !Permissions.hasPermission(plr, "plots.admin.command.done"))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NO_PLOT_PERMS);
|
||||
return false;
|
||||
}
|
||||
if (plot.getSettings().flags.containsKey("done")) {
|
||||
if (plot.getSettings().flags.containsKey("done"))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.DONE_ALREADY_DONE);
|
||||
return false;
|
||||
}
|
||||
if (MainUtil.runners.containsKey(plot)) {
|
||||
if (MainUtil.runners.containsKey(plot))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER);
|
||||
return false;
|
||||
}
|
||||
MainUtil.runners.put(plot, 1);
|
||||
MainUtil.sendMessage(plr, C.GENERATING_LINK);
|
||||
HybridUtils.manager.analyzePlot(plot, new RunnableVal<PlotAnalysis>() {
|
||||
HybridUtils.manager.analyzePlot(plot, new RunnableVal<PlotAnalysis>()
|
||||
{
|
||||
@Override
|
||||
public void run() {
|
||||
public void run()
|
||||
{
|
||||
MainUtil.runners.remove(plot);
|
||||
if (value == null || value.getComplexity() >= Settings.CLEAR_THRESHOLD) {
|
||||
Flag flag = new Flag(FlagManager.getFlag("done"), (System.currentTimeMillis() / 1000));
|
||||
if ((value == null) || (value.getComplexity() >= Settings.CLEAR_THRESHOLD))
|
||||
{
|
||||
final Flag flag = new Flag(FlagManager.getFlag("done"), (System.currentTimeMillis() / 1000));
|
||||
FlagManager.addPlotFlag(plot, flag);
|
||||
MainUtil.sendMessage(plr, C.DONE_SUCCESS);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.DONE_INSUFFICIENT_COMPLEXITY);
|
||||
}
|
||||
}
|
||||
|
@ -17,52 +17,58 @@ import com.intellectualcrafters.plot.util.TaskManager;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "download",
|
||||
aliases = {"dl"},
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE,
|
||||
description = "Download your plot",
|
||||
permission = "plots.download"
|
||||
)
|
||||
public class Download extends SubCommand {
|
||||
command = "download",
|
||||
aliases = { "dl" },
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE,
|
||||
description = "Download your plot",
|
||||
permission = "plots.download")
|
||||
public class Download extends SubCommand
|
||||
{
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args) {
|
||||
|
||||
if (!Settings.METRICS) {
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
|
||||
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");
|
||||
return false;
|
||||
}
|
||||
final String world = plr.getLocation().getWorld();
|
||||
if (!PS.get().isPlotWorld(world)) {
|
||||
return !sendMessage(plr, C.NOT_IN_PLOT_WORLD);
|
||||
}
|
||||
if (!PS.get().isPlotWorld(world)) { return !sendMessage(plr, C.NOT_IN_PLOT_WORLD); }
|
||||
final Plot plot = MainUtil.getPlot(plr.getLocation());
|
||||
if (plot == null) {
|
||||
return !sendMessage(plr, C.NOT_IN_PLOT);
|
||||
}
|
||||
if (!plot.hasOwner()) {
|
||||
if (plot == null) { return !sendMessage(plr, C.NOT_IN_PLOT); }
|
||||
if (!plot.hasOwner())
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.PLOT_UNOWNED);
|
||||
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);
|
||||
return false;
|
||||
}
|
||||
if (MainUtil.runners.containsKey(plot)) {
|
||||
if (MainUtil.runners.containsKey(plot))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER);
|
||||
return false;
|
||||
}
|
||||
MainUtil.runners.put(plot, 1);
|
||||
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
|
||||
public void run() {
|
||||
TaskManager.runTaskAsync(new Runnable() {
|
||||
public void run()
|
||||
{
|
||||
TaskManager.runTaskAsync(new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run() {
|
||||
URL url = SchematicHandler.manager.upload(value, null, null);
|
||||
if (url == null) {
|
||||
public void run()
|
||||
{
|
||||
final URL url = SchematicHandler.manager.upload(value, null, null);
|
||||
if (url == null)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.GENERATING_LINK_FAILED);
|
||||
MainUtil.runners.remove(plot);
|
||||
return;
|
||||
|
@ -39,24 +39,26 @@ import com.intellectualcrafters.plot.util.StringMan;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "flag",
|
||||
aliases = {"f"},
|
||||
usage = "/plot flag <set|remove|add|list|info> <flag> <value>",
|
||||
description = "Manage plot flags",
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE,
|
||||
permission = "plots.flag"
|
||||
)
|
||||
public class FlagCmd extends SubCommand {
|
||||
command = "flag",
|
||||
aliases = { "f" },
|
||||
usage = "/plot flag <set|remove|add|list|info> <flag> <value>",
|
||||
description = "Manage plot flags",
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE,
|
||||
permission = "plots.flag")
|
||||
public class FlagCmd extends SubCommand
|
||||
{
|
||||
|
||||
@Override
|
||||
public String getUsage() {
|
||||
public String getUsage()
|
||||
{
|
||||
return super.getUsage().replaceAll("<flag>", StringMan.join(FlagManager.getFlags(), "|"));
|
||||
}
|
||||
|
||||
|
||||
@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 remove fly
|
||||
@ -64,40 +66,50 @@ public class FlagCmd extends SubCommand {
|
||||
* plot flag add use 2,4
|
||||
* plot flag list
|
||||
*/
|
||||
if (args.length == 0) {
|
||||
if (args.length == 0)
|
||||
{
|
||||
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot flag <set|remove|add|list|info>");
|
||||
return false;
|
||||
}
|
||||
final Location loc = player.getLocation();
|
||||
final Plot plot = MainUtil.getPlot(loc);
|
||||
if (plot == null) {
|
||||
if (plot == null)
|
||||
{
|
||||
MainUtil.sendMessage(player, C.NOT_IN_PLOT);
|
||||
return false;
|
||||
}
|
||||
if (!plot.hasOwner()) {
|
||||
if (!plot.hasOwner())
|
||||
{
|
||||
sendMessage(player, C.PLOT_NOT_CLAIMED);
|
||||
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");
|
||||
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);
|
||||
return false;
|
||||
}
|
||||
switch (args[0].toLowerCase()) {
|
||||
case "info": {
|
||||
if (!Permissions.hasPermission(player, "plots.set.flag")) {
|
||||
switch (args[0].toLowerCase())
|
||||
{
|
||||
case "info":
|
||||
{
|
||||
if (!Permissions.hasPermission(player, "plots.set.flag"))
|
||||
{
|
||||
MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.flag.info");
|
||||
return false;
|
||||
}
|
||||
if (args.length != 2) {
|
||||
if (args.length != 2)
|
||||
{
|
||||
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot flag info <flag>");
|
||||
return false;
|
||||
}
|
||||
final AbstractFlag af = FlagManager.getFlag(args[1]);
|
||||
if (af == null) {
|
||||
if (af == null)
|
||||
{
|
||||
MainUtil.sendMessage(player, C.NOT_VALID_FLAG);
|
||||
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot flag info <flag>");
|
||||
return false;
|
||||
@ -110,73 +122,92 @@ public class FlagCmd extends SubCommand {
|
||||
MainUtil.sendMessage(player, C.FLAG_DESC, af.getValueDesc());
|
||||
return true;
|
||||
}
|
||||
case "set": {
|
||||
if (!Permissions.hasPermission(player, "plots.set.flag")) {
|
||||
case "set":
|
||||
{
|
||||
if (!Permissions.hasPermission(player, "plots.set.flag"))
|
||||
{
|
||||
MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.set.flag");
|
||||
return false;
|
||||
}
|
||||
if (args.length < 3) {
|
||||
if (args.length < 3)
|
||||
{
|
||||
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot flag set <flag> <value>");
|
||||
return false;
|
||||
}
|
||||
final AbstractFlag af = FlagManager.getFlag(args[1].toLowerCase());
|
||||
if (af == null) {
|
||||
if (af == null)
|
||||
{
|
||||
MainUtil.sendMessage(player, C.NOT_VALID_FLAG);
|
||||
return false;
|
||||
}
|
||||
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());
|
||||
return false;
|
||||
}
|
||||
final Object parsed = af.parseValueRaw(value);
|
||||
if (parsed == null) {
|
||||
if (parsed == null)
|
||||
{
|
||||
MainUtil.sendMessage(player, "&c" + af.getValueDesc());
|
||||
return false;
|
||||
}
|
||||
final Flag flag = new Flag(FlagManager.getFlag(args[1].toLowerCase(), true), parsed);
|
||||
final boolean result = FlagManager.addPlotFlag(plot, flag);
|
||||
if (!result) {
|
||||
if (!result)
|
||||
{
|
||||
MainUtil.sendMessage(player, C.FLAG_NOT_ADDED);
|
||||
return false;
|
||||
}
|
||||
MainUtil.sendMessage(player, C.FLAG_ADDED);
|
||||
return true;
|
||||
}
|
||||
case "remove": {
|
||||
if (!Permissions.hasPermission(player, "plots.flag.remove")) {
|
||||
case "remove":
|
||||
{
|
||||
if (!Permissions.hasPermission(player, "plots.flag.remove"))
|
||||
{
|
||||
MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.flag.remove");
|
||||
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]");
|
||||
return false;
|
||||
}
|
||||
final AbstractFlag af = FlagManager.getFlag(args[1].toLowerCase());
|
||||
if (af == null) {
|
||||
if (af == null)
|
||||
{
|
||||
MainUtil.sendMessage(player, C.NOT_VALID_FLAG);
|
||||
return false;
|
||||
}
|
||||
final Flag flag = FlagManager.getPlotFlagAbs(plot, 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)) {
|
||||
if (!Permissions.hasPermission(player, "plots.set.flag." + args[1].toLowerCase()))
|
||||
{
|
||||
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);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (flag == null) {
|
||||
if (flag == null)
|
||||
{
|
||||
MainUtil.sendMessage(player, C.FLAG_NOT_IN_PLOT);
|
||||
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), " ");
|
||||
((FlagValue.ListValue) flag.getAbstractFlag().value).remove(flag.getValue(), value);
|
||||
DBFunc.setFlags(plot, plot.getSettings().flags.values());
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
final boolean result = FlagManager.removePlotFlag(plot, flag.getKey());
|
||||
if (!result) {
|
||||
if (!result)
|
||||
{
|
||||
MainUtil.sendMessage(player, C.FLAG_NOT_REMOVED);
|
||||
return false;
|
||||
}
|
||||
@ -184,23 +215,30 @@ public class FlagCmd extends SubCommand {
|
||||
MainUtil.sendMessage(player, C.FLAG_REMOVED);
|
||||
return true;
|
||||
}
|
||||
case "add": {
|
||||
if (!Permissions.hasPermission(player, "plots.flag.add")) {
|
||||
case "add":
|
||||
{
|
||||
if (!Permissions.hasPermission(player, "plots.flag.add"))
|
||||
{
|
||||
MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.flag.add");
|
||||
return false;
|
||||
}
|
||||
if (args.length < 3) {
|
||||
if (args.length < 3)
|
||||
{
|
||||
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot flag add <flag> <values>");
|
||||
return false;
|
||||
}
|
||||
final AbstractFlag af = FlagManager.getFlag(args[1].toLowerCase());
|
||||
if (af == null) {
|
||||
if (af == null)
|
||||
{
|
||||
MainUtil.sendMessage(player, C.NOT_VALID_FLAG);
|
||||
return false;
|
||||
}
|
||||
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)) {
|
||||
if (!Permissions.hasPermission(player, "plots.set.flag." + args[1].toLowerCase()))
|
||||
{
|
||||
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);
|
||||
return false;
|
||||
}
|
||||
@ -208,18 +246,23 @@ public class FlagCmd extends SubCommand {
|
||||
}
|
||||
final String value = StringMan.join(Arrays.copyOfRange(args, 2, args.length), " ");
|
||||
final Object parsed = af.parseValueRaw(value);
|
||||
if (parsed == null) {
|
||||
if (parsed == null)
|
||||
{
|
||||
MainUtil.sendMessage(player, "&c" + af.getValueDesc());
|
||||
return false;
|
||||
}
|
||||
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);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
((FlagValue.ListValue) flag.getAbstractFlag().value).add(flag.getValue(), value);
|
||||
}
|
||||
final boolean result = FlagManager.addPlotFlag(plot, flag);
|
||||
if (!result) {
|
||||
if (!result)
|
||||
{
|
||||
MainUtil.sendMessage(player, C.FLAG_NOT_ADDED);
|
||||
return false;
|
||||
}
|
||||
@ -227,26 +270,32 @@ public class FlagCmd extends SubCommand {
|
||||
MainUtil.sendMessage(player, C.FLAG_ADDED);
|
||||
return true;
|
||||
}
|
||||
case "list": {
|
||||
if (!Permissions.hasPermission(player, "plots.flag.list")) {
|
||||
case "list":
|
||||
{
|
||||
if (!Permissions.hasPermission(player, "plots.flag.list"))
|
||||
{
|
||||
MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.flag.list");
|
||||
return false;
|
||||
}
|
||||
if (args.length != 1) {
|
||||
if (args.length != 1)
|
||||
{
|
||||
MainUtil.sendMessage(player, C.COMMAND_SYNTAX, "/plot flag list");
|
||||
return false;
|
||||
}
|
||||
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", "");
|
||||
if (!flags.containsKey(type)) {
|
||||
if (!flags.containsKey(type))
|
||||
{
|
||||
flags.put(type, new ArrayList<String>());
|
||||
}
|
||||
flags.get(type).add(af.getKey());
|
||||
}
|
||||
String message = "";
|
||||
String prefix = "";
|
||||
for (final String flag : flags.keySet()) {
|
||||
for (final String flag : flags.keySet())
|
||||
{
|
||||
message += prefix + "&6" + flag + ": &7" + StringMan.join(flags.get(flag), ", ");
|
||||
prefix = "\n";
|
||||
}
|
||||
|
@ -9,79 +9,86 @@ import java.util.Set;
|
||||
import java.util.regex.Matcher;
|
||||
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.util.Permissions;
|
||||
import com.intellectualcrafters.plot.util.StringMan;
|
||||
import com.plotsquared.general.commands.Command;
|
||||
|
||||
public class GenerateDocs {
|
||||
public static void main(String[] args) {
|
||||
public class GenerateDocs
|
||||
{
|
||||
public static void main(final String[] args)
|
||||
{
|
||||
MainCommand.getInstance().addCommand(new WE_Anywhere());
|
||||
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(" - This page is automatically generated");
|
||||
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("");
|
||||
log("# Contents");
|
||||
for (CommandCategory category : CommandCategory.values()) {
|
||||
for (final CommandCategory category : CommandCategory.values())
|
||||
{
|
||||
log("###### " + category.name());
|
||||
for (Command<PlotPlayer> command : MainCommand.getCommands(category, null)) {
|
||||
log(" - [/plot " + command.getCommand() + "](https://github.com/IntellectualSites/PlotSquared/wiki/Commands#" + command.getCommand() +") ");
|
||||
for (final Command<PlotPlayer> command : MainCommand.getCommands(category, null))
|
||||
{
|
||||
log(" - [/plot " + command.getCommand() + "](https://github.com/IntellectualSites/PlotSquared/wiki/Commands#" + command.getCommand() + ") ");
|
||||
}
|
||||
log("");
|
||||
}
|
||||
log("# Commands");
|
||||
for (Command<PlotPlayer> command : commands) {
|
||||
for (final Command<PlotPlayer> command : commands)
|
||||
{
|
||||
printCommand(command);
|
||||
}
|
||||
}
|
||||
|
||||
public static void printCommand(Command<PlotPlayer> command) {
|
||||
try {
|
||||
String clazz = command.getClass().getSimpleName();
|
||||
String name = command.getCommand();
|
||||
|
||||
|
||||
public static void printCommand(final Command<PlotPlayer> command)
|
||||
{
|
||||
try
|
||||
{
|
||||
final String clazz = command.getClass().getSimpleName();
|
||||
final String name = command.getCommand();
|
||||
|
||||
// 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 + ") ");
|
||||
|
||||
File file = new File("src/main/java/com/intellectualcrafters/plot/commands/" + clazz + ".java");
|
||||
List<String> lines = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8);
|
||||
List<String> perms = getPerms(name, lines);
|
||||
String comment = getComments(lines);
|
||||
|
||||
|
||||
final File file = new File("src/main/java/com/intellectualcrafters/plot/commands/" + clazz + ".java");
|
||||
final List<String> lines = Files.readAllLines(file.toPath(), StandardCharsets.UTF_8);
|
||||
final List<String> perms = getPerms(name, lines);
|
||||
final String comment = getComments(lines);
|
||||
|
||||
log("#### Description");
|
||||
log("`" + command.getDescription() + "`");
|
||||
if (comment.length() > 0) {
|
||||
if (comment.length() > 0)
|
||||
{
|
||||
log("##### Comments");
|
||||
log("``` java");
|
||||
log(comment);
|
||||
log("```");
|
||||
}
|
||||
|
||||
|
||||
log("#### Usage");
|
||||
log("`" + command.getUsage().replaceAll("\\{label\\}", "plot") + "`");
|
||||
|
||||
|
||||
if (command.getRequiredType() != RequiredType.NONE) {
|
||||
|
||||
if (command.getRequiredType() != RequiredType.NONE)
|
||||
{
|
||||
log("#### Required callers");
|
||||
log("`" + command.getRequiredType().name() + "`");
|
||||
}
|
||||
|
||||
Set<String> aliases = command.getAliases();
|
||||
if (aliases.size() > 0) {
|
||||
|
||||
final Set<String> aliases = command.getAliases();
|
||||
if (aliases.size() > 0)
|
||||
{
|
||||
log("#### Aliases");
|
||||
log("`" + StringMan.getString(command.getAliases()) + "`");
|
||||
}
|
||||
|
||||
|
||||
log("#### Permissions");
|
||||
log("##### Primary");
|
||||
log(" - `" + command.getPermission() + "` ");
|
||||
if (perms.size() > 0) {
|
||||
if (perms.size() > 0)
|
||||
{
|
||||
log("");
|
||||
log("##### Other");
|
||||
log(" - `" + StringMan.join(perms, "`\n - `") + "`");
|
||||
@ -90,54 +97,68 @@ public class GenerateDocs {
|
||||
log("***");
|
||||
log("");
|
||||
}
|
||||
catch (Exception e) {
|
||||
catch (final Exception e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static List<String> getPerms(String cmd, List<String> lines) {
|
||||
ArrayList<String> perms = new ArrayList<String>();
|
||||
Pattern p = Pattern.compile("\"([^\"]*)\"");
|
||||
for (String line : lines) {
|
||||
if (line.contains("Permissions.hasPermission(")) {
|
||||
Matcher m = p.matcher(line);
|
||||
while (m.find()) {
|
||||
|
||||
public static List<String> getPerms(final String cmd, final List<String> lines)
|
||||
{
|
||||
final ArrayList<String> perms = new ArrayList<String>();
|
||||
final Pattern p = Pattern.compile("\"([^\"]*)\"");
|
||||
for (final String line : lines)
|
||||
{
|
||||
if (line.contains("Permissions.hasPermission("))
|
||||
{
|
||||
final Matcher m = p.matcher(line);
|
||||
while (m.find())
|
||||
{
|
||||
String perm = m.group(1);
|
||||
if (perm.endsWith(".")) {
|
||||
if (perm.endsWith("."))
|
||||
{
|
||||
perm += "<arg>";
|
||||
}
|
||||
if (perm.startsWith(".")) {
|
||||
if (perm.startsWith("."))
|
||||
{
|
||||
perms.set(perms.size() - 1, perms.get(perms.size() - 1) + perm);
|
||||
}
|
||||
else if (perm.contains(".")) {
|
||||
else if (perm.contains("."))
|
||||
{
|
||||
perms.add(perm);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
switch (cmd.toLowerCase()) {
|
||||
switch (cmd.toLowerCase())
|
||||
{
|
||||
case "auto":
|
||||
case "claim": {
|
||||
case "claim":
|
||||
{
|
||||
perms.add("plots.plot.#");
|
||||
break;
|
||||
}
|
||||
}
|
||||
return perms;
|
||||
}
|
||||
|
||||
public static String getComments(List<String> lines) {
|
||||
StringBuilder result = new StringBuilder();
|
||||
for (String line : lines) {
|
||||
|
||||
public static String getComments(final List<String> lines)
|
||||
{
|
||||
final StringBuilder result = new StringBuilder();
|
||||
for (String line : lines)
|
||||
{
|
||||
line = line.trim();
|
||||
if (line.startsWith("/** ") || line.startsWith("*/ ") || line.startsWith("* ")) {
|
||||
if (line.startsWith("/** ") || line.startsWith("*/ ") || line.startsWith("* "))
|
||||
{
|
||||
line = (line.replaceAll("/[*][*] ", "").replaceAll("[*]/ ", "").replaceAll("[*] ", "")).trim();
|
||||
result.append(line + "\n");
|
||||
}
|
||||
}
|
||||
return result.toString().trim();
|
||||
}
|
||||
|
||||
public static void log(String s) {
|
||||
|
||||
public static void log(final String s)
|
||||
{
|
||||
System.out.println(s);
|
||||
}
|
||||
}
|
||||
|
@ -4,15 +4,16 @@ import com.intellectualcrafters.plot.object.PlotPlayer;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "help",
|
||||
description = "Get this help menu",
|
||||
aliases = {"he"},
|
||||
category = CommandCategory.INFO
|
||||
)
|
||||
public class Help extends SubCommand {
|
||||
command = "help",
|
||||
description = "Get this help menu",
|
||||
aliases = { "he" },
|
||||
category = CommandCategory.INFO)
|
||||
public class Help extends SubCommand
|
||||
{
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args) {
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -23,7 +23,6 @@ package com.intellectualcrafters.plot.commands;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import com.intellectualcrafters.plot.PS;
|
||||
import com.intellectualcrafters.plot.PS.SortType;
|
||||
import com.intellectualcrafters.plot.config.C;
|
||||
import com.intellectualcrafters.plot.object.Plot;
|
||||
import com.intellectualcrafters.plot.object.PlotPlayer;
|
||||
@ -31,42 +30,53 @@ import com.intellectualcrafters.plot.util.MainUtil;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "home",
|
||||
aliases = {"h"},
|
||||
description = "Go to your plot",
|
||||
usage = "/plot home [id|alias]",
|
||||
category = CommandCategory.TELEPORT,
|
||||
requiredType = RequiredType.NONE
|
||||
)
|
||||
public class Home extends SubCommand {
|
||||
command = "home",
|
||||
aliases = { "h" },
|
||||
description = "Go to your plot",
|
||||
usage = "/plot home [id|alias]",
|
||||
category = CommandCategory.TELEPORT,
|
||||
requiredType = RequiredType.NONE)
|
||||
public class Home extends SubCommand
|
||||
{
|
||||
|
||||
private Plot isAlias(final String a) {
|
||||
for (final Plot p : PS.get().getPlots()) {
|
||||
if ((p.getSettings().getAlias().length() > 0) && p.getSettings().getAlias().equalsIgnoreCase(a)) {
|
||||
return p;
|
||||
}
|
||||
private Plot isAlias(final String a)
|
||||
{
|
||||
for (final Plot p : PS.get().getPlots())
|
||||
{
|
||||
if ((p.getSettings().getAlias().length() > 0) && p.getSettings().getAlias().equalsIgnoreCase(a)) { return p; }
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@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);
|
||||
if (plots.size() == 1) {
|
||||
if (plots.size() == 1)
|
||||
{
|
||||
MainUtil.teleportPlayer(plr, plr.getLocation(), plots.get(0));
|
||||
return true;
|
||||
} else if (plots.size() > 1) {
|
||||
if (args.length < 1) {
|
||||
}
|
||||
else if (plots.size() > 1)
|
||||
{
|
||||
if (args.length < 1)
|
||||
{
|
||||
args = new String[] { "1" };
|
||||
}
|
||||
int id = 0;
|
||||
try {
|
||||
try
|
||||
{
|
||||
id = Integer.parseInt(args[0]);
|
||||
} catch (final Exception e) {
|
||||
}
|
||||
catch (final Exception e)
|
||||
{
|
||||
Plot temp;
|
||||
if ((temp = isAlias(args[0])) != null) {
|
||||
if (temp.hasOwner()) {
|
||||
if (temp.isOwner(plr.getUUID())) {
|
||||
if ((temp = isAlias(args[0])) != null)
|
||||
{
|
||||
if (temp.hasOwner())
|
||||
{
|
||||
if (temp.isOwner(plr.getUUID()))
|
||||
{
|
||||
MainUtil.teleportPlayer(plr, plr.getLocation(), temp);
|
||||
return true;
|
||||
}
|
||||
@ -77,19 +87,23 @@ public class Home extends SubCommand {
|
||||
MainUtil.sendMessage(plr, C.NOT_VALID_NUMBER, "(1, " + plots.size() + ")");
|
||||
return true;
|
||||
}
|
||||
if ((id > (plots.size())) || (id < 1)) {
|
||||
if ((id > (plots.size())) || (id < 1))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NOT_VALID_NUMBER, "(1, " + plots.size() + ")");
|
||||
return false;
|
||||
}
|
||||
MainUtil.teleportPlayer(plr, plr.getLocation(), plots.get(id - 1));
|
||||
return true;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.FOUND_NO_PLOTS);
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
@ -35,46 +35,54 @@ import com.intellectualcrafters.plot.util.StringMan;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "inbox",
|
||||
description = "Review the comments for a plot",
|
||||
usage = "/plot inbox [inbox] [delete <index>|clear|page]",
|
||||
permission = "plots.inbox",
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE
|
||||
)
|
||||
public class Inbox extends SubCommand {
|
||||
|
||||
public void displayComments(PlotPlayer player, List<PlotComment> oldComments, int page) {
|
||||
if (oldComments == null || oldComments.size() == 0) {
|
||||
command = "inbox",
|
||||
description = "Review the comments for a plot",
|
||||
usage = "/plot inbox [inbox] [delete <index>|clear|page]",
|
||||
permission = "plots.inbox",
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE)
|
||||
public class Inbox extends SubCommand
|
||||
{
|
||||
|
||||
public void displayComments(final PlotPlayer player, final List<PlotComment> oldComments, int page)
|
||||
{
|
||||
if ((oldComments == null) || (oldComments.size() == 0))
|
||||
{
|
||||
MainUtil.sendMessage(player, C.INBOX_EMPTY);
|
||||
return;
|
||||
}
|
||||
PlotComment[] comments = oldComments.toArray(new PlotComment[oldComments.size()]);
|
||||
if (page < 0) {
|
||||
final PlotComment[] comments = oldComments.toArray(new PlotComment[oldComments.size()]);
|
||||
if (page < 0)
|
||||
{
|
||||
page = 0;
|
||||
}
|
||||
// Get the total pages
|
||||
// int totalPages = ((int) Math.ceil(12 *
|
||||
final int totalPages = (int) Math.ceil(comments.length / 12);
|
||||
if (page > totalPages) {
|
||||
if (page > totalPages)
|
||||
{
|
||||
page = totalPages;
|
||||
}
|
||||
// Only display 12 per page
|
||||
int max = (page * 12) + 12;
|
||||
if (max > comments.length) {
|
||||
if (max > comments.length)
|
||||
{
|
||||
max = comments.length;
|
||||
}
|
||||
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");
|
||||
PlotComment c;
|
||||
// This might work xD
|
||||
for (int x = (page * 12); x < max; x++) {
|
||||
for (int x = (page * 12); x < max; x++)
|
||||
{
|
||||
c = comments[x];
|
||||
String color;
|
||||
if (player.getName().equals(c.senderName)) {
|
||||
if (player.getName().equals(c.senderName))
|
||||
{
|
||||
color = "&a";
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
color = "&7";
|
||||
}
|
||||
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
|
||||
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());
|
||||
if (args.length == 0) {
|
||||
if (args.length == 0)
|
||||
{
|
||||
sendMessage(player, C.COMMAND_SYNTAX, "/plot inbox [inbox] [delete <index>|clear|page]");
|
||||
for (final CommentInbox inbox : CommentManager.inboxes.values()) {
|
||||
if (inbox.canRead(plot, player)) {
|
||||
if (!inbox.getComments(plot, new RunnableVal() {
|
||||
for (final CommentInbox inbox : CommentManager.inboxes.values())
|
||||
{
|
||||
if (inbox.canRead(plot, player))
|
||||
{
|
||||
if (!inbox.getComments(plot, new RunnableVal()
|
||||
{
|
||||
@Override
|
||||
public void run() {
|
||||
if (value != null) {
|
||||
public void run()
|
||||
{
|
||||
if (value != null)
|
||||
{
|
||||
int total = 0;
|
||||
int unread = 0;
|
||||
for (PlotComment comment : (ArrayList<PlotComment>) value) {
|
||||
for (final PlotComment comment : (ArrayList<PlotComment>) value)
|
||||
{
|
||||
total++;
|
||||
if (comment.timestamp > CommentManager.getTimestamp(player, inbox.toString())) {
|
||||
if (comment.timestamp > CommentManager.getTimestamp(player, inbox.toString()))
|
||||
{
|
||||
unread++;
|
||||
}
|
||||
}
|
||||
if (total != 0) {
|
||||
if (total != 0)
|
||||
{
|
||||
String color;
|
||||
if (unread > 0) {
|
||||
if (unread > 0)
|
||||
{
|
||||
color = "&c";
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
color = "";
|
||||
}
|
||||
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());
|
||||
}
|
||||
}
|
||||
@ -125,94 +145,120 @@ public class Inbox extends SubCommand {
|
||||
return false;
|
||||
}
|
||||
final CommentInbox inbox = CommentManager.inboxes.get(args[0].toLowerCase());
|
||||
if (inbox == null) {
|
||||
sendMessage(player, C.INVALID_INBOX, StringMan.join(CommentManager.inboxes.keySet(),", "));
|
||||
if (inbox == null)
|
||||
{
|
||||
sendMessage(player, C.INVALID_INBOX, StringMan.join(CommentManager.inboxes.keySet(), ", "));
|
||||
return false;
|
||||
}
|
||||
player.setMeta("inbox:" + inbox.toString(), System.currentTimeMillis());
|
||||
final int page;
|
||||
if (args.length > 1) {
|
||||
switch (args[1].toLowerCase()) {
|
||||
case "delete": {
|
||||
if (!inbox.canModify(plot, player)) {
|
||||
if (args.length > 1)
|
||||
{
|
||||
switch (args[1].toLowerCase())
|
||||
{
|
||||
case "delete":
|
||||
{
|
||||
if (!inbox.canModify(plot, player))
|
||||
{
|
||||
sendMessage(player, C.NO_PERM_INBOX_MODIFY);
|
||||
return false;
|
||||
}
|
||||
if (args.length != 3) {
|
||||
if (args.length != 3)
|
||||
{
|
||||
sendMessage(player, C.COMMAND_SYNTAX, "/plot inbox " + inbox.toString() + " delete <index>");
|
||||
}
|
||||
final int index;
|
||||
try {
|
||||
try
|
||||
{
|
||||
index = Integer.parseInt(args[2]);
|
||||
if (index < 1) {
|
||||
if (index < 1)
|
||||
{
|
||||
sendMessage(player, C.NOT_VALID_INBOX_INDEX, index + "");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
catch (NumberFormatException e) {
|
||||
catch (final NumberFormatException e)
|
||||
{
|
||||
sendMessage(player, C.COMMAND_SYNTAX, "/plot inbox " + inbox.toString() + " delete <index>");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!inbox.getComments(plot, new RunnableVal() {
|
||||
|
||||
if (!inbox.getComments(plot, new RunnableVal()
|
||||
{
|
||||
@Override
|
||||
public void run() {
|
||||
List<PlotComment> comments = (List<PlotComment>) value;
|
||||
if (index > comments.size()) {
|
||||
public void run()
|
||||
{
|
||||
final List<PlotComment> comments = (List<PlotComment>) value;
|
||||
if (index > comments.size())
|
||||
{
|
||||
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);
|
||||
plot.getSettings().removeComment(comment);
|
||||
MainUtil.sendMessage(player, C.COMMENT_REMOVED, comment.comment);
|
||||
}
|
||||
})) {
|
||||
}))
|
||||
{
|
||||
sendMessage(player, C.NOT_IN_PLOT);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
case "clear": {
|
||||
if (!inbox.canModify(plot, player)) {
|
||||
case "clear":
|
||||
{
|
||||
if (!inbox.canModify(plot, player))
|
||||
{
|
||||
sendMessage(player, C.NO_PERM_INBOX_MODIFY);
|
||||
}
|
||||
inbox.clearInbox(plot);
|
||||
ArrayList<PlotComment> comments = plot.getSettings().getComments(inbox.toString());
|
||||
if (comments != null) {
|
||||
final ArrayList<PlotComment> comments = plot.getSettings().getComments(inbox.toString());
|
||||
if (comments != null)
|
||||
{
|
||||
plot.getSettings().removeComments(comments);
|
||||
}
|
||||
MainUtil.sendMessage(player, C.COMMENT_REMOVED, "*");
|
||||
return true;
|
||||
}
|
||||
default: {
|
||||
try {
|
||||
page = Integer.parseInt(args[1]) ;
|
||||
default:
|
||||
{
|
||||
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]");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
page = 1;
|
||||
}
|
||||
if (!inbox.canRead(plot, player)) {
|
||||
if (!inbox.canRead(plot, player))
|
||||
{
|
||||
sendMessage(player, C.NO_PERM_INBOX);
|
||||
return false;
|
||||
}
|
||||
if (!inbox.getComments(plot, new RunnableVal() {
|
||||
if (!inbox.getComments(plot, new RunnableVal()
|
||||
{
|
||||
@Override
|
||||
public void run() {
|
||||
List<PlotComment> comments = (List<PlotComment>) value;
|
||||
public void run()
|
||||
{
|
||||
final List<PlotComment> comments = (List<PlotComment>) value;
|
||||
displayComments(player, comments, page);
|
||||
}
|
||||
})) {
|
||||
if (plot == null) {
|
||||
}))
|
||||
{
|
||||
if (plot == null)
|
||||
{
|
||||
sendMessage(player, C.NOT_IN_PLOT);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
sendMessage(player, C.PLOT_UNOWNED);
|
||||
}
|
||||
return false;
|
||||
|
@ -25,7 +25,6 @@ import java.util.Collection;
|
||||
import java.util.UUID;
|
||||
import java.util.regex.Matcher;
|
||||
|
||||
import com.intellectualcrafters.plot.PS;
|
||||
import com.intellectualcrafters.plot.config.C;
|
||||
import com.intellectualcrafters.plot.config.Settings;
|
||||
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.PlotItemStack;
|
||||
import com.intellectualcrafters.plot.object.PlotPlayer;
|
||||
import com.intellectualcrafters.plot.object.PlotWorld;
|
||||
import com.intellectualcrafters.plot.util.BlockManager;
|
||||
import com.intellectualcrafters.plot.util.MainUtil;
|
||||
import com.intellectualcrafters.plot.util.StringMan;
|
||||
@ -46,52 +44,56 @@ import com.intellectualcrafters.plot.util.UUIDHandler;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "info",
|
||||
aliases = {"i"},
|
||||
description = "Display plot info",
|
||||
usage = "/plot info <id>",
|
||||
category = CommandCategory.INFO
|
||||
)
|
||||
public class Info extends SubCommand {
|
||||
command = "info",
|
||||
aliases = { "i" },
|
||||
description = "Display plot info",
|
||||
usage = "/plot info <id>",
|
||||
category = CommandCategory.INFO)
|
||||
public class Info extends SubCommand
|
||||
{
|
||||
|
||||
public static String getPlayerList(final Collection<UUID> uuids) {
|
||||
ArrayList<UUID> l = new ArrayList<>(uuids);
|
||||
if ((l == null) || (l.size() < 1)) {
|
||||
return C.NONE.s();
|
||||
}
|
||||
public static String getPlayerList(final Collection<UUID> uuids)
|
||||
{
|
||||
final ArrayList<UUID> l = new ArrayList<>(uuids);
|
||||
if ((l == null) || (l.size() < 1)) { return C.NONE.s(); }
|
||||
final String c = C.PLOT_USER_LIST.s();
|
||||
final StringBuilder list = new StringBuilder();
|
||||
for (int x = 0; x < l.size(); x++) {
|
||||
if ((x + 1) == l.size()) {
|
||||
for (int x = 0; x < l.size(); x++)
|
||||
{
|
||||
if ((x + 1) == l.size())
|
||||
{
|
||||
list.append(c.replace("%user%", getPlayerName(l.get(x))).replace(",", ""));
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
list.append(c.replace("%user%", getPlayerName(l.get(x))));
|
||||
}
|
||||
}
|
||||
return list.toString();
|
||||
}
|
||||
|
||||
public static String getPlayerName(final UUID uuid) {
|
||||
if (uuid == null) {
|
||||
return C.UNKNOWN.s();
|
||||
}
|
||||
if (uuid.equals(DBFunc.everyone) || uuid.toString().equalsIgnoreCase(DBFunc.everyone.toString())) {
|
||||
return "everyone";
|
||||
}
|
||||
public static String getPlayerName(final UUID uuid)
|
||||
{
|
||||
if (uuid == null) { return C.UNKNOWN.s(); }
|
||||
if (uuid.equals(DBFunc.everyone) || uuid.toString().equalsIgnoreCase(DBFunc.everyone.toString())) { return "everyone"; }
|
||||
final String name = UUIDHandler.getName(uuid);
|
||||
if (name == null) {
|
||||
return "unknown";
|
||||
}
|
||||
if (name == null) { return "unknown"; }
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer player, String[] args) {
|
||||
public boolean onCommand(final PlotPlayer player, String[] args)
|
||||
{
|
||||
String arg = null;
|
||||
Plot plot;
|
||||
if (args.length > 0) arg = args[0] + "";
|
||||
if (arg != null) {
|
||||
switch (arg) {
|
||||
if (args.length > 0)
|
||||
{
|
||||
arg = args[0] + "";
|
||||
}
|
||||
if (arg != null)
|
||||
{
|
||||
switch (arg)
|
||||
{
|
||||
case "trusted":
|
||||
case "alias":
|
||||
case "inv":
|
||||
@ -107,49 +109,66 @@ public class Info extends SubCommand {
|
||||
break;
|
||||
default:
|
||||
plot = MainUtil.getPlotFromString(player, arg, false);
|
||||
if (args.length == 2) {
|
||||
if (args.length == 2)
|
||||
{
|
||||
arg = args[1];
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
arg = null;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
plot = MainUtil.getPlotFromString(player, null, false);
|
||||
}
|
||||
if (plot == null && arg != null) {
|
||||
if ((plot == null) && (arg != null))
|
||||
{
|
||||
plot = MainUtil.getPlotFromString(player, null, false);
|
||||
}
|
||||
if (plot == null) {
|
||||
if (plot == null)
|
||||
{
|
||||
MainUtil.sendMessage(player, C.NOT_IN_PLOT);
|
||||
return false;
|
||||
}
|
||||
if (arg != null) {
|
||||
if (args.length == 1) {
|
||||
if (arg != null)
|
||||
{
|
||||
if (args.length == 1)
|
||||
{
|
||||
args = new String[0];
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
args = new String[] { args[1] };
|
||||
}
|
||||
}
|
||||
if ((args.length == 1) && args[0].equalsIgnoreCase("inv")) {
|
||||
PlotInventory inv = new PlotInventory(player) {
|
||||
if ((args.length == 1) && args[0].equalsIgnoreCase("inv"))
|
||||
{
|
||||
final PlotInventory inv = new PlotInventory(player)
|
||||
{
|
||||
@Override
|
||||
public boolean onClick(int index) {
|
||||
public boolean onClick(final int index)
|
||||
{
|
||||
// TODO InfoInventory not implemented yet!!!!!!!!
|
||||
// See plot rating or musicsubcommand on examples
|
||||
return false;
|
||||
}
|
||||
};
|
||||
UUID uuid = player.getUUID();
|
||||
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, "&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"}));
|
||||
final UUID uuid = player.getUUID();
|
||||
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, "&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();
|
||||
return true;
|
||||
}
|
||||
@ -162,27 +181,33 @@ public class Info extends SubCommand {
|
||||
trustedEveryone = (plot.getMembers() != null) && plot.getMembers().contains(DBFunc.everyone);
|
||||
}
|
||||
// Unclaimed?
|
||||
if (!hasOwner && !containsEveryone && !trustedEveryone) {
|
||||
if (!hasOwner && !containsEveryone && !trustedEveryone)
|
||||
{
|
||||
MainUtil.sendMessage(player, C.PLOT_INFO_UNCLAIMED, (plot.id.x + ";" + plot.id.y));
|
||||
return true;
|
||||
}
|
||||
String info = C.PLOT_INFO.s();
|
||||
if (arg != null) {
|
||||
if (arg != null)
|
||||
{
|
||||
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");
|
||||
return false;
|
||||
}
|
||||
formatAndSend(info, plot.world, plot, player, true);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
formatAndSend(info, plot.world, plot, player, false);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private String getCaption(final String string) {
|
||||
switch (string) {
|
||||
private String getCaption(final String string)
|
||||
{
|
||||
switch (string)
|
||||
{
|
||||
case "trusted":
|
||||
return C.PLOT_INFO_TRUSTED.s();
|
||||
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 id2 = MainUtil.getTopPlot(plot).id;
|
||||
final int num = MainUtil.getPlotSelectionIds(id, id2).size();
|
||||
final String alias = plot.getSettings().getAlias().length() > 0 ? plot.getSettings().getAlias() : C.NONE.s();
|
||||
Location top = MainUtil.getPlotTopLoc(world, plot.id);
|
||||
Location bot = MainUtil.getPlotBottomLoc(world, plot.id).add(1, 0, 1);
|
||||
final Location top = MainUtil.getPlotTopLoc(world, plot.id);
|
||||
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 trusted = getPlayerList(plot.getTrusted());
|
||||
final String members = getPlayerList(plot.getMembers());
|
||||
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 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());
|
||||
|
||||
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("%id%", id.toString());
|
||||
@ -242,27 +271,34 @@ public class Info extends SubCommand {
|
||||
info = info.replaceAll("%flags%", Matcher.quoteReplacement(flags));
|
||||
info = info.replaceAll("%build%", build + "");
|
||||
info = info.replaceAll("%desc%", "No description set.");
|
||||
if (info.contains("%rating%")) {
|
||||
if (info.contains("%rating%"))
|
||||
{
|
||||
final String newInfo = info;
|
||||
TaskManager.runTaskAsync(new Runnable() {
|
||||
TaskManager.runTaskAsync(new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run() {
|
||||
public void run()
|
||||
{
|
||||
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;
|
||||
}
|
||||
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 prefix = "";
|
||||
double[] ratings = MainUtil.getAverageRatings(plot);
|
||||
for (int i = 0; i < ratings.length; i++) {
|
||||
final double[] ratings = MainUtil.getAverageRatings(plot);
|
||||
for (int i = 0; i < ratings.length; i++)
|
||||
{
|
||||
rating += prefix + Settings.RATING_CATEGORIES.get(i) + "=" + String.format("%.1f", ratings[i]);
|
||||
prefix = ",";
|
||||
}
|
||||
info = newInfo.replaceAll("%rating%", rating);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
info = newInfo.replaceAll("%rating%", String.format("%.1f", MainUtil.getAverageRating(plot)) + "/" + max);
|
||||
}
|
||||
MainUtil.sendMessage(player, C.PLOT_INFO_HEADER);
|
||||
|
@ -31,38 +31,41 @@ import com.intellectualcrafters.plot.util.UUIDHandler;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "kick",
|
||||
aliases = {"k"},
|
||||
description = "Kick a player from your plot",
|
||||
permission = "plots.kick",
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE
|
||||
)
|
||||
public class Kick extends SubCommand {
|
||||
command = "kick",
|
||||
aliases = { "k" },
|
||||
description = "Kick a player from your plot",
|
||||
permission = "plots.kick",
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE)
|
||||
public class Kick extends SubCommand
|
||||
{
|
||||
|
||||
@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 Plot plot = MainUtil.getPlot(loc);
|
||||
if (plot == null) {
|
||||
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) { return !sendMessage(plr, C.NOT_IN_PLOT); }
|
||||
if ((plot == null) || ((!plot.hasOwner() || !plot.isOwner(plr.getUUID())) && !Permissions.hasPermission(plr, "plots.admin.command.kick")))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.NO_PLOT_PERMS);
|
||||
return false;
|
||||
}
|
||||
if (args.length != 1) {
|
||||
if (args.length != 1)
|
||||
{
|
||||
MainUtil.sendMessage(plr, "&c/plot kick <player>");
|
||||
return false;
|
||||
}
|
||||
final PlotPlayer player = UUIDHandler.getPlayer(args[0]);
|
||||
if (player == null) {
|
||||
if (player == null)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[0]);
|
||||
return false;
|
||||
}
|
||||
Location otherLoc = player.getLocation();
|
||||
if (!plr.getLocation().getWorld().equals(otherLoc.getWorld()) || !plot.equals(MainUtil.getPlot(otherLoc))) {
|
||||
final Location otherLoc = player.getLocation();
|
||||
if (!plr.getLocation().getWorld().equals(otherLoc.getWorld()) || !plot.equals(MainUtil.getPlot(otherLoc)))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[0]);
|
||||
return false;
|
||||
}
|
||||
|
@ -23,7 +23,6 @@ package com.intellectualcrafters.plot.commands;
|
||||
import java.util.UUID;
|
||||
|
||||
import com.intellectualcrafters.plot.config.C;
|
||||
import com.intellectualcrafters.plot.object.OfflinePlotPlayer;
|
||||
import com.intellectualcrafters.plot.object.PlotPlayer;
|
||||
import com.intellectualcrafters.plot.util.MainUtil;
|
||||
import com.intellectualcrafters.plot.util.UUIDHandler;
|
||||
@ -31,38 +30,40 @@ import com.plotsquared.general.commands.Argument;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "limit",
|
||||
permission = "plots.limit",
|
||||
description = "Set or increment player plot claim limits",
|
||||
aliases = {"setlimit"},
|
||||
usage = "/plot limit <player> <expression>",
|
||||
category = CommandCategory.DEBUG
|
||||
)
|
||||
public class Limit extends SubCommand {
|
||||
command = "limit",
|
||||
permission = "plots.limit",
|
||||
description = "Set or increment player plot claim limits",
|
||||
aliases = { "setlimit" },
|
||||
usage = "/plot limit <player> <expression>",
|
||||
category = CommandCategory.DEBUG)
|
||||
public class Limit extends SubCommand
|
||||
{
|
||||
|
||||
public Limit() {
|
||||
public Limit()
|
||||
{
|
||||
requiredArguments = new Argument[] {
|
||||
Argument.String,
|
||||
Argument.String
|
||||
Argument.String,
|
||||
Argument.String
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args) {
|
||||
UUID uuid = UUIDHandler.getUUID(args[0], null);
|
||||
if (uuid == null) {
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
final UUID uuid = UUIDHandler.getUUID(args[0], null);
|
||||
if (uuid == null)
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.INVALID_PLAYER, args[0]);
|
||||
return false;
|
||||
}
|
||||
OfflinePlotPlayer op = UUIDHandler.getUUIDWrapper().getOfflinePlayer(uuid);
|
||||
|
||||
UUIDHandler.getUUIDWrapper().getOfflinePlayer(uuid);
|
||||
|
||||
// get current plot limit
|
||||
// increase
|
||||
|
||||
// EconHandler.manager.setPermission(op, perm, value);
|
||||
|
||||
// EconHandler.manager.setPermission(op, perm, value);
|
||||
plr.sendMessage("TODO");
|
||||
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -19,90 +19,106 @@ import com.intellectualcrafters.plot.util.TaskManager;
|
||||
import com.plotsquared.general.commands.CommandDeclaration;
|
||||
|
||||
@CommandDeclaration(
|
||||
command = "load",
|
||||
aliases = {"restore"},
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE,
|
||||
description = "Load your plot",
|
||||
permission = "plots.load",
|
||||
usage = "/plot restore"
|
||||
)
|
||||
public class Load extends SubCommand {
|
||||
command = "load",
|
||||
aliases = { "restore" },
|
||||
category = CommandCategory.ACTIONS,
|
||||
requiredType = RequiredType.NONE,
|
||||
description = "Load your plot",
|
||||
permission = "plots.load",
|
||||
usage = "/plot restore")
|
||||
public class Load extends SubCommand
|
||||
{
|
||||
|
||||
@Override
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args) {
|
||||
|
||||
if (!Settings.METRICS) {
|
||||
public boolean onCommand(final PlotPlayer plr, final String[] args)
|
||||
{
|
||||
|
||||
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");
|
||||
return false;
|
||||
}
|
||||
final String world = plr.getLocation().getWorld();
|
||||
if (!PS.get().isPlotWorld(world)) {
|
||||
return !sendMessage(plr, C.NOT_IN_PLOT_WORLD);
|
||||
}
|
||||
if (!PS.get().isPlotWorld(world)) { return !sendMessage(plr, C.NOT_IN_PLOT_WORLD); }
|
||||
final Plot plot = MainUtil.getPlot(plr.getLocation());
|
||||
if (plot == null) {
|
||||
return !sendMessage(plr, C.NOT_IN_PLOT);
|
||||
}
|
||||
if (!plot.hasOwner()) {
|
||||
if (plot == null) { return !sendMessage(plr, C.NOT_IN_PLOT); }
|
||||
if (!plot.hasOwner())
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.PLOT_UNOWNED);
|
||||
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);
|
||||
return false;
|
||||
}
|
||||
if (MainUtil.runners.containsKey(plot)) {
|
||||
if (MainUtil.runners.containsKey(plot))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (args.length != 0) {
|
||||
if (args.length == 1) {
|
||||
|
||||
if (args.length != 0)
|
||||
{
|
||||
if (args.length == 1)
|
||||
{
|
||||
// TODO load save here
|
||||
List<String> schematics = (List<String>) plr.getMeta("plot_schematics");
|
||||
if (schematics == null) {
|
||||
final List<String> schematics = (List<String>) plr.getMeta("plot_schematics");
|
||||
if (schematics == null)
|
||||
{
|
||||
// No schematics found:
|
||||
MainUtil.sendMessage(plr, C.LOAD_NULL);
|
||||
return false;
|
||||
}
|
||||
String schem;
|
||||
try {
|
||||
try
|
||||
{
|
||||
schem = schematics.get(Integer.parseInt(args[0]) - 1);
|
||||
}
|
||||
catch (Exception e) {
|
||||
catch (final Exception e)
|
||||
{
|
||||
// use /plot load <index>
|
||||
MainUtil.sendMessage(plr, C.NOT_VALID_NUMBER, "(1, " + schematics.size() + ")");
|
||||
return false;
|
||||
}
|
||||
final URL url;
|
||||
try {
|
||||
try
|
||||
{
|
||||
url = new URL(Settings.WEB_URL + "saves/" + plr.getUUID() + "/" + schem + ".schematic");
|
||||
} catch (MalformedURLException e) {
|
||||
}
|
||||
catch (final MalformedURLException e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
MainUtil.sendMessage(plr, C.LOAD_FAILED);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
MainUtil.runners.put(plot, 1);
|
||||
MainUtil.sendMessage(plr, C.GENERATING_COMPONENT);
|
||||
TaskManager.runTaskAsync(new Runnable() {
|
||||
TaskManager.runTaskAsync(new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run() {
|
||||
Schematic schematic = SchematicHandler.manager.getSchematic(url);
|
||||
if (schematic == null) {
|
||||
public void run()
|
||||
{
|
||||
final Schematic schematic = SchematicHandler.manager.getSchematic(url);
|
||||
if (schematic == null)
|
||||
{
|
||||
MainUtil.runners.remove(plot);
|
||||
sendMessage(plr, C.SCHEMATIC_INVALID, "non-existent or not in gzip format");
|
||||
return;
|
||||
}
|
||||
SchematicHandler.manager.paste(schematic, plot, 0, 0, new RunnableVal<Boolean>() {
|
||||
SchematicHandler.manager.paste(schematic, plot, 0, 0, new RunnableVal<Boolean>()
|
||||
{
|
||||
@Override
|
||||
public void run() {
|
||||
public void run()
|
||||
{
|
||||
MainUtil.runners.remove(plot);
|
||||
if (this.value) {
|
||||
if (value)
|
||||
{
|
||||
sendMessage(plr, C.SCHEMATIC_PASTE_SUCCESS);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
sendMessage(plr, C.SCHEMATIC_PASTE_FAILED);
|
||||
}
|
||||
}
|
||||
@ -115,18 +131,22 @@ public class Load extends SubCommand {
|
||||
MainUtil.sendMessage(plr, C.COMMAND_SYNTAX, "/plot load <index>");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// list schematics
|
||||
|
||||
List<String> schematics = (List<String>) plr.getMeta("plot_schematics");
|
||||
if (schematics == null) {
|
||||
|
||||
final List<String> schematics = (List<String>) plr.getMeta("plot_schematics");
|
||||
if (schematics == null)
|
||||
{
|
||||
MainUtil.runners.put(plot, 1);
|
||||
TaskManager.runTaskAsync(new Runnable() {
|
||||
TaskManager.runTaskAsync(new Runnable()
|
||||
{
|
||||
@Override
|
||||
public void run() {
|
||||
List<String> schematics = SchematicHandler.manager.getSaves(plr.getUUID());
|
||||
public void run()
|
||||
{
|
||||
final List<String> schematics = SchematicHandler.manager.getSaves(plr.getUUID());
|
||||
MainUtil.runners.remove(plot);
|
||||
if (schematics == null || schematics.size() == 0) {
|
||||
if ((schematics == null) || (schematics.size() == 0))
|
||||
{
|
||||
MainUtil.sendMessage(plr, C.LOAD_FAILED);
|
||||
return;
|
||||
}
|
||||
@ -135,76 +155,91 @@ public class Load extends SubCommand {
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
displaySaves(plr, 0);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public void displaySaves(PlotPlayer player, int page) {
|
||||
List<String> schematics = (List<String>) player.getMeta("plot_schematics");
|
||||
for (int i = 0; i < Math.min(schematics.size(), 32); i++) {
|
||||
try {
|
||||
String schem = schematics.get(i);
|
||||
String[] split = schem.split("_");
|
||||
if (split.length != 6) {
|
||||
|
||||
public void displaySaves(final PlotPlayer player, final int page)
|
||||
{
|
||||
final List<String> schematics = (List<String>) player.getMeta("plot_schematics");
|
||||
for (int i = 0; i < Math.min(schematics.size(), 32); i++)
|
||||
{
|
||||
try
|
||||
{
|
||||
final String schem = schematics.get(i);
|
||||
final String[] split = schem.split("_");
|
||||
if (split.length != 6)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
String time = secToTime((System.currentTimeMillis() / 1000) - (Long.parseLong(split[0])));
|
||||
String world = split[1];
|
||||
PlotId id = PlotId.fromString(split[2] + ";" + split[3]);
|
||||
String size = split[4];
|
||||
String server = split[5].replaceAll(".schematic", "");
|
||||
final String time = secToTime((System.currentTimeMillis() / 1000) - (Long.parseLong(split[0])));
|
||||
final String world = split[1];
|
||||
final PlotId id = PlotId.fromString(split[2] + ";" + split[3]);
|
||||
final String size = split[4];
|
||||
final String server = split[5].replaceAll(".schematic", "");
|
||||
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";
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
color = "$1";
|
||||
}
|
||||
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();
|
||||
}
|
||||
}
|
||||
MainUtil.sendMessage(player, C.LOAD_LIST);
|
||||
}
|
||||
|
||||
public String secToTime(long time) {
|
||||
StringBuilder toreturn = new StringBuilder();
|
||||
|
||||
public String secToTime(long time)
|
||||
{
|
||||
final StringBuilder toreturn = new StringBuilder();
|
||||
int years = 0;
|
||||
int weeks = 0;
|
||||
int days = 0;
|
||||
int hours = 0;
|
||||
int minutes = 0;
|
||||
if (time>=33868800) {
|
||||
years = (int) (time/33868800);
|
||||
time-=years*33868800;
|
||||
toreturn.append(years+"y ");
|
||||
if (time >= 33868800)
|
||||
{
|
||||
years = (int) (time / 33868800);
|
||||
time -= years * 33868800;
|
||||
toreturn.append(years + "y ");
|
||||
}
|
||||
if (time>=604800) {
|
||||
weeks = (int) (time/604800);
|
||||
time-=weeks*604800;
|
||||
toreturn.append(weeks+"w ");
|
||||
if (time >= 604800)
|
||||
{
|
||||
weeks = (int) (time / 604800);
|
||||
time -= weeks * 604800;
|
||||
toreturn.append(weeks + "w ");
|
||||
}
|
||||
if (time>=86400) {
|
||||
days = (int) (time/86400);
|
||||
time-=days*86400;
|
||||
toreturn.append(days+"d ");
|
||||
if (time >= 86400)
|
||||
{
|
||||
days = (int) (time / 86400);
|
||||
time -= days * 86400;
|
||||
toreturn.append(days + "d ");
|
||||
}
|
||||
if (time>=3600) {
|
||||
hours = (int) (time/3600);
|
||||
time-=hours*3600;
|
||||
toreturn.append(hours+"h ");
|
||||
if (time >= 3600)
|
||||
{
|
||||
hours = (int) (time / 3600);
|
||||
time -= hours * 3600;
|
||||
toreturn.append(hours + "h ");
|
||||
}
|
||||
if (time>=60) {
|
||||
minutes = (int) (time/60);
|
||||
time-=minutes*60;
|
||||
toreturn.append(minutes+"m ");
|
||||
if (time >= 60)
|
||||
{
|
||||
minutes = (int) (time / 60);
|
||||
time -= minutes * 60;
|
||||
toreturn.append(minutes + "m ");
|
||||
}
|
||||
if (toreturn.equals("")||time>0){
|
||||
toreturn.append((time)+"s ");
|
||||
if (toreturn.equals("") || (time > 0))
|
||||
{
|
||||
toreturn.append((time) + "s ");
|
||||
}
|
||||
return toreturn.toString().trim();
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user