summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/TaskDeployer.java
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/TaskDeployer.java')
-rw-r--r--Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/TaskDeployer.java532
1 files changed, 0 insertions, 532 deletions
diff --git a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/TaskDeployer.java b/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/TaskDeployer.java
deleted file mode 100644
index 2a5a9c462e5..00000000000
--- a/Master/texmf-dist/source/support/arara/src/main/java/com/github/arara/utils/TaskDeployer.java
+++ /dev/null
@@ -1,532 +0,0 @@
-/**
- * \cond LICENSE
- * Arara -- the cool TeX automation tool
- * Copyright (c) 2012, Paulo Roberto Massa Cereda
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * 3. Neither the name of the project's author nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
- * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- * \endcond
- *
- * TaskDeployer: This class is responsible for taking the tasks and turning them
- * into rara commands.
- */
-// package definition
-package com.github.arara.utils;
-
-// needed imports
-import com.github.arara.exception.AraraException;
-import com.github.arara.model.AraraCommand;
-import com.github.arara.model.AraraRuleArgument;
-import com.github.arara.model.AraraRuleConfig;
-import com.github.arara.model.AraraTask;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.*;
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.lang3.SystemUtils;
-import org.mvel2.templates.TemplateRuntime;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.yaml.snakeyaml.Yaml;
-import org.yaml.snakeyaml.constructor.Constructor;
-import org.yaml.snakeyaml.error.MarkedYAMLException;
-import org.yaml.snakeyaml.nodes.Tag;
-import org.yaml.snakeyaml.representer.Representer;
-
-/**
- * Class responsible for taking the tasks and turning them into Arara commands.
- *
- * @author Paulo Roberto Massa Cereda
- * @version 3.0a
- * @since 1.0
- */
-public class TaskDeployer {
-
- // the logger
- final static Logger logger = LoggerFactory.getLogger(TaskDeployer.class);
- // the localization class
- final static AraraLocalization localization = AraraLocalization.getInstance();
- // the tasks list
- private List<AraraTask> tasks;
- //the output list with the proper commands
- private List<AraraCommand> commands;
- // the configuration
- private ConfigurationLoader configuration;
-
- /**
- * Constructor.
- *
- * @param tasks The Arara tasks.
- */
- public TaskDeployer(List<AraraTask> tasks, ConfigurationLoader configuration) {
-
- // set everything
- this.tasks = tasks;
-
- // set the configuration
- this.configuration = configuration;
-
- // create the list
- commands = new ArrayList<AraraCommand>();
-
- }
-
- /**
- * Deploys the tasks and returns the commands list.
- *
- * @return The Arara commands list.
- * @throws Exception Raised if something bad happened.
- */
- public List<AraraCommand> deploy() throws Exception {
-
- // log message
- logger.info("Deploying tasks into commands.");
-
- // for each task
- for (AraraTask currentTask : tasks) {
-
- // get the index where the rule is located
- int pathIndex = findRule(currentTask);
-
- // if it's not a negative index, that is, the rule was found
- if (pathIndex != -1) {
-
- // deploy plain rule
- deployRule(currentTask, pathIndex);
-
- } else {
-
- // not found, throw exception
- throw new AraraException(localization.getMessage("Error_RuleNotFound", currentTask.getName()));
- }
- }
-
- // return the commands
- return commands;
-
- }
-
- /**
- * Finds the rule in the rules directory.
- *
- * @param task The task to find.
- * @return The rule location.
- */
- private int findRule(AraraTask task) {
-
- // get the search path
- List<String> paths = configuration.getPaths();
-
- // for every entry in the search path
- for (int i = 0; i < paths.size(); i++) {
-
- // if the current task is found in the current path
- if (new File(paths.get(i).concat(File.separator).concat(task.getName()).concat(".yaml")).exists()) {
-
- // add an entry to the logger
- logger.trace(localization.getMessage("Log_RuleFound", task.getName(), paths.get(i)));
-
- // return the index of the current path
- return i;
- }
- }
-
- // nothing was found, return a negative value
- return -1;
-
- }
-
- /**
- * Deploys plain rule.
- *
- * @param task The task.
- * @throws Exception The rule has a bad definition.
- */
- private void deployRule(AraraTask task, int pathIndex) throws Exception {
-
- // create a representer
- Representer representer = new Representer();
-
- // add a class tag
- representer.addClassTag(AraraRuleConfig.class, new Tag("!config"));
- representer.addClassTag(AraraRuleArgument.class, new Tag("!argument"));
-
- // create a new YAML parser
- Yaml yaml = new Yaml(new Constructor(AraraRuleConfig.class), representer);
-
- FileReader fileReader = null;
-
- // new file reader
- fileReader = new FileReader(configuration.getPaths().get(pathIndex).concat(File.separator).concat(task.getName()).concat(".yaml"));
-
- // load rule
- AraraRuleConfig plainRule = null;
-
- try {
-
- // try to load the rule
- plainRule = (AraraRuleConfig) yaml.load(fileReader);
-
- } catch (MarkedYAMLException yamlException) {
-
- // YAML syntax error, throw exception
- throw new AraraException(localization.getMessage("Error_InvalidYAMLRule", task.getName(), configuration.getPaths().get(pathIndex)).concat("\n\n").concat(AraraUtils.extractInformationFromYAMLException(yamlException)));
- }
-
- try {
-
- // close reader
- fileReader.close();
-
- } catch (IOException ioException) {
- // do nothing here
- }
-
- // check if the rule is invalid
- if (plainRule == null) {
-
- // raise an error
- throw new AraraException(localization.getMessage("Error_InvalidRule", task.getName(), configuration.getPaths().get(pathIndex)));
- }
-
- // verify if the identifier is empty
- if (plainRule.getIdentifier() == null) {
-
- // raise error
- throw new AraraException(localization.getMessage("Error_EmptyIdentifierRule", task.getName(), configuration.getPaths().get(pathIndex)));
-
- } else {
-
- // check if the rule has a proper name
- if (plainRule.getName() == null) {
-
- // raise error
- throw new AraraException(localization.getMessage("Error_EmptyNameRule", task.getName(), configuration.getPaths().get(pathIndex)));
-
- } else {
-
- // check if the rule has a proper list of arguments
- if (plainRule.getArguments() == null) {
-
- // raise error
- throw new AraraException(localization.getMessage("Error_EmptyArgumentsListRule", task.getName(), configuration.getPaths().get(pathIndex)));
-
- }
- }
- }
-
- // if the rule name doesn't match with the file name
- if (!task.getName().equals(plainRule.getIdentifier())) {
-
- // throw exception
- throw new AraraException(localization.getMessage("Error_WrongIdentifierRule", task.getName(), configuration.getPaths().get(pathIndex), plainRule.getIdentifier()));
- }
-
- // check if the rule has any forbidden identifier
- if (plainRule.checkForForbiddenIdentifiers() != null) {
-
- // raise error
- throw new AraraException(localization.getMessage("Error_ForbiddenIdentifierRule", task.getName(), configuration.getPaths().get(pathIndex), plainRule.checkForForbiddenIdentifiers()));
- }
-
- // get the list of all arguments available in the rule
- List<String> availableArgumentsInRule = plainRule.getIdentifiersList();
-
- // add the two reserved keywords
- availableArgumentsInRule.add("file");
- availableArgumentsInRule.add("item");
-
- // get the parameters for the task
- HashMap directiveMap = task.getParameters();
-
- // for every entry in the parameters map of the task, add it to the
- // list of available parameters in the directive
- List<String> availableArgumentsInDirective = new ArrayList<String>();
- for (Object theKey : directiveMap.keySet()) {
- availableArgumentsInDirective.add((String) theKey);
- }
-
- // find out which arguments are not defined in the directive and in
- // the rule
- List<String> argumentsNotDefinedInDirective = (List<String>) CollectionUtils.subtract(availableArgumentsInRule, availableArgumentsInDirective);
- List<String> argumentsNotDefinedInRule = (List<String>) CollectionUtils.subtract(availableArgumentsInDirective, availableArgumentsInRule);
-
- // if there are invalid arguments in the directive
- if (!argumentsNotDefinedInRule.isEmpty()) {
-
- // raise error
- throw new AraraException(localization.getMessage("Error_ArgumentsNotDefinedInRule", task.getName(), configuration.getPaths().get(pathIndex), argumentsNotDefinedInRule.toString()));
- }
-
- // for all arguments in the rule not mapped in the directive, set
- // their default value to an empty string
- for (String currentKey : argumentsNotDefinedInDirective) {
- directiveMap.put(currentKey, "");
- }
-
- // add entries in the arguments map
- HashMap argumentMap = new HashMap();
- argumentMap.put("file", directiveMap.get("file"));
- argumentMap.put("item", directiveMap.get("item"));
- directiveMap.remove("file");
- directiveMap.remove("item");
- argumentMap.put("parameters", directiveMap);
-
- // helper functions added
- argumentMap.put("SystemUtils", SystemUtils.class);
- argumentMap.put("isEmpty", AraraMethods.class.getMethod("isEmpty", String.class));
- argumentMap.put("isNotEmpty", AraraMethods.class.getMethod("isNotEmpty", String.class));
- argumentMap.put("isEmpty", AraraMethods.class.getMethod("isEmpty", String.class, String.class));
- argumentMap.put("isNotEmpty", AraraMethods.class.getMethod("isNotEmpty", String.class, String.class));
- argumentMap.put("isEmpty", AraraMethods.class.getMethod("isEmpty", String.class, String.class, String.class));
- argumentMap.put("isNotEmpty", AraraMethods.class.getMethod("isNotEmpty", String.class, String.class, String.class));
- argumentMap.put("isTrue", AraraMethods.class.getMethod("isTrue", String.class));
- argumentMap.put("isFalse", AraraMethods.class.getMethod("isFalse", String.class));
- argumentMap.put("isTrue", AraraMethods.class.getMethod("isTrue", String.class, String.class));
- argumentMap.put("isFalse", AraraMethods.class.getMethod("isFalse", String.class, String.class));
- argumentMap.put("isTrue", AraraMethods.class.getMethod("isTrue", String.class, String.class, String.class));
- argumentMap.put("isFalse", AraraMethods.class.getMethod("isFalse", String.class, String.class, String.class));
- argumentMap.put("isTrue", AraraMethods.class.getMethod("isTrue", String.class, String.class, String.class, String.class));
- argumentMap.put("isFalse", AraraMethods.class.getMethod("isFalse", String.class, String.class, String.class, String.class));
- argumentMap.put("trimSpaces", AraraMethods.class.getMethod("trimSpaces", String.class));
- argumentMap.put("getFilename", AraraMethods.class.getMethod("getFilename", String.class));
- argumentMap.put("getBasename", AraraMethods.class.getMethod("getBasename", String.class));
- argumentMap.put("getFiletype", AraraMethods.class.getMethod("getFiletype", String.class));
- argumentMap.put("getDirname", AraraMethods.class.getMethod("getDirname", String.class));
- argumentMap.put("isFile", AraraMethods.class.getMethod("isFile", String.class));
- argumentMap.put("isDir", AraraMethods.class.getMethod("isDir", String.class));
- argumentMap.put("isWindows", AraraMethods.class.getMethod("isWindows", String.class, String.class));
- argumentMap.put("isLinux", AraraMethods.class.getMethod("isLinux", String.class, String.class));
- argumentMap.put("isUnix", AraraMethods.class.getMethod("isUnix", String.class, String.class));
- argumentMap.put("isMac", AraraMethods.class.getMethod("isMac", String.class, String.class));
-
- argumentMap.put("isTrue", AraraMethods.class.getMethod("isTrue", boolean.class, String.class));
- argumentMap.put("isTrue", AraraMethods.class.getMethod("isTrue", boolean.class, String.class, String.class));
- argumentMap.put("isFalse", AraraMethods.class.getMethod("isFalse", boolean.class, String.class));
- argumentMap.put("isFalse", AraraMethods.class.getMethod("isFalse", boolean.class, String.class, String.class));
-
- argumentMap.put("getOriginalFile", AraraMethods.class.getMethod("getOriginalFile"));
-
- // create a rule map
- HashMap ruleMap = new HashMap();
-
- // for every argument in the rule
- for (AraraRuleArgument currentArgument : plainRule.getArguments()) {
-
- // if there's not a default value
- if (currentArgument.getDefault() == null) {
-
- // set the default to an empty string
- ruleMap.put(currentArgument.getIdentifier(), "");
-
- } else {
-
- // there's actually a default value
- try {
-
- // get the default value and apply the template
- String defaultValue = (String) TemplateRuntime.eval(currentArgument.getDefault(), argumentMap);
-
- // put the new default value into the rule map
- ruleMap.put(currentArgument.getIdentifier(), defaultValue);
-
- } catch (RuntimeException runtimeException) {
-
- // an error occurred, throw exception
- throw new AraraException(localization.getMessage("Error_DefaultValueRuntimeErrorRule", currentArgument.getIdentifier(), task.getName(), configuration.getPaths().get(pathIndex), AraraUtils.getVariableFromException(runtimeException)));
-
- }
- }
- }
-
- // after setting the default values into the rule map, let's add
- // the directive parameters and both file and item references
- ruleMap.put("parameters", directiveMap);
- ruleMap.put("file", argumentMap.get("file"));
- ruleMap.put("item", argumentMap.get("item"));
-
- // helper classes
- ruleMap.put("SystemUtils", SystemUtils.class);
- ruleMap.put("isEmpty", AraraMethods.class.getMethod("isEmpty", String.class));
- ruleMap.put("isNotEmpty", AraraMethods.class.getMethod("isNotEmpty", String.class));
- ruleMap.put("isEmpty", AraraMethods.class.getMethod("isEmpty", String.class, String.class));
- ruleMap.put("isNotEmpty", AraraMethods.class.getMethod("isNotEmpty", String.class, String.class));
- ruleMap.put("isEmpty", AraraMethods.class.getMethod("isEmpty", String.class, String.class, String.class));
- ruleMap.put("isNotEmpty", AraraMethods.class.getMethod("isNotEmpty", String.class, String.class, String.class));
- ruleMap.put("isTrue", AraraMethods.class.getMethod("isTrue", String.class));
- ruleMap.put("isFalse", AraraMethods.class.getMethod("isFalse", String.class));
- ruleMap.put("isTrue", AraraMethods.class.getMethod("isTrue", String.class, String.class));
- ruleMap.put("isFalse", AraraMethods.class.getMethod("isFalse", String.class, String.class));
- ruleMap.put("isTrue", AraraMethods.class.getMethod("isTrue", String.class, String.class, String.class));
- ruleMap.put("isFalse", AraraMethods.class.getMethod("isFalse", String.class, String.class, String.class));
- ruleMap.put("isTrue", AraraMethods.class.getMethod("isTrue", String.class, String.class, String.class, String.class));
- ruleMap.put("isFalse", AraraMethods.class.getMethod("isFalse", String.class, String.class, String.class, String.class));
- ruleMap.put("trimSpaces", AraraMethods.class.getMethod("trimSpaces", String.class));
- ruleMap.put("getFilename", AraraMethods.class.getMethod("getFilename", String.class));
- ruleMap.put("getBasename", AraraMethods.class.getMethod("getBasename", String.class));
- ruleMap.put("getFiletype", AraraMethods.class.getMethod("getFiletype", String.class));
- ruleMap.put("getDirname", AraraMethods.class.getMethod("getDirname", String.class));
- ruleMap.put("isFile", AraraMethods.class.getMethod("isFile", String.class));
- ruleMap.put("isDir", AraraMethods.class.getMethod("isDir", String.class));
- ruleMap.put("isWindows", AraraMethods.class.getMethod("isWindows", String.class, String.class));
- ruleMap.put("isLinux", AraraMethods.class.getMethod("isLinux", String.class, String.class));
- ruleMap.put("isUnix", AraraMethods.class.getMethod("isUnix", String.class, String.class));
- ruleMap.put("isMac", AraraMethods.class.getMethod("isMac", String.class, String.class));
-
- ruleMap.put("isTrue", AraraMethods.class.getMethod("isTrue", boolean.class, String.class));
- ruleMap.put("isTrue", AraraMethods.class.getMethod("isTrue", boolean.class, String.class, String.class));
- ruleMap.put("isFalse", AraraMethods.class.getMethod("isFalse", boolean.class, String.class));
- ruleMap.put("isFalse", AraraMethods.class.getMethod("isFalse", boolean.class, String.class, String.class));
-
- ruleMap.put("getOriginalFile", AraraMethods.class.getMethod("getOriginalFile"));
-
- // remove references to file and item
- availableArgumentsInDirective.remove("file");
- availableArgumentsInDirective.remove("item");
-
- // for all arguments in the rule
- for (AraraRuleArgument currentArgument : plainRule.getArguments()) {
-
- // if the current argument is defined in the directive
- if (isArgumentDefinedInDirective(availableArgumentsInDirective, currentArgument)) {
-
- // if there is a valid flag
- if (currentArgument.getFlag() != null) {
-
- try {
-
- // get the flag and apply template
- String defaultFlag = (String) TemplateRuntime.eval(currentArgument.getFlag(), ruleMap);
-
- // put the new flag reference into the rule map
- ruleMap.put(currentArgument.getIdentifier(), defaultFlag);
- } catch (RuntimeException runtimeException) {
-
- // an error occurred, throw exception
- throw new AraraException(localization.getMessage("Error_FlagRuntimeErrorRule", currentArgument.getIdentifier(), task.getName(), configuration.getPaths().get(pathIndex), AraraUtils.getVariableFromException(runtimeException)));
-
- }
- }
- }
- }
-
- // create a new list of commands to be executed by the current task
- List<String> commandsList = new ArrayList<String>();
-
- // if there is a command element in the rule
- if (plainRule.getCommand() != null) {
-
- // and if there isn't a list of commands
- if (plainRule.getCommands() == null) {
-
- // add the current command to the list of commands to
- // be executed
- commandsList.add(plainRule.getCommand());
-
- } else {
-
- // both are defined, throw an error
- throw new AraraException(localization.getMessage("Error_DuplicatedCommandElementsRule", task.getName(), configuration.getPaths().get(pathIndex)));
-
- }
- } else {
-
- // none of the fields is defined
- if (plainRule.getCommands() == null) {
-
- // neither of the elements is defined, throw an error
- throw new AraraException(localization.getMessage("Error_MissingCommandElementsRule", task.getName(), configuration.getPaths().get(pathIndex)));
-
- } else {
-
- // there's a list of commands, add them to the list
- commandsList.addAll(plainRule.getCommands());
- }
- }
-
- // for every command to be processed
- for (String commandTemplate : commandsList) {
-
- try {
- // get the current command and apply template
- commandTemplate = (String) TemplateRuntime.eval(commandTemplate, ruleMap);
-
- } catch (RuntimeException runtimeException) {
-
- // an error occurred, throw exception
- throw new AraraException(localization.getMessage("Error_CommandRuntimeErrorRule", task.getName(), configuration.getPaths().get(pathIndex), AraraUtils.getVariableFromException(runtimeException)));
-
- }
-
- // check if it's a valid command
- if (!"".equals(commandTemplate.trim())) {
-
- // create a new command
- AraraCommand araraCommand = new AraraCommand();
-
- // add the command
- araraCommand.setCommand(commandTemplate);
-
- // add the name
- araraCommand.setName(plainRule.getName());
-
- // add to the list
- commands.add(araraCommand);
-
- }
- }
- }
-
- /**
- * Checks if the current argument is included in the list of arguments from
- * the directive.
- *
- * @param arguments List of arguments from the directive.
- * @param argument The current argument to be analyzed.
- * @return A logic value indicating if the current argument is included in
- * the list of arguments from the directive.
- */
- private boolean isArgumentDefinedInDirective(List<String> arguments, AraraRuleArgument argument) {
-
- // for every argument in the list
- for (String current : arguments) {
-
- // if the identifiers match
- if (current.equalsIgnoreCase(argument.getIdentifier())) {
-
- // found it
- return true;
- }
- }
-
- // not found
- return false;
- }
-}