Automatically adding config comments, fixes
Fixed read-only config handling (here as well) Added a warning for RandomTP if the worldborder is too large (#70) Implemented config comments with the help of Towny's CommentedConfiguration TODO: Glboal config, remove Towny dep
This commit is contained in:
parent
89c27a10c6
commit
fa18e8f22a
9 changed files with 300 additions and 42 deletions
|
@ -19,6 +19,7 @@
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
<orderEntry type="module" module-name="ButtonCore (1) (com.github.TBMCPlugins.ButtonCore)" />
|
<orderEntry type="module" module-name="ButtonCore (1) (com.github.TBMCPlugins.ButtonCore)" />
|
||||||
<orderEntry type="module" module-name="ButtonCore (1) (com.github.TBMCPlugins.ButtonCore)" />
|
<orderEntry type="module" module-name="ButtonCore (1) (com.github.TBMCPlugins.ButtonCore)" />
|
||||||
|
<orderEntry type="module" module-name="ButtonCore (1) (com.github.TBMCPlugins.ButtonCore)" />
|
||||||
<orderEntry type="library" name="Maven: org.reflections:reflections:0.9.10" level="project" />
|
<orderEntry type="library" name="Maven: org.reflections:reflections:0.9.10" level="project" />
|
||||||
<orderEntry type="library" name="Maven: com.google.code.findbugs:annotations:2.0.1" level="project" />
|
<orderEntry type="library" name="Maven: com.google.code.findbugs:annotations:2.0.1" level="project" />
|
||||||
<orderEntry type="library" name="Maven: org.javassist:javassist:3.20.0-GA" level="project" />
|
<orderEntry type="library" name="Maven: org.javassist:javassist:3.20.0-GA" level="project" />
|
||||||
|
|
|
@ -8,6 +8,8 @@ import org.bukkit.*;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
// @formatter:off
|
// @formatter:off
|
||||||
@SuppressWarnings("FieldCanBeLocal")@CommandClass
|
@SuppressWarnings("FieldCanBeLocal")@CommandClass
|
||||||
public class RandomTP extends TBMCCommandBase
|
public class RandomTP extends TBMCCommandBase
|
||||||
|
@ -53,15 +55,15 @@ public class RandomTP extends TBMCCommandBase
|
||||||
|
|
||||||
public void onEnable(Component component)
|
public void onEnable(Component component)
|
||||||
{
|
{
|
||||||
System.out.println("Adding command");
|
|
||||||
TBMCChatAPI.AddCommand(component, this);
|
TBMCChatAPI.AddCommand(component, this);
|
||||||
|
|
||||||
System.out.println("Getting world");
|
|
||||||
world = Bukkit.getWorld("World");
|
world = Bukkit.getWorld("World");
|
||||||
System.out.println("Getting border");
|
|
||||||
border = world.getWorldBorder();
|
border = world.getWorldBorder();
|
||||||
System.out.println("Getting new location");
|
Logger logger = component.getPlugin().getLogger();
|
||||||
System.out.println("Success: "+newLocation()); //TODO: It takes 10-30 seconds to find a location (newLocation() was there)
|
logger.info("Getting new location");
|
||||||
|
if(border.getSize() > 100000)
|
||||||
|
logger.warning("World border is wide, it may take a minute...");
|
||||||
|
logger.info("Success: "+newLocation());
|
||||||
}
|
}
|
||||||
|
|
||||||
/*================================================================================================*/
|
/*================================================================================================*/
|
||||||
|
|
|
@ -6,6 +6,7 @@ import buttondevteam.lib.architecture.Component;
|
||||||
/**
|
/**
|
||||||
* Teleport player to random location within world border.
|
* Teleport player to random location within world border.
|
||||||
* Every five players teleport to the same general area, and then a new general area is randomly selected for the next five players.
|
* Every five players teleport to the same general area, and then a new general area is randomly selected for the next five players.
|
||||||
|
* Author: github.com/iiegit
|
||||||
*/
|
*/
|
||||||
public class RandomTPComponent extends Component<MainPlugin> {
|
public class RandomTPComponent extends Component<MainPlugin> {
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -20,6 +20,9 @@ import org.bukkit.plugin.messaging.PluginMessageListener;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides a /spawn command that works with BungeeCord. Make sure to set up on each server.
|
||||||
|
*/
|
||||||
public class SpawnComponent extends Component<MainPlugin> implements PluginMessageListener {
|
public class SpawnComponent extends Component<MainPlugin> implements PluginMessageListener {
|
||||||
@Override
|
@Override
|
||||||
protected void enable() {
|
protected void enable() {
|
||||||
|
@ -72,7 +75,7 @@ public class SpawnComponent extends Component<MainPlugin> implements PluginMessa
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set to empty if this server is the target.
|
* The BungeeCord server that has the spawn. Set to empty if this server is the target.
|
||||||
*/
|
*/
|
||||||
private ConfigData<String> targetServer() {
|
private ConfigData<String> targetServer() {
|
||||||
return getConfig().getData("targetServer", "");
|
return getConfig().getData("targetServer", "");
|
||||||
|
|
|
@ -39,11 +39,11 @@ public class VotifierComponent extends Component<MainPlugin> {
|
||||||
getPlugin().getLogger().info("Vote: " + vote);
|
getPlugin().getLogger().info("Vote: " + vote);
|
||||||
org.bukkit.OfflinePlayer op = Bukkit.getOfflinePlayer(vote.getUsername());
|
org.bukkit.OfflinePlayer op = Bukkit.getOfflinePlayer(vote.getUsername());
|
||||||
Player p = Bukkit.getPlayer(vote.getUsername());
|
Player p = Bukkit.getPlayer(vote.getUsername());
|
||||||
if (op != null) {
|
/*if (op != null) {
|
||||||
economy.depositPlayer(op, rewardAmount().get());
|
economy.depositPlayer(op, rewardAmount().get());
|
||||||
}
|
}
|
||||||
if (p != null) {
|
if (p != null) {
|
||||||
p.sendMessage("§bThanks for voting! $50 was added to your account.");
|
p.sendMessage("§bThanks for voting! $50 was added to your account.");
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,12 +6,16 @@ import buttondevteam.lib.chat.Command2MC;
|
||||||
import buttondevteam.lib.chat.TBMCChatAPI;
|
import buttondevteam.lib.chat.TBMCChatAPI;
|
||||||
import lombok.AccessLevel;
|
import lombok.AccessLevel;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
import org.bukkit.configuration.file.FileConfiguration;
|
||||||
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.lang.annotation.ElementType;
|
import java.lang.annotation.ElementType;
|
||||||
import java.lang.annotation.Retention;
|
import java.lang.annotation.Retention;
|
||||||
import java.lang.annotation.RetentionPolicy;
|
import java.lang.annotation.RetentionPolicy;
|
||||||
import java.lang.annotation.Target;
|
import java.lang.annotation.Target;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.Stack;
|
import java.util.Stack;
|
||||||
|
|
||||||
|
@ -21,14 +25,15 @@ public abstract class ButtonPlugin extends JavaPlugin {
|
||||||
private static Command2MC command2MC = new Command2MC();
|
private static Command2MC command2MC = new Command2MC();
|
||||||
@Getter(AccessLevel.PROTECTED)
|
@Getter(AccessLevel.PROTECTED)
|
||||||
private IHaveConfig iConfig;
|
private IHaveConfig iConfig;
|
||||||
|
private CommentedConfiguration yaml;
|
||||||
@Getter(AccessLevel.PROTECTED)
|
@Getter(AccessLevel.PROTECTED)
|
||||||
private IHaveConfig data; //TODO
|
private IHaveConfig data; //TODO
|
||||||
private boolean loaded = false;
|
|
||||||
/**
|
/**
|
||||||
* Used to unregister components in the right order - and to reload configs
|
* Used to unregister components in the right order - and to reload configs
|
||||||
*/
|
*/
|
||||||
@Getter
|
@Getter
|
||||||
private Stack<Component<?>> componentStack = new Stack<>();
|
private Stack<Component<?>> componentStack = new Stack<>();
|
||||||
|
;
|
||||||
|
|
||||||
protected abstract void pluginEnable();
|
protected abstract void pluginEnable();
|
||||||
|
|
||||||
|
@ -56,8 +61,8 @@ public abstract class ButtonPlugin extends JavaPlugin {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void loadConfig() {
|
private void loadConfig() {
|
||||||
var section = super.getConfig().getConfigurationSection("global");
|
var section = getConfig().getConfigurationSection("global");
|
||||||
if (section == null) section = super.getConfig().createSection("global");
|
if (section == null) section = getConfig().createSection("global");
|
||||||
iConfig = new IHaveConfig(section, this::saveConfig);
|
iConfig = new IHaveConfig(section, this::saveConfig);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -88,13 +93,35 @@ public abstract class ButtonPlugin extends JavaPlugin {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean justReload() {
|
public boolean justReload() {
|
||||||
if (loaded && ConfigData.saveNow(getConfig())) {
|
if (yaml != null && ConfigData.saveNow(getConfig())) {
|
||||||
getLogger().warning("Saved pending configuration changes to the file, didn't reload (try again).");
|
getLogger().warning("Saved pending configuration changes to the file, didn't reload (try again).");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
super.reloadConfig();
|
yaml = new CommentedConfiguration(new File(getDataFolder(), "config.yml"));
|
||||||
loaded = true; //Needed because for the first time it uses reloadConfig() to load it
|
yaml.load();
|
||||||
|
var res = getTextResource("configHelp.yml");
|
||||||
|
if (res == null)
|
||||||
return true;
|
return true;
|
||||||
|
var yc = YamlConfiguration.loadConfiguration(res);
|
||||||
|
for (var kv : yc.getValues(true).entrySet())
|
||||||
|
if (kv.getValue() instanceof String)
|
||||||
|
yaml.addComment(kv.getKey(),
|
||||||
|
Arrays.stream(((String) kv.getValue()).split("\n"))
|
||||||
|
.map(str -> "# " + str.trim()).toArray(String[]::new));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public FileConfiguration getConfig() {
|
||||||
|
if (yaml == null)
|
||||||
|
justReload();
|
||||||
|
return yaml;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void saveConfig() {
|
||||||
|
if (yaml != null)
|
||||||
|
yaml.save();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
|
|
@ -0,0 +1,227 @@
|
||||||
|
package buttondevteam.lib.architecture;
|
||||||
|
|
||||||
|
import com.palmergames.util.FileMgmt;
|
||||||
|
import org.bukkit.configuration.InvalidConfigurationException;
|
||||||
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
|
import org.bukkit.configuration.file.YamlConstructor;
|
||||||
|
import org.bukkit.configuration.file.YamlRepresenter;
|
||||||
|
import org.yaml.snakeyaml.DumperOptions;
|
||||||
|
import org.yaml.snakeyaml.Yaml;
|
||||||
|
import org.yaml.snakeyaml.representer.Representer;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A copy of Towny's CommentedConfiguration: https://github.com/TownyAdvanced/Towny/blob/master/src/com/palmergames/bukkit/config/CommentedConfiguration.java
|
||||||
|
*
|
||||||
|
* @author dumptruckman & Articdive
|
||||||
|
*/
|
||||||
|
public class CommentedConfiguration extends YamlConfiguration { //TODO: Remove FileMgmt dependency
|
||||||
|
private HashMap<String, String> comments;
|
||||||
|
private File file;
|
||||||
|
|
||||||
|
private final DumperOptions yamlOptions = new DumperOptions();
|
||||||
|
private final Representer yamlRepresenter = new YamlRepresenter();
|
||||||
|
private final Yaml yaml = new Yaml(new YamlConstructor(), yamlRepresenter, yamlOptions);
|
||||||
|
|
||||||
|
public CommentedConfiguration(File file) {
|
||||||
|
|
||||||
|
super();
|
||||||
|
comments = new HashMap<>();
|
||||||
|
this.file = file;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean load() {
|
||||||
|
|
||||||
|
boolean loaded = true;
|
||||||
|
|
||||||
|
try {
|
||||||
|
this.load(file);
|
||||||
|
} catch (InvalidConfigurationException | IOException e) {
|
||||||
|
loaded = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return loaded;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void save() {
|
||||||
|
|
||||||
|
boolean saved = true;
|
||||||
|
|
||||||
|
// Save the config just like normal
|
||||||
|
try {
|
||||||
|
this.save(file);
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
saved = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if there's comments to add and it saved fine, we need to add comments
|
||||||
|
if (!comments.isEmpty() && saved) {
|
||||||
|
// String array of each line in the config file
|
||||||
|
String[] yamlContents = FileMgmt.convertFileToString(file).split("[" + System.getProperty("line.separator") + "]");
|
||||||
|
|
||||||
|
// This will hold the newly formatted line
|
||||||
|
StringBuilder newContents = new StringBuilder();
|
||||||
|
// This holds the current path the lines are at in the config
|
||||||
|
String currentPath = "";
|
||||||
|
// This flags if the line is a node or unknown text.
|
||||||
|
boolean node;
|
||||||
|
// The depth of the path. (number of words separated by periods - 1)
|
||||||
|
int depth = 0;
|
||||||
|
|
||||||
|
// Loop through the config lines
|
||||||
|
for (String line : yamlContents) {
|
||||||
|
// If the line is a node (and not something like a list value)
|
||||||
|
if (line.contains(": ") || (line.length() > 1 && line.charAt(line.length() - 1) == ':')) {
|
||||||
|
|
||||||
|
// This is a node so flag it as one
|
||||||
|
node = true;
|
||||||
|
|
||||||
|
// Grab the index of the end of the node name
|
||||||
|
int index;
|
||||||
|
index = line.indexOf(": ");
|
||||||
|
if (index < 0) {
|
||||||
|
index = line.length() - 1;
|
||||||
|
}
|
||||||
|
// If currentPath is empty, store the node name as the currentPath. (this is only on the first iteration, i think)
|
||||||
|
if (currentPath.isEmpty()) {
|
||||||
|
currentPath = line.substring(0, index);
|
||||||
|
} else {
|
||||||
|
// Calculate the whitespace preceding the node name
|
||||||
|
int whiteSpace = 0;
|
||||||
|
for (int n = 0; n < line.length(); n++) {
|
||||||
|
if (line.charAt(n) == ' ') {
|
||||||
|
whiteSpace++;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Find out if the current depth (whitespace * 2) is greater/lesser/equal to the previous depth
|
||||||
|
if (whiteSpace / 2 > depth) {
|
||||||
|
// Path is deeper. Add a . and the node name
|
||||||
|
currentPath += "." + line.substring(whiteSpace, index);
|
||||||
|
depth++;
|
||||||
|
} else if (whiteSpace / 2 < depth) {
|
||||||
|
// Path is shallower, calculate current depth from whitespace (whitespace / 2) and subtract that many levels from the currentPath
|
||||||
|
int newDepth = whiteSpace / 2;
|
||||||
|
for (int i = 0; i < depth - newDepth; i++) {
|
||||||
|
currentPath = currentPath.replace(currentPath.substring(currentPath.lastIndexOf(".")), "");
|
||||||
|
}
|
||||||
|
// Grab the index of the final period
|
||||||
|
int lastIndex = currentPath.lastIndexOf(".");
|
||||||
|
if (lastIndex < 0) {
|
||||||
|
// if there isn't a final period, set the current path to nothing because we're at root
|
||||||
|
currentPath = "";
|
||||||
|
} else {
|
||||||
|
// If there is a final period, replace everything after it with nothing
|
||||||
|
currentPath = currentPath.replace(currentPath.substring(currentPath.lastIndexOf(".")), "");
|
||||||
|
currentPath += ".";
|
||||||
|
}
|
||||||
|
// Add the new node name to the path
|
||||||
|
currentPath += line.substring(whiteSpace, index);
|
||||||
|
// Reset the depth
|
||||||
|
depth = newDepth;
|
||||||
|
} else {
|
||||||
|
// Path is same depth, replace the last path node name to the current node name
|
||||||
|
int lastIndex = currentPath.lastIndexOf(".");
|
||||||
|
if (lastIndex < 0) {
|
||||||
|
// if there isn't a final period, set the current path to nothing because we're at root
|
||||||
|
currentPath = "";
|
||||||
|
} else {
|
||||||
|
// If there is a final period, replace everything after it with nothing
|
||||||
|
currentPath = currentPath.replace(currentPath.substring(currentPath.lastIndexOf(".")), "");
|
||||||
|
currentPath += ".";
|
||||||
|
}
|
||||||
|
//currentPath = currentPath.replace(currentPath.substring(currentPath.lastIndexOf(".")), "");
|
||||||
|
currentPath += line.substring(whiteSpace, index);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
node = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (node) {
|
||||||
|
// If there's a comment for the current path, retrieve it and flag that path as already commented
|
||||||
|
String comment = comments.get(currentPath);
|
||||||
|
|
||||||
|
if (comment != null) {
|
||||||
|
// Add the comment to the beginning of the current line
|
||||||
|
line = comment + System.getProperty("line.separator") + line + System.getProperty("line.separator");
|
||||||
|
} else {
|
||||||
|
// Add a new line as it is a node, but has no comment
|
||||||
|
line += System.getProperty("line.separator");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Add the (modified) line to the total config String
|
||||||
|
if (!node) {
|
||||||
|
newContents.append(line).append(System.getProperty("line.separator"));
|
||||||
|
} else {
|
||||||
|
newContents.append(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Due to a Bukkit Bug with the Configuration
|
||||||
|
* we just need to remove any extra comments at the start of a file.
|
||||||
|
*/
|
||||||
|
while (newContents.toString().startsWith(" " + System.getProperty("line.separator"))) {
|
||||||
|
newContents = new StringBuilder(newContents.toString().replaceFirst(" " + System.getProperty("line.separator"), ""));
|
||||||
|
}
|
||||||
|
FileMgmt.stringToFile(newContents.toString(), file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a comment just before the specified path. The comment can be
|
||||||
|
* multiple lines. An empty string will indicate a blank line.
|
||||||
|
*
|
||||||
|
* @param path Configuration path to add comment.
|
||||||
|
* @param commentLines Comments to add. One String per line.
|
||||||
|
*/
|
||||||
|
public void addComment(String path, String... commentLines) {
|
||||||
|
|
||||||
|
StringBuilder commentstring = new StringBuilder();
|
||||||
|
StringBuilder leadingSpaces = new StringBuilder();
|
||||||
|
for (int n = 0; n < path.length(); n++) {
|
||||||
|
if (path.charAt(n) == '.') {
|
||||||
|
leadingSpaces.append(" ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (String line : commentLines) {
|
||||||
|
if (!line.isEmpty()) {
|
||||||
|
line = leadingSpaces + line;
|
||||||
|
} else {
|
||||||
|
line = " ";
|
||||||
|
}
|
||||||
|
if (commentstring.length() > 0) {
|
||||||
|
commentstring.append(System.getProperty("line.separator"));
|
||||||
|
}
|
||||||
|
commentstring.append(line);
|
||||||
|
}
|
||||||
|
comments.put(path, commentstring.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String saveToString() {
|
||||||
|
yamlOptions.setIndent(options().indent());
|
||||||
|
yamlOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
|
||||||
|
yamlOptions.setWidth(10000);
|
||||||
|
yamlRepresenter.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
|
||||||
|
|
||||||
|
|
||||||
|
String dump = yaml.dump(getValues(false));
|
||||||
|
|
||||||
|
|
||||||
|
if (dump.equals(BLANK_CONFIG)) {
|
||||||
|
dump = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
return dump;
|
||||||
|
}
|
||||||
|
}
|
|
@ -83,8 +83,8 @@ public class ConfigData<T> {
|
||||||
Object val;
|
Object val;
|
||||||
if (config == null || !config.isSet(path)) { //Call set() if config == null
|
if (config == null || !config.isSet(path)) { //Call set() if config == null
|
||||||
val = primitiveDef;
|
val = primitiveDef;
|
||||||
if (def == null && config != null) //In Discord's case def may be null
|
if ((def == null || this instanceof ReadOnlyConfigData) && config != null) //In Discord's case def may be null
|
||||||
setInternal(primitiveDef);
|
setInternal(primitiveDef); //If read-only then we still need to save the default value so it can be set
|
||||||
else
|
else
|
||||||
set(def); //Save default value - def is always set
|
set(def); //Save default value - def is always set
|
||||||
} else
|
} else
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
package buttondevteam.buttonproc;
|
package buttondevteam.buttonproc;
|
||||||
|
|
||||||
|
import org.bukkit.configuration.InvalidConfigurationException;
|
||||||
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
|
|
||||||
import javax.annotation.processing.ProcessingEnvironment;
|
import javax.annotation.processing.ProcessingEnvironment;
|
||||||
import javax.lang.model.element.Element;
|
import javax.lang.model.element.Element;
|
||||||
import javax.lang.model.element.ExecutableElement;
|
import javax.lang.model.element.ExecutableElement;
|
||||||
|
@ -10,29 +13,35 @@ import javax.lang.model.type.TypeMirror;
|
||||||
import javax.tools.FileObject;
|
import javax.tools.FileObject;
|
||||||
import javax.tools.StandardLocation;
|
import javax.tools.StandardLocation;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileWriter;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
public class ConfigProcessor {
|
public class ConfigProcessor {
|
||||||
private final ProcessingEnvironment procEnv;
|
private final ProcessingEnvironment procEnv;
|
||||||
private final FileWriter sw;
|
private final YamlConfiguration yc = new YamlConfiguration();
|
||||||
|
private final FileObject fo;
|
||||||
|
|
||||||
public ConfigProcessor(ProcessingEnvironment procEnv) {
|
public ConfigProcessor(ProcessingEnvironment procEnv) {
|
||||||
|
FileObject fo1;
|
||||||
this.procEnv = procEnv;
|
this.procEnv = procEnv;
|
||||||
FileWriter sw = null;
|
|
||||||
try {
|
try {
|
||||||
FileObject file = procEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", "configHelp.md");
|
fo1 = procEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", "configHelp.yml");
|
||||||
sw = new FileWriter(new File(file.toUri()));
|
|
||||||
System.out.println(file.toUri());
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
fo1 = null;
|
||||||
}
|
}
|
||||||
this.sw = sw;
|
this.fo = fo1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void process(Element targetcl) {
|
public void process(Element targetcl) {
|
||||||
if (targetcl.getModifiers().contains(Modifier.ABSTRACT)) return;
|
if (targetcl.getModifiers().contains(Modifier.ABSTRACT)) return;
|
||||||
final String path = "components." + targetcl.getSimpleName();
|
final String path = "components." + targetcl.getSimpleName();
|
||||||
|
File file = new File(fo.toUri());
|
||||||
|
try {
|
||||||
|
if (file.exists())
|
||||||
|
yc.load(file);
|
||||||
|
} catch (IOException | InvalidConfigurationException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
for (Element e : targetcl.getEnclosedElements()) {
|
for (Element e : targetcl.getEnclosedElements()) {
|
||||||
/*System.out.println("Element: "+e);
|
/*System.out.println("Element: "+e);
|
||||||
System.out.println("Type: "+e.getClass()+" - "+e.getKind());
|
System.out.println("Type: "+e.getClass()+" - "+e.getKind());
|
||||||
|
@ -49,30 +58,18 @@ public class ConfigProcessor {
|
||||||
String doc = procEnv.getElementUtils().getDocComment(e);
|
String doc = procEnv.getElementUtils().getDocComment(e);
|
||||||
if (doc == null) continue;
|
if (doc == null) continue;
|
||||||
System.out.println("DOC: " + doc);
|
System.out.println("DOC: " + doc);
|
||||||
try {
|
yc.set(path + "." + e.getSimpleName(), doc.trim());
|
||||||
sw.append(path).append(".").append(String.valueOf(e.getSimpleName())).append(System.lineSeparator()).append(System.lineSeparator());
|
|
||||||
sw.append(doc.trim()).append(System.lineSeparator()).append(System.lineSeparator());
|
|
||||||
} catch (IOException e1) {
|
|
||||||
e1.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
String javadoc = procEnv.getElementUtils().getDocComment(targetcl);
|
String javadoc = procEnv.getElementUtils().getDocComment(targetcl);
|
||||||
try {
|
|
||||||
if (javadoc != null) {
|
if (javadoc != null) {
|
||||||
System.out.println("JAVADOC");
|
System.out.println("JAVADOC");
|
||||||
System.out.println(javadoc.trim());
|
System.out.println(javadoc.trim());
|
||||||
sw.append(path).append(System.lineSeparator()).append(System.lineSeparator());
|
yc.set(path, javadoc.trim());
|
||||||
sw.append(javadoc).append(System.lineSeparator()).append(System.lineSeparator());
|
|
||||||
}
|
}
|
||||||
sw.flush();
|
try {
|
||||||
|
yc.save(file);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void finalize() throws Throwable {
|
|
||||||
sw.close();
|
|
||||||
super.finalize();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue