Create tag template / auto-generate page for all permissions incl. description

This commit is contained in:
ljacqu 2015-12-05 20:53:44 +01:00
parent c91fb46951
commit 4d082388a5
13 changed files with 261 additions and 114 deletions

View File

@ -0,0 +1,41 @@
<!-- AUTO-GENERATED FILE! Do not edit this directly -->
<!-- File auto-generated on Sat Dec 05 20:52:57 CET 2015. See permissions/permission_nodes.tpl.md -->
## AuthMe Permission Nodes
The following are the permission nodes that are currently supported by the latest dev builds.
- **authme.command.admin.accounts** Administrator command to see all accounts associated with an user.
- **authme.command.admin.changemail** Administrator command to set or change the email adress of an user.
- **authme.command.admin.changepassword** Administrator command to change the password of a user.
- **authme.command.admin.converter** Administrator command to convert old or other data to AuthMe data.
- **authme.command.admin.firstspawn** Administrator command to teleport to the first AuthMe spawn.
- **authme.command.admin.forcelogin** Administrator command to force-login an existing user.
- **authme.command.admin.getemail** Administrator command to get the email address of an user, if set.
- **authme.command.admin.getip** Administrator command to get the last known IP of an user.
- **authme.command.admin.lastlogin** Administrator command to see the last login date and time of an user.
- **authme.command.admin.purge** Administrator command to purge old user data.
- **authme.command.admin.purgebannedplayers** Administrator command to purge all data associated with banned players.
- **authme.command.admin.purgelastpos** Administrator command to purge the last position of an user.
- **authme.command.admin.register** Administrator command to register a new user.
- **authme.command.admin.reload** Administrator command to reload the plugin configuration.
- **authme.command.admin.setfirstspawn** Administrator command to set the first AuthMe spawn.
- **authme.command.admin.setspawn** Administrator command to set the AuthMe spawn.
- **authme.command.admin.spawn** Administrator command to teleport to the AuthMe spawn.
- **authme.command.admin.switchantibot** Administrator command to toggle the AntiBot protection status.
- **authme.command.admin.unregister** Administrator command to unregister an existing user.
- **authme.command.player.allow2accounts** Permission for users to allow two accounts.
- **authme.command.player.bypassforcesurvival** Permission for users to bypass force-survival mode.
- **authme.command.player.captcha** Command permission to use captcha.
- **authme.command.player.changepassword** Command permission to change the password.
- **authme.command.player.email.add** Command permission to add an email address.
- **authme.command.player.email.change** Command permission to change the email address.
- **authme.command.player.email.recover** Command permission to recover an account using it's email address.
- **authme.command.player.login** Command permission to login.
- **authme.command.player.logout** Command permission to logout.
- **authme.command.player.register** Command permission to register.
- **authme.command.player.seeotheraccounts** Permission for user to see other accounts.
- **authme.command.player.unregister** Command permission to unregister.
- **authme.player.bypassantibot** Permission node to bypass AntiBot protection.
- **authme.player.canbeforced** Permission for users a login can be forced to.
- **authme.player.vip** Permission node to identify VIP users.

View File

@ -1,4 +1,4 @@
package permissionstree;
package permissions;
import fr.xephi.authme.permission.AdminPermission;
import fr.xephi.authme.permission.PermissionNode;

View File

@ -0,0 +1,86 @@
package permissions;
import utils.ANewMap;
import utils.GeneratedFileWriter;
import utils.TagReplacer;
import utils.ToolsConstants;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
/**
* Class responsible for formatting a permissions node list and
* for writing it to a file if desired.
*/
public class PermissionsListWriter {
private static final String PERMISSIONS_OUTPUT_FILE = ToolsConstants.DOCS_FOLDER + "permission_nodes.md";
public static void main(String[] args) {
// Ask if result should be written to file
Scanner scanner = new Scanner(System.in);
System.out.println("Include description? [Enter 'n' for no]");
boolean includeDescription = !matches("n", scanner);
if (!includeDescription) {
outputSimpleList();
return;
}
System.out.println("Write to file? [Enter 'n' for console output]");
boolean writeToFile = !matches("n", scanner);
scanner.close();
if (writeToFile) {
generateAndWriteFile();
} else {
System.out.println(generatePermissionsList());
}
}
private static void generateAndWriteFile() {
final String permissionsTagValue = generatePermissionsList();
Map<String, Object> tags = ANewMap.<String, Object>with("permissions", permissionsTagValue).build();
GeneratedFileWriter.generateFileFromTemplate(
ToolsConstants.TOOLS_SOURCE_ROOT + "permissions/permission_nodes.tpl.md", PERMISSIONS_OUTPUT_FILE, tags);
System.out.println("Wrote to '" + PERMISSIONS_OUTPUT_FILE + "'");
System.out.println("Before committing, please verify the output!");
}
private static String generatePermissionsList() {
PermissionNodesGatherer gatherer = new PermissionNodesGatherer();
Map<String, String> permissions = gatherer.gatherNodesWithJavaDoc();
final String template = GeneratedFileWriter.readFromToolsFile("permissions/permission_node_entry.tpl.md");
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, String> entry : permissions.entrySet()) {
Map<String, Object> tags = ANewMap.<String, Object>
with("node", entry.getKey())
.and("description", entry.getValue())
.build();
sb.append(TagReplacer.applyReplacements(template, tags));
}
return sb.toString();
}
private static void outputSimpleList() {
PermissionNodesGatherer gatherer = new PermissionNodesGatherer();
Set<String> nodes = gatherer.gatherNodes();
for (String node : nodes) {
System.out.println(node);
}
System.out.println();
System.out.println("Total: " + nodes.size());
}
private static boolean matches(String answer, Scanner sc) {
String userInput = sc.nextLine();
return answer.equalsIgnoreCase(userInput);
}
}

View File

@ -0,0 +1,2 @@
# About
Helper script to generate a page with an up-to-date list of permission nodes.

View File

@ -0,0 +1 @@
- **{node}** {description}

View File

@ -0,0 +1,7 @@
<!-- {gen_warning} -->
<!-- File auto-generated on {gen_date}. See permissions/permission_nodes.tpl.md -->
## AuthMe Permission Nodes
The following are the permission nodes that are currently supported by the latest dev builds.
{permissions}

View File

@ -1,62 +0,0 @@
package permissionstree;
import fr.xephi.authme.util.StringUtils;
import utils.CommentType;
import utils.GeneratedFileWriter;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
/**
* Class responsible for formatting a permissions node list and
* for writing it to a file if desired.
*/
public class PermissionsListWriter {
private static final String PERMISSIONS_TREE_FILE = "gen_permtree.txt";
public static void main(String[] args) {
// Ask if result should be written to file
Scanner scanner = new Scanner(System.in);
System.out.println("Include description? [Enter 'n' for no]");
boolean includeDescription = !matches("n", scanner);
System.out.println("Write to file? [Enter 'y' for yes]");
boolean writeToFile = matches("y", scanner);
scanner.close();
// Generate connections and output or write
String output = generatedOutput(includeDescription);
if (writeToFile) {
GeneratedFileWriter.createGeneratedFile(PERMISSIONS_TREE_FILE, output, CommentType.YML);
} else {
System.out.println(output);
}
}
private static String generatedOutput(boolean includeDescription) {
PermissionNodesGatherer creater = new PermissionNodesGatherer();
if (!includeDescription) {
Set<String> nodes = creater.gatherNodes();
return StringUtils.join("\n", nodes);
}
Map<String, String> permissions = creater.gatherNodesWithJavaDoc();
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, String> entry : permissions.entrySet()) {
sb.append(entry.getKey())
.append(": ")
.append(entry.getValue())
.append("\n");
}
return sb.toString();
}
private static boolean matches(String answer, Scanner sc) {
String userInput = sc.nextLine();
return answer.equalsIgnoreCase(userInput);
}
}

View File

@ -1,2 +0,0 @@
# About
Helper script to generate a list of all permission nodes.

View File

@ -0,0 +1,36 @@
package utils;
import java.util.HashMap;
import java.util.Map;
/**
* A map builder for the lazy.
* <p />
* Sample usage:
* <code>
* Map&lt;String, Integer> map = ANewMap
* .with("test", 123)
* .and("text", 938)
* .and("abc", 456)
* .build();
* </code>
*/
public class ANewMap<K, V> {
private Map<K, V> map = new HashMap<>();
public static <K, V> ANewMap<K, V> with(K key, V value) {
ANewMap<K, V> instance = new ANewMap<>();
return instance.and(key, value);
}
public ANewMap<K, V> and(K key, V value) {
map.put(key, value);
return this;
}
public Map<K, V> build() {
return map;
}
}

View File

@ -1,11 +0,0 @@
package utils;
/**
* Enum for different comment formats.
*/
public enum CommentType {
JAVA,
YML
}

View File

@ -1,61 +1,47 @@
package utils;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Date;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Map;
/**
* Utility class for writing a generated file with a timestamp.
*/
public final class GeneratedFileWriter {
private final static Charset CHARSET = Charset.forName("utf-8");
private GeneratedFileWriter() {
}
public static void createGeneratedFile(File file, String contents, CommentType commentFormat) {
validateFile(file);
public static void generateFileFromTemplate(String templateFile, String destinationFile, Map<String, Object> tags) {
String template = readFromFile(templateFile);
String result = TagReplacer.applyReplacements(template, tags);
try (OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(file))) {
osw.write(generateComment(commentFormat));
osw.write(contents);
writeToFile(destinationFile, result);
}
private static void writeToFile(String outputFile, String contents) {
try {
Files.write(Paths.get(outputFile), contents.getBytes());
} catch (IOException e) {
throw new RuntimeException("Could not write to file '" + file.getName() + "'", e);
throw new RuntimeException("Failed to write to file '" + outputFile + "'", e);
}
}
public static void createGeneratedFile(String fileName, String contents, CommentType commentFormat) {
createGeneratedFile(new File(fileName), contents, commentFormat);
}
private static String generateComment(CommentType commentFormat) {
String comment = "Auto-generated file, generated on " + new Date() + "\n\n";
switch (commentFormat) {
case JAVA:
return "// " + comment;
case YML:
return "# " + comment;
default:
throw new RuntimeException("Unknown comment format '" + commentFormat + "'");
public static String readFromFile(String file) {
try {
return new String(Files.readAllBytes(Paths.get(file)), CHARSET);
} catch (IOException e) {
throw new RuntimeException("Could not read from file '" + file + "'", e);
}
}
private static void validateFile(File file) {
if (!file.exists()) {
System.out.println("File '" + file.getName() + "' doesn't exist; attempting to create it");
try {
boolean success = file.createNewFile();
if (!success) {
throw new RuntimeException("Failed to create file '" + file.getName() + "'");
}
} catch (IOException e) {
throw new RuntimeException("Could not create file '" + file.getName() + "'", e);
}
}
if (!file.canWrite()) {
throw new RuntimeException("File '" + file.getName() + "' is not writable");
}
public static String readFromToolsFile(String file) {
return readFromFile(ToolsConstants.TOOLS_SOURCE_ROOT + file);
}
}

View File

@ -0,0 +1,46 @@
package utils;
import java.util.Date;
import java.util.Map;
/**
* Class responsible for replacing template tags to actual content.
* For all files, the following tags are defined:
* <ul>
* <li>{gen_date} the generation date</li>
* <li>{gen_warning} - warning not to edit the generated file directly</li>
* </ul>
*/
public class TagReplacer {
/**
* Replace a template with default tags and custom ones supplied by a map.
*
* @param template The template to process
* @param tags Map with additional tags, e.g. a map entry with key "foo" and value "bar" will replace
* any occurrences of "{foo}" to "bar".
* @return The filled template
*/
public static String applyReplacements(String template, Map<String, Object> tags) {
String result = template;
for (Map.Entry<String, Object> tagRule : tags.entrySet()) {
result = result.replace("{" + tagRule.getKey() + "}", tagRule.getValue().toString());
}
return applyReplacements(result);
}
/**
* Apply the default tag replacements.
*
* @param template The template to process
* @return The filled template
*/
public static String applyReplacements(String template) {
return template
.replace("{gen_date}", new Date().toString())
.replace("{gen_warning}", "AUTO-GENERATED FILE! Do not edit this directly");
}
}

View File

@ -0,0 +1,17 @@
package utils;
/**
* Constants for the src/tools folder.
*/
public final class ToolsConstants {
private ToolsConstants() {
}
public static final String MAIN_SOURCE_ROOT = "src/main/java/";
public static final String TOOLS_SOURCE_ROOT = "src/tools/";
public static final String DOCS_FOLDER = TOOLS_SOURCE_ROOT + "docs/";
}