diff options
author | Norbert Preining <norbert@preining.info> | 2020-03-05 03:00:59 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2020-03-05 03:00:59 +0000 |
commit | 898048513951b471a492afa23e46112d14bcb236 (patch) | |
tree | 8596afc705f55d2d07b324a756f7283ac0e2d21b /support/arara/source/src/main/java/com | |
parent | 19d25b8009801aa98ea2f46b45c37c257f990491 (diff) |
CTAN sync 202003050300
Diffstat (limited to 'support/arara/source/src/main/java/com')
45 files changed, 0 insertions, 9847 deletions
diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/Arara.java b/support/arara/source/src/main/java/com/github/cereda/arara/Arara.java deleted file mode 100644 index 36405b1b47..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/Arara.java +++ /dev/null @@ -1,205 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara; - -import com.github.cereda.arara.controller.LanguageController; -import com.github.cereda.arara.controller.LoggingController; -import com.github.cereda.arara.model.AraraException; -import com.github.cereda.arara.model.Configuration; -import com.github.cereda.arara.model.Directive; -import com.github.cereda.arara.model.Extractor; -import com.github.cereda.arara.model.Interpreter; -import com.github.cereda.arara.model.Parser; -import com.github.cereda.arara.model.StopWatch; -import com.github.cereda.arara.utils.CommonUtils; -import com.github.cereda.arara.utils.DirectiveUtils; -import com.github.cereda.arara.utils.DisplayUtils; -import java.util.List; - -/** - * Main class. This class wraps all classes from the application model as well - * as utilitary classes in order to provide modularity. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class Arara { - - /** - * Main method. This is the application entry point. - * @param args A string array containing all command line arguments. - */ - public static void main(String[] args) { - - // the first component to be initialized is the - // language controller; note that init() actually - // has no body at all, but it's a dirty maneuver to - // trigger the static class startup - LanguageController.init(); - - // the second component to be initalized is the - // logging controller; note init() actually disables - // the logging, so early exceptions won't generate - // a lot of noise in the terminal - LoggingController.init(); - - // print the arara logo in the terminal; I just - // hope people use this tool in a good terminal with - // fixed-width fonts, otherwise the logo will be messed - DisplayUtils.printLogo(); - - try { - - // first of all, let's try to load a potential - // configuration file located at the current - // user's home directory; if there's a bad - // configuration file, arara will panic and - // end the execution - Configuration.load(); - - // if we are here, either there was no configuration - // file at all or we managed to load the settings; now, - // it's time to properly parse the command line arguments; - // this is done by creating a brand new instance of arara's - // command line parser and providing the string array to it - Parser parser = new Parser(args); - - // now let's see if we are good to go; parse() will return - // a boolean value indicating if the provided arguments - // allow the tool to continue (we might reach some special - // flags as well, like --help or --version, which simply - // do their jobs and return false, since there's no point - // of continuing processing with such flags) - if (parser.parse()) { - - // let's print the current file information; it is a - // basic display, just the file name, the size properly - // formatted as a human readable format, and the last - // modification date; also, in this point, the logging - // feature starts to collect data (of course, if enabled - // either through the configuration file or manually - // in the command line) - DisplayUtils.printFileInformation(); - - // time to read the file and try to extract the directives; - // this class does a pretty good job on finding directives, - // including the multiline ones; it was a long awaited - // feature people were asking me to implement, so here - // it is! - Extractor extractor = new Extractor(); - - // extract() brings us a list of directives properly parsed - // and almost ready to be handled; note that no directives - // in the provided file will raise an exception; this is - // by design and I opted to not include a default fallback - // (although it wouldn't be so difficult to write one, - // I decided not to take the risk) - List<Directive> directives = extractor.extract(); - - // once we have our nice list of directives, it is time to - // actually validate them (for example, we have a couple of - // keywords that cannot be used as directive parameters); - // another interesting feature of the validate() method is - // to replicate a directive that has the 'files' keyword on - // it, since it's the whole point of having 'files' in the - // first place; if you check the log file, you will see - // that the list of extracted directives might differ from - // the final list of directives to be effectively processed - // by arara - directives = DirectiveUtils.validate(directives); - - // arara features now a cool stopwatch, so we can see how - // much time has passed since everything started; start(), - // for obvious reasons, starts the stopwatch and keeps track - // of time for us; internally, this class makes use of - // nano time, so we might get an interesting precision here - // (although timing is not a serious business in here, it's - // just a cool addition) - StopWatch.start(); - - // this is surely the golden heart of arara; this class - // implements a powerful interpreter that will handle all - // rules and their corresponding tasks - Interpreter interpreter = new Interpreter(); - - // once we have this bad boy ready, let's provide the list - // of directives previously extracted and validated; it is - // like loading a cannon, I guess - interpreter.setDirectives(directives); - - // time to shine, now the interpreter class will interpret - // one directive at a time, get the corresponding rule, - // set the parameters, evaluate it, get the tasks, run them, - // evaluate the result and print the status; note that - // arara, from this version on, will try to evaluate things - // progressively, so in case of an error, the previous tasks - // were already processed and potentially executed - interpreter.execute(); - } - - } catch (AraraException exception) { - - // something bad just happened, so arara will print the proper - // exception and provide details on it, if available; the idea - // here is to propagate an exception throughout the whole - // application and catch it here instead of a local treatment - DisplayUtils.printException(exception); - } - - // we are done here (with or without errors, that makes no difference - // at this point), so let's stop our stopwatch; now it's just an easy - // subtraction to be made (note that the values are internally - // represented as nanoseconds, but the result is printed as seconds) - StopWatch.stop(); - - // this is the last command from arara; once the execution time is - // available, print it; note that this notification is suppressed - // when the command line parsing returns false as result (it makes - // no sense to print the execution time for a help message, I guess) - DisplayUtils.printTime(); - - // gets the application exit status; the rule here is: - // 0 : everything went just fine (note that the dry-run mode always - // makes arara exit with 0, unless it is an error in the directive - // builder itself). - // 1 : one of the tasks failed, so the execution ended abruptly. This - // means the error relies on the command line call, not with arara. - // 2 : arara just handled an exception, meaning that something bad - // just happened and might require user intervention. - System.exit(CommonUtils.getExitStatus()); - - // I owe David Carlisle $100 - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/controller/ConfigurationController.java b/support/arara/source/src/main/java/com/github/cereda/arara/controller/ConfigurationController.java deleted file mode 100644 index 2dbc3a2bff..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/controller/ConfigurationController.java +++ /dev/null @@ -1,106 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.controller; - -import java.util.HashMap; -import java.util.Map; - -/** - * Implements the configuration controller. The idea here is to provide a map - * that holds all configuration settings used by model and utilitary classes - * throughout the execution. This controller is implemented as a singleton. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class ConfigurationController { - - // the controller itself, since we have a singleton; - // this is the reference instance, instantiated once - private static final ConfigurationController instance = - new ConfigurationController(); - - // the configuration settings are stored in a map; - // pretty much everything can be stored in this map, - // as long as you know what to retrieve later on - private final Map<String, Object> map; - - /** - * Private constructor. Called once for creating the proper singleton. - */ - private ConfigurationController() { - map = new HashMap<String, Object>(); - } - - /** - * Gets the current configuration controller. Since this class is - * implemented as a singleton, you will get the same controller every - * single time, and that's good. - * @return The configuration controller, which hold the settings map. - */ - public static ConfigurationController getInstance() { - return instance; - } - - /** - * Returns the object indexed by the provided key. This method provides an - * easy access to the underlying map. - * @param key A string representing the key. - * @return An object indexed by the provided key. - */ - public Object get(String key) { - return map.get(key); - } - - /** - * Puts the object in the map and indexes it in the provided key. This - * method provides an easy access to the underlying map. - * @param key A string representing the key. - * @param value The object to be indexed by the provided key. - */ - public void put(String key, Object value) { - map.put(key, value); - } - - /** - * Checks if the map contains the provided key. This is actually a wrapper - * to the private map's method of the same name. - * @param key The key to be checked. - * @return A boolean value indicating if the map contains the provided key. - */ - public boolean contains(String key) { - return map.containsKey(key); - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/controller/LanguageController.java b/support/arara/source/src/main/java/com/github/cereda/arara/controller/LanguageController.java deleted file mode 100644 index 85bfc3a43d..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/controller/LanguageController.java +++ /dev/null @@ -1,120 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.controller; - -import ch.qos.cal10n.IMessageConveyor; -import ch.qos.cal10n.MessageConveyor; -import java.util.Locale; - -/** - * Implements the language controller. This controller provides a singleton - * object that holds the application messages, easily available to all model - * and utilitary classes. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class LanguageController { - - // the controller itself, since we have a singleton; - // this is the reference instance, instantiated once - private static final LanguageController instance = - new LanguageController(); - - // the message conveyor helps us to get localized messages - // according to the provided locale - private IMessageConveyor conveyor; - - /** - * Private constructor. The fallback language is set to English for all - * messages in arara. - */ - private LanguageController() { - conveyor = new MessageConveyor(new Locale("en")); - } - - /** - * Initializes the class. This method actually does nothing, it just - * triggers the static attributions. Dirty, isn't it? - */ - public static void init() { - // quack, quack, quack! - } - - /** - * Gets the singleton reference. Since this class is implemented as a - * singleton, you will get the same controller every single time. - * @return The language controller which holds the conveyor. - */ - public static LanguageController getInstance() { - return instance; - } - - /** - * Sets the current locale. This method actually resets the language - * conveyor in order to use the new locale. It's quite simple. - * @param locale The new locale for localized messages through the language - * conveyor. - */ - public void setLocale(Locale locale) { - conveyor = new MessageConveyor(locale); - } - - /** - * Gets the localized message indexed by the provided enumeration key, - * applying an array of objects as parameters. This method is a wrapper to - * the conveyor's method of the same name. - * @param <E> Enumeration type that represents the conveyor messages. - * @param key Key set in the provided enumeration type. - * @param parameters Array of objects to be used as parameters. - * @return A string containing a localized message indexed by the provided - * enumeration key and applied the array of objects as parameters. - */ - public <E extends Enum<?>> String getMessage(E key, Object... parameters) { - return conveyor.getMessage(key, parameters); - } - - /** - * Gets the localized message indexed by the provided enumeration key. This - * method is a wrapper to the conveyor's method of the same name. - * @param <E> Enumeration type that represents the conveyor messages. - * @param key Key set in the provided enumeration type. - * @return A string containing a localized message indexed by the provided - * enumeration key. - */ - public <E extends Enum<?>> String getMessage(E key) { - return conveyor.getMessage(key); - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/controller/LoggingController.java b/support/arara/source/src/main/java/com/github/cereda/arara/controller/LoggingController.java deleted file mode 100644 index 958beec291..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/controller/LoggingController.java +++ /dev/null @@ -1,109 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.controller; - -import ch.qos.logback.classic.LoggerContext; -import ch.qos.logback.classic.joran.JoranConfigurator; -import ch.qos.logback.core.joran.spi.JoranException; -import java.io.InputStream; -import org.slf4j.LoggerFactory; - -/** - * Implements the logging controller. This class actually sets the logging - * configuration in order to allow appending results to a file. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class LoggingController { - - /** - * Sets the logging configuration according to the provided boolean value. - * If the value is set to true, the log entries will be appended to a file, - * otherwise the logging feature will keep silent. - * @param enable A boolean value that indicates the logging behaviour - * throughout the application. - */ - public static void enableLogging(boolean enable) { - - // get the logger context from a factory, set a - // new context and reset it - LoggerContext loggerContext = - (LoggerContext) LoggerFactory.getILoggerFactory(); - - try { - - // get a new configuration and set - // the context - JoranConfigurator configurator = new JoranConfigurator(); - configurator.setContext(loggerContext); - loggerContext.reset(); - - // if enabled, the log entries will be - // appended to a file, otherwise it will - // remain silent - if (enable) { - - // set the file name and configure - // the logging controller to append - // entries to the file - String name = (String) ConfigurationController. - getInstance().get("execution.log.name"); - loggerContext.putProperty("name", name); - configurator.doConfigure(getResource()); - } - } catch (JoranException exception) { - // quack, quack, quack! - } - } - - /** - * Get the configuration resource as an input stream. The configuration - * is actually a XML file. - * @return An input stream of the provided configuration XML resource. - */ - private static InputStream getResource() { - String resource = "/com/github/cereda/arara/configuration/logback.xml"; - return LoggingController.class.getResourceAsStream(resource); - } - - /** - * Initializes the logging controller by disabling it. I don't want an odd - * behaviour out of the box. - */ - public static void init() { - enableLogging(false); - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/controller/SessionController.java b/support/arara/source/src/main/java/com/github/cereda/arara/controller/SessionController.java deleted file mode 100644 index 41c627dc98..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/controller/SessionController.java +++ /dev/null @@ -1,124 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.controller; - -import java.util.HashMap; -import java.util.Map; - -/** - * Implements a session controller. This class wraps a map that holds the - * execution session, that is, a dirty maneuver to exchange pretty much any - * data between commands and even rules. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class SessionController { - - // the controller itself, since we have a singleton; - // this is the reference instance, instantiated once - private static final SessionController instance = - new SessionController(); - - // the session map which holds the execution session; - // the idea here is to provide wrappers to the map - // methods, so it could be easily manipulated - private final Map<String, Object> map; - - /** - * Private constructor. Called once when the singleton is created. - */ - private SessionController() { - map = new HashMap<String, Object>(); - } - - /** - * Gets the singleton reference. Since this class is implemented as a - * singleton, you will get the same controller every single time. - * @return The session controller which holds the session map. - */ - public static SessionController getInstance() { - return instance; - } - - /** - * Gets the object indexed by the provided key. This method actually holds - * the map method of the very same name. - * @param key The provided map key. - * @return The object indexed by the provided map key. - */ - public Object get(String key) { - return map.get(key); - } - - /** - * Puts the object in the session map and indexes it under the provided - * key. This method actually holds the map method of the very same name. - * @param key The provided map key. - * @param value The object to be indexed under the provided key. - */ - public void put(String key, Object value) { - map.put(key, value); - } - - /** - * Checks if the session map contains the provided key. This method holds - * the map method of the very same name. - * @param key The key to be checked. - * @return A boolean value indicating if the session map contains the - * provided key. - */ - public boolean contains(String key) { - return map.containsKey(key); - } - - /** - * Remove an entry from the map according to the provided key. This method - * holds the map method of the same name. - * @param key The provided key to indicate which session map entry should - * be removed. - */ - public void remove(String key) { - map.remove(key); - } - - /** - * Clears the session map. This method, as usual, holds the map method of - * the same name. - */ - public void clear() { - map.clear(); - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/controller/SystemCallController.java b/support/arara/source/src/main/java/com/github/cereda/arara/controller/SystemCallController.java deleted file mode 100644 index 4d87adc8a8..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/controller/SystemCallController.java +++ /dev/null @@ -1,153 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.controller; - -import java.util.HashMap; -import java.util.Map; -import org.zeroturnaround.exec.ProcessExecutor; - -/** - * Implements a system call controller. This class wraps a map that holds the - * result of system specific variables not directly available at runtime. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class SystemCallController { - - /** - * Implements a private command interface. - */ - private interface Command { - - /** - * Executes the command body. - * @return An object. - */ - public Object execute(); - } - - // the controller itself, since we have a singleton; - // this is the reference instance, instantiated once - private static final SystemCallController instance = - new SystemCallController(); - - // the system call map which holds the result of - // system specific variables not directly available - // at runtime; the idea here is to provide wrappers - // to the map getter, so it could be easily manipulated - private final Map<String, Object> map; - - // the commands map will allow the system call map being - // populated only on demand, that is, if the key is not - // found, this map will provide the corresponding method - // and update the value - private final Map<String, Command> commands; - - /** - * Private constructor. Called once when the singleton is created. - */ - private SystemCallController() { - - // create the new map instance to be - // populated on demand - map = new HashMap<String, Object>(); - - // create the new map of commands and - // add the corresponding system calls - commands = new HashMap<String, Command>(); - - // add the check for a Cygwin - // environment in here - commands.put("cygwin", new Command() { - - /** - * Implements the body of the command. In this particular - * instance, it checks if we are inside a Cygwin environment. - * @return A boolean value indicating if we are inside a Cygwin - * environment. - */ - public Object execute() { - try { - - // execute a new system call to 'uname -s', read the output - // as an UTF-8 string, lowercase it and check if it starts - // with the 'cygwin' string; if so, we are inside Cygwin - return ( - new ProcessExecutor().command("uname", "-s"). - readOutput(true).execute().outputUTF8() - ).toLowerCase().startsWith("cygwin"); - - } catch (Exception exception) { - - // gracefully fallback in case of any nasty and evil - // exception, e.g, if the command is unavailable - return false; - } - } - }); - } - - /** - * Gets the singleton reference. Since this class is implemented as a - * singleton, you will get the same controller every single time. - * @return The system call controller which holds the system call map. - */ - public static SystemCallController getInstance() { - return instance; - } - - /** - * Gets the object indexed by the provided key. This method actually holds - * the map method of the very same name. - * @param key The provided map key. - * @return The object indexed by the provided map key. - */ - public Object get(String key) { - - // if key is not found, meaning that - // the value wasn't required before - if (!map.containsKey(key)) { - - // perform the system call and - // populate the corresponding value - map.put(key, commands.get(key).execute()); - } - - // simply return the corresponding - // value based on the provided key - return map.get(key); - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/model/AraraException.java b/support/arara/source/src/main/java/com/github/cereda/arara/model/AraraException.java deleted file mode 100644 index 5f5d788e0f..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/model/AraraException.java +++ /dev/null @@ -1,88 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.model; - -/** - * Implements the specific exception model for arara. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class AraraException extends Exception { - - // the underlying exception, - // used to hold more details - // on what really happened - private Exception exception; - - /** - * Constructor. Takes the exception message. - * @param message The exception message. - */ - public AraraException(String message) { - super(message); - } - - /** - * Constructor. Takes the exception message and the underlying exception. - * @param message The exception message. - * @param exception The underlying exception object. - */ - public AraraException(String message, Exception exception) { - super(message); - this.exception = exception; - } - - /** - * Gets the underlying exception. - * @return The underlying message. - */ - public Exception getException() { - return exception; - } - - /** - * Checks if there is an underlying exception defined in the current object. - * @return A boolean value indicating if the current object has an - * underlying exception. - */ - public boolean hasException() { - if (exception != null) { - return (exception.getMessage() != null); - } else { - return false; - } - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/model/Argument.java b/support/arara/source/src/main/java/com/github/cereda/arara/model/Argument.java deleted file mode 100644 index b0e7d2bca6..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/model/Argument.java +++ /dev/null @@ -1,125 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.model; - -import com.github.cereda.arara.utils.CommonUtils; - -/** - * The rule argument model. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class Argument { - - // the argument identifier - private String identifier; - - // a boolean indicating if the - // current argument is required - private boolean required; - - // the flag to hold the argument - // value manipulation - private String flag; - - // the argument fallback if it is - // not defined in the directive - private String fallback; - - /** - * Gets the identifier. - * @return The identifier. - */ - public String getIdentifier() { - return CommonUtils.removeKeyword(identifier); - } - - /** - * Sets the identifier. - * @param identifier The identifier. - */ - public void setIdentifier(String identifier) { - this.identifier = identifier; - } - - /** - * Checks if the argument is required. - * @return A boolean value indicating if the argument is required. - */ - public boolean isRequired() { - return required; - } - - /** - * Sets the argument requirement. - * @param required A boolean value. - */ - public void setRequired(boolean required) { - this.required = required; - } - - /** - * Gets the argument flag. - * @return The flag. - */ - public String getFlag() { - return CommonUtils.removeKeyword(flag); - } - - /** - * Sets the argument flag. - * @param flag The argument flag. - */ - public void setFlag(String flag) { - this.flag = flag; - } - - /** - * Gets the argument fallback. - * @return The argument fallback. - */ - public String getDefault() { - return CommonUtils.removeKeyword(fallback); - } - - /** - * Sets the argument fallback. - * @param fallback The argument fallback. - */ - public void setDefault(String fallback) { - this.fallback = fallback; - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/model/Command.java b/support/arara/source/src/main/java/com/github/cereda/arara/model/Command.java deleted file mode 100644 index 848f3f3010..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/model/Command.java +++ /dev/null @@ -1,127 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.model; - -import com.github.cereda.arara.utils.CommonUtils; -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -/** - * Implements a command model, containing a list of strings. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class Command { - - // a list of elements which are components - // of a command and represented as strings - private final List<String> elements; - - // an optional file acting as a reference - // for the default working directory - private File workingDirectory; - - /** - * Constructor. - * @param values An array of objects. - */ - public Command(Object... values) { - elements = new ArrayList<String>(); - List result = CommonUtils.flatten(Arrays.asList(values)); - for (Object value : result) { - String element = String.valueOf(value); - if (!CommonUtils.checkEmptyString(element)) { - elements.add(element); - } - } - } - - /** - * Constructor. - * @param elements A list of strings. - */ - public Command(List<String> elements) { - this.elements = elements; - } - - /** - * Gets the list of strings representing each element of a command. - * @return A list of strings. - */ - public List<String> getElements() { - return elements; - } - - /** - * Sets the working directory. - * @param workingDirectory A file representing the working directory. - */ - public void setWorkingDirectory(File workingDirectory) { - this.workingDirectory = workingDirectory; - } - - /** - * Gets the working directory, if any. - * @return A file representing the working directory. - */ - public File getWorkingDirectory() { - return workingDirectory; - } - - /** - * Checks if a working directory was defined. - * @return A logic value indicating if a working directory was defined. - */ - public boolean hasWorkingDirectory() { - return workingDirectory != null; - } - - /** - * Provides a textual representation of the current command. - * @return A string representing the current command. - */ - @Override - public String toString() { - return CommonUtils.getCollectionElements(elements, "[ ", " ]", ", "). - concat( - hasWorkingDirectory() - ? " @ " + workingDirectory.toString() - : "" - ); - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/model/Conditional.java b/support/arara/source/src/main/java/com/github/cereda/arara/model/Conditional.java deleted file mode 100644 index d8f0543709..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/model/Conditional.java +++ /dev/null @@ -1,139 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.model; - -/** - * The conditional class, it represents the type of conditional available - * for a directive and its corresponding expression to be evaluated. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class Conditional { - - // these are all types of conditionals arara - // is able to recognize; personally, I believe - // they are more than sufficient to cover the - // majority of test cases - public enum ConditionalType { - - // evaluated beforehand, directive is interpreted - // if and only if the result is true - IF, - - // there is no evaluation, directive is interpreted, - // no extra effort is needed - NONE, - - // evaluated beforehand, directive is interpreted - // if and only if the result is false - UNLESS, - - // directive is interpreted the first time, then the - // evaluation is done; while the result is false, - // the directive is interpreted again and again - UNTIL, - - // evaluated beforehand, directive is interpreted if - // and oly if the result is true, and the process is - // repeated while the result still holds true - WHILE - } - - // the conditional type, specified above; the - // default fallback, as seen in the constructor, - // is set to NONE, that is, no conditional at all - private ConditionalType type; - - // the expression to be evaluated according to its - // type; the default fallback, as seen in the - // constructor, is set to an empty string - private String condition; - - /** - * Constructor. - */ - public Conditional() { - type = ConditionalType.NONE; - condition = ""; - } - - /** - * Gets the conditional type. - * @return The conditional type. - */ - public ConditionalType getType() { - return type; - } - - /** - * Sets the conditional type. - * @param type The conditional type. - */ - public void setType(ConditionalType type) { - this.type = type; - } - - /** - * Gets the condition, that is, the expression to be evaluated. - * @return A string representing the condition. - */ - public String getCondition() { - return condition; - } - - /** - * Sets the condition, that is, the expression to be evaluated. - * @param condition A string representing the condition. - */ - public void setCondition(String condition) { - this.condition = condition; - } - - /** - * Provides a textual representation of the conditional object. - * @return A string representation of this object. - */ - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("{ ").append(type); - if (type != ConditionalType.NONE) { - builder.append(", expression: ").append(condition.trim()); - } - builder.append(" }"); - return builder.toString(); - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/model/Configuration.java b/support/arara/source/src/main/java/com/github/cereda/arara/model/Configuration.java deleted file mode 100644 index 70f6382364..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/model/Configuration.java +++ /dev/null @@ -1,246 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.model; - -import com.github.cereda.arara.controller.ConfigurationController; -import com.github.cereda.arara.controller.LanguageController; -import com.github.cereda.arara.utils.CommonUtils; -import com.github.cereda.arara.utils.ConfigurationUtils; -import java.io.File; -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -/** - * Implements the configuration model, which holds the default settings and can - * load the configuration file. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class Configuration { - - // the application messages obtained from the - // language controller - private static final LanguageController messages = - LanguageController.getInstance(); - - /** - * Loads the application configuration. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static void load() throws AraraException { - - // initialize both file type and language models, - // since we can track errors from there instead - // of relying on a check on this level - FileType.init(); - Language.init(); - - // reset everything - reset(); - - // get the configuration file, if any - File file = ConfigurationUtils.getConfigFile(); - if (file != null) { - - // set the configuration file name for - // logging purposes - ConfigurationController.getInstance(). - put("execution.configuration.name", - CommonUtils.getCanonicalPath(file) - ); - - // then validate it and update the - // configuration accordingly - Resource resource = ConfigurationUtils.validateConfiguration(file); - update(resource); - } - - // just to be sure, update the - // current locale in order to - // display localized messages - Locale locale = ((Language) ConfigurationController. - getInstance().get("execution.language")).getLocale(); - LanguageController.getInstance().setLocale(locale); - } - - /** - * Resets the configuration to initial settings. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - private static void reset() throws AraraException { - - // put everything in a map to be - // later assigned to the configuration - // controller, which holds the settings - Map<String, Object> mapping = new HashMap<String, Object>(); - - mapping.put("execution.loops", 10L); - mapping.put("directives.charset", Charset.forName("UTF-8")); - mapping.put("execution.errors.halt", true); - mapping.put("execution.timeout", false); - mapping.put("execution.timeout.value", 0L); - mapping.put("execution.timeout.unit", TimeUnit.MILLISECONDS); - mapping.put("application.version", "4.0"); - mapping.put("application.revision", "2"); - mapping.put("directives.linebreak.pattern", "^\\s*-->\\s(.*)$"); - - String directive = "^\\s*(\\w+)\\s*(:\\s*(\\{.*\\})\\s*)?"; - String pattern = "(\\s+(if|while|until|unless)\\s+(\\S.*))?$"; - - mapping.put("directives.pattern", directive.concat(pattern)); - mapping.put("application.pattern", "arara:\\s"); - mapping.put("application.width", 65); - mapping.put("execution.database.name", "arara"); - mapping.put("execution.log.name", "arara"); - mapping.put("execution.verbose", false); - - mapping.put("trigger.halt", false); - mapping.put("execution.language", new Language("en")); - mapping.put("execution.logging", false); - mapping.put("execution.dryrun", false); - mapping.put("execution.status", 0); - mapping.put("application.copyright.year", "2012-2019"); - mapping.put("execution.filetypes", ConfigurationUtils. - getDefaultFileTypes()); - mapping.put("execution.rule.paths", - Arrays.asList( - CommonUtils.buildPath( - ConfigurationUtils.getApplicationPath(), - "rules" - ) - ) - ); - - mapping.put("execution.preambles", new HashMap<String, String>()); - mapping.put("execution.preamble.active", false); - mapping.put("execution.configuration.name", "[none]"); - mapping.put("execution.header", false); - mapping.put("ui.lookandfeel", "none"); - - // get the configuration controller and - // set every map key to it - ConfigurationController controller = - ConfigurationController.getInstance(); - for (String key : mapping.keySet()) { - controller.put(key, mapping.get(key)); - } - } - - /** - * Update the configuration based on the provided map. - * @param data Map containing the new configuration settings. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - private static void update(Resource resource) throws AraraException { - - ConfigurationController controller = - ConfigurationController.getInstance(); - - if (resource.getPaths() != null) { - List<String> paths = resource.getPaths(); - paths = ConfigurationUtils.normalizePaths(paths); - controller.put("execution.rule.paths", paths); - } - - if (resource.getFiletypes() != null) { - List<FileTypeResource> resources = resource.getFiletypes(); - List<FileType> filetypes = new ArrayList<FileType>(); - for (FileTypeResource type : resources) { - if (type.getPattern() != null) { - filetypes.add( - new FileType(type.getExtension(), type.getPattern()) - ); - } else { - filetypes.add(new FileType(type.getExtension())); - } - } - filetypes = ConfigurationUtils.normalizeFileTypes(filetypes); - controller.put("execution.filetypes", filetypes); - } - - controller.put("execution.verbose", resource.isVerbose()); - controller.put("execution.logging", resource.isLogging()); - controller.put("execution.header", resource.isHeader()); - - if (resource.getDbname() != null) { - controller.put("execution.database.name", - ConfigurationUtils.cleanFileName(resource.getDbname())); - } - - if (resource.getLogname() != null) { - controller.put("execution.log.name", - ConfigurationUtils.cleanFileName(resource.getLogname())); - } - - if (resource.getLanguage() != null) { - controller.put("execution.language", - new Language(resource.getLanguage())); - } - - long loops = resource.getLoops(); - if (loops > 0) { - controller.put("execution.loops", loops); - } else { - if (loops < 0) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_CONFIGURATION_LOOPS_INVALID_RANGE - ) - ); - } - } - - if (resource.getPreambles() != null) { - controller.put("execution.preambles", - resource.getPreambles()); - } - - if (resource.getLaf() != null) { - controller.put("ui.lookandfeel", - resource.getLaf()); - } - - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/model/Database.java b/support/arara/source/src/main/java/com/github/cereda/arara/model/Database.java deleted file mode 100644 index 474209e405..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/model/Database.java +++ /dev/null @@ -1,80 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.model; - -import java.util.HashMap; -import org.simpleframework.xml.ElementMap; -import org.simpleframework.xml.Root; - -/** - * The XML database model, which keeps track on file changes. I am using the - * Simple framework to marshall and unmarshall objects and XML files. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -@Root(name = "status") -public class Database { - - // the whole database is implemented as a map, where - // the key is the absolute canonical file and the value - // is its corresponding CRC32 hash; the XML map is done - // inline, so it does not clutter the output a lot - @ElementMap(entry = "hash", key = "file", attribute = true, inline = true) - private HashMap<String, String> map; - - /** - * Constructor. It creates a new map. - */ - public Database() { - map = new HashMap<String, String>(); - } - - /** - * Gets the map. - * @return The map. - */ - public HashMap<String, String> getMap() { - return map; - } - - /** - * Sets the map. - * @param map The map. - */ - public void setMap(HashMap<String, String> map) { - this.map = map; - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/model/Directive.java b/support/arara/source/src/main/java/com/github/cereda/arara/model/Directive.java deleted file mode 100644 index a3831db8b2..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/model/Directive.java +++ /dev/null @@ -1,146 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.model; - -import java.util.List; -import java.util.Map; - -/** - * Implements the directive model. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class Directive { - - // the directive identifier, it is resolved - // to the rule identifier later on - private String identifier; - - // a map containing the parameters; they - // are validated later on in order to - // ensure they are valid - private Map<String, Object> parameters; - - // a conditional containing the type and - // the expression to be evaluated later on - private Conditional conditional; - - // a list contained all line numbers from - // the main file which built the current - // directive - private List<Integer> lineNumbers; - - /** - * Gets the directive identifier. - * @return A string representing the directive identifier. - */ - public String getIdentifier() { - return identifier; - } - - /** - * Sets the directive identifier. - * @param identifier A string representing the directive identifier. - */ - public void setIdentifier(String identifier) { - this.identifier = identifier; - } - - /** - * Gets the directive parameters. - * @return A map containing the directive parameters. - */ - public Map<String, Object> getParameters() { - return parameters; - } - - /** - * Sets the directive parameters. - * @param parameters A map containing the directive parameters. - */ - public void setParameters(Map<String, Object> parameters) { - this.parameters = parameters; - } - - /** - * Gets the conditional object from the current directive. - * @return The conditional object from the current directive. - */ - public Conditional getConditional() { - return conditional; - } - - /** - * Sets the conditional object from the current directive. - * @param conditional The conditional object from the current directive. - */ - public void setConditional(Conditional conditional) { - this.conditional = conditional; - } - - /** - * Gets the list containing all line numbers from the current directive. - * @return A list containing all line numbers from the current directive. - */ - public List<Integer> getLineNumbers() { - return lineNumbers; - } - - /** - * Sets the list containing all line numbers from the current directive. - * @param lineNumbers A list containing all line numbers from the current - * directive. - */ - public void setLineNumbers(List<Integer> lineNumbers) { - this.lineNumbers = lineNumbers; - } - - /** - * Provides a textual representation of the current directive. - * @return A string containing a textual representation of the current - * directive. - */ - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - builder.append("Directive: { "); - builder.append("identifier: ").append(identifier).append(", "); - builder.append("parameters: ").append(parameters).append(", "); - builder.append("conditional: ").append(conditional).append(", "); - builder.append("lines: ").append(lineNumbers).append(" }"); - return builder.toString(); - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/model/Evaluator.java b/support/arara/source/src/main/java/com/github/cereda/arara/model/Evaluator.java deleted file mode 100644 index 30995ecaf9..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/model/Evaluator.java +++ /dev/null @@ -1,158 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.model; - -import com.github.cereda.arara.controller.ConfigurationController; -import com.github.cereda.arara.controller.LanguageController; -import com.github.cereda.arara.utils.CommonUtils; -import com.github.cereda.arara.utils.Methods; -import java.util.HashMap; -import java.util.Map; -import org.mvel2.templates.TemplateRuntime; - -/** - * Implements the evaluator model, on which a conditional can be analyzed and - * processed. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class Evaluator { - - // this attribute holds the maximum number of - // loops arara will accept; it's like - // reaching infinity - private final long loops; - - // the counter for the current execution, it - // helps us keep track of the number of times - // this evaluation has happened, and also to - // prevent potential infinite loops - private long counter; - - // a flag that indicates the - // evaluation to halt regardless - // of the the result - private boolean halt; - - // the application messages obtained from the - // language controller - private static final LanguageController messages = - LanguageController.getInstance(); - - /** - * Constructor. It gets the application maximum number of loops and reset - * all counters. - */ - public Evaluator() { - loops = (Long) ConfigurationController.getInstance(). - get("execution.loops"); - counter = 0; - halt = false; - } - - /** - * Evaluate the provided conditional. - * @param conditional The conditional object. - * @return A boolean value indicating if the conditional holds. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public boolean evaluate(Conditional conditional) throws AraraException { - - // when in dry-run mode, arara - // always ignore conditional evaluations - if (((Boolean) ConfigurationController. - getInstance().get("execution.dryrun")) == true) { - return false; - } - - switch (conditional.getType()) { - case NONE: - return false; - case IF: - case UNLESS: - if (!halt) { - halt = true; - } else { - return false; - } - break; - } - - // check counters and see if the execution - // has reached our concept of infinity, - // thus breaking the cycles - counter++; - if (((conditional.getType() == Conditional.ConditionalType.WHILE) && - (counter > loops)) || - ((conditional.getType() == Conditional.ConditionalType.UNTIL) && - (counter >= loops))) { - return false; - } else { - - Map<String, Object> context = new HashMap<String, Object>(); - Methods.addConditionalMethods(context); - - try { - Object result = TemplateRuntime.eval("@{ ".concat( - conditional.getCondition()).concat(" }"), context); - if (!CommonUtils.checkClass(Boolean.class, result)) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_EVALUATE_NOT_BOOLEAN_VALUE - ) - ); - } else { - boolean value = (Boolean) result; - switch (conditional.getType()) { - case UNLESS: - case UNTIL: - value = !value; - break; - } - return value; - } - } catch (RuntimeException exception) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_EVALUATE_COMPILATION_FAILED - ), - exception - ); - } - } - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/model/Extractor.java b/support/arara/source/src/main/java/com/github/cereda/arara/model/Extractor.java deleted file mode 100644 index b4a248688a..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/model/Extractor.java +++ /dev/null @@ -1,88 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.model; - -import com.github.cereda.arara.controller.ConfigurationController; -import com.github.cereda.arara.controller.LanguageController; -import com.github.cereda.arara.utils.CommonUtils; -import com.github.cereda.arara.utils.DirectiveUtils; -import java.io.File; -import java.io.IOException; -import java.nio.charset.Charset; -import java.util.List; -import org.apache.commons.io.FileUtils; - -/** - * It extracts directives from the provided main file. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class Extractor { - - // the application messages obtained from the - // language controller - private static final LanguageController messages = - LanguageController.getInstance(); - - /** - * Extracts a list of directives from the provided main file, obtained from - * the configuration controller. - * @return A list of directives. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public List<Directive> extract() throws AraraException { - - File file = (File) ConfigurationController. - getInstance().get("execution.reference"); - Charset charset = (Charset) ConfigurationController. - getInstance().get("directives.charset"); - - try { - List<String> content = CommonUtils.getPreambleContent(); - List<String> lines = FileUtils.readLines(file, charset.name()); - content.addAll(lines); - return DirectiveUtils.extractDirectives(content); - } catch (IOException ioexception) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_EXTRACTOR_IO_ERROR - ), - ioexception - ); - } - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/model/FileType.java b/support/arara/source/src/main/java/com/github/cereda/arara/model/FileType.java deleted file mode 100644 index e7403bee51..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/model/FileType.java +++ /dev/null @@ -1,170 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.model; - -import com.github.cereda.arara.controller.LanguageController; -import com.github.cereda.arara.utils.CommonUtils; -import java.util.HashMap; -import java.util.Map; -import org.apache.commons.lang.builder.EqualsBuilder; -import org.apache.commons.lang.builder.HashCodeBuilder; - -/** - * Implements the file type model. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class FileType { - - // string representing the - // file extension - private String extension; - - // string representing the - // file pattern to be used - // as directive lookup - private String pattern; - - // the application messages obtained from the - // language controller - private static final LanguageController messages = - LanguageController.getInstance(); - - // a map containing all file - // types that arara accepts - private static final Map<String, String> types = - new HashMap<String, String>(); - - /** - * Initializes the file type class by setting the default file types and - * their corresponding patterns. - */ - public static void init() { - types.put("tex", "^\\s*%\\s+"); - types.put("dtx", "^\\s*%\\s+"); - types.put("ltx", "^\\s*%\\s+"); - types.put("drv", "^\\s*%\\s+"); - types.put("ins", "^\\s*%\\s+"); - } - - /** - * Constructor. It takes both file extension and pattern lookup. - * @param extension The file extension. - * @param pattern The file pattern. - */ - public FileType(String extension, String pattern) { - this.extension = extension; - this.pattern = pattern; - } - - /** - * Constructor. It takes the extension, but it might raise an exception if - * the extension is unknown. This constructor is used when you just want - * to reorganize the file lookup priority without the need of changing the - * default extensions. - * @param extension The file extension. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public FileType(String extension) throws AraraException { - if (types.containsKey(extension)) { - this.extension = extension; - this.pattern = types.get(extension); - } else { - throw new AraraException( - messages.getMessage( - Messages.ERROR_FILETYPE_UNKNOWN_EXTENSION, - extension, - CommonUtils.getFileTypesList() - ) - ); - } - } - - /** - * Implements the file type hash code. Note that only the file extension is - * considered. - * @return An integer representing the file type hash code. - */ - @Override - public int hashCode() { - return new HashCodeBuilder().append(extension).toHashCode(); - } - - /** - * Implements the file type equals method, checking if one file type is - * equal to another. Note that only the file extension is considered. - * @param object The object to be analyzed. - * @return A boolean value indicating if those two objects are equal. - */ - @Override - public boolean equals(Object object) { - if (object == null) { - return false; - } - if (getClass() != object.getClass()) { - return false; - } - final FileType reference = (FileType) object; - return new EqualsBuilder().append(extension, reference.extension).isEquals(); - } - - /** - * Gets the file type extension. - * @return String representing the file type extension. - */ - public String getExtension() { - return extension; - } - - /** - * Gets the file type pattern. - * @return String representing the file type pattern. - */ - public String getPattern() { - return pattern; - } - - /** - * Provides a textual representation of the current file type object. - * @return A string containing a textual representation of the current file - * type object. - */ - @Override - public String toString() { - return ".".concat(extension); - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/model/FileTypeResource.java b/support/arara/source/src/main/java/com/github/cereda/arara/model/FileTypeResource.java deleted file mode 100644 index d23b10f9f5..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/model/FileTypeResource.java +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.model; - -import com.github.cereda.arara.utils.CommonUtils; - -/** - * Implements the file type resource model. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class FileTypeResource { - - // the file extension - private String extension; - - // the file pattern - private String pattern; - - /** - * Gets the extension. - * @return The extension. - */ - public String getExtension() { - return CommonUtils.removeKeyword(extension); - } - - /** - * Sets the extension. - * @param extension The extension. - */ - public void setExtension(String extension) { - this.extension = extension; - } - - /** - * Gets the pattern. - * @return The pattern. - */ - public String getPattern() { - return CommonUtils.removeKeyword(pattern); - } - - /** - * Sets the pattern. - * @param pattern The pattern. - */ - public void setPattern(String pattern) { - this.pattern = pattern; - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/model/Interpreter.java b/support/arara/source/src/main/java/com/github/cereda/arara/model/Interpreter.java deleted file mode 100644 index 30c18a3074..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/model/Interpreter.java +++ /dev/null @@ -1,486 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.model; - -import com.github.cereda.arara.controller.ConfigurationController; -import com.github.cereda.arara.controller.LanguageController; -import com.github.cereda.arara.utils.CommonUtils; -import com.github.cereda.arara.utils.DisplayUtils; -import com.github.cereda.arara.utils.InterpreterUtils; -import com.github.cereda.arara.utils.Methods; -import com.github.cereda.arara.utils.RuleUtils; -import java.io.File; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import org.mvel2.templates.TemplateRuntime; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Interprets the list of directives. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class Interpreter { - - // the application messages obtained from the - // language controller - private static final LanguageController messages - = LanguageController.getInstance(); - - // the class logger obtained from - // the logger factory - private static final Logger logger - = LoggerFactory.getLogger(Interpreter.class); - - // list of directives to be - // interpreted in here - private List<Directive> directives; - - /** - * Sets the list of directives. - * @param directives The list of directives. - */ - public void setDirectives(List<Directive> directives) { - this.directives = directives; - } - - /** - * Executes each directive, throwing an exception if something bad has - * happened. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public void execute() throws AraraException { - - for (Directive directive : directives) { - - logger.info( - messages.getMessage( - Messages.LOG_INFO_INTERPRET_RULE, - directive.getIdentifier() - ) - ); - - ConfigurationController.getInstance(). - put("execution.file", - directive.getParameters().get("reference") - ); - File file = getRule(directive); - - logger.info( - messages.getMessage( - Messages.LOG_INFO_RULE_LOCATION, - file.getParent() - ) - ); - - ConfigurationController.getInstance(). - put("execution.info.rule.id", directive.getIdentifier()); - ConfigurationController.getInstance(). - put("execution.info.rule.path", file.getParent()); - ConfigurationController.getInstance(). - put("execution.directive.lines", - directive.getLineNumbers() - ); - ConfigurationController.getInstance(). - put("execution.directive.reference", - directive.getParameters().get("reference") - ); - - Rule rule = parseRule(file, directive); - Map<String, Object> parameters = parseArguments(rule, directive); - Methods.addRuleMethods(parameters); - - String name = rule.getName(); - List<String> authors = rule.getAuthors() == null - ? new ArrayList<String>() : rule.getAuthors(); - ConfigurationController.getInstance(). - put("execution.rule.arguments", - InterpreterUtils.getRuleArguments(rule) - ); - - Evaluator evaluator = new Evaluator(); - - boolean available = true; - if (InterpreterUtils. - runPriorEvaluation(directive.getConditional())) { - available = evaluator.evaluate(directive.getConditional()); - } - - if (available) { - - do { - - List<RuleCommand> commands = rule.getCommands(); - for (RuleCommand command : commands) { - String closure = command.getCommand(); - Object result = null; - try { - result = TemplateRuntime.eval(closure, parameters); - } catch (RuntimeException exception) { - throw new AraraException( - CommonUtils.getRuleErrorHeader().concat( - messages.getMessage( - Messages.ERROR_INTERPRETER_COMMAND_RUNTIME_ERROR - ) - ), - exception - ); - } - - List<Object> execution = new ArrayList<Object>(); - if (CommonUtils.checkClass(List.class, result)) { - execution = CommonUtils.flatten((List<?>) result); - } else { - execution.add(result); - } - - for (Object current : execution) { - - if (current == null) { - throw new AraraException( - CommonUtils.getRuleErrorHeader().concat( - messages.getMessage( - Messages.ERROR_INTERPRETER_NULL_COMMAND - ) - ) - ); - } else { - - if (!CommonUtils.checkEmptyString( - String.valueOf(current))) { - - DisplayUtils.printEntry(name, - command.getName() == null - ? messages.getMessage( - Messages.INFO_LABEL_UNNAMED_TASK - ) - : command.getName() - ); - boolean success = true; - - if (CommonUtils.checkClass( - Trigger.class, current)) { - if (((Boolean) ConfigurationController. - getInstance(). - get("execution.dryrun")) == false) { - if (((Boolean) ConfigurationController. - getInstance(). - get("execution.verbose")) == true) { - DisplayUtils.wrapText( - messages.getMessage( - Messages.INFO_INTERPRETER_VERBOSE_MODE_TRIGGER_MODE - ) - ); - } - } else { - DisplayUtils.printAuthors(authors); - DisplayUtils.wrapText( - messages.getMessage( - Messages.INFO_INTERPRETER_DRYRUN_MODE_TRIGGER_MODE - ) - ); - DisplayUtils.printConditional( - directive.getConditional() - ); - } - Trigger trigger = (Trigger) current; - trigger.process(); - } else { - if (CommonUtils.checkClass( - Boolean.class, current)) { - success = (Boolean) current; - logger.info( - messages.getMessage( - Messages.LOG_INFO_BOOLEAN_MODE, - String.valueOf(success) - ) - ); - - if (((Boolean) ConfigurationController. - getInstance(). - get("execution.dryrun")) == true) { - - DisplayUtils.printAuthors(authors); - DisplayUtils.wrapText( - messages.getMessage( - Messages.INFO_INTERPRETER_DRYRUN_MODE_BOOLEAN_MODE, - success - ) - ); - DisplayUtils.printConditional( - directive.getConditional() - ); - } - } else { - - Object representation - = CommonUtils.checkClass( - Command.class, - current - ) - ? current - : String.valueOf(current); - logger.info( - messages.getMessage( - Messages.LOG_INFO_SYSTEM_COMMAND, - representation - ) - ); - - if (((Boolean) ConfigurationController. - getInstance(). - get("execution.dryrun")) == false) { - int code = InterpreterUtils. - run(representation); - Object check = null; - try { - Map<String, Object> context - = new HashMap<String, Object>(); - context.put("value", code); - check = TemplateRuntime.eval( - "@{ ".concat( - command.getExit() == null - ? "value == 0" - : command.getExit()).concat(" }"), - context); - } catch (RuntimeException exception) { - throw new AraraException( - CommonUtils.getRuleErrorHeader(). - concat( - messages.getMessage( - Messages.ERROR_INTERPRETER_EXIT_RUNTIME_ERROR - ) - ), - exception - ); - } - if (CommonUtils. - checkClass( - Boolean.class, - check)) { - success = (Boolean) check; - } else { - throw new AraraException( - CommonUtils.getRuleErrorHeader().concat( - messages.getMessage( - Messages.ERROR_INTERPRETER_WRONG_EXIT_CLOSURE_RETURN - ) - ) - ); - } - } else { - DisplayUtils.printAuthors(authors); - DisplayUtils.wrapText( - messages.getMessage( - Messages.INFO_INTERPRETER_DRYRUN_MODE_SYSTEM_COMMAND, - representation - ) - ); - DisplayUtils.printConditional( - directive.getConditional() - ); - } - } - } - - DisplayUtils.printEntryResult(success); - - if (((Boolean) ConfigurationController. - getInstance().get("trigger.halt")) - || (((Boolean) ConfigurationController. - getInstance(). - get("execution.errors.halt") - && !success))) { - return; - } - } - } - } - } - } while (evaluator.evaluate(directive.getConditional())); - } - } - } - - /** - * Gets the rule according to the provided directive. - * @param directive The provided directive. - * @return The absolute canonical path of the rule, given the provided - * directive. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - private File getRule(Directive directive) throws AraraException { - File file = InterpreterUtils.buildRulePath(directive.getIdentifier()); - if (file == null) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_INTERPRETER_RULE_NOT_FOUND, - directive.getIdentifier(), - CommonUtils.getCollectionElements( - CommonUtils.getAllRulePaths(), - "(", - ")", - "; " - ) - ) - ); - } else { - return file; - } - } - - /** - * Parses the rule against the provided directive. - * @param file The file representing the rule. - * @param directive The directive to be analyzed. - * @return A rule object. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - private Rule parseRule(File file, Directive directive) - throws AraraException { - return RuleUtils.parseRule(file, directive.getIdentifier()); - } - - /** - * Parses the rule arguments against the provided directive. - * @param rule The rule object. - * @param directive The directive. - * @return A map containing all arguments resolved according to the - * directive parameters. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - private Map<String, Object> parseArguments(Rule rule, Directive directive) - throws AraraException { - - List<Argument> arguments = rule.getArguments(); - - Set<String> unknown = CommonUtils. - getUnknownKeys(directive.getParameters(), arguments); - unknown.remove("file"); - unknown.remove("reference"); - if (!unknown.isEmpty()) { - throw new AraraException( - CommonUtils.getRuleErrorHeader().concat( - messages.getMessage( - Messages.ERROR_INTERPRETER_UNKNOWN_KEYS, - CommonUtils.getCollectionElements( - unknown, - "(", - ")", - ", " - ) - ) - ) - ); - } - - Map<String, Object> mapping = new HashMap<String, Object>(); - mapping.put("file", directive.getParameters().get("file")); - mapping.put("reference", directive.getParameters().get("reference")); - - Map<String, Object> context = new HashMap<String, Object>(); - context.put("parameters", directive.getParameters()); - context.put("file", directive.getParameters().get("file")); - context.put("reference", directive.getParameters().get("reference")); - Methods.addRuleMethods(context); - - for (Argument argument : arguments) { - if ((argument.isRequired()) - && (!directive.getParameters().containsKey( - argument.getIdentifier()))) { - throw new AraraException( - CommonUtils.getRuleErrorHeader().concat( - messages.getMessage( - Messages.ERROR_INTERPRETER_ARGUMENT_IS_REQUIRED, - argument.getIdentifier() - ) - ) - ); - } - - if (argument.getDefault() != null) { - try { - Object result = TemplateRuntime. - eval(argument.getDefault(), context); - mapping.put(argument.getIdentifier(), result); - } catch (RuntimeException exception) { - throw new AraraException( - CommonUtils.getRuleErrorHeader(). - concat(messages.getMessage( - Messages.ERROR_INTERPRETER_DEFAULT_VALUE_RUNTIME_ERROR - ) - ), - exception - ); - } - } else { - mapping.put(argument.getIdentifier(), ""); - } - - if ((argument.getFlag() != null) - && (directive.getParameters().containsKey( - argument.getIdentifier()))) { - - try { - Object result = TemplateRuntime.eval( - argument.getFlag(), - context - ); - mapping.put(argument.getIdentifier(), result); - } catch (RuntimeException exception) { - throw new AraraException(CommonUtils.getRuleErrorHeader(). - concat( - messages.getMessage( - Messages.ERROR_INTERPRETER_FLAG_RUNTIME_EXCEPTION - ) - ), - exception - ); - } - } - } - - return mapping; - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/model/Language.java b/support/arara/source/src/main/java/com/github/cereda/arara/model/Language.java deleted file mode 100644 index ff1b16a03f..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/model/Language.java +++ /dev/null @@ -1,148 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.model; - -import com.github.cereda.arara.controller.LanguageController; -import com.github.cereda.arara.utils.CommonUtils; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; - -/** - * Implements the language model. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class Language { - - // the language code, based on - // ISO 639-1 and language variants - private final String code; - - // map containing all languages - // supported by nightingale - private static final Map<String, Pair<String, Locale>> languages = - new HashMap<String, Pair<String, Locale>>(); - - // the application messages obtained from the - // language controller - private static final LanguageController messages = - LanguageController.getInstance(); - - /** - * Initialize the language model. All supported languages are added in here. - */ - public static void init() { - languages.put("en", new Pair<String, Locale>( - "English", - new Locale("en") - )); - languages.put("de", new Pair<String, Locale>( - "German", - new Locale("de") - )); - languages.put("nl", new Pair<String, Locale>( - "Dutch", - new Locale("nl") - )); - languages.put("qn", new Pair<String, Locale>( - "Broad Norfolk", - new Locale("en", "QN") - )); - languages.put("ptbr", new Pair<String, Locale>( - "Brazilian Portuguese", - new Locale("pt", "BR") - )); - languages.put("it", new Pair<String, Locale>( - "Italian", - new Locale("it") - )); - } - - /** - * Creates a new language object. It might raise an exception if the - * provided language does not exist in the map. - * @param code The language code, based on ISO 639-1 and language variants. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public Language(String code) throws AraraException { - if (languages.containsKey(code)) { - this.code = code; - } else { - throw new AraraException( - messages.getMessage( - Messages.ERROR_LANGUAGE_INVALID_CODE, - getLanguagesList() - ) - ); - } - } - - /** - * Gets the language name. - * @return A string representing the language name. - */ - public String getName() { - return languages.get(code).getFirstElement(); - } - - /** - * Gets the language locale. - * @return The language locale. - */ - public Locale getLocale() { - return languages.get(code).getSecondElement(); - } - - /** - * Gets a string representing the list of available languages. - * @return String representing the list of available languages. - */ - public static String getLanguagesList() { - List<String> entries = new ArrayList<String>(); - for (String key : languages.keySet()) { - entries.add(languages.get(key). - getFirstElement(). - concat(": "). - concat(key) - ); - } - return CommonUtils.getCollectionElements(entries, "(", ")", ", "); - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/model/Messages.java b/support/arara/source/src/main/java/com/github/cereda/arara/model/Messages.java deleted file mode 100644 index 901e61be6a..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/model/Messages.java +++ /dev/null @@ -1,173 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.model; - -import ch.qos.cal10n.BaseName; -import ch.qos.cal10n.Locale; -import ch.qos.cal10n.LocaleData; - -/** - * This enumeration contains all application messages. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -@BaseName("com.github.cereda.arara.localization.messages") -@LocaleData({ - @Locale(value = "de", charset = "UTF-8"), - @Locale(value = "en", charset = "UTF-8"), - @Locale(value = "en_QN", charset = "UTF-8"), - @Locale(value = "it", charset = "UTF-8"), - @Locale(value = "nl", charset = "UTF-8"), - @Locale(value = "pt_BR", charset = "UTF-8") -}) -public enum Messages { - - ERROR_BASENAME_NOT_A_FILE, - ERROR_CALCULATEHASH_IO_EXCEPTION, - ERROR_CHECKBOOLEAN_NOT_VALID_BOOLEAN, - ERROR_CHECKOS_INVALID_OPERATING_SYSTEM, - ERROR_CHECKREGEX_IO_EXCEPTION, - ERROR_CONFIGURATION_GENERIC_ERROR, - ERROR_CONFIGURATION_INVALID_YAML, - ERROR_CONFIGURATION_LOOPS_INVALID_RANGE, - ERROR_DISCOVERFILE_FILE_NOT_FOUND, - ERROR_EVALUATE_COMPILATION_FAILED, - ERROR_EVALUATE_NOT_BOOLEAN_VALUE, - ERROR_EXTRACTOR_IO_ERROR, - ERROR_FILETYPE_NOT_A_FILE, - ERROR_FILETYPE_UNKNOWN_EXTENSION, - ERROR_GETAPPLICATIONPATH_ENCODING_EXCEPTION, - ERROR_GETCANONICALFILE_IO_EXCEPTION, - ERROR_GETCANONICALPATH_IO_EXCEPTION, - ERROR_GETPARENTCANONICALPATH_IO_EXCEPTION, - ERROR_INTERPRETER_ARGUMENT_IS_REQUIRED, - ERROR_INTERPRETER_COMMAND_RUNTIME_ERROR, - ERROR_INTERPRETER_DEFAULT_VALUE_RUNTIME_ERROR, - ERROR_INTERPRETER_EXIT_RUNTIME_ERROR, - ERROR_INTERPRETER_FLAG_RUNTIME_EXCEPTION, - ERROR_INTERPRETER_NULL_COMMAND, - ERROR_INTERPRETER_RULE_NOT_FOUND, - ERROR_INTERPRETER_UNKNOWN_KEYS, - ERROR_INTERPRETER_WRONG_EXIT_CLOSURE_RETURN, - ERROR_ISSUBDIRECTORY_NOT_A_DIRECTORY, - ERROR_LANGUAGE_INVALID_CODE, - ERROR_LOAD_COULD_NOT_LOAD_XML, - ERROR_PARSER_INVALID_PREAMBLE, - ERROR_PARSER_LOOPS_INVALID_RANGE, - ERROR_PARSER_LOOPS_NAN, - ERROR_PARSER_TIMEOUT_INVALID_RANGE, - ERROR_PARSER_TIMEOUT_NAN, - ERROR_PARSERULE_GENERIC_ERROR, - ERROR_PARSERULE_INVALID_YAML, - ERROR_REPLICATELIST_MISSING_FORMAT_ARGUMENTS_EXCEPTION, - ERROR_RULE_IDENTIFIER_AND_PATH, - ERROR_RUN_GENERIC_EXCEPTION, - ERROR_RUN_INTERRUPTED_EXCEPTION, - ERROR_RUN_INVALID_EXIT_VALUE_EXCEPTION, - ERROR_RUN_IO_EXCEPTION, - ERROR_RUN_TIMEOUT_EXCEPTION, - ERROR_RUN_TIMEOUT_INVALID_RANGE, - ERROR_SAVE_COULD_NOT_SAVE_XML, - ERROR_SESSION_OBTAIN_UNKNOWN_KEY, - ERROR_SESSION_REMOVE_UNKNOWN_KEY, - ERROR_TRIGGER_ACTION_NOT_FOUND, - ERROR_TRIGGER_CALL_EXCEPTION, - ERROR_VALIDATE_EMPTY_FILES_LIST, - ERROR_VALIDATE_FILE_IS_RESERVED, - ERROR_VALIDATE_FILES_IS_NOT_A_LIST, - ERROR_VALIDATE_INVALID_DIRECTIVE_FORMAT, - ERROR_VALIDATE_NO_DIRECTIVES_FOUND, - ERROR_VALIDATE_ORPHAN_LINEBREAK, - ERROR_VALIDATE_REFERENCE_IS_RESERVED, - ERROR_VALIDATE_YAML_EXCEPTION, - ERROR_VALIDATEBODY_ARGUMENT_ID_IS_RESERVED, - ERROR_VALIDATEBODY_ARGUMENTS_LIST, - ERROR_VALIDATEBODY_DUPLICATE_ARGUMENT_IDENTIFIERS, - ERROR_VALIDATEBODY_MISSING_KEYS, - ERROR_VALIDATEBODY_NULL_ARGUMENT_ID, - ERROR_VALIDATEBODY_NULL_COMMAND, - ERROR_VALIDATEBODY_NULL_COMMANDS_LIST, - ERROR_VALIDATEHEADER_NULL_ID, - ERROR_VALIDATEHEADER_NULL_NAME, - ERROR_VALIDATEHEADER_WRONG_IDENTIFIER, - ERROR_VELOCITY_FILE_NOT_FOUND, - ERROR_VELOCITY_PARSE_EXCEPTION, - ERROR_VELOCITY_METHOD_INVOCATION_EXCEPTION, - ERROR_VELOCITY_IO_EXCEPTION, - INFO_DISPLAY_EXCEPTION_MORE_DETAILS, - INFO_DISPLAY_EXECUTION_TIME, - INFO_DISPLAY_FILE_INFORMATION, - INFO_INTERPRETER_DRYRUN_MODE_BOOLEAN_MODE, - INFO_INTERPRETER_DRYRUN_MODE_SYSTEM_COMMAND, - INFO_INTERPRETER_DRYRUN_MODE_TRIGGER_MODE, - INFO_INTERPRETER_VERBOSE_MODE_TRIGGER_MODE, - INFO_LABEL_AUTHOR, - INFO_LABEL_AUTHORS, - INFO_LABEL_CONDITIONAL, - INFO_LABEL_NO_AUTHORS, - INFO_LABEL_ON_DETAILS, - INFO_LABEL_ON_ERROR, - INFO_LABEL_ON_FAILURE, - INFO_LABEL_ON_SUCCESS, - INFO_LABEL_UNNAMED_TASK, - INFO_PARSER_ALL_RIGHTS_RESERVED, - INFO_PARSER_DRYRUN_MODE_DESCRIPTION, - INFO_PARSER_HELP_DESCRIPTION, - INFO_PARSER_LANGUAGE_DESCRIPTION, - INFO_PARSER_LOG_DESCRIPTION, - INFO_PARSER_LOOPS_DESCRIPTION, - INFO_PARSER_NOTES, - INFO_PARSER_ONLY_HEADER, - INFO_PARSER_PREAMBLE_DESCRIPTION, - INFO_PARSER_SILENT_MODE_DESCRIPTION, - INFO_PARSER_TIMEOUT_DESCRIPTION, - INFO_PARSER_VERBOSE_MODE_DESCRIPTION, - INFO_PARSER_VERSION_DESCRIPTION, - LOG_INFO_BEGIN_BUFFER, - LOG_INFO_BOOLEAN_MODE, - LOG_INFO_DIRECTIVES_BLOCK, - LOG_INFO_END_BUFFER, - LOG_INFO_INTERPRET_RULE, - LOG_INFO_INTERPRET_TASK, - LOG_INFO_POTENTIAL_DIRECTIVE_FOUND, - LOG_INFO_POTENTIAL_PATTERN_FOUND, - LOG_INFO_RULE_LOCATION, - LOG_INFO_SYSTEM_COMMAND, - LOG_INFO_TASK_RESULT, - LOG_INFO_VALIDATED_DIRECTIVES, - LOG_INFO_WELCOME_MESSAGE, - ERROR_CONFIGURATION_FILETYPE_MISSING_EXTENSION - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/model/Pair.java b/support/arara/source/src/main/java/com/github/cereda/arara/model/Pair.java deleted file mode 100644 index 427a5fca1d..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/model/Pair.java +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.model; - -/** - * Implements a pair of objects. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class Pair<T, V> { - - // first element of the pair - private final T firstElement; - - // second element of the pair - private final V secondElement; - - /** - * Constructor. - * @param firstElement The first element. - * @param secondElement The second element. - */ - public Pair(T firstElement, V secondElement) { - this.firstElement = firstElement; - this.secondElement = secondElement; - } - - /** - * Gets the first element. - * @return The first element. - */ - public T getFirstElement() { - return firstElement; - } - - /** - * Gets the second element. - * @return The second element. - */ - public V getSecondElement() { - return secondElement; - } - - /** - * A shorter version for getting the first element. - * @return The first element. - */ - public T first() { - return getFirstElement(); - } - - /** - * A shorter version for getting the second element. - * @return The second element. - */ - public V second() { - return getSecondElement(); - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/model/Parser.java b/support/arara/source/src/main/java/com/github/cereda/arara/model/Parser.java deleted file mode 100644 index 681c2f8fef..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/model/Parser.java +++ /dev/null @@ -1,410 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.model; - -import com.github.cereda.arara.controller.ConfigurationController; -import com.github.cereda.arara.controller.LanguageController; -import com.github.cereda.arara.controller.LoggingController; -import com.github.cereda.arara.utils.CommonUtils; -import com.github.cereda.arara.utils.DisplayUtils; -import java.util.Locale; -import java.util.Map; -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.DefaultParser; -import org.apache.commons.cli.HelpFormatter; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; - -/** - * Implements the command line parser. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class Parser { - - // command line arguments to be - // processed by this parser - private final String[] arguments; - - // command line options, it will - // group each option available - // in arara - private Options options; - - // each option available in - // arara - private Option version; - private Option help; - private Option log; - private Option verbose; - private Option silent; - private Option dryrun; - private Option timeout; - private Option language; - private Option loops; - private Option preamble; - private Option onlyheader; - - public Parser() { - this.arguments = null; - } - - // the application messages obtained from the - // language controller - private static final LanguageController messages = - LanguageController.getInstance(); - - /** - * Constructor. - * @param arguments Array of strings representing the command line - * arguments. - */ - public Parser(String[] arguments) { - this.arguments = arguments; - } - - /** - * Parses the command line arguments. - * @return A boolean value indicating if the parsing should allow the - * application to look for directives in the provided main file. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public boolean parse() throws AraraException { - - // create new instances of the - // command line options, including - // the ones that require arguments - version = new Option("V", "version", false, ""); - help = new Option("h", "help", false, ""); - log = new Option("l", "log", false, ""); - verbose = new Option("v", "verbose", false, ""); - silent = new Option("s", "silent", false, ""); - dryrun = new Option("n", "dry-run", false, ""); - timeout = new Option("t", "timeout", true, ""); - timeout.setArgName("number"); - language = new Option("L", "language", true, ""); - language.setArgName("code"); - loops = new Option("m", "max-loops", true, ""); - loops.setArgName("number"); - preamble = new Option("p", "preamble", true, ""); - preamble.setArgName("name"); - onlyheader = new Option("H", "header", false, ""); - - // add all options to the options - // group, so they are recognized - // by the command line parser - options = new Options(); - options.addOption(version); - options.addOption(help); - options.addOption(log); - options.addOption(verbose); - options.addOption(silent); - options.addOption(dryrun); - options.addOption(timeout); - options.addOption(language); - options.addOption(loops); - options.addOption(preamble); - options.addOption(onlyheader); - - // update all descriptions based - // on the localized messages - updateDescriptions(); - - // a new default command line - // parser is created and the - // arguments are parsed - CommandLineParser parser = new DefaultParser(); - - try { - - CommandLine line = parser.parse(options, arguments); - - String reference; - if (line.hasOption("language")) { - ConfigurationController.getInstance(). - put("execution.language", - new Language(line.getOptionValue("language")) - ); - Locale locale = ((Language) ConfigurationController. - getInstance().get("execution.language")).getLocale(); - messages.setLocale(locale); - updateDescriptions(); - } - - if (line.hasOption("help")) { - printVersion(); - printUsage(); - return false; - } - - if (line.hasOption("version")) { - printVersion(); - printNotes(); - return false; - } - - if (line.getArgs().length != 1) { - printVersion(); - printUsage(); - return false; - } else { - reference = line.getArgs()[0]; - } - - if (line.hasOption("timeout")) { - try { - long value = Long.parseLong(line.getOptionValue("timeout")); - if (value <= 0) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_PARSER_TIMEOUT_INVALID_RANGE - ) - ); - } else { - ConfigurationController.getInstance(). - put("execution.timeout", true); - ConfigurationController.getInstance(). - put("execution.timeout.value", value); - } - } catch (NumberFormatException nfexception) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_PARSER_TIMEOUT_NAN - ) - ); - } - } - - if (line.hasOption("max-loops")) { - try { - long value = Long.parseLong( - line.getOptionValue("max-loops") - ); - if (value <= 0) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_PARSER_LOOPS_INVALID_RANGE - ) - ); - } else { - ConfigurationController.getInstance(). - put("execution.loops", value); - } - } catch (NumberFormatException nfexception) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_PARSER_LOOPS_NAN - ) - ); - } - } - - if (line.hasOption("verbose")) { - ConfigurationController.getInstance(). - put("execution.verbose", true); - } - - if (line.hasOption("silent")) { - ConfigurationController.getInstance(). - put("execution.verbose", false); - } - - if (line.hasOption("dry-run")) { - ConfigurationController.getInstance(). - put("execution.dryrun", true); - ConfigurationController.getInstance(). - put("execution.errors.halt", false); - } - - if (line.hasOption("log")) { - ConfigurationController.getInstance(). - put("execution.logging", true); - } - - if (line.hasOption("preamble")) { - @SuppressWarnings("unchecked") - Map<String, String> preambles = (Map<String, String>) - ConfigurationController.getInstance(). - get("execution.preambles"); - if (preambles.containsKey(line.getOptionValue("preamble"))) { - ConfigurationController.getInstance(). - put("execution.preamble.active", true); - ConfigurationController.getInstance(). - put("execution.preamble.content", - preambles.get(line.getOptionValue("preamble")) - ); - } - else { - throw new AraraException( - messages.getMessage( - Messages.ERROR_PARSER_INVALID_PREAMBLE, - line.getOptionValue("preamble") - ) - ); - } - } - - if (line.hasOption("header")) { - ConfigurationController.getInstance(). - put("execution.header", true); - } - - CommonUtils.discoverFile(reference); - LoggingController.enableLogging((Boolean) ConfigurationController. - getInstance().get("execution.logging")); - ConfigurationController.getInstance().put("display.time", true); - - return true; - - } catch (ParseException pexception) { - printVersion(); - printUsage(); - return false; - } - } - - /** - * Prints the application usage. - */ - private void printUsage() { - HelpFormatter formatter = new HelpFormatter(); - StringBuilder builder = new StringBuilder(); - builder.append("arara [file [--dry-run] [--log] "); - builder.append("[--verbose | --silent] [--timeout N] "); - builder.append("[--max-loops N] [--language L] "); - builder.append("[ --preamble P ] [--header] | --help | --version]"); - formatter.printHelp(builder.toString(), options); - } - - /** - * Prints the application version. - */ - private void printVersion() { - String year = (String) ConfigurationController.getInstance(). - get("application.copyright.year"); - String number = (String) ConfigurationController.getInstance(). - get("application.version"); - String revision = (String) ConfigurationController.getInstance(). - get("application.revision"); - StringBuilder builder = new StringBuilder(); - builder.append("arara "); - builder.append(number); - builder.append(" (revision "); - builder.append(revision); - builder.append(")"); - builder.append("\n"); - builder.append("Copyright (c) ").append(year).append(", "); - builder.append("Paulo Roberto Massa Cereda"); - builder.append("\n"); - builder.append(messages.getMessage( - Messages.INFO_PARSER_ALL_RIGHTS_RESERVED) - ); - builder.append("\n"); - System.out.println(builder.toString()); - } - - /** - * Print the application notes. - */ - private void printNotes() { - DisplayUtils.wrapText(messages.getMessage(Messages.INFO_PARSER_NOTES)); - } - - /** - * Updates all the descriptions in order to make them reflect the current - * language setting. - */ - private void updateDescriptions() { - version.setDescription( - messages.getMessage( - Messages.INFO_PARSER_VERSION_DESCRIPTION - ) - ); - help.setDescription( - messages.getMessage( - Messages.INFO_PARSER_HELP_DESCRIPTION - ) - ); - log.setDescription( - messages.getMessage( - Messages.INFO_PARSER_LOG_DESCRIPTION - ) - ); - verbose.setDescription( - messages.getMessage( - Messages.INFO_PARSER_VERBOSE_MODE_DESCRIPTION - ) - ); - silent.setDescription( - messages.getMessage( - Messages.INFO_PARSER_SILENT_MODE_DESCRIPTION - ) - ); - dryrun.setDescription( - messages.getMessage( - Messages.INFO_PARSER_DRYRUN_MODE_DESCRIPTION - ) - ); - timeout.setDescription( - messages.getMessage( - Messages.INFO_PARSER_TIMEOUT_DESCRIPTION - ) - ); - language.setDescription( - messages.getMessage( - Messages.INFO_PARSER_LANGUAGE_DESCRIPTION - ) - ); - loops.setDescription( - messages.getMessage( - Messages.INFO_PARSER_LOOPS_DESCRIPTION - ) - ); - preamble.setDescription( - messages.getMessage( - Messages.INFO_PARSER_PREAMBLE_DESCRIPTION - ) - ); - onlyheader.setDescription( - messages.getMessage( - Messages.INFO_PARSER_ONLY_HEADER - ) - ); - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/model/Resource.java b/support/arara/source/src/main/java/com/github/cereda/arara/model/Resource.java deleted file mode 100644 index 58eaa0dc40..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/model/Resource.java +++ /dev/null @@ -1,291 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.model; - -import com.github.cereda.arara.utils.CommonUtils; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.collections4.Transformer; -import org.apache.commons.lang.SystemUtils; -import org.mvel2.templates.TemplateRuntime; - -/** - * Implements the configuration resource model. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class Resource { - - // rule paths - private List<String> paths; - - // file types - private List<FileTypeResource> filetypes; - - // the application language - private String language; - - // maximum number of loops - private long loops; - - // verbose flag - private boolean verbose; - - // logging flag - private boolean logging; - - // database name - private String dbname; - - // log name - private String logname; - - // header flag - private boolean header; - - // map of preambles - private Map<String, String> preambles; - - // look and feel - private String laf; - - /** - * Gets the rule paths. - * @return The rule paths. - */ - public List<String> getPaths() { - if (paths != null) { - - final Map<String, Object> map = new HashMap<String, Object>(); - Map<String, Object> user = new HashMap<String, Object>(); - user.put("home", SystemUtils.USER_HOME); - user.put("dir", SystemUtils.USER_DIR); - user.put("name", SystemUtils.USER_NAME); - map.put("user", user); - - Collection<String> result = CollectionUtils.collect( - paths, new Transformer<String, String>() { - public String transform(String input) { - String path = CommonUtils.removeKeyword(input); - try { - path = (String) TemplateRuntime.eval(path, map); - } - catch (RuntimeException nothandled) { - // do nothing, gracefully fallback to - // the default, unparsed path - } - return path; - } - }); - paths = new ArrayList<String>(result); - } - return paths; - } - - /** - * Sets the rule paths. - * @param paths The rule paths. - */ - public void setPaths(List<String> paths) { - this.paths = paths; - } - - /** - * Gets the list of file types. - * @return The list of file types. - */ - public List<FileTypeResource> getFiletypes() { - return filetypes; - } - - /** - * Sets the list of file types. - * @param filetypes The list of file types. - */ - public void setFiletypes(List<FileTypeResource> filetypes) { - this.filetypes = filetypes; - } - - /** - * Gets the language. - * @return The language. - */ - public String getLanguage() { - return CommonUtils.removeKeyword(language); - } - - /** - * Sets the language. - * @param language The language. - */ - public void setLanguage(String language) { - this.language = language; - } - - /** - * Get the maximum number of loops. - * @return The maximum number of loops. - */ - public long getLoops() { - return loops; - } - - /** - * Sets the maximum number of loops. - * @param loops The maximum number of loops. - */ - public void setLoops(long loops) { - this.loops = loops; - } - - /** - * Checks if verbose mode is active. - * @return A boolean value. - */ - public boolean isVerbose() { - return verbose; - } - - /** - * Sets the verbose mode. - * @param verbose A boolean value. - */ - public void setVerbose(boolean verbose) { - this.verbose = verbose; - } - - /** - * Checks if logging mode is active. - * @return A boolean value. - */ - public boolean isLogging() { - return logging; - } - - /** - * Sets the logging mode. - * @param logging A boolean value. - */ - public void setLogging(boolean logging) { - this.logging = logging; - } - - /** - * Gets the database name. - * @return The database name. - */ - public String getDbname() { - return CommonUtils.removeKeyword(dbname); - } - - /** - * Sets the database name. - * @param dbname The database name. - */ - public void setDbname(String dbname) { - this.dbname = dbname; - } - - /** - * Gets the log name. - * @return The log name. - */ - public String getLogname() { - return CommonUtils.removeKeyword(logname); - } - - /** - * Sets the log name. - * @param logname The log name. - */ - public void setLogname(String logname) { - this.logname = logname; - } - - /** - * Gets the map of preambles. - * @return Map of preambles. - */ - public Map<String, String> getPreambles() { - return preambles; - } - - /** - * Sets the map of preambles. - * @param preambles Map of preambles. - */ - public void setPreambles(Map<String, String> preambles) { - this.preambles = preambles; - } - - /** - * Gets the logical value of the header flag. - * @return Logical value of the header flag. - */ - public boolean isHeader() { - return header; - } - - /** - * Sets the logical value of the header flag. - * @param header The header flag. - */ - public void setHeader(boolean header) { - this.header = header; - } - - /** - * Gets the look and feel reference. - * @return The look and feel reference. - */ - public String getLaf() { - return CommonUtils.removeKeyword(laf); - } - - /** - * Sets the look and feel reference. - * @param laf The look and feel reference. - */ - public void setLaf(String laf) { - this.laf = laf; - } - - - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/model/Rule.java b/support/arara/source/src/main/java/com/github/cereda/arara/model/Rule.java deleted file mode 100644 index acf43cdf58..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/model/Rule.java +++ /dev/null @@ -1,155 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.model; - -import com.github.cereda.arara.utils.CommonUtils; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.collections4.Transformer; - -/** - * Implements the rule model. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class Rule { - - // the rule identifier - private String identifier; - - // the rule name - private String name; - - // the list of authors - private List<String> authors; - - // the list of commands - private List<RuleCommand> commands; - - // the list of arguments - private List<Argument> arguments; - - /** - * Gets the rule identifier. - * @return The rule identifier. - */ - public String getIdentifier() { - return CommonUtils.removeKeyword(identifier); - } - - /** - * Sets the rule identifier. - * @param identifier The rule identifier. - */ - public void setIdentifier(String identifier) { - this.identifier = identifier; - } - - /** - * Gets the rule identifier. - * @return The rule identifier. - */ - public String getName() { - return CommonUtils.removeKeyword(name); - } - - /** - * Sets the rule name. - * @param name The rule name. - */ - public void setName(String name) { - this.name = name; - } - - /** - * Gets the list of authors. - * @return A list of authors. - */ - public List<String> getAuthors() { - if (authors != null) { - Collection<String> result = CollectionUtils.collect( - authors, new Transformer<String, String>() { - public String transform(String input) { - return CommonUtils.removeKeyword(input); - } - }); - authors = new ArrayList<String>(result); - } - return authors; - } - - /** - * Sets the list of authors. - * @param authors The list of authors. - */ - public void setAuthors(List<String> authors) { - this.authors = authors; - } - - /** - * Gets the list of commands. - * @return The list of commands. - */ - public List<RuleCommand> getCommands() { - return commands; - } - - /** - * Sets the list of commands. - * @param commands The list of commands. - */ - public void setCommands(List<RuleCommand> commands) { - this.commands = commands; - } - - /** - * Gets the list of arguments. - * @return The list of arguments. - */ - public List<Argument> getArguments() { - return arguments; - } - - /** - * Sets the list of arguments. - * @param arguments The list of arguments. - */ - public void setArguments(List<Argument> arguments) { - this.arguments = arguments; - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/model/RuleCommand.java b/support/arara/source/src/main/java/com/github/cereda/arara/model/RuleCommand.java deleted file mode 100644 index e63430afeb..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/model/RuleCommand.java +++ /dev/null @@ -1,103 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.model; - -import com.github.cereda.arara.utils.CommonUtils; - -/** - * Implements the rule command model. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class RuleCommand { - - // the command name - private String name; - - // the command instruction - private String command; - - // the exit status expression - private String exit; - - /** - * Gets the command name. - * @return The command name. - */ - public String getName() { - return CommonUtils.removeKeyword(name); - } - - /** - * Sets the command name. - * @param name The command name. - */ - public void setName(String name) { - this.name = name; - } - - /** - * Gets the command instruction. - * @return The command instruction. - */ - public String getCommand() { - return CommonUtils.removeKeyword(command); - } - - /** - * Sets the command instruction. - * @param command The command instruction. - */ - public void setCommand(String command) { - this.command = command; - } - - /** - * Gets the exit status expression. - * @return The exit status expression. - */ - public String getExit() { - return CommonUtils.removeKeyword(exit); - } - - /** - * Sets the exit status expression. - * @param exit The exit status expression. - */ - public void setExit(String exit) { - this.exit = exit; - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/model/Session.java b/support/arara/source/src/main/java/com/github/cereda/arara/model/Session.java deleted file mode 100644 index 4462c5e369..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/model/Session.java +++ /dev/null @@ -1,122 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.model; - -import com.github.cereda.arara.controller.LanguageController; -import com.github.cereda.arara.controller.SessionController; - -/** - * Implements the session model. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class Session { - - // get the current instance from the - // session controller - private static final SessionController session = - SessionController.getInstance(); - - // the application messages obtained from the - // language controller - private static final LanguageController messages = - LanguageController.getInstance(); - - /** - * Inserts the object into the session, indexed by the provided key. - * @param key The provided key. - * @param value The value to be inserted. - */ - public void insert(String key, Object value) { - session.put(key, value); - } - - /** - * Removes the entry indexed by the provided key from the session. - * @param key The provided key. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public void remove(String key) throws AraraException { - if (session.contains(key)) { - session.remove(key); - } else { - throw new AraraException( - messages.getMessage( - Messages.ERROR_SESSION_REMOVE_UNKNOWN_KEY, - key - ) - ); - } - } - - /** - * Checks if the provided key exists in the session. - * @param key The provided key. - * @return A boolean value indicating if the provided key exists in the - * session. - */ - public boolean exists(String key) { - return session.contains(key); - } - - /** - * Clears the session. - */ - public void forget() { - session.clear(); - } - - /** - * Gets the object indexed by the provided key from the session. - * @param key The provided key. - * @return The object indexed by the provided key. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public Object obtain(String key) throws AraraException { - if (session.contains(key)) { - return session.get(key); - } else { - throw new AraraException( - messages.getMessage( - Messages.ERROR_SESSION_OBTAIN_UNKNOWN_KEY, - key - ) - ); - } - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/model/StopWatch.java b/support/arara/source/src/main/java/com/github/cereda/arara/model/StopWatch.java deleted file mode 100644 index da7062cf19..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/model/StopWatch.java +++ /dev/null @@ -1,84 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.model; - -import com.github.cereda.arara.controller.ConfigurationController; - -/** - * Implements a stopwatch. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class StopWatch { - - // two variables indicating the - // times the stopwatch started - // and stopped - private static long beginning = 0; - private static long end = 0; - - // a variable to indicate the - // stopwatch is enabled; so far, - // it hasn't started, then it is - // not enabled - private static boolean enabled = false; - - /** - * Starts the stopwatch. - */ - public static void start() { - beginning = System.nanoTime(); - enabled = true; - } - - /** - * Stops the stopwatch. - */ - public static void stop() { - end = System.nanoTime(); - } - - /** - * Gets the string representation of the elapsed time. - * @return A string representation of the elapsed time. - */ - public static String getTime() { - Language language = (Language) ConfigurationController. - getInstance().get("execution.language"); - double result = enabled ? (double) (end - beginning) / 1000000000 : 0.0; - return String.format(language.getLocale(), "%1.2f", result); - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/model/Trigger.java b/support/arara/source/src/main/java/com/github/cereda/arara/model/Trigger.java deleted file mode 100644 index 7d8ae6ce79..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/model/Trigger.java +++ /dev/null @@ -1,135 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.model; - -import com.github.cereda.arara.controller.ConfigurationController; -import com.github.cereda.arara.controller.LanguageController; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.Callable; - -/** - * Implements the trigger model. The tool provides triggers, which are a way - * to alter its internal behaviour according to a list of parameters. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class Trigger { - - // the action name and its - // list of parameters - private final String action; - private final List<Object> parameters; - - // the application messages obtained from the - // language controller - private static final LanguageController messages = - LanguageController.getInstance(); - - /** - * Constructor. - * @param action The action name. - * @param parameters The list of parameters. - */ - public Trigger(String action, List<Object> parameters) { - this.action = action; - this.parameters = parameters; - } - - /** - * Gets the action name. - * @return The action name. - */ - public String getAction() { - return action; - } - - /** - * Gets the list of parameters. - * @return The list of parameters. - */ - public List<Object> getParameters() { - return parameters; - } - - /** - * Returns a textual representation of the current trigger. - * @return A string containing a textual representation of the current - * trigger. - */ - @Override - public String toString() { - return "trigger"; - } - - /** - * Processes the current trigger. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public void process() throws AraraException { - - Map<String, Callable<Object>> mapping = - new HashMap<String, Callable<Object>>(); - mapping.put("halt", new Callable<Object>() { - public Object call() { - ConfigurationController.getInstance().put("trigger.halt", true); - return null; - } - }); - if (mapping.containsKey(action)) { - try { - mapping.get(action).call(); - } catch (Exception exception) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_TRIGGER_CALL_EXCEPTION, - action - ), - exception - ); - } - } else { - throw new AraraException( - messages.getMessage( - Messages.ERROR_TRIGGER_ACTION_NOT_FOUND, - action - ) - ); - } - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/utils/ClassLoadingUtils.java b/support/arara/source/src/main/java/com/github/cereda/arara/utils/ClassLoadingUtils.java deleted file mode 100644 index fdd642e21d..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/utils/ClassLoadingUtils.java +++ /dev/null @@ -1,166 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.utils; - -import com.github.cereda.arara.model.Pair; -import java.io.File; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLClassLoader; - -/** - * Implements utilitary methods for classloading and object instantiation. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class ClassLoadingUtils { - - /** - * Loads a class from the provided file, potentially a Java archive. - * @param file File containing the Java bytecode (namely, a JAR). - * @param name The canonical name of the class. - * @return A pair representing the status and the class. - */ - public static Pair<Integer, Class> loadClass(File file, String name) { - - // status and class to be returned, - // it defaults to an object class - int status = 0; - Class value = Object.class; - - // if file does not exist, nothing - // can be done, status is changed - if (!file.exists()) { - status = 1; - } else { - - // classloading involves defining - // a classloader and fetching the - // desired class from it, based on - // the provided file archive - try { - - // creates a new classloader with - // the provided file (potentially - // a JAR file) - URLClassLoader classloader = new URLClassLoader( - new URL[]{ - file.toURI().toURL() - }, - ClassLoadingUtils.class.getClassLoader() - ); - - // fetches the class from the - // instantiated classloader - value = Class.forName(name, true, classloader); - - } catch (MalformedURLException nothandled1) { - - // the file URL is incorrect, - // update status accordingly - status = 2; - - } catch (ClassNotFoundException nothandled2) { - - // the class was not found, - // update status accordingly - status = 3; - - } - } - - // return a new pair based on the - // current status and class holder - return new Pair<Integer, Class>(status, value); - } - - /** - * Loads a class from the provided file, instantiating it. - * @param file File containing the Java bytecode (namely, a JAR). - * @param name The canonical name of the class. - * @return A pair representing the status and the class object. - */ - public static Pair<Integer, Object> loadObject(File file, String name) { - - // load the corresponding class - // based on the qualified name - Pair<Integer, Class> pair = loadClass(file, name); - - // status and object to be returned, - // it defaults to an object - int status = pair.getFirstElement(); - Object value = new Object(); - - // checks if the class actually - // exists, otherwise simply - // ignore instantiation - if (status == 0) { - - // object instantiation relies - // on the default constructor - // (without arguments), class - // must implement it - - // OBS: constructors with arguments - // must be invoked through reflection - try { - - // get the class reference from - // the pair and instantiate it - // by invoking the default - // constructor (without arguments) - value = pair.getSecondElement().newInstance(); - - } catch (IllegalAccessException nothandled1) { - - // the object instantiation violated - // an access policy, status is updated - status = 4; - - } catch (InstantiationException nothandled2) { - - // an instantiation exception has - // occurred, status is updated - status = 5; - - } - } - - // return a new pair based on the - // current status and object holder - return new Pair<Integer, Object>(status, value); - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/utils/CommonUtils.java b/support/arara/source/src/main/java/com/github/cereda/arara/utils/CommonUtils.java deleted file mode 100644 index 0263f64eac..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/utils/CommonUtils.java +++ /dev/null @@ -1,954 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.utils; - -import com.github.cereda.arara.controller.ConfigurationController; -import com.github.cereda.arara.controller.LanguageController; -import com.github.cereda.arara.controller.SystemCallController; -import com.github.cereda.arara.model.AraraException; -import com.github.cereda.arara.model.Argument; -import com.github.cereda.arara.model.Database; -import com.github.cereda.arara.model.FileType; -import com.github.cereda.arara.model.Messages; -import java.io.File; -import java.io.IOException; -import java.nio.charset.Charset; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.MissingFormatArgumentException; -import java.util.Set; -import java.util.StringTokenizer; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.collections4.Transformer; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.filefilter.NameFileFilter; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.SystemUtils; - -/** - * Implements common utilitary methods. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class CommonUtils { - - // the application messages obtained from the - // language controller - private static final LanguageController messages = - LanguageController.getInstance(); - - /** - * Checks if the input string is equal to a valid boolean value. - * @param value The input string. - * @return A boolean value represented by the provided string. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static boolean checkBoolean(String value) throws AraraException { - List<String> yes = Arrays.asList( - new String[]{"yes", "true", "1", "on"} - ); - List<String> no = Arrays.asList( - new String[]{"no", "false", "0", "off"} - ); - if (!union(yes, no).contains(value.toLowerCase())) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_CHECKBOOLEAN_NOT_VALID_BOOLEAN, - value - ) - ); - } else { - return yes.contains(value.toLowerCase()); - } - } - - /** - * Provides a union set operation between two lists. - * @param <T> The list type. - * @param list1 The first list. - * @param list2 The second list. - * @return The union of those two lists. - */ - private static <T> List<T> union(List<T> list1, List<T> list2) { - Set<T> elements = new HashSet<T>(); - elements.addAll(list1); - elements.addAll(list2); - return new ArrayList<T>(elements); - } - - /** - * Build a system-dependant path based on the path and the file. - * @param path A string representing the path to be prepended. - * @param file A string representing the file to be appended. - * @return The full path as a string. - */ - public static String buildPath(String path, String file) { - return path.endsWith(File.separator) ? - path.concat(file) : path.concat(File.separator).concat(file); - } - - /** - * Checks if the provided string is empty. It does not handle a null value. - * @param string A string. - * @return A boolean value indicating if the string is empty. - */ - public static boolean checkEmptyString(String string) { - return "".equals(string); - } - - /** - * Removes the keyword from the beginning of the provided string. - * @param line A string to be analyzed. - * @return The provided string without the keyword. - */ - public static String removeKeyword(String line) { - if (line != null) { - Pattern pattern = Pattern.compile("^(\\s)*<arara>\\s"); - Matcher matcher = pattern.matcher(line); - if (matcher.find()) { - line = (line.substring(matcher.end(), line.length())); - } - line = line.trim(); - } - return line; - } - - /** - * Discovers the file through string reference lookup and sets the - * configuration accordingly. - * @param reference The string reference. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static void discoverFile(String reference) throws AraraException { - File file = lookupFile(reference); - if (file == null) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_DISCOVERFILE_FILE_NOT_FOUND, - reference, - getFileTypesList() - ) - ); - } - } - - /** - * Performs a file lookup based on a string reference. - * @param reference The file reference as a string. - * @return The file as result of the lookup operation. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - private static File lookupFile(String reference) throws AraraException { - @SuppressWarnings("unchecked") - List<FileType> types = (List<FileType>) ConfigurationController. - getInstance().get("execution.filetypes"); - File file = new File(reference); - String name = file.getName(); - String parent = getParentCanonicalPath(file); - String path = buildPath(parent, name); - - // direct search, so we are considering - // the reference as a complete name - for (FileType type : types) { - if (path.endsWith(".".concat(type.getExtension()))) { - file = new File(path); - if (file.exists()) { - if (file.isFile()) { - ConfigurationController. - getInstance(). - put("execution.file.pattern", - type.getPattern()); - ConfigurationController. - getInstance(). - put("execution.reference", file); - return file; - } - } - } - } - - // indirect search; in this case, we are considering - // that the file reference has an implict extension, - // so we need to add it and look again - for (FileType type : types) { - path = buildPath(parent, name.concat("."). - concat(type.getExtension())); - file = new File(path); - if (file.exists()) { - if (file.isFile()) { - ConfigurationController.getInstance(). - put("execution.file.pattern", type.getPattern()); - ConfigurationController.getInstance(). - put("execution.reference", file); - return file; - } - } - } - return null; - } - - /** - * Gets the parent canonical path of a file. - * @param file The file. - * @return The parent canonical path of a file. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static String getParentCanonicalPath(File file) - throws AraraException { - try { - String path = file.getCanonicalFile().getParent(); - return path; - } catch (IOException exception) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_GETPARENTCANONICALPATH_IO_EXCEPTION - ), - exception - ); - } - } - - /** - * Gets the canonical file from a file. - * @param file The file. - * @return The canonical file. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static File getCanonicalFile(String file) throws AraraException { - try { - return (new File(file)).getCanonicalFile(); - } catch (IOException exception) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_GETCANONICALFILE_IO_EXCEPTION - ), - exception - ); - } - } - - /** - * Checks if the provided object is from a certain class. - * @param clazz The class. - * @param object The object. - * @return A boolean value indicating if the provided object is from a - * certain class. - */ - public static boolean checkClass(Class clazz, Object object) { - return clazz.isInstance(object); - } - - /** - * Helper method to flatten a potential list of lists into a list of - * objects. - * @param list First list. - * @param flat Second list. - */ - private static void flatten(List<?> list, List<Object> flat) { - for (Object item : list) { - if (item instanceof List<?>) { - flatten((List<?>) item, flat); - } else { - flat.add(item); - } - } - } - - /** - * Flattens a potential list of lists into a list of objects. - * @param list The list to be flattened. - * @return The flattened list. - */ - public static List<Object> flatten(List<?> list) { - List<Object> result = new ArrayList<Object>(); - flatten(list, result); - return result; - } - - /** - * Gets the list of file types, in order. - * @return A string representation of the list of file types, in order. - */ - public static String getFileTypesList() { - @SuppressWarnings("unchecked") - List<FileType> types = (List<FileType>) ConfigurationController. - getInstance().get("execution.filetypes"); - return getCollectionElements(types, "[ ", " ]", " | "); - } - - /** - * Gets a string representation of a collection. - * @param collection The collection. - * @param open The opening string. - * @param close The closing string. - * @param separator The element separator. - * @return A string representation of the provided collection. - */ - public static String getCollectionElements(Collection collection, - String open, String close, String separator) { - StringBuilder builder = new StringBuilder(); - builder.append(open); - builder.append(StringUtils.join(collection, separator)); - builder.append(close); - return builder.toString(); - } - - /** - * Gets a set of strings containing unknown keys from a map and a list. It - * is a set difference from the keys in the map and the entries in the list. - * @param parameters The map of parameters. - * @param arguments The list of arguments. - * @return A set of strings representing unknown keys from a map and a list. - */ - public static Set<String> getUnknownKeys(Map<String, Object> parameters, - List<Argument> arguments) { - Collection<String> found = parameters.keySet(); - Collection<String> expected = CollectionUtils.collect( - arguments, new Transformer<Argument, String>() { - public String transform(Argument argument) { - return argument.getIdentifier(); - } - }); - Collection<String> difference = CollectionUtils. - subtract(found, expected); - return new HashSet<String>(difference); - } - - /** - * Gets the rule error header, containing the identifier and the path, if - * any. - * @return A string representation of the rule error header, containing the - * identifier and the path, if any. - */ - public static String getRuleErrorHeader() { - if ((ConfigurationController.getInstance(). - contains("execution.info.rule.id")) && - (ConfigurationController.getInstance(). - contains("execution.info.rule.path"))) { - String id = (String) ConfigurationController.getInstance(). - get("execution.info.rule.id"); - String path = (String) ConfigurationController.getInstance(). - get("execution.info.rule.path"); - return messages.getMessage( - Messages.ERROR_RULE_IDENTIFIER_AND_PATH, - id, - path - ).concat(" "); - } else { - return ""; - } - } - - /** - * Trims spaces from every string of a list of strings. - * @param input The list of strings. - * @return A new list of strings, with each element trimmed. - */ - public static List<String> trimSpaces(List<String> input) { - Collection<String> result = CollectionUtils.collect( - input, new Transformer<String, String>() { - public String transform(String input) { - return input.trim(); - } - }); - return new ArrayList<String>(result); - } - - /** - * Gets a human readable representation of a file size. - * @param file The file. - * @return A string representation of the file size. - */ - public static String calculateFileSize(File file) { - return FileUtils.byteCountToDisplaySize(file.length()); - } - - /** - * Gets the date the provided file was last modified. - * @param file The file. - * @return A string representation of the date the provided file was last - * modified. - */ - public static String getLastModifiedInformation(File file) { - SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); - return format.format(file.lastModified()); - } - - /** - * Gets a list of all rule paths. - * @return A list of all rule paths. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static List<String> getAllRulePaths() throws AraraException { - @SuppressWarnings("unchecked") - List<String> paths = (List<String>) ConfigurationController. - getInstance().get("execution.rule.paths"); - List<String> result = new ArrayList<String>(); - for (String path : paths) { - File location = new File(InterpreterUtils.construct(path, "quack")); - result.add(getParentCanonicalPath(location)); - } - return result; - } - - /** - * Gets the reference of the current file in execution. Note that this - * method might return a value different than the main file provided in - * the command line. - * @return A reference of the current file in execution. Might be different - * than the main file provided in the command line. - */ - private static File getCurrentReference() { - return (File) ConfigurationController.getInstance(). - get("execution.file"); - } - - /** - * Calculates the CRC32 checksum of the provided file. - * @param file The file. - * @return A string containing the CRC32 checksum of the provided file. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static String calculateHash(File file) throws AraraException { - try { - long result = FileUtils.checksumCRC32(file); - return String.format("%08x", result); - } catch (IOException exception) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_CALCULATEHASH_IO_EXCEPTION - ), - exception - ); - } - } - - /** - * Gets the file type of a file. - * @param file The file. - * @return The corresponding file type. - */ - public static String getFiletype(File file) { - return getFiletype(file.getName()); - } - - /** - * Gets the file type of a string representing the file. - * @param name A string representing the file. - * @return The corresponding file type. - */ - public static String getFiletype(String name) { - name = name.lastIndexOf(".") != -1 ? - name.substring(name.lastIndexOf(".") + 1, name.length()) : ""; - return name; - } - - /** - * Gets the base name of a file. - * @param file The file. - * @return The corresponding base name. - */ - public static String getBasename(File file) { - return getBasename(file.getName()); - } - - /** - * Gets the base name of a string representing the file. - * @param name A string representing the file. - * @return The corresponding base name. - */ - public static String getBasename(String name) { - int index = name.lastIndexOf(".") != -1 ? - name.lastIndexOf(".") : name.length(); - return name.substring(0, index); - } - - /** - * Encloses the provided object in double quotes. - * @param object The object. - * @return A string representation of the provided object enclosed in double - * quotes. - */ - public static String addQuotes(Object object) { - return "\"".concat(String.valueOf(object)).concat("\""); - } - - /** - * Generates a string based on a list of objects, separating each one of - * them by one space. - * @param objects A list of objects. - * @return A string based on the list of objects, separating each one of - * them by one space. Empty values are not considered. - */ - public static String generateString(Object... objects) { - List<String> values = new ArrayList<String>(); - for (Object object : objects) { - if (!CommonUtils.checkEmptyString(String.valueOf(object))) { - values.add(String.valueOf(object)); - } - } - return StringUtils.join(values, " "); - } - - /** - * Checks if a file exists. - * @param file The file. - * @return A boolean value indicating if the file exists. - */ - public static boolean exists(File file) { - return file.exists(); - } - - /** - * Checks if a file exists based on its extension. - * @param extension The extension. - * @return A boolean value indicating if the file exists. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static boolean exists(String extension) throws AraraException { - File file = new File(getPath(extension)); - return file.exists(); - } - - /** - * Checks if a file has changed since the last verification. - * @param file The file. - * @return A boolean value indicating if the file has changed since the last - * verification. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static boolean hasChanged(File file) throws AraraException { - Database database = DatabaseUtils.load(); - HashMap<String, String> map = database.getMap(); - String path = getCanonicalPath(file); - if (!file.exists()) { - if (map.containsKey(path)) { - map.remove(path); - database.setMap(map); - DatabaseUtils.save(database); - return true; - } else { - return false; - } - } else { - String hash = calculateHash(file); - if (map.containsKey(path)) { - String value = map.get(path); - if (hash.equals(value)) { - return false; - } else { - map.put(path, hash); - database.setMap(map); - DatabaseUtils.save(database); - return true; - } - } else { - map.put(path, hash); - database.setMap(map); - DatabaseUtils.save(database); - return true; - } - } - } - - /** - * Checks if the file has changed since the last verification based on the - * provided extension. - * @param extension The provided extension. - * @return A boolean value indicating if the file has changed since the last - * verification. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static boolean hasChanged(String extension) throws AraraException { - File file = new File(getPath(extension)); - return hasChanged(file); - } - - /** - * Gets the full file path based on the provided extension. - * @param extension The extension. - * @return A string containing the full file path. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - private static String getPath(String extension) throws AraraException { - String name = getBasename(getCurrentReference()); - String path = getParentCanonicalPath(getCurrentReference()); - name = name.concat(".").concat(extension); - return buildPath(path, name); - } - - /** - * Gets the canonical path from the provided file. - * @param file The file. - * @return The canonical path from the provided file. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static String getCanonicalPath(File file) throws AraraException { - try { - return file.getCanonicalPath(); - } catch (IOException exception) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_GETCANONICALPATH_IO_EXCEPTION - ), - exception - ); - } - } - - /** - * Checks if the file based on the provided extension contains the provided - * regex. - * @param extension The file extension. - * @param regex The regex. - * @return A boolean value indicating if the file contains the provided - * regex. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static boolean checkRegex(String extension, String regex) - throws AraraException { - File file = new File(getPath(extension)); - return checkRegex(file, regex); - } - - /** - * Checks if the file contains the provided regex. - * @param file The file. - * @param regex The regex. - * @return A boolean value indicating if the file contains the provided - * regex. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static boolean checkRegex(File file, String regex) - throws AraraException { - Charset charset = (Charset) ConfigurationController. - getInstance().get("directives.charset"); - try { - String text = FileUtils.readFileToString(file, charset.name()); - Pattern pattern = Pattern.compile(regex); - Matcher matcher = pattern.matcher(text); - return matcher.find(); - } catch (IOException exception) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_CHECKREGEX_IO_EXCEPTION, - file.getName() - ), - exception - ); - } - } - - /** - * Replicates a string pattern based on a list of objects, generating a list - * as result. - * @param pattern The string pattern. - * @param values The list of objects to be merged with the pattern. - * @return A list containing the string pattern replicated to each object - * from the list. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static List<Object> replicateList(String pattern, - List<Object> values) throws AraraException { - List<Object> result = new ArrayList<Object>(); - for (Object value : values) { - try { - result.add(String.format(pattern, value)); - } catch (MissingFormatArgumentException exception) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_REPLICATELIST_MISSING_FORMAT_ARGUMENTS_EXCEPTION - ), - exception - ); - } - } - return result; - } - - /** - * Checks if the provided operating system string holds according to the - * underlying operating system. - * @param value A string representing an operating system. - * @return A boolean value indicating if the provided string refers to the - * underlying operating system. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static boolean checkOS(String value) throws AraraException { - Map<String, Boolean> values = new HashMap<String, Boolean>(); - values.put("windows", SystemUtils.IS_OS_WINDOWS); - values.put("linux", SystemUtils.IS_OS_LINUX); - values.put("mac", SystemUtils.IS_OS_MAC_OSX); - values.put("unix", SystemUtils.IS_OS_UNIX); - values.put("aix", SystemUtils.IS_OS_AIX); - values.put("irix", SystemUtils.IS_OS_IRIX); - values.put("os2", SystemUtils.IS_OS_OS2); - values.put("solaris", SystemUtils.IS_OS_SOLARIS); - values.put("cygwin", (Boolean) SystemCallController. - getInstance().get("cygwin")); - if (!values.containsKey(value.toLowerCase())) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_CHECKOS_INVALID_OPERATING_SYSTEM, - value - ) - ); - } - return values.get(value.toLowerCase()); - } - - /** - * Returns the exit status of the application. - * @return An integer representing the exit status of the application. - */ - public static int getExitStatus() { - return (Integer) ConfigurationController. - getInstance().get("execution.status"); - } - - /** - * Gets the system property according to the provided key, or resort to the - * fallback value if an exception is thrown or if the key is invalid. - * @param key The system property key. - * @param fallback The fallback value. - * @return A string containing the system property value or the fallback. - */ - public static String getSystemProperty(String key, String fallback) { - try { - String result = System.getProperty(key, fallback); - return result.equals("") ? fallback : result; - } catch (Exception exception) { - return fallback; - } - } - - /** - * Gets the preamble content, converting a single string into a list of - * strings, based on new lines. - * @return A list of strings representing the preamble content. - */ - public static List<String> getPreambleContent() { - if (((Boolean) ConfigurationController. - getInstance().get("execution.preamble.active")) == true) { - return new ArrayList<String>( - Arrays.asList( - ((String) ConfigurationController.getInstance(). - get("execution.preamble.content") - ).split("\n")) - ); - } - else { - return new ArrayList<String>(); - } - } - - /** - * Generates a list of filenames from the provided command based on a list - * of extensions for each underlying operating system. - * @param command A string representing the command. - * @return A list of filenames. - */ - private static List<String> appendExtensions(String command) { - - // the resulting list, to hold the - // filenames generated from the - // provided command - List<String> result = new ArrayList<String>(); - - // list of extensions, specific for - // each operating system (in fact, it - // is more Windows specific) - List<String> extensions; - - // the application is running on - // Windows, so let's look for the - // following extensions in order - if (SystemUtils.IS_OS_WINDOWS) { - - // this list is actually a sublist from - // the original Windows PATHEXT environment - // variable which holds the list of executable - // extensions that Windows supports - extensions = Arrays.asList(".com", ".exe", ".bat", ".cmd"); - } - else { - - // no Windows, so the default - // extension will be just an - // empty string - extensions = Arrays.asList(""); - } - - // for each and every extension in the - // list, let's build the corresponding - // filename and add to the result - for (String extension : extensions) { - result.add(command.concat(extension)); - } - - // return the resulting list - // holding the filenames - return result; - } - - /** - * Checks if the provided command name is reachable from the system path. - * @param command A string representing the command. - * @return A logic value. - */ - public static boolean isOnPath(String command) { - try { - - // first and foremost, let's build the list - // of filenames based on the underlying - // operating system - List<String> filenames = appendExtensions(command); - - // break the path into several parts - // based on the path separator symbol - StringTokenizer tokenizer = new StringTokenizer( - System.getenv("PATH"), - File.pathSeparator - ); - - // iterate through every part of the - // path looking for each filename - while (tokenizer.hasMoreTokens()) { - - // if the search does not return an empty - // list, one of the filenames got a match, - // and the command is available somewhere - // in the system path - if ( - !FileUtils.listFiles( - new File(tokenizer.nextToken()), - new NameFileFilter(filenames), - null - ).isEmpty()) { - - // command is found somewhere, - // so it is on path - return true; - } - } - - // nothing was found, - // command is not on path - return false; - } - catch (Exception exception) { - - // an exception was raised, simply - // return and forget about it - return false; - } - } - - /** - * Gets the full base name of a file. - * @param file The file. - * @return The corresponding full base name. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static String getFullBasename(File file) throws AraraException { - - // if the provided file does not contain a - // file separator, fallback to the usual - // base name lookup - if (!file.toString().contains(File.separator)) { - return getBasename(file); - } - else { - - // we need to get the parent file, get the - // canonical path and build the corresponding - // full base name path - File parent = file.getParentFile(); - String path = getCanonicalPath(parent == null ? file : parent); - return buildPath(path, getBasename(file)); - } - } - - /** - * Checks whether a directory is under a root directory. - * @param f1 Directory to be inspected. - * @param f2 Root directory. - * @return Logical value indicating whether the directoy is under root. - * @throws AraraException There was a problem with path retrieval. - */ - public static boolean isSubDirectory(File f1, File f2) - throws AraraException { - if (f1.isDirectory()) { - return getCanonicalPath(f1). - startsWith( - getParentCanonicalPath(f2).concat(File.separator) - ); - } - else { - throw new AraraException( - messages.getMessage( - Messages.ERROR_ISSUBDIRECTORY_NOT_A_DIRECTORY, - f1.getName() - ) - ); - } - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/utils/ConfigurationUtils.java b/support/arara/source/src/main/java/com/github/cereda/arara/utils/ConfigurationUtils.java deleted file mode 100644 index 7336110ebe..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/utils/ConfigurationUtils.java +++ /dev/null @@ -1,239 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.utils; - -import com.github.cereda.arara.Arara; -import com.github.cereda.arara.controller.LanguageController; -import com.github.cereda.arara.model.AraraException; -import com.github.cereda.arara.model.FileType; -import com.github.cereda.arara.model.FileTypeResource; -import com.github.cereda.arara.model.Messages; -import com.github.cereda.arara.model.Resource; -import java.io.File; -import java.io.FileReader; -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.collections4.Predicate; -import org.apache.commons.lang.SystemUtils; -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; - -/** - * Implements configuration utilitary methods. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class ConfigurationUtils { - - // the application messages obtained from the - // language controller - private static final LanguageController messages = - LanguageController.getInstance(); - - /** - * Gets the list of default file types provided by nightingale, in order. - * @return The list of default file types, in order. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static List<FileType> getDefaultFileTypes() throws AraraException { - return Arrays.asList( - new FileType("tex"), - new FileType("dtx"), - new FileType("ltx"), - new FileType("drv"), - new FileType("ins") - ); - } - - /** - * Gets the configuration file located at the user home directory, if any. - * @return The file reference to the external configuration, if any. - */ - public static File getConfigFile() { - List<String> names = Arrays.asList( - ".araraconfig.yaml", - "araraconfig.yaml", - ".arararc.yaml", - "arararc.yaml" - ); - - // look for configuration files in the user's working directory first - for (String name : names) { - String path = CommonUtils.buildPath(SystemUtils.USER_DIR, name); - File file = new File(path); - if (file.exists()) { - return file; - } - } - - // if no configuration files are found in the user's working directory, - // try to look up in a global directory, that is, the user home - for (String name : names) { - String path = CommonUtils.buildPath(SystemUtils.USER_HOME, name); - File file = new File(path); - if (file.exists()) { - return file; - } - } - return null; - } - - /** - * Validates the configuration file. - * @param file The configuration file. - * @return The configuration file as a resource. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static Resource validateConfiguration(File file) - throws AraraException { - - Representer representer = new Representer(); - representer.addClassTag(Resource.class, new Tag("!config")); - Yaml yaml = new Yaml(new Constructor(Resource.class), representer); - try { - Resource resource = yaml.loadAs(new FileReader(file), - Resource.class); - if (resource.getFiletypes() != null) { - List<FileTypeResource> filetypes = resource.getFiletypes(); - if (CollectionUtils.exists(filetypes, - new Predicate<FileTypeResource>() { - public boolean evaluate(FileTypeResource filetype) { - return (filetype.getExtension() == null); - } - })) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_CONFIGURATION_FILETYPE_MISSING_EXTENSION - ) - ); - } - } - return resource; - } catch (MarkedYAMLException yamlException) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_CONFIGURATION_INVALID_YAML - ), - yamlException - ); - } catch (Exception exception) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_CONFIGURATION_GENERIC_ERROR - ) - ); - } - } - - /** - * Normalize a list of rule paths, removing all duplicates. - * @param paths The list of rule paths. - * @return A list of normalized paths, without duplicates. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static List<String> normalizePaths(List<String> paths) - throws AraraException { - paths.add(CommonUtils.buildPath(getApplicationPath(), "rules")); - Set<String> set = new LinkedHashSet<String>(paths); - List<String> result = new ArrayList<String>(set); - return result; - } - - /** - * Normalize a list of file types, removing all duplicates. - * @param types The list of file types. - * @return A list of normalized file types, without duplicates. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static List<FileType> normalizeFileTypes(List<FileType> types) - throws AraraException { - types.addAll(getDefaultFileTypes()); - Set<FileType> set = new LinkedHashSet<FileType>(types); - List<FileType> result = new ArrayList<FileType>(set); - return result; - } - - /** - * Gets the canonical absolute application path. - * @return The string representation of the canonical absolute application - * path. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static String getApplicationPath() throws AraraException { - try { - String path = Arara.class.getProtectionDomain(). - getCodeSource().getLocation().getPath(); - path = URLDecoder.decode(path, "UTF-8"); - path = new File(path).getParentFile().getPath(); - return path; - } catch (UnsupportedEncodingException exception) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_GETAPPLICATIONPATH_ENCODING_EXCEPTION - ), - exception - ); - } - } - - /** - * Cleans the file name to avoid invalid entries. - * @param name The file name. - * @return A cleaned file name. - */ - public static String cleanFileName(String name) { - String result = (new File(name)).getName().trim(); - if (CommonUtils.checkEmptyString(result)) { - return "arara"; - } else { - return result.trim(); - } - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/utils/DatabaseUtils.java b/support/arara/source/src/main/java/com/github/cereda/arara/utils/DatabaseUtils.java deleted file mode 100644 index 3a9b4eeea5..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/utils/DatabaseUtils.java +++ /dev/null @@ -1,140 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.utils; - -import com.github.cereda.arara.controller.ConfigurationController; -import com.github.cereda.arara.controller.LanguageController; -import com.github.cereda.arara.model.AraraException; -import com.github.cereda.arara.model.Database; -import com.github.cereda.arara.model.Messages; -import java.io.File; -import org.simpleframework.xml.Serializer; -import org.simpleframework.xml.core.Persister; - -/** - * Implements database utilitary methods. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class DatabaseUtils { - - // the application messages obtained from the - // language controller - private static final LanguageController messages = - LanguageController.getInstance(); - - /** - * Loads the XML file representing the database. - * @return The database object. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static Database load() throws AraraException { - if (!exists()) { - return new Database(); - } else { - File file = new File(getPath()); - try { - Serializer serializer = new Persister(); - Database database = serializer.read(Database.class, file); - return database; - } catch (Exception exception) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_LOAD_COULD_NOT_LOAD_XML, - file.getName() - ), - exception - ); - } - } - } - - /** - * Saves the database on a XML file. - * @param database The database object. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static void save(Database database) throws AraraException { - File file = new File(getPath()); - try { - Serializer serializer = new Persister(); - serializer.write(database, file); - } catch (Exception exception) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_SAVE_COULD_NOT_SAVE_XML, - file.getName() - ), - exception - ); - } - } - - /** - * Checks if the XML file representing the database exists. - * @return A boolean value indicating if the XML file exists. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - private static boolean exists() throws AraraException { - File file = new File(getPath()); - return file.exists(); - } - - /** - * Gets the path to the XML file representing the database. - * @return A string representing the path to the XML file. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - private static String getPath() throws AraraException { - String name = ((String) ConfigurationController. - getInstance().get("execution.database.name")).concat(".xml"); - String path = CommonUtils.getParentCanonicalPath(getReference()); - return CommonUtils.buildPath(path, name); - } - - /** - * Gets the main file reference. - * @return The main file reference. - */ - private static File getReference() { - return (File) ConfigurationController. - getInstance().get("execution.reference"); - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/utils/DirectiveAssembler.java b/support/arara/source/src/main/java/com/github/cereda/arara/utils/DirectiveAssembler.java deleted file mode 100644 index 6f6f676ab5..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/utils/DirectiveAssembler.java +++ /dev/null @@ -1,106 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.utils; - -import java.util.ArrayList; -import java.util.List; - -/** - * Implements a directive assembler in order to help build a directive from a - * list of strings. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class DirectiveAssembler { - - // this variable holds a list of - // line numbers indicating which - // lines composed the resulting - // potential directive - private final List<Integer> lineNumbers; - - // this variable holds the textual - // representation of the directive - private String text; - - /** - * Constructor. - */ - public DirectiveAssembler() { - lineNumbers = new ArrayList<Integer>(); - text = ""; - } - - /** - * Checks if an append operation is allowed. - * @return A boolean value indicating if an append operation is allowed. - */ - public boolean isAppendAllowed() { - return !lineNumbers.isEmpty(); - } - - /** - * Adds a line number to the assembler. - * @param line An integer representing the line number. - */ - public void addLineNumber(int line) { - lineNumbers.add(line); - } - - /** - * Appends the provided line to the assembler text. - * @param line The provided line. - */ - public void appendLine(String line) { - text = text.concat(" ").concat(line.trim()); - } - - /** - * Gets the list of line numbers. - * @return The list of line numbers. - */ - public List<Integer> getLineNumbers() { - return lineNumbers; - } - - /** - * Gets the text. - * @return The assembler text, properly trimmed. - */ - public String getText() { - return text.trim(); - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/utils/DirectiveResolver.java b/support/arara/source/src/main/java/com/github/cereda/arara/utils/DirectiveResolver.java deleted file mode 100644 index b0a1af850b..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/utils/DirectiveResolver.java +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.utils; - -import org.yaml.snakeyaml.nodes.Tag; -import org.yaml.snakeyaml.resolver.Resolver; - -/** - * This class implements a directive resolver. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class DirectiveResolver extends Resolver { - - /** - * Adds implicit resolvers to the YAML model. For arara, I disabled - * boolean and numeric values to be automatically parsed. They still can - * be used through an explicit conversion in the rule context. - */ - @Override - protected void addImplicitResolvers() { - addImplicitResolver(Tag.MERGE, MERGE, "<"); - addImplicitResolver(Tag.NULL, NULL, "~nN\0"); - addImplicitResolver(Tag.NULL, EMPTY, null); - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/utils/DirectiveUtils.java b/support/arara/source/src/main/java/com/github/cereda/arara/utils/DirectiveUtils.java deleted file mode 100644 index 6ea0404f72..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/utils/DirectiveUtils.java +++ /dev/null @@ -1,438 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.utils; - -import com.github.cereda.arara.controller.ConfigurationController; -import com.github.cereda.arara.controller.LanguageController; -import com.github.cereda.arara.model.AraraException; -import com.github.cereda.arara.model.Conditional; -import com.github.cereda.arara.model.Directive; -import com.github.cereda.arara.model.Messages; -import com.github.cereda.arara.model.Pair; -import java.io.File; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.yaml.snakeyaml.DumperOptions; -import org.yaml.snakeyaml.Yaml; -import org.yaml.snakeyaml.constructor.Constructor; -import org.yaml.snakeyaml.error.MarkedYAMLException; -import org.yaml.snakeyaml.representer.Representer; - -/** - * Implements directive utilitary methods. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class DirectiveUtils { - - // the application messages obtained from the - // language controller - private static final LanguageController messages = - LanguageController.getInstance(); - - // get the logger context from a factory - private static final Logger logger = - LoggerFactory.getLogger(DirectiveUtils.class); - - /** - * Extracts a list of directives from a list of strings. - * @param lines List of strings. - * @return A list of directives. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static List<Directive> extractDirectives(List<String> lines) - throws AraraException { - - boolean header = (Boolean) ConfigurationController. - getInstance().get("execution.header"); - String regex = (String) ConfigurationController. - getInstance().get("execution.file.pattern"); - Pattern linecheck = Pattern.compile(regex); - regex = regex.concat((String) ConfigurationController. - getInstance().get("application.pattern")); - Pattern pattern = Pattern.compile(regex); - List<Pair<Integer, String>> pairs = - new ArrayList<Pair<Integer, String>>(); - Matcher matcher; - for (int i = 0; i < lines.size(); i++) { - matcher = pattern.matcher(lines.get(i)); - if (matcher.find()) { - String line = lines.get(i).substring( - matcher.end(), - lines.get(i).length() - ); - Pair<Integer, String> pair = - new Pair<Integer, String>(i + 1, line); - pairs.add(pair); - - logger.info( - messages.getMessage( - Messages.LOG_INFO_POTENTIAL_PATTERN_FOUND, - (i + 1), - line.trim() - ) - ); - } - else { - if (header) { - if (!checkLinePattern(linecheck, lines.get(i))) { - break; - } - } - } - } - - if (pairs.isEmpty()) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_VALIDATE_NO_DIRECTIVES_FOUND - ) - ); - } - - List<DirectiveAssembler> assemblers - = new ArrayList<DirectiveAssembler>(); - DirectiveAssembler assembler = new DirectiveAssembler(); - regex = (String) ConfigurationController.getInstance(). - get("directives.linebreak.pattern"); - pattern = Pattern.compile(regex); - for (Pair<Integer, String> pair : pairs) { - matcher = pattern.matcher(pair.getSecondElement()); - if (matcher.find()) { - if (!assembler.isAppendAllowed()) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_VALIDATE_ORPHAN_LINEBREAK, - pair.getFirstElement() - ) - ); - } else { - assembler.addLineNumber(pair.getFirstElement()); - assembler.appendLine(matcher.group(1)); - } - } else { - if (assembler.isAppendAllowed()) { - assemblers.add(assembler); - } - assembler = new DirectiveAssembler(); - assembler.addLineNumber(pair.getFirstElement()); - assembler.appendLine(pair.getSecondElement()); - } - } - if (assembler.isAppendAllowed()) { - assemblers.add(assembler); - } - - List<Directive> directives = new ArrayList<Directive>(); - for (DirectiveAssembler current : assemblers) { - directives.add(generateDirective(current)); - } - return directives; - - } - - /** - * Generates a directive from a directive assembler. - * @param assembler The directive assembler. - * @return The corresponding directive. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static Directive generateDirective(DirectiveAssembler assembler) - throws AraraException { - String regex = (String) ConfigurationController.getInstance(). - get("directives.pattern"); - Pattern pattern = Pattern.compile(regex); - Matcher matcher = pattern.matcher(assembler.getText()); - if (matcher.find()) { - Directive directive = new Directive(); - directive.setIdentifier(matcher.group(1)); - directive.setParameters( - getParameters(matcher.group(3), assembler.getLineNumbers()) - ); - Conditional conditional = new Conditional(); - conditional.setType(getType(matcher.group(5))); - conditional.setCondition(getCondition(matcher.group(6))); - directive.setConditional(conditional); - directive.setLineNumbers(assembler.getLineNumbers()); - - logger.info( - messages.getMessage( - Messages.LOG_INFO_POTENTIAL_DIRECTIVE_FOUND, - directive - ) - ); - - return directive; - } else { - throw new AraraException( - messages.getMessage( - Messages.ERROR_VALIDATE_INVALID_DIRECTIVE_FORMAT, - CommonUtils.getCollectionElements( - assembler.getLineNumbers(), - "(", - ")", - ", " - ) - ) - ); - } - } - - /** - * Gets the conditional type based on the input string. - * @param text The input string. - * @return The conditional type. - */ - private static Conditional.ConditionalType getType(String text) { - if (text == null) { - return Conditional.ConditionalType.NONE; - } else { - if (text.equals("if")) { - return Conditional.ConditionalType.IF; - } else { - if (text.equals("while")) { - return Conditional.ConditionalType.WHILE; - } else { - if (text.equals("until")) { - return Conditional.ConditionalType.UNTIL; - } else { - return Conditional.ConditionalType.UNLESS; - } - } - } - } - } - - /** - * Gets the condition from the input string. - * @param text The input string. - * @return A string representing the condition. - */ - private static String getCondition(String text) { - return text == null ? "" : text; - } - - /** - * Gets the parameters from the input string. - * @param text The input string. - * @param numbers The list of line numbers. - * @return A map containing the directive parameters. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - private static Map<String, Object> getParameters(String text, - List<Integer> numbers) throws AraraException { - - if (text == null) { - return new HashMap<String, Object>(); - } - - Yaml yaml = new Yaml( - new Constructor(), - new Representer(), - new DumperOptions(), - new DirectiveResolver() - ); - try { - @SuppressWarnings("unchecked") - HashMap<String, Object> map = yaml.loadAs(text, HashMap.class); - return map; - } catch (MarkedYAMLException exception) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_VALIDATE_YAML_EXCEPTION, - CommonUtils.getCollectionElements( - numbers, - "(", - ")", - ", " - ) - ), - exception - ); - } - } - - /** - * Validates the list of directives, returning a new list. - * @param directives The list of directives. - * @return A new list of directives. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static List<Directive> validate(List<Directive> directives) - throws AraraException { - - ArrayList<Directive> result = new ArrayList<Directive>(); - for (Directive directive : directives) { - Map<String, Object> parameters = directive.getParameters(); - - if (parameters.containsKey("file")) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_VALIDATE_FILE_IS_RESERVED, - CommonUtils.getCollectionElements( - directive.getLineNumbers(), - "(", - ")", - ", " - ) - ) - ); - } - - if (parameters.containsKey("reference")) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_VALIDATE_REFERENCE_IS_RESERVED, - CommonUtils.getCollectionElements( - directive.getLineNumbers(), - "(", - ")", - ", " - ) - ) - ); - } - - if (parameters.containsKey("files")) { - - Object holder = parameters.get("files"); - if (holder instanceof List) { - @SuppressWarnings("unchecked") - List<Object> files = (List<Object>) holder; - parameters.remove("files"); - if (files.isEmpty()) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_VALIDATE_EMPTY_FILES_LIST, - CommonUtils.getCollectionElements( - directive.getLineNumbers(), - "(", - ")", - ", " - ) - ) - ); - } - for (Object file : files) { - Map<String, Object> map = new HashMap<String, Object>(); - for (String key : parameters.keySet()) { - map.put(key, parameters.get(key)); - } - File representation = CommonUtils. - getCanonicalFile(String.valueOf(file)); - - map.put("reference", representation); - map.put("file", representation.getName()); - - Directive addition = new Directive(); - Conditional conditional = new Conditional(); - conditional.setCondition(directive.getConditional(). - getCondition() - ); - conditional.setType(directive.getConditional(). - getType() - ); - addition.setIdentifier(directive.getIdentifier()); - addition.setConditional(conditional); - addition.setParameters(map); - addition.setLineNumbers(directive.getLineNumbers()); - result.add(addition); - } - } else { - throw new AraraException( - messages.getMessage( - Messages.ERROR_VALIDATE_FILES_IS_NOT_A_LIST, - CommonUtils.getCollectionElements( - directive.getLineNumbers(), - "(", - ")", - ", " - ) - ) - ); - } - } else { - File representation = (File) ConfigurationController. - getInstance().get("execution.reference"); - parameters.put("file", representation.getName()); - parameters.put("reference", representation); - directive.setParameters(parameters); - result.add(directive); - } - } - - logger.info( - messages.getMessage( - Messages.LOG_INFO_VALIDATED_DIRECTIVES - ) - ); - logger.info(DisplayUtils.displayOutputSeparator( - messages.getMessage( - Messages.LOG_INFO_DIRECTIVES_BLOCK - ) - )); - for (Directive directive : result) { - logger.info(directive.toString()); - } - - logger.info(DisplayUtils.displaySeparator()); - - return result; - } - - /** - * Checks if the provided line contains the corresponding pattern, based on - * the file type, or an empty line. - * @param pattern Pattern to be matched, based on the file type. - * @param line Provided line. - * @return Logical value indicating if the provided line contains the - * corresponding pattern, based on the file type, or an empty line. - */ - private static boolean checkLinePattern(Pattern pattern, String line) { - return CommonUtils.checkEmptyString(line.trim()) || - pattern.matcher(line).find(); - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/utils/DisplayUtils.java b/support/arara/source/src/main/java/com/github/cereda/arara/utils/DisplayUtils.java deleted file mode 100644 index 75cda6f99a..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/utils/DisplayUtils.java +++ /dev/null @@ -1,502 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.utils; - -import com.github.cereda.arara.controller.ConfigurationController; -import com.github.cereda.arara.controller.LanguageController; -import com.github.cereda.arara.model.AraraException; -import com.github.cereda.arara.model.Conditional; -import com.github.cereda.arara.model.Messages; -import com.github.cereda.arara.model.StopWatch; -import java.io.File; -import java.util.List; -import org.apache.commons.lang.StringUtils; -import org.apache.commons.lang.WordUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Implements display utilitary methods. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class DisplayUtils { - - // the application messages obtained from the - // language controller - private static final LanguageController messages = - LanguageController.getInstance(); - - // get the logger context from a factory - private static final Logger logger = - LoggerFactory.getLogger(DisplayUtils.class); - - /** - * Displays the short version of the current entry in the terminal. - * @param name Rule name. - * @param task Task name. - */ - private static void buildShortEntry(String name, String task) { - int width = getWidth(); - int result = getLongestMatch(); - if (result >= width) { - result = 10; - } - int space = width - result - 1; - StringBuilder entry = new StringBuilder(); - entry.append("(").append(name).append(") "); - entry.append(task).append(" "); - String line = StringUtils.abbreviate(entry.toString(), space - 4); - entry = new StringBuilder(); - entry.append(StringUtils.rightPad(line, space, ".")).append(" "); - System.out.print(entry); - } - - /** - * Displays the short version of the current entry result in the terminal. - * @param value The boolean value to be displayed. - */ - private static void buildShortResult(boolean value) { - int result = getLongestMatch(); - System.out.println(StringUtils.leftPad(getResult(value), result)); - } - - /** - * Displays the current entry result in the terminal. - * @param value The boolean value to be displayed. - */ - public static void printEntryResult(boolean value) { - ConfigurationController.getInstance().put("display.line", false); - ConfigurationController.getInstance().put("display.result", true); - ConfigurationController.getInstance() - .put("execution.status", value ? 0 : 1); - logger.info( - messages.getMessage( - Messages.LOG_INFO_TASK_RESULT - ).concat(" ").concat(getResult(value)) - ); - if (!isDryRunMode()) { - if (!isVerboseMode()) { - buildShortResult(value); - } else { - buildLongResult(value); - } - } - } - - /** - * Displays a long version of the current entry result in the terminal. - * @param value The boolean value to be displayed - */ - private static void buildLongResult(boolean value) { - int width = getWidth(); - System.out.println("\n".concat(StringUtils.leftPad( - " ".concat(getResult(value)), width, "-" - ))); - } - - /** - * Displays the current entry in the terminal. - * @param name The rule name. - * @param task The task name. - */ - public static void printEntry(String name, String task) { - logger.info( - messages.getMessage( - Messages.LOG_INFO_INTERPRET_TASK, - task, - name - ) - ); - ConfigurationController.getInstance().put("display.line", true); - ConfigurationController.getInstance().put("display.result", false); - if (!isDryRunMode()) { - if (!isVerboseMode()) { - buildShortEntry(name, task); - } else { - buildLongEntry(name, task); - } - } else { - buildDryRunEntry(name, task); - } - } - - /** - * Gets the length of the longest result match. - * @return An integer value representing the longest result match. - */ - private static int getLongestMatch() { - String[] values = new String[]{ - messages.getMessage(Messages.INFO_LABEL_ON_SUCCESS), - messages.getMessage(Messages.INFO_LABEL_ON_FAILURE), - messages.getMessage(Messages.INFO_LABEL_ON_ERROR) - }; - int max = values[0].length(); - for (String value : values) { - if (max < value.length()) { - max = value.length(); - } - } - return max; - } - - /** - * Displays a long version of the current entry in the terminal. - * @param name Rule name. - * @param task Task name. - */ - private static void buildLongEntry(String name, String task) { - if (ConfigurationController.getInstance().contains("display.rolling")) { - addNewLine(); - } else { - ConfigurationController.getInstance().put("display.rolling", true); - } - StringBuilder line = new StringBuilder(); - line.append("(").append(name).append(") "); - line.append(task); - System.out.println(displaySeparator()); - System.out.println(StringUtils.abbreviate(line.toString(), getWidth())); - System.out.println(displaySeparator()); - } - - /** - * Displays a dry-run version of the current entry in the terminal. - * @param name The rule name. - * @param task The task name. - */ - private static void buildDryRunEntry(String name, String task) { - if (ConfigurationController.getInstance().contains("display.rolling")) { - addNewLine(); - } else { - ConfigurationController.getInstance().put("display.rolling", true); - } - StringBuilder line = new StringBuilder(); - line.append("[DR] (").append(name).append(") "); - line.append(task); - System.out.println(StringUtils.abbreviate(line.toString(), getWidth())); - System.out.println(displaySeparator()); - } - - /** - * Displays the exception in the terminal. - * @param exception The exception object. - */ - public static void printException(AraraException exception) { - ConfigurationController.getInstance().put("display.exception", true); - ConfigurationController.getInstance().put("execution.status", 2); - boolean display = false; - if (ConfigurationController.getInstance().contains("display.line")) { - display = (Boolean) ConfigurationController. - getInstance().get("display.line"); - } - if (ConfigurationController.getInstance().contains("display.result")) { - if (((Boolean) ConfigurationController. - getInstance().get("display.result")) == true) { - addNewLine(); - } - } - if (display) { - if (!isDryRunMode()) { - if (!isVerboseMode()) { - buildShortError(); - } else { - buildLongError(); - } - addNewLine(); - } - } - String text = exception.hasException() ? - exception.getMessage().concat(" ").concat( - messages.getMessage( - Messages.INFO_DISPLAY_EXCEPTION_MORE_DETAILS - ) - ) - : exception.getMessage(); - logger.error(text); - wrapText(text); - if (exception.hasException()) { - addNewLine(); - displayDetailsLine(); - String details = exception.getException().getMessage(); - logger.error(details); - wrapText(details); - } - } - - /** - * Gets the string representation of the provided boolean value. - * @param value The boolean value. - * @return The string representation. - */ - private static String getResult(boolean value) { - return (value == true ? - messages.getMessage( - Messages.INFO_LABEL_ON_SUCCESS - ) - : messages.getMessage(Messages.INFO_LABEL_ON_FAILURE)); - } - - /** - * Displays the short version of an error in the terminal. - */ - private static void buildShortError() { - int result = getLongestMatch(); - System.out.println(StringUtils.leftPad( - messages.getMessage( - Messages.INFO_LABEL_ON_ERROR - ), - result - )); - } - - /** - * Displays the long version of an error in the terminal. - */ - private static void buildLongError() { - String line = StringUtils.leftPad( - " ".concat(messages.getMessage(Messages.INFO_LABEL_ON_ERROR)), - getWidth(), "-"); - System.out.println(line); - } - - /** - * Gets the default terminal width defined in the settings. - * @return An integer representing the terminal width. - */ - private static int getWidth() { - return (Integer) ConfigurationController. - getInstance().get("application.width"); - } - - /** - * Displays the provided text wrapped nicely according to the default - * terminal width. - * @param text The text to be displayed. - */ - public static void wrapText(String text) { - System.out.println(WordUtils.wrap(text, getWidth())); - } - - /** - * Checks if the execution is in dry-run mode. - * @return A boolean value indicating if the execution is in dry-run mode. - */ - private static boolean isDryRunMode() { - return (Boolean) ConfigurationController. - getInstance().get("execution.dryrun"); - } - - /** - * Checks if the execution is in verbose mode. - * @return A boolean value indicating if the execution is in verbose mode. - */ - private static boolean isVerboseMode() { - return (Boolean) ConfigurationController. - getInstance().get("execution.verbose"); - } - - /** - * Displays the rule authors in the terminal. - * @param authors The list of authors. - */ - public static void printAuthors(List<String> authors) { - StringBuilder line = new StringBuilder(); - line.append(authors.size() == 1 ? - messages.getMessage(Messages.INFO_LABEL_AUTHOR) - : messages.getMessage(Messages.INFO_LABEL_AUTHORS)); - String text = authors.isEmpty() ? - messages.getMessage(Messages.INFO_LABEL_NO_AUTHORS) - : CommonUtils.getCollectionElements( - CommonUtils.trimSpaces(authors), "", "", ", "); - line.append(" ").append(text); - wrapText(line.toString()); - } - - /** - * Displays the current conditional in the terminal. - * @param conditional The conditional object. - */ - public static void printConditional(Conditional conditional) { - if (conditional.getType() != Conditional.ConditionalType.NONE) { - StringBuilder line = new StringBuilder(); - line.append(messages.getMessage(Messages.INFO_LABEL_CONDITIONAL)); - line.append(" ("); - line.append(String.valueOf(conditional.getType())); - line.append(") ").append(conditional.getCondition()); - wrapText(line.toString()); - } - } - - /** - * Displays the file information in the terminal. - */ - public static void printFileInformation() { - File file = (File) ConfigurationController. - getInstance().get("execution.reference"); - String version = (String) ConfigurationController. - getInstance().get("application.version"); - String revision = (String) ConfigurationController. - getInstance().get("application.revision"); - String line = messages.getMessage( - Messages.INFO_DISPLAY_FILE_INFORMATION, - file.getName(), - CommonUtils.calculateFileSize(file), - CommonUtils.getLastModifiedInformation(file) - ); - logger.info(messages.getMessage( - Messages.LOG_INFO_WELCOME_MESSAGE, - version, - revision - )); - logger.info(displaySeparator()); - logger.info(String.format("::: arara @ %s", - getApplicationPath() - )); - logger.info(String.format("::: Java %s, %s", - CommonUtils.getSystemProperty("java.version", - "[unknown version]"), - CommonUtils.getSystemProperty("java.vendor", - "[unknown vendor]") - )); - logger.info(String.format("::: %s", - CommonUtils.getSystemProperty("java.home", - "[unknown location]") - )); - logger.info(String.format("::: %s, %s, %s", - CommonUtils.getSystemProperty("os.name", - "[unknown OS name]"), - CommonUtils.getSystemProperty("os.arch", - "[unknown OS arch]"), - CommonUtils.getSystemProperty("os.version", - "[unknown OS version]") - )); - logger.info(String.format("::: user.home @ %s", - CommonUtils.getSystemProperty("user.home", - "[unknown user's home directory]") - )); - logger.info(String.format("::: user.dir @ %s", - CommonUtils.getSystemProperty("user.dir", - "[unknown user's working directory]") - )); - logger.info(String.format("::: CF @ %s", - (String) ConfigurationController. - getInstance().get("execution.configuration.name") - )); - logger.info(displaySeparator()); - logger.info(line); - wrapText(line); - addNewLine(); - } - - /** - * Displays the elapsed time in the terminal. - */ - public static void printTime() { - if (ConfigurationController.getInstance().contains("display.time")) { - if ((ConfigurationController.getInstance().contains("display.line")) - || (ConfigurationController.getInstance(). - contains("display.exception"))) { - addNewLine(); - } - String text = messages.getMessage( - Messages.INFO_DISPLAY_EXECUTION_TIME, StopWatch.getTime()); - logger.info(text); - wrapText(text); - } - } - - /** - * Displays the application logo in the terminal. - */ - public static void printLogo() { - StringBuilder builder = new StringBuilder(); - builder.append(" __ _ _ __ __ _ _ __ __ _ ").append("\n"); - builder.append(" / _` | '__/ _` | '__/ _` |").append("\n"); - builder.append("| (_| | | | (_| | | | (_| |").append("\n"); - builder.append(" \\__,_|_| \\__,_|_| \\__,_|"); - System.out.println(builder.toString()); - addNewLine(); - } - - /** - * Adds a new line in the terminal. - */ - private static void addNewLine() { - System.out.println(); - } - - /** - * Displays a line containing details. - */ - private static void displayDetailsLine() { - String line = messages.getMessage( - Messages.INFO_LABEL_ON_DETAILS).concat(" "); - line = StringUtils.rightPad( - StringUtils.abbreviate(line, getWidth()), getWidth(), "-"); - System.out.println(line); - } - - /** - * Gets the output separator with the provided text. - * @param message The provided text. - * @return A string containing the output separator with the provided text. - */ - public static String displayOutputSeparator(String message) { - return StringUtils.center(" ".concat(message).concat(" "), - getWidth(), "-"); - } - - /** - * Gets the line separator. - * @return A string containing the line separator. - */ - public static String displaySeparator() { - return StringUtils.repeat("-", getWidth()); - } - - /** - * Gets the application path. - * @return A string containing the application path. - */ - private static String getApplicationPath() { - try { - return ConfigurationUtils.getApplicationPath(); - } - catch (AraraException ae) { - return "[unknown application path]"; - } - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/utils/FileHandlingUtils.java b/support/arara/source/src/main/java/com/github/cereda/arara/utils/FileHandlingUtils.java deleted file mode 100644 index fdd1ab36c6..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/utils/FileHandlingUtils.java +++ /dev/null @@ -1,124 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.utils; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import org.apache.commons.io.FileUtils; - -/** - * Implements file handling utilitary methods. - * - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class FileHandlingUtils { - - /** - * Writes the string to a file, using UTF-8 as default encoding. - * @param file The file. - * @param text The string to be written. - * @param append A flag whether to append the content. - * @return A logical value indicating whether it was successful. - */ - public static boolean writeToFile(File file, String text, boolean append) { - try { - - // try to write the provided - // string to the file, with - // UTF-8 as encoding - FileUtils.writeStringToFile(file, text, "UTF-8", append); - return true; - - } catch (IOException nothandled) { - - // if something bad happens, - // gracefully fallback to - // reporting the failure - return false; - } - } - - /** - * Writes the string list to a file, using UTF-8 as default encoding. - * @param file The file. - * @param lines The string list to be written. - * @param append A flag whether to append the content. - * @return A logical value indicating whether it was successful. - */ - public static boolean writeToFile(File file, List<String> lines, - boolean append) { - try { - - // try to write the provided - // string lists to the file, - // with UTF-8 as encoding - FileUtils.writeLines(file, "UTF-8", lines, append); - return true; - - } catch (IOException nothandled) { - - // if something bad happens, - // gracefully fallback to - // reporting the failure - return false; - } - } - - /** - * Reads the provided file into a list of strings. - * @param file The file. - * @return A list of strings. - */ - public static List<String> readFromFile(File file) { - try { - - // returns the contents of - // the provided file as - // a list of strings - return FileUtils.readLines(file, "UTF-8"); - - } catch (IOException nothandled) { - - // if something bad happens, - // gracefully fallback to - // an empty file list - return new ArrayList<String>(); - } - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/utils/FileSearchingUtils.java b/support/arara/source/src/main/java/com/github/cereda/arara/utils/FileSearchingUtils.java deleted file mode 100644 index 9f0c03c143..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/utils/FileSearchingUtils.java +++ /dev/null @@ -1,117 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.utils; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.filefilter.FalseFileFilter; -import org.apache.commons.io.filefilter.TrueFileFilter; -import org.apache.commons.io.filefilter.WildcardFileFilter; - -/** - * Implements file searching utilitary methods. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class FileSearchingUtils { - - /** - * List all files from the provided directory according to the list of - * extensions. The leading dot must be omitted, unless it is part of the - * extension. - * @param directory The provided directory. - * @param extensions The list of extensions. - * @param recursive A flag indicating whether the search is recursive. - * @return A list of files. - */ - public static List<File> listFilesByExtensions(File directory, - List<String> extensions, boolean recursive) { - try { - - // convert the provided extension - // list to an extension array - String[] array = new String[extensions.size()]; - array = extensions.toArray(array); - - // return the result of the - // provided search - return new ArrayList<File>( - FileUtils.listFiles(directory, array, recursive) - ); - } catch (Exception nothandled) { - - // if something bad happens, - // gracefully fallback to - // an empty file list - return new ArrayList<File>(); - } - } - - /** - * List all files from the provided directory matching the list of file - * name patterns. Such list can contain wildcards. - * @param directory The provided directory. - * @param patterns The list of file name patterns. - * @param recursive A flag indicating whether the search is recursive. - * @return A list of files. - */ - public static List<File> listFilesByPatterns(File directory, - List<String> patterns, boolean recursive) { - try { - - // return the result of the provided - // search, with the wildcard filter - // and a potential recursive search - return new ArrayList<File>( - FileUtils.listFiles( - directory, - new WildcardFileFilter(patterns), - recursive - ? TrueFileFilter.INSTANCE - : FalseFileFilter.INSTANCE - ) - ); - } catch (Exception nothandled) { - - // if something bad happens, - // gracefully fallback to - // an empty file list - return new ArrayList<File>(); - } - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/utils/InterpreterUtils.java b/support/arara/source/src/main/java/com/github/cereda/arara/utils/InterpreterUtils.java deleted file mode 100644 index d60de0884b..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/utils/InterpreterUtils.java +++ /dev/null @@ -1,257 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.utils; - -import com.github.cereda.arara.controller.ConfigurationController; -import com.github.cereda.arara.controller.LanguageController; -import com.github.cereda.arara.model.AraraException; -import com.github.cereda.arara.model.Argument; -import com.github.cereda.arara.model.Command; -import com.github.cereda.arara.model.Conditional; -import com.github.cereda.arara.model.Messages; -import com.github.cereda.arara.model.Rule; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.collections4.Transformer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.zeroturnaround.exec.InvalidExitValueException; -import org.zeroturnaround.exec.ProcessExecutor; -import org.zeroturnaround.exec.listener.ShutdownHookProcessDestroyer; - -/** - * Implements interpreter utilitary methods. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class InterpreterUtils { - - // the application messages obtained from the - // language controller - private static final LanguageController messages = - LanguageController.getInstance(); - - // get the logger context from a factory - private static final Logger logger = - LoggerFactory.getLogger(InterpreterUtils.class); - - /** - * Gets a list of all rule arguments. - * @param rule The provided rule. - * @return A list of strings containing all rule arguments. - */ - public static List<String> getRuleArguments(Rule rule) { - Collection<String> result = CollectionUtils.collect( - rule.getArguments(), new Transformer<Argument, String>() { - public String transform(Argument input) { - return input.getIdentifier(); - } - }); - return new ArrayList<String>(result); - } - - /** - * Checks if the current conditional has a prior evaluation. - * @param conditional The current conditional object. - * @return A boolean value indicating if the current conditional has a prior - * evaluation. - */ - public static boolean runPriorEvaluation(Conditional conditional) { - if (((Boolean) ConfigurationController.getInstance(). - get("execution.dryrun")) == true) { - return false; - } - switch (conditional.getType()) { - case IF: - case WHILE: - case UNLESS: - return true; - default: - return false; - } - } - - /** - * Runs the command in the underlying operating system. - * @param command An object representing the command. - * @return An integer value representing the exit code. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static int run(Object command) throws AraraException { - boolean verbose = (Boolean) ConfigurationController. - getInstance().get("execution.verbose"); - boolean timeout = (Boolean) ConfigurationController. - getInstance().get("execution.timeout"); - long value = (Long) ConfigurationController. - getInstance().get("execution.timeout.value"); - TimeUnit unit = (TimeUnit) ConfigurationController. - getInstance().get("execution.timeout.unit"); - ByteArrayOutputStream buffer = new ByteArrayOutputStream(); - ProcessExecutor executor = new ProcessExecutor(); - if (CommonUtils.checkClass(Command.class, command)) { - executor = executor.command(((Command) command).getElements()); - if (((Command) command).hasWorkingDirectory()) { - executor = executor.directory( - ((Command) command).getWorkingDirectory() - ); - } - } else { - executor = executor.commandSplit((String) command); - } - if (timeout) { - if (value == 0) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_RUN_TIMEOUT_INVALID_RANGE - ) - ); - } - executor = executor.timeout(value, unit); - } - TeeOutputStream tee; - if (verbose) { - tee = new TeeOutputStream(System.out, buffer); - executor = executor.redirectInput(System.in); - } else { - tee = new TeeOutputStream(buffer); - } - executor = executor.redirectOutput(tee).redirectError(tee); - ShutdownHookProcessDestroyer hook = new ShutdownHookProcessDestroyer(); - executor = executor.addDestroyer(hook); - try { - int exit = executor.execute().getExitValue(); - logger.info(DisplayUtils.displayOutputSeparator( - messages.getMessage( - Messages.LOG_INFO_BEGIN_BUFFER - ) - )); - logger.info(buffer.toString()); - logger.info(DisplayUtils.displayOutputSeparator( - messages.getMessage( - Messages.LOG_INFO_END_BUFFER - ) - )); - return exit; - } catch (IOException ioexception) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_RUN_IO_EXCEPTION - ), - ioexception - ); - } catch (InterruptedException iexception) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_RUN_INTERRUPTED_EXCEPTION - ), - iexception - ); - } catch (InvalidExitValueException ievexception) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_RUN_INVALID_EXIT_VALUE_EXCEPTION - ), - ievexception - ); - } catch (TimeoutException texception) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_RUN_TIMEOUT_EXCEPTION - ), - texception - ); - } catch (Exception exception) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_RUN_GENERIC_EXCEPTION - ), - exception - ); - } - } - - /** - * Builds the rule path based on the rule name and returns the corresponding - * file location. - * @param name The rule name. - * @return The rule file. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static File buildRulePath(String name) throws AraraException { - @SuppressWarnings("unchecked") - List<String> paths = (List<String>) ConfigurationController. - getInstance().get("execution.rule.paths"); - for (String path : paths) { - File location = new File(construct(path, name)); - if (location.exists()) { - return location; - } - } - return null; - } - - /** - * Constructs the path given the current path and the rule name. - * @param path The current path. - * @param name The rule name. - * @return The constructed path. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static String construct(String path, String name) - throws AraraException { - name = name.concat(".yaml"); - File location = new File(path); - if (location.isAbsolute()) { - return CommonUtils.buildPath(path, name); - } else { - File reference = (File) ConfigurationController. - getInstance().get("execution.reference"); - String parent = CommonUtils.buildPath( - CommonUtils.getParentCanonicalPath(reference), path); - return CommonUtils.buildPath(parent, name); - } - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/utils/MessageUtils.java b/support/arara/source/src/main/java/com/github/cereda/arara/utils/MessageUtils.java deleted file mode 100644 index b36bda8808..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/utils/MessageUtils.java +++ /dev/null @@ -1,313 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.utils; - -import com.github.cereda.arara.controller.ConfigurationController; -import javax.swing.JOptionPane; -import javax.swing.UIManager; - -/** - * Implements utilitary methods for displaying messages. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class MessageUtils { - - // holds the default width for the - // message body, in pixels - private static final int WIDTH = 250; - - // let's start the UI manager and set - // the default look and feel to be as - // close as possible to the system - static { - - // get the current look and feel - String laf = (String) ConfigurationController. - getInstance().get("ui.lookandfeel"); - - // check if one is actually set - if (!laf.equals("none")) { - - // use a special keyword to indicate - // the use of a system look and feel - if (laf.equals("system")) { - laf = UIManager.getSystemLookAndFeelClassName(); - } - - // let's try it, in case it fails, - // rely to the default look and feel - try { - - // get the system look and feel name - // and try to set it as default - UIManager.setLookAndFeel(laf); - } - catch (Exception exception) { - // quack, quack, quack - } - - } - } - - /** - * Normalizes the icon type to one of the five available icons. - * @param value An integer value. - * @return The normalized integer value. - */ - private static int normalizeIconType(int value) { - - // do the normalization according to the available - // icons in the underlying message implementation - switch (value) { - case 1: - value = JOptionPane.ERROR_MESSAGE; - break; - case 2: - value = JOptionPane.INFORMATION_MESSAGE; - break; - case 3: - value = JOptionPane.WARNING_MESSAGE; - break; - case 4: - value = JOptionPane.QUESTION_MESSAGE; - break; - default: - value = JOptionPane.PLAIN_MESSAGE; - break; - } - return value; - } - - /** - * Normalizes the message width, so only valid nonzero values are accepted. - * @param value An integer value corresponding to the message width. - * @return The normalized width. - */ - private static int normalizeMessageWidth(int value) { - return (value > 0 ? value : WIDTH); - } - - /** - * Shows the message. - * @param width Integer value, in pixels. - * @param type Type of message. - * @param title Title of the message. - * @param text Text of the message. - */ - public static void showMessage(int width, int type, - String title, String text) { - - // effectively shows the message based - // on the provided parameters - JOptionPane.showMessageDialog( - null, - String.format( - "<html><body style=\"width:%dpx\">%s</body></html>", - normalizeMessageWidth(width), - text - ), - title, - normalizeIconType(type) - ); - } - - /** - * Shows the message. It relies on the default width. - * @param type Type of message. - * @param title Title of the message. - * @param text Text of the message. - */ - public static void showMessage(int type, String title, String text) { - showMessage(WIDTH, type, title, text); - } - - /** - * Shows a message with options presented as an array of buttons. - * @param width Integer value, in pixels. - * @param type Type of message. - * @param title Title of the message. - * @param text Text of the message. - * @param buttons An array of objects to be presented as buttons. - * @return The index of the selected button, starting from 1. - */ - public static int showOptions(int width, int type, String title, - String text, Object... buttons) { - - // returns the index of the selected button, - // zero if nothing is selected - return JOptionPane.showOptionDialog( - null, - String.format( - "<html><body style=\"width:%dpx\">%s</body></html>", - normalizeMessageWidth(width), - text - ), - title, - JOptionPane.DEFAULT_OPTION, - normalizeIconType(type), - null, - buttons, - buttons[0] - ) + 1; - } - - /** - * Shows a message with options presented as an array of buttons. It relies - * on the default width. - * @param type Type of message. - * @param title Title of the message. - * @param text Text of the message. - * @param buttons An array of objects to be presented as buttons. - * @return The index of the selected button, starting from 1. - */ - public static int showOptions(int type, String title, - String text, Object... buttons) { - return showOptions(WIDTH, type, title, text, buttons); - } - - /** - * Shows a message with a text input. - * @param width Integer value, in pixels. - * @param type Type of message. - * @param title Title of the message. - * @param text Text of the message. - * @return The string representing the input text. - */ - public static String showInput(int width, int type, - String title, String text) { - - // get the string from the - // input text, if any - String input = JOptionPane.showInputDialog( - null, - String.format( - "<html><body style=\"width:%dpx\">%s</body></html>", - normalizeMessageWidth(width), - text - ), - title, - normalizeIconType(type) - ); - - // if the input is not null, that is, - // the user actually typed something - if (input != null) { - - // return the trimmed string - return input.trim(); - } - - // nothing was typed, so let's - // return an empty string - return ""; - } - - /** - * Shows a message with a text input. It relies on the default width. - * @param type Type of message. - * @param title Title of the message. - * @param text Text of the message. - * @return The string representing the input text. - */ - public static String showInput(int type, String title, String text) { - return showInput(WIDTH, type, title, text); - } - - /** - * Shows a message with options presented as a dropdown list of elements. - * @param width Integer value, in pixels. - * @param type Type of message. - * @param title Title of the message. - * @param text Text of the message. - * @param elements An array of objects representing the elements. - * @return The index of the selected element, starting from 1. - */ - public static int showDropdown(int width, int type, String title, - String text, Object... elements) { - - // show the dropdown list and get - // the selected object, if any - Object index = JOptionPane.showInputDialog( - null, - String.format( - "<html><body style=\"width:%dpx\">%s</body></html>", - normalizeMessageWidth(width), - text - ), - title, - normalizeIconType(type), - null, - elements, - elements[0] - ); - - // if it's not a null object, let's - // find the corresponding index - if (index != null) { - - // iterate through the array of elements - for (int i = 0; i < elements.length; i++) { - - // if the element is found, simply - // return the index plus 1, as zero - // corresponds to no selection at all - if (elements[i].equals(index)) { - return i + 1; - } - - } - } - - // nothing was selected, - // simply return zero - return 0; - } - - /** - * Shows a message with options presented as a dropdown list of elements. It - * relies on the default width. - * @param type Type of message. - * @param title Title of the message. - * @param text Text of the message. - * @param elements An array of objects representing the elements. - * @return The index of the selected element, starting from 1. - */ - public static int showDropdown(int type, String title, - String text, Object... elements) { - return showDropdown(WIDTH, type, title, text, elements); - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/utils/Methods.java b/support/arara/source/src/main/java/com/github/cereda/arara/utils/Methods.java deleted file mode 100644 index 24982dace9..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/utils/Methods.java +++ /dev/null @@ -1,1368 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.utils; - -import com.github.cereda.arara.controller.ConfigurationController; -import com.github.cereda.arara.controller.LanguageController; -import com.github.cereda.arara.model.AraraException; -import com.github.cereda.arara.model.Command; -import com.github.cereda.arara.model.Messages; -import com.github.cereda.arara.model.Pair; -import com.github.cereda.arara.model.Session; -import com.github.cereda.arara.model.Trigger; -import java.io.File; -import java.util.Arrays; -import java.util.List; -import java.util.Map; - -/** - * Implements some auxiliary methods for runtime evaluation. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class Methods { - - // the language controller - private static final LanguageController messages = - LanguageController.getInstance(); - - // the session controller - private static final Session session = new Session(); - - /** - * Adds the rule methods to the provided map. - * @param map The map. - */ - public static void addRuleMethods(Map<String, Object> map) { - addConditionalMethods(map); - try { - map.put("getOriginalFile", Methods.class.getMethod("getOriginalFile")); - map.put("getOriginalReference", Methods.class.getMethod("getOriginalReference")); - map.put("isEmpty", Methods.class.getMethod("isEmpty", String.class)); - map.put("isNotEmpty", Methods.class.getMethod("isNotEmpty", String.class)); - map.put("isEmpty", Methods.class.getMethod("isEmpty", String.class, Object.class)); - map.put("isNotEmpty", Methods.class.getMethod("isNotEmpty", String.class, Object.class)); - map.put("isEmpty", Methods.class.getMethod("isEmpty", String.class, Object.class, Object.class)); - map.put("isNotEmpty", Methods.class.getMethod("isNotEmpty", String.class, Object.class, Object.class)); - map.put("isTrue", Methods.class.getMethod("isTrue", String.class)); - map.put("isFalse", Methods.class.getMethod("isFalse", String.class)); - map.put("isTrue", Methods.class.getMethod("isTrue", String.class, Object.class)); - map.put("isFalse", Methods.class.getMethod("isFalse", String.class, Object.class)); - map.put("isTrue", Methods.class.getMethod("isTrue", String.class, Object.class, Object.class)); - map.put("isFalse", Methods.class.getMethod("isFalse", String.class, Object.class, Object.class)); - map.put("isTrue", Methods.class.getMethod("isTrue", String.class, Object.class, Object.class, Object.class)); - map.put("isFalse", Methods.class.getMethod("isFalse", String.class, Object.class, Object.class, Object.class)); - map.put("trimSpaces", Methods.class.getMethod("trimSpaces", String.class)); - map.put("isTrue", Methods.class.getMethod("isTrue", boolean.class, Object.class)); - map.put("isFalse", Methods.class.getMethod("isFalse", boolean.class, Object.class)); - map.put("isTrue", Methods.class.getMethod("isTrue", boolean.class, Object.class, Object.class)); - map.put("isFalse", Methods.class.getMethod("isFalse", boolean.class, Object.class, Object.class)); - map.put("getBasename", Methods.class.getMethod("getBasename", File.class)); - map.put("getBasename", Methods.class.getMethod("getBasename", String.class)); - map.put("getFullBasename", Methods.class.getMethod("getFullBasename", File.class)); - map.put("getFullBasename", Methods.class.getMethod("getFullBasename", String.class)); - map.put("getFiletype", Methods.class.getMethod("getFiletype", File.class)); - map.put("getFiletype", Methods.class.getMethod("getFiletype", String.class)); - map.put("throwError", Methods.class.getMethod("throwError", String.class)); - map.put("getSession", Methods.class.getMethod("getSession")); - map.put("isWindows", Methods.class.getMethod("isWindows")); - map.put("isLinux", Methods.class.getMethod("isLinux")); - map.put("isMac", Methods.class.getMethod("isMac")); - map.put("isUnix", Methods.class.getMethod("isUnix")); - map.put("isAIX", Methods.class.getMethod("isAIX")); - map.put("isIrix", Methods.class.getMethod("isIrix")); - map.put("isOS2", Methods.class.getMethod("isOS2")); - map.put("isSolaris", Methods.class.getMethod("isSolaris")); - map.put("isCygwin", Methods.class.getMethod("isCygwin")); - map.put("isWindows", Methods.class.getMethod("isWindows", Object.class, Object.class)); - map.put("isLinux", Methods.class.getMethod("isLinux", Object.class, Object.class)); - map.put("isMac", Methods.class.getMethod("isMac", Object.class, Object.class)); - map.put("isUnix", Methods.class.getMethod("isUnix", Object.class, Object.class)); - map.put("isAIX", Methods.class.getMethod("isAIX", Object.class, Object.class)); - map.put("isIrix", Methods.class.getMethod("isIrix", Object.class, Object.class)); - map.put("isOS2", Methods.class.getMethod("isOS2", Object.class, Object.class)); - map.put("isSolaris", Methods.class.getMethod("isSolaris", Object.class, Object.class)); - map.put("isCygwin", Methods.class.getMethod("isCygwin", Object.class, Object.class)); - map.put("replicatePattern", Methods.class.getMethod("replicatePattern", String.class, List.class)); - map.put("buildString", Methods.class.getMethod("buildString", Object[].class)); - map.put("addQuotes", Methods.class.getMethod("addQuotes", Object.class)); - map.put("getCommand", Methods.class.getMethod("getCommand", List.class)); - map.put("getCommand", Methods.class.getMethod("getCommand", Object[].class)); - map.put("getTrigger", Methods.class.getMethod("getTrigger", String.class)); - map.put("getTrigger", Methods.class.getMethod("getTrigger", String.class, Object[].class)); - map.put("checkClass", Methods.class.getMethod("checkClass", Class.class, Object.class)); - map.put("isString", Methods.class.getMethod("isString", Object.class)); - map.put("isList", Methods.class.getMethod("isList", Object.class)); - map.put("isMap", Methods.class.getMethod("isMap", Object.class)); - map.put("isBoolean", Methods.class.getMethod("isBoolean", Object.class)); - map.put("isVerboseMode", Methods.class.getMethod("isVerboseMode")); - map.put("showMessage", Methods.class.getMethod("showMessage", int.class, String.class, String.class)); - map.put("showMessage", Methods.class.getMethod("showMessage", int.class, int.class, String.class, String.class)); - map.put("isOnPath", Methods.class.getMethod("isOnPath", String.class)); - map.put("unsafelyExecuteSystemCommand", Methods.class.getMethod("unsafelyExecuteSystemCommand", Command.class)); - map.put("mergeVelocityTemplate", Methods.class.getMethod("mergeVelocityTemplate", File.class, File.class, Map.class)); - map.put("getCommandWithWorkingDirectory", Methods.class.getMethod("getCommandWithWorkingDirectory", String.class, List.class)); - map.put("getCommandWithWorkingDirectory", Methods.class.getMethod("getCommandWithWorkingDirectory", String.class, Object[].class)); - map.put("getCommandWithWorkingDirectory", Methods.class.getMethod("getCommandWithWorkingDirectory", File.class, List.class)); - map.put("getCommandWithWorkingDirectory", Methods.class.getMethod("getCommandWithWorkingDirectory", File.class, Object[].class)); - map.put("listFilesByExtensions", Methods.class.getMethod("listFilesByExtensions", File.class, List.class, boolean.class)); - map.put("listFilesByExtensions", Methods.class.getMethod("listFilesByExtensions", String.class, List.class, boolean.class)); - map.put("listFilesByPatterns", Methods.class.getMethod("listFilesByPatterns", File.class, List.class, boolean.class)); - map.put("listFilesByPatterns", Methods.class.getMethod("listFilesByPatterns", String.class, List.class, boolean.class)); - map.put("writeToFile", Methods.class.getMethod("writeToFile", File.class, String.class, boolean.class)); - map.put("writeToFile", Methods.class.getMethod("writeToFile", File.class, List.class, boolean.class)); - map.put("writeToFile", Methods.class.getMethod("writeToFile", String.class, String.class, boolean.class)); - map.put("writeToFile", Methods.class.getMethod("writeToFile", String.class, List.class, boolean.class)); - map.put("readFromFile", Methods.class.getMethod("readFromFile", File.class)); - map.put("readFromFile", Methods.class.getMethod("readFromFile", String.class)); - map.put("isSubdirectory", Methods.class.getMethod("isSubdirectory", File.class)); - } catch (Exception exception) { - // quack, quack, quack - } - } - - /** - * Adds conditional methods to the provided map. - * @param map The map. - */ - public static void addConditionalMethods(Map<String, Object> map) { - try { - map.put("exists", Methods.class.getMethod("exists", String.class)); - map.put("exists", Methods.class.getMethod("exists", File.class)); - map.put("missing", Methods.class.getMethod("missing", String.class)); - map.put("missing", Methods.class.getMethod("missing", File.class)); - map.put("changed", Methods.class.getMethod("changed", String.class)); - map.put("changed", Methods.class.getMethod("changed", File.class)); - map.put("unchanged", Methods.class.getMethod("unchanged", String.class)); - map.put("unchanged", Methods.class.getMethod("unchanged", File.class)); - map.put("found", Methods.class.getMethod("found", String.class, String.class)); - map.put("found", Methods.class.getMethod("found", File.class, String.class)); - map.put("toFile", Methods.class.getMethod("toFile", String.class)); - map.put("showDropdown", Methods.class.getMethod("showDropdown", int.class, String.class, String.class, Object[].class)); - map.put("showDropdown", Methods.class.getMethod("showDropdown", int.class, int.class, String.class, String.class, Object[].class)); - map.put("showInput", Methods.class.getMethod("showInput", int.class, String.class, String.class)); - map.put("showInput", Methods.class.getMethod("showInput", int.class, int.class, String.class, String.class)); - map.put("showOptions", Methods.class.getMethod("showOptions", int.class, String.class, String.class, Object[].class)); - map.put("showOptions", Methods.class.getMethod("showOptions", int.class, int.class, String.class, String.class, Object[].class)); - map.put("currentFile", Methods.class.getMethod("currentFile")); - map.put("loadClass", Methods.class.getMethod("loadClass", File.class, String.class)); - map.put("loadClass", Methods.class.getMethod("loadClass", String.class, String.class)); - map.put("loadObject", Methods.class.getMethod("loadObject", File.class, String.class)); - map.put("loadObject", Methods.class.getMethod("loadObject", String.class, String.class)); - } catch (Exception exception) { - // quack, quack, quack - } - } - - /** - * Gets the original file. - * @return The original file. - */ - public static String getOriginalFile() { - File file = (File) ConfigurationController.getInstance().get("execution.reference"); - return file.getName(); - } - - /** - * Gets the original reference. - * @return The original reference. - */ - public static File getOriginalReference() { - return (File) ConfigurationController.getInstance().get("execution.reference"); - } - - /** - * Checks if the string is empty. - * @param string The string. - * @return A boolean value. - */ - public static boolean isEmpty(String string) { - return CommonUtils.checkEmptyString(string); - } - - /** - * Checks if the string is not empty. - * @param string The string. - * @return A boolean value. - */ - public static boolean isNotEmpty(String string) { - return !isEmpty(string); - } - - /** - * Checks if the string is empty. - * @param string The string. - * @param yes Object to return if true. - * @return An object or empty string. - */ - public static Object isEmpty(String string, Object yes) { - return isEmpty(string) ? yes : ""; - } - - /** - * Checks if the string is not empty. - * @param string The string. - * @param yes Object to return if true. - * @return An object or empty string. - */ - public static Object isNotEmpty(String string, Object yes) { - return isNotEmpty(string) ? yes : ""; - } - - /** - * Checks if the string is empty. - * @param string The string. - * @param yes Object to return if true. - * @param no Object to return if false. - * @return One of the two objects. - */ - public static Object isEmpty(String string, Object yes, Object no) { - return isEmpty(string) ? yes : no; - } - - /** - * Checks if the string is not empty. - * @param string The string. - * @param yes Object to return if true. - * @param no Object to return if false. - * @return One of the two objects. - */ - public static Object isNotEmpty(String string, Object yes, Object no) { - return isNotEmpty(string) ? yes : no; - } - - /** - * Checks if the string holds a true value. - * @param string The string. - * @return A boolean value. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static boolean isTrue(String string) throws AraraException { - return isEmpty(string) ? false : CommonUtils.checkBoolean(string); - } - - /** - * Checks if the string holds a false value. - * @param string The string. - * @return A boolean value. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static boolean isFalse(String string) throws AraraException { - return isEmpty(string) ? false : !CommonUtils.checkBoolean(string); - } - - /** - * Checks if the string holds a true value. - * @param string The string. - * @param yes Object to return if true. - * @return An object or an empty string. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static Object isTrue(String string, Object yes) - throws AraraException { - return isTrue(string) ? yes : ""; - } - - /** - * Checks if the string holds a false value. - * @param string The string. - * @param yes Object to return if true. - * @return An object or an empty string. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static Object isFalse(String string, Object yes) - throws AraraException { - return (isFalse(string) ? yes : ""); - } - - /** - * Checks if the string holds a true value. - * @param string The string. - * @param yes Object to return if true. - * @param no Object to return if false. - * @return One of the two objects. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static Object isTrue(String string, Object yes, Object no) - throws AraraException { - return (isTrue(string) ? yes : no); - } - - /** - * Checks if the string holds a false value. - * @param string The string. - * @param yes Object to return if true. - * @param no Object to return if false. - * @return One of the two objects. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static Object isFalse(String string, Object yes, Object no) - throws AraraException { - return (isFalse(string) ? yes : no); - } - - /** - * Checks if the string holds a true value. - * @param string The string. - * @param yes Object to return if true. - * @param no Object to return if false. - * @param fallback Object to return if string is empty. - * @return One of the three options. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static Object isTrue(String string, Object yes, Object no, - Object fallback) throws AraraException { - return isEmpty(string) ? fallback : (isTrue(string) ? yes : no); - } - - /** - * Checks if the string holds a false value. - * @param string The string. - * @param yes Object to return if true. - * @param no Object to return if false. - * @param fallback Object to return if string is empty. - * @return One of the three options. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static Object isFalse(String string, Object yes, Object no, - Object fallback) throws AraraException { - return isEmpty(string) ? fallback : (isFalse(string) ? yes : no); - } - - /** - * Trim spaces from the string. - * @param string The string. - * @return A trimmed string. - */ - public static String trimSpaces(String string) { - return string.trim(); - } - - /** - * Checks if the expression resolves to true. - * @param value The expression. - * @param yes Object to return if true. - * @return An object or an empty string. - */ - public static Object isTrue(boolean value, Object yes) { - return value ? yes : ""; - } - - /** - * Checks if the expression resolves to false. - * @param value The expression. - * @param yes Object to return if true. - * @return An object or an empty string. - */ - public static Object isFalse(boolean value, Object yes) { - return !value ? yes : ""; - } - - /** - * Checks if the expression resolves to true. - * @param value The expression. - * @param yes Object to return if true. - * @param no Object to return if false. - * @return One of the two objects. - */ - public static Object isTrue(boolean value, Object yes, Object no) { - return value ? yes : no; - } - - /** - * Checks if the expression resolves to false. - * @param value The expression. - * @param yes Object to return if true. - * @param no Object to return if false. - * @return One of the two objects. - */ - public static Object isFalse(boolean value, Object yes, Object no) { - return !value ? yes : no; - } - - /** - * Gets the basename. - * @param file The file. - * @return The basename of the provided file. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static String getBasename(File file) throws AraraException { - if (file.isFile()) { - return CommonUtils.getBasename(file); - } else { - throw new AraraException( - CommonUtils.getRuleErrorHeader().concat( - messages.getMessage( - Messages.ERROR_BASENAME_NOT_A_FILE, - file.getName() - ) - ) - ); - } - } - - /** - * Gets the basename. - * @param filename The string. - * @return The basename. - */ - public static String getBasename(String filename) { - return CommonUtils.getBasename(filename); - } - - /** - * Gets the file type. - * @param file The provided file. - * @return The file type. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static String getFiletype(File file) throws AraraException { - if (file.isFile()) { - return CommonUtils.getFiletype(file); - } else { - throw new AraraException( - CommonUtils.getRuleErrorHeader().concat( - messages.getMessage( - Messages.ERROR_FILETYPE_NOT_A_FILE, - file.getName() - ) - ) - ); - } - } - - /** - * Gets the file type. - * @param filename The provided string. - * @return The file type. - */ - public static String getFiletype(String filename) { - return CommonUtils.getFiletype(filename); - } - - /** - * Replicates the pattern to each element of a list. - * @param pattern The pattern. - * @param values The list. - * @return A list of strings containing the pattern applied to the list. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static List<Object> replicatePattern(String pattern, - List<Object> values) throws AraraException { - return CommonUtils.replicateList(pattern, values); - } - - /** - * Throws an exception. - * @param text The text to be thrown as the exception message. - * @throws AraraException The exception to be thrown by this method. - */ - public static void throwError(String text) throws AraraException { - throw new AraraException(text); - } - - /** - * Gets the session. - * @return The session. - */ - public static Session getSession() { - return session; - } - - /** - * Checks if Windows is the underlying operating system. - * @return A boolean value. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static boolean isWindows() throws AraraException { - return CommonUtils.checkOS("windows"); - } - - /** - * Checks if we are inside a Cygwin environment. - * @return A boolean value. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static boolean isCygwin() throws AraraException { - return CommonUtils.checkOS("cygwin"); - } - - /** - * Checks if Linux is the underlying operating system. - * @return A boolean value. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static boolean isLinux() throws AraraException { - return CommonUtils.checkOS("linux"); - } - - /** - * Checks if Mac is the underlying operating system. - * @return A boolean value. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static boolean isMac() throws AraraException { - return CommonUtils.checkOS("mac"); - } - - /** - * Checks if Unix is the underlying operating system. - * @return A boolean value. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static boolean isUnix() throws AraraException { - return CommonUtils.checkOS("unix"); - } - - /** - * Checks if AIX is the underlying operating system. - * @return A boolean value. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static boolean isAIX() throws AraraException { - return CommonUtils.checkOS("aix"); - } - - /** - * Checks if Irix is the underlying operating system. - * @return A boolean value. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static boolean isIrix() throws AraraException { - return CommonUtils.checkOS("irix"); - } - - /** - * Checks if OS2 is the underlying operating system. - * @return A boolean value. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static boolean isOS2() throws AraraException { - return CommonUtils.checkOS("os2"); - } - - /** - * Checks if Solaris is the underlying operating system. - * @return A boolean value. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static boolean isSolaris() throws AraraException { - return CommonUtils.checkOS("solaris"); - } - - /** - * Checks if Windows is the underlying operating system. - * @param yes Object to return if true. - * @param no Object to return if false. - * @return One of the two objects. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static Object isWindows(Object yes, Object no) - throws AraraException { - return CommonUtils.checkOS("windows") ? yes : no; - } - - /** - * Checks if we are inside a Cygwin environment. - * @param yes Object to return if true. - * @param no Object to return if false. - * @return One of the two objects. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static Object isCygwin(Object yes, Object no) throws AraraException { - return CommonUtils.checkOS("cygwin") ? yes : no; - } - - /** - * Checks if Linux is the underlying operating system. - * @param yes Object to return if true. - * @param no Object to return if false. - * @return One of the two objects. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static Object isLinux(Object yes, Object no) throws AraraException { - return CommonUtils.checkOS("linux") ? yes : no; - } - - /** - * Checks if Mac is the underlying operating system. - * @param yes Object to return if true. - * @param no Object to return if false. - * @return One of the two objects. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static Object isMac(Object yes, Object no) throws AraraException { - return CommonUtils.checkOS("mac") ? yes : no; - } - - /** - * Checks if Unix is the underlying operating system. - * @param yes Object to return if true. - * @param no Object to return if false. - * @return One of the two objects. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static Object isUnix(Object yes, Object no) throws AraraException { - return CommonUtils.checkOS("unix") ? yes : no; - } - - /** - * Checks if AIX is the underlying operating system. - * @param yes Object to return if true. - * @param no Object to return if false. - * @return One of the two objects. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static Object isAIX(Object yes, Object no) throws AraraException { - return CommonUtils.checkOS("aix") ? yes : no; - } - - /** - * Checks if Irix is the underlying operating system. - * @param yes Object to return if true. - * @param no Object to return if false. - * @return One of the two objects. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static Object isIrix(Object yes, Object no) throws AraraException { - return CommonUtils.checkOS("irix") ? yes : no; - } - - /** - * Checks if OS2 is the underlying operating system. - * @param yes Object to return if true. - * @param no Object to return if false. - * @return One of the two objects. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static Object isOS2(Object yes, Object no) throws AraraException { - return CommonUtils.checkOS("os2") ? yes : no; - } - - /** - * Checks if Solaris is the underlying operating system. - * @param yes Object to return if true. - * @param no Object to return if false. - * @return One of the two objects. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static Object isSolaris(Object yes, Object no) throws AraraException { - return CommonUtils.checkOS("solaris") ? yes : no; - } - - /** - * Checks if the file exists according to its extension. - * @param extension The extension. - * @return A boolean value. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static boolean exists(String extension) throws AraraException { - return CommonUtils.exists(extension); - } - - /** - * Checks if the file is missing according to its extension. - * @param extension The extension. - * @return A boolean value. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static boolean missing(String extension) throws AraraException { - return !exists(extension); - } - - /** - * Checks if the file has changed, according to its extension. - * @param extension The extension. - * @return A boolean value. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static boolean changed(String extension) throws AraraException { - return CommonUtils.hasChanged(extension); - } - - /** - * Checks if the file is unchanged according to its extension. - * @param extension The extension. - * @return A boolean value. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static boolean unchanged(String extension) throws AraraException { - return !changed(extension); - } - - /** - * Checks if the file exists. - * @param filename The file. - * @return A boolean value. - */ - public static boolean exists(File filename) { - return CommonUtils.exists(filename); - } - - /** - * Checks if the file is missing. - * @param filename The file. - * @return A boolean value. - */ - public static boolean missing(File filename) { - return !exists(filename); - } - - /** - * Checks if the file has changed. - * @param filename The file. - * @return A boolean value. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static boolean changed(File filename) throws AraraException { - return CommonUtils.hasChanged(filename); - } - - /** - * Checks if the file is unchanged. - * @param filename The file. - * @return A boolean value. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static boolean unchanged(File filename) throws AraraException { - return !changed(filename); - } - - /** - * Build a string based on an array of objects. - * @param objects Array of objects. - * @return A string built from the array. - */ - public static String buildString(Object... objects) { - return CommonUtils.generateString(objects); - } - - /** - * Encloses the provided object into double quotes. - * @param object The object. - * @return The object enclosed in double quotes. - */ - public static String addQuotes(Object object) { - return CommonUtils.addQuotes(object); - } - - /** - * Checks if the file contains the regex, based on its extension. - * @param extension The extension. - * @param regex The regex. - * @return A boolean value. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static boolean found(String extension, String regex) - throws AraraException { - return CommonUtils.checkRegex(extension, regex); - } - - /** - * Checks if the file contains the provided regex. - * @param file The file. - * @param regex The regex. - * @return A boolean value. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static boolean found(File file, String regex) - throws AraraException { - return CommonUtils.checkRegex(file, regex); - } - - /** - * Gets the command based on a list of strings. - * @param elements The list of strings. - * @return A command. - */ - public static Command getCommand(List<String> elements) { - return new Command(elements); - } - - /** - * Gets the command based on an array of objects. - * @param elements Array of objects. - * @return A command. - */ - public static Command getCommand(Object... elements) { - return new Command(elements); - } - - /** - * Gets the command based on an array of objects and with the provided - * working directory as string. - * @param path String path representing the working directory. - * @param elements Array of elements. - * @return A command. - */ - public static Command getCommandWithWorkingDirectory(String path, - Object... elements) { - Command command = new Command(elements); - command.setWorkingDirectory(new File(path)); - return command; - } - - /** - * Gets the command based on an array of objects and with the provided - * working directory as file. - * @param file File representing the working directory. - * @param elements Array of elements. - * @return A command. - */ - public static Command getCommandWithWorkingDirectory(File file, - Object... elements) { - Command command = new Command(elements); - command.setWorkingDirectory(file); - return command; - } - - /** - * Gets the command based on a list of strings and with the provided - * working directory as string. - * @param path String path representing the working directory. - * @param elements List of strings. - * @return A command. - */ - public static Command getCommandWithWorkingDirectory(String path, - List<String> elements) { - Command command = new Command(elements); - command.setWorkingDirectory(new File(path)); - return command; - } - - /** - * Gets the command based on a list of strings and with the provided - * working directory as file. - * @param file File representing the working directory. - * @param elements List of strings. - * @return A command. - */ - public static Command getCommandWithWorkingDirectory(File file, - List<String> elements) { - Command command = new Command(elements); - command.setWorkingDirectory(file); - return command; - } - - /** - * Gets the trigger. - * @param action The action name. - * @return The trigger. - */ - public static Trigger getTrigger(String action) { - return new Trigger(action, null); - } - - /** - * Gets the trigger. - * @param action The action name. - * @param parameters The trigger parameters. - * @return A trigger. - */ - public static Trigger getTrigger(String action, Object... parameters) { - return new Trigger(action, Arrays.asList(parameters)); - } - - /** - * Checks if the object is an intance of the provided class. - * @param clazz The class. - * @param object The object. - * @return A boolean value. - */ - public static boolean checkClass(Class clazz, Object object) { - return CommonUtils.checkClass(clazz, object); - } - - /** - * Checks if the object is a string. - * @param object The object. - * @return A boolean value. - */ - public static boolean isString(Object object) { - return checkClass(String.class, object); - } - - /** - * Checks if the object is a list. - * @param object The object. - * @return A boolean value. - */ - public static boolean isList(Object object) { - return checkClass(List.class, object); - } - - /** - * Checks if the object is a map. - * @param object The object. - * @return A boolean value. - */ - public static boolean isMap(Object object) { - return checkClass(Map.class, object); - } - - /** - * Checks if the object is a boolean. - * @param object The object. - * @return A boolean value. - */ - public static boolean isBoolean(Object object) { - return checkClass(Boolean.class, object); - } - - /** - * Checks if the execution is in verbose mode. - * @return A boolean value indicating if the execution is in verbose mode. - */ - public static boolean isVerboseMode() { - return (Boolean) ConfigurationController. - getInstance().get("execution.verbose"); - } - - /** - * Returns a file object based on the provided name. - * @param name The file name. - * @return A file object. - */ - public static File toFile(String name) { - return new File(name); - } - - /** - * Shows the message. - * @param width Integer value, in pixels. - * @param type Type of message. - * @param title Title of the message. - * @param text Text of the message. - */ - public static void showMessage(int width, int type, - String title, String text) { - MessageUtils.showMessage(width, type, title, text); - } - - /** - * Shows the message. It relies on the default width. - * @param type Type of message. - * @param title Title of the message. - * @param text Text of the message. - */ - public static void showMessage(int type, String title, String text) { - MessageUtils.showMessage(type, title, text); - } - - /** - * Shows a message with options presented as an array of buttons. - * @param width Integer value, in pixels. - * @param type Type of message. - * @param title Title of the message. - * @param text Text of the message. - * @param buttons An array of objects to be presented as buttons. - * @return The index of the selected button, starting from 1. - */ - public static int showOptions(int width, int type, String title, - String text, Object... buttons) { - return MessageUtils.showOptions(width, type, title, text, buttons); - } - - /** - * Shows a message with options presented as an array of buttons. It relies - * on the default width. - * @param type Type of message. - * @param title Title of the message. - * @param text Text of the message. - * @param buttons An array of objects to be presented as buttons. - * @return The index of the selected button, starting from 1. - */ - public static int showOptions(int type, String title, - String text, Object... buttons) { - return MessageUtils.showOptions(type, title, text, buttons); - } - - /** - * Shows a message with a text input. - * @param width Integer value, in pixels. - * @param type Type of message. - * @param title Title of the message. - * @param text Text of the message. - * @return The string representing the input text. - */ - public static String showInput(int width, int type, - String title, String text) { - return MessageUtils.showInput(width, type, title, text); - } - - /** - * Shows a message with a text input. It relies on the default width. - * @param type Type of message. - * @param title Title of the message. - * @param text Text of the message. - * @return The string representing the input text. - */ - public static String showInput(int type, String title, String text) { - return MessageUtils.showInput(type, title, text); - } - - /** - * Shows a message with options presented as a dropdown list of elements. - * @param width Integer value, in pixels. - * @param type Type of message. - * @param title Title of the message. - * @param text Text of the message. - * @param elements An array of objects representing the elements. - * @return The index of the selected element, starting from 1. - */ - public static int showDropdown(int width, int type, String title, - String text, Object... elements) { - return MessageUtils.showDropdown(width, type, title, text, elements); - } - - /** - * Shows a message with options presented as a dropdown list of elements. It - * relies on the default width. - * @param type Type of message. - * @param title Title of the message. - * @param text Text of the message. - * @param elements An array of objects representing the elements. - * @return The index of the selected element, starting from 1. - */ - public static int showDropdown(int type, String title, - String text, Object... elements) { - return MessageUtils.showDropdown(type, title, text, elements); - } - - /** - * Checks if the provided command name is reachable from the system path. - * @param command A string representing the command. - * @return A logic value. - */ - public static boolean isOnPath(String command) { - return CommonUtils.isOnPath(command); - } - - /** - * Gets the full basename. - * @param file The file. - * @return The full basename of the provided file. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static String getFullBasename(File file) throws AraraException { - if (file.isFile()) { - return CommonUtils.getFullBasename(file); - } else { - throw new AraraException( - CommonUtils.getRuleErrorHeader().concat( - messages.getMessage( - Messages.ERROR_BASENAME_NOT_A_FILE, - file.getName() - ) - ) - ); - } - } - - /** - * Gets the full basename. - * @param name The string. - * @return The full basename. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static String getFullBasename(String name) throws AraraException { - return getFullBasename(new File(name)); - } - - /** - * Unsafely executes a system command from the underlying operating system - * and returns a pair containing the exit status and the command output as a - * string. - * @param command The system command to be executed. - * @return A pair containing the exit status and the system command output - * as a string. - */ - public static Pair<Integer, String> - unsafelyExecuteSystemCommand(Command command) { - return UnsafeUtils.executeSystemCommand(command); - } - - /** - * Merges the provided template with a context map and writes the result in - * an output file. This method relies on Apache Velocity. - * @param input The input file. - * @param output The output file. - * @param map The context map. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static void mergeVelocityTemplate(File input, File output, - Map<String, Object> map) throws AraraException { - VelocityUtils.mergeVelocityTemplate(input, output, map); - } - - /** - * Gets the file reference for the current directive. It is important to - * observe that version 4.0 of arara replicates the directive when 'files' - * is detected amongst the parameters, so each instance will have a - * different reference. - * @return A file reference for the current directive. - */ - public static File currentFile() { - return (File) ConfigurationController.getInstance(). - get("execution.directive.reference"); - } - - /** - * Loads a class from the provided file, potentially a Java archive. - * @param file File containing the Java bytecode (namely, a JAR). - * @param name The canonical name of the class. - * @return A pair representing the status and the class. - */ - public static Pair<Integer, Class> loadClass(File file, String name) { - return ClassLoadingUtils.loadClass(file, name); - } - - /** - * Loads a class from the provided string reference, representing a file. - * @param ref String reference representing a file. - * @param name The canonical name of the class. - * @return A pair representing the status and the class. - */ - public static Pair<Integer, Class> loadClass(String ref, String name) { - return ClassLoadingUtils.loadClass(new File(ref), name); - } - - /** - * Loads a class from the provided file, instantiating it. - * @param file File containing the Java bytecode (namely, a JAR). - * @param name The canonical name of the class. - * @return A pair representing the status and the class object. - */ - public static Pair<Integer, Object> loadObject(File file, String name) { - return ClassLoadingUtils.loadObject(file, name); - } - - /** - * Loads a class from the provided string reference, instantiating it. - * @param ref String reference representing a file. - * @param name The canonical name of the class. - * @return A pair representing the status and the class object. - */ - public static Pair<Integer, Object> loadObject(String ref, String name) { - return ClassLoadingUtils.loadObject(new File(ref), name); - } - - /** - * List all files from the provided directory according to the list of - * extensions. The leading dot must be omitted, unless it is part of the - * extension. - * @param directory The provided directory. - * @param extensions The list of extensions. - * @param recursive A flag indicating whether the search is recursive. - * @return A list of files. - */ - public static List<File> listFilesByExtensions(File directory, - List<String> extensions, boolean recursive) { - return FileSearchingUtils.listFilesByExtensions( - directory, - extensions, - recursive - ); - } - - /** - * List all files from the provided string path according to the list of - * extensions. The leading dot must be omitted, unless it is part of the - * extension. - * @param path The provided path as plain string. - * @param extensions The list of extensions. - * @param recursive A flag indicating whether the search is recursive. - * @return A list of files. - */ - public static List<File> listFilesByExtensions(String path, - List<String> extensions, boolean recursive) { - return FileSearchingUtils.listFilesByExtensions( - new File(path), - extensions, - recursive - ); - } - - /** - * List all files from the provided directory matching the list of file - * name patterns. Such list can contain wildcards. - * @param directory The provided directory. - * @param patterns The list of file name patterns. - * @param recursive A flag indicating whether the search is recursive. - * @return A list of files. - */ - public static List<File> listFilesByPatterns(File directory, - List<String> patterns, boolean recursive) { - return FileSearchingUtils.listFilesByPatterns( - directory, - patterns, - recursive - ); - } - - /** - * List all files from the provided path matching the list of file - * name patterns. Such list can contain wildcards. - * @param path The provided path as plain string. - * @param patterns The list of file name patterns. - * @param recursive A flag indicating whether the search is recursive. - * @return A list of files. - */ - public static List<File> listFilesByPatterns(String path, - List<String> patterns, boolean recursive) { - return FileSearchingUtils.listFilesByPatterns( - new File(path), - patterns, - recursive - ); - } - - /** - * Writes the string to a file, using UTF-8 as default encoding. - * @param file The file. - * @param text The string to be written. - * @param append A flag whether to append the content. - * @return A logical value indicating whether it was successful. - */ - public static boolean writeToFile(File file, String text, boolean append) { - return FileHandlingUtils.writeToFile(file, text, append); - } - - /** - * Writes the string to a file, using UTF-8 as default encoding. - * @param path The path. - * @param text The string to be written. - * @param append A flag whether to append the content. - * @return A logical value indicating whether it was successful. - */ - public static boolean writeToFile(String path, String text, - boolean append) { - return FileHandlingUtils.writeToFile(new File(path), text, append); - } - - /** - * Writes the string list to a file, using UTF-8 as default encoding. - * @param file The file. - * @param lines The string list to be written. - * @param append A flag whether to append the content. - * @return A logical value indicating whether it was successful. - */ - public static boolean writeToFile(File file, List<String> lines, - boolean append) { - return FileHandlingUtils.writeToFile(file, lines, append); - } - - /** - * Writes the string list to a file, using UTF-8 as default encoding. - * @param path The path. - * @param lines The string list to be written. - * @param append A flag whether to append the content. - * @return A logical value indicating whether it was successful. - */ - public static boolean writeToFile(String path, List<String> lines, - boolean append) { - return FileHandlingUtils.writeToFile(new File(path), lines, append); - } - - /** - * Reads the provided file into a list of strings. - * @param file The file. - * @return A list of strings. - */ - public static List<String> readFromFile(File file) { - return FileHandlingUtils.readFromFile(file); - } - - /** - * Reads the provided file into a list of strings. - * @param path The path. - * @return A list of strings. - */ - public static List<String> readFromFile(String path) { - return FileHandlingUtils.readFromFile(new File(path)); - } - - /** - * Checks whether a directory is under the project directory. - * @param directory The directory to be inspected. - * @return Logical value indicating whether the directoy is under root. - * @throws AraraException There was a problem with path retrieval. - */ - public static boolean isSubdirectory(File directory) - throws AraraException { - return CommonUtils.isSubDirectory(directory, getOriginalReference()); - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/utils/RuleUtils.java b/support/arara/source/src/main/java/com/github/cereda/arara/utils/RuleUtils.java deleted file mode 100644 index f2fb1c8570..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/utils/RuleUtils.java +++ /dev/null @@ -1,244 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.utils; - -import com.github.cereda.arara.controller.LanguageController; -import com.github.cereda.arara.model.AraraException; -import com.github.cereda.arara.model.Argument; -import com.github.cereda.arara.model.Messages; -import com.github.cereda.arara.model.RuleCommand; -import com.github.cereda.arara.model.Rule; -import java.io.File; -import java.io.FileReader; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.collections4.Predicate; -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; - -/** - * Implements rule utilitary methods. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class RuleUtils { - - // the application messages obtained from the - // language controller - private static final LanguageController messages = - LanguageController.getInstance(); - - /** - * Parses the provided file, checks the identifier and returns a rule - * representation. - * @param file The rule file. - * @param identifier The directive identifier. - * @return The rule object. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - public static Rule parseRule(File file, String identifier) - throws AraraException { - Representer representer = new Representer(); - representer.addClassTag(Rule.class, new Tag("!config")); - Yaml yaml = new Yaml(new Constructor(Rule.class), representer); - Rule rule = null; - try { - rule = yaml.loadAs(new FileReader(file), Rule.class); - } catch (MarkedYAMLException yamlException) { - throw new AraraException( - CommonUtils.getRuleErrorHeader().concat( - messages.getMessage( - Messages.ERROR_PARSERULE_INVALID_YAML - ) - ), - yamlException - ); - } catch (Exception exception) { - throw new AraraException( - CommonUtils.getRuleErrorHeader().concat( - messages.getMessage( - Messages.ERROR_PARSERULE_GENERIC_ERROR - ) - ) - ); - } - validateHeader(rule, identifier); - validateBody(rule); - return rule; - } - - /** - * Validates the rule header according to the directive identifier. - * @param rule The rule object. - * @param identifier The directive identifier. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - private static void validateHeader(Rule rule, String identifier) - throws AraraException { - if (rule.getIdentifier() != null) { - if (!rule.getIdentifier().equals(identifier)) { - throw new AraraException(CommonUtils.getRuleErrorHeader(). - concat( - messages.getMessage( - Messages.ERROR_VALIDATEHEADER_WRONG_IDENTIFIER, - rule.getIdentifier(), - identifier - ) - ) - ); - } - } else { - throw new AraraException( - CommonUtils.getRuleErrorHeader().concat( - messages.getMessage( - Messages.ERROR_VALIDATEHEADER_NULL_ID - ) - ) - ); - } - if (rule.getName() == null) { - throw new AraraException( - CommonUtils.getRuleErrorHeader().concat( - messages.getMessage( - Messages.ERROR_VALIDATEHEADER_NULL_NAME - ) - ) - ); - } - } - - /** - * Validates the rule body. - * @param rule The rule object. - * @throws AraraException Something wrong happened, to be caught in the - * higher levels. - */ - private static void validateBody(Rule rule) throws AraraException { - if (rule.getCommands() == null) { - throw new AraraException( - CommonUtils.getRuleErrorHeader().concat( - messages.getMessage( - Messages.ERROR_VALIDATEBODY_NULL_COMMANDS_LIST - ) - ) - ); - } else { - if (CollectionUtils.exists(rule.getCommands(), - new Predicate<RuleCommand>() { - public boolean evaluate(RuleCommand command) { - return (command.getCommand() == null); - } - })) { - throw new AraraException(CommonUtils.getRuleErrorHeader(). - concat( - messages.getMessage( - Messages.ERROR_VALIDATEBODY_NULL_COMMAND - ) - ) - ); - } - } - if (rule.getArguments() == null) { - throw new AraraException( - CommonUtils.getRuleErrorHeader().concat( - messages.getMessage( - Messages.ERROR_VALIDATEBODY_ARGUMENTS_LIST - ) - ) - ); - } else { - String[] keywords = new String[]{"file", "files", "reference"}; - - List<String> arguments = new ArrayList<String>(); - for (Argument argument : rule.getArguments()) { - if (argument.getIdentifier() != null) { - if ((argument.getFlag() != null) || - (argument.getDefault() != null)) { - arguments.add(argument.getIdentifier()); - } else { - throw new AraraException( - CommonUtils.getRuleErrorHeader().concat( - messages.getMessage( - Messages.ERROR_VALIDATEBODY_MISSING_KEYS - ) - ) - ); - } - } else { - throw new AraraException( - CommonUtils.getRuleErrorHeader().concat( - messages.getMessage( - Messages.ERROR_VALIDATEBODY_NULL_ARGUMENT_ID - ) - ) - ); - } - } - - for (String keyword : keywords) { - if (arguments.contains(keyword)) { - throw new AraraException( - CommonUtils.getRuleErrorHeader().concat( - messages.getMessage( - Messages.ERROR_VALIDATEBODY_ARGUMENT_ID_IS_RESERVED, - keyword - ) - ) - ); - } - } - - int expected = arguments.size(); - int found = (new HashSet<String>(arguments)).size(); - if (expected != found) { - throw new AraraException( - CommonUtils.getRuleErrorHeader().concat( - messages.getMessage( - Messages.ERROR_VALIDATEBODY_DUPLICATE_ARGUMENT_IDENTIFIERS - ) - ) - ); - } - } - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/utils/TeeOutputStream.java b/support/arara/source/src/main/java/com/github/cereda/arara/utils/TeeOutputStream.java deleted file mode 100644 index 58418ea62d..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/utils/TeeOutputStream.java +++ /dev/null @@ -1,109 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.utils; - -import java.io.IOException; -import java.io.OutputStream; -import org.apache.commons.io.IOUtils; - -/** - * Implements a stream splitter. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class TeeOutputStream extends OutputStream { - - // an array of streams in which - // an object of this class will - // split data - private final OutputStream[] streams; - - /** - * Constructor. - * @param outputStreams An array of output streams. - */ - public TeeOutputStream(OutputStream... outputStreams) { - streams = outputStreams; - } - - /** - * Writes the provided integer to each stream. - * @param b The provided integer - * @throws IOException An IO exception. - */ - @Override - public void write(int b) throws IOException { - for (OutputStream ostream : streams) { - ostream.write(b); - } - } - - /** - * Writes the provided byte array to each stream, with the provided offset - * and length. - * @param b The byte array. - * @param offset The offset. - * @param length The length. - * @throws IOException An IO exception. - */ - @Override - public void write(byte[] b, int offset, int length) throws IOException { - for (OutputStream ostream : streams) { - ostream.write(b, offset, length); - } - } - - /** - * Flushes every stream. - * @throws IOException An IO exception. - */ - @Override - public void flush() throws IOException { - for (OutputStream ostream : streams) { - ostream.flush(); - } - } - - /** - * Closes every stream silently. - */ - @Override - public void close() { - for (OutputStream ostream : streams) { - IOUtils.closeQuietly(ostream); - } - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/utils/UnsafeUtils.java b/support/arara/source/src/main/java/com/github/cereda/arara/utils/UnsafeUtils.java deleted file mode 100644 index d5a4058b3e..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/utils/UnsafeUtils.java +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.utils; - -import com.github.cereda.arara.model.Command; -import com.github.cereda.arara.model.Pair; -import org.zeroturnaround.exec.ProcessExecutor; -import org.zeroturnaround.exec.ProcessResult; - -/** - * Implements unsafe utilitary methods. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class UnsafeUtils { - - /** - * Executes a system command from the underlying operating system and - * returns a pair containing the exit status and the command output as a - * string. - * @param command The system command to be executed. - * @return A pair containing the exit status and the system command output - * as a string. - */ - public static Pair<Integer, String> executeSystemCommand(Command command) { - - try { - - // create a process result with the provided - // command, capturing the output - ProcessResult result = new ProcessExecutor( - command.getElements() - ).readOutput(true).execute(); - - // return the pair containing the exit status - // and the output string as UTF-8 - return new Pair<Integer, String>( - result.getExitValue(), - result.outputUTF8() - ); - - } catch (Exception exception) { - - // quack, quack, do nothing, just - // return a default error code - - // if something goes wrong, the default - // error branch returns an exit status of - // -99 and an empty string - return new Pair<Integer, String>(-99, ""); - - } - } - -} diff --git a/support/arara/source/src/main/java/com/github/cereda/arara/utils/VelocityUtils.java b/support/arara/source/src/main/java/com/github/cereda/arara/utils/VelocityUtils.java deleted file mode 100644 index 3f94adc909..0000000000 --- a/support/arara/source/src/main/java/com/github/cereda/arara/utils/VelocityUtils.java +++ /dev/null @@ -1,157 +0,0 @@ -/** - * Arara, the cool TeX automation tool - * Copyright (c) 2012 -- 2019, 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. - */ -package com.github.cereda.arara.utils; - -import com.github.cereda.arara.controller.LanguageController; -import com.github.cereda.arara.model.AraraException; -import com.github.cereda.arara.model.Messages; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.io.Writer; -import java.util.Map; -import org.apache.velocity.Template; -import org.apache.velocity.VelocityContext; -import org.apache.velocity.app.VelocityEngine; -import org.apache.velocity.exception.MethodInvocationException; -import org.apache.velocity.exception.ParseErrorException; -import org.apache.velocity.exception.ResourceNotFoundException; -import org.apache.velocity.runtime.RuntimeConstants; - -/** - * Implements the template merging from Apache Velocity. - * @author Paulo Roberto Massa Cereda - * @version 4.0 - * @since 4.0 - */ -public class VelocityUtils { - - // the language controller - private static final LanguageController messages = - LanguageController.getInstance(); - - /** - * Merges the provided template with the context map and writes the result - * in an output file. The operation relies on the Apache Velocity project. - * @param input The input file. - * @param output The output file. - * @param map The context map. - * @throws AraraException Something terribly wrong happened, to be caught - * in the higher levels. - */ - public static void mergeVelocityTemplate(File input, File output, - Map<String, Object> map) throws AraraException { - - // let us try - try { - - // create the template engine instance - VelocityEngine engine = new VelocityEngine(); - - // use the resource path trick: set the default - // location to the input file's parent directory, - // so our file is easily located - engine.setProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, - input.getCanonicalFile().getParent()); - - // set the logging feature of Apache Velocity to - // register the occurrences in a null provider - // (we do not want unnecessary verbose output) - engine.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, - "org.apache.velocity.runtime.log.NullLogSystem"); - - // init the engine with the - // provided settings - engine.init(); - - // create a context for Apache Velocity, - // based on the provided map - VelocityContext context = new VelocityContext(map); - - // get the template from the engine and - // read it as an UTF-8 file - Template template = engine.getTemplate(input.getName(), "UTF-8"); - - // create an output stream from - // the file output reference - FileOutputStream stream = new FileOutputStream(output); - - // create a writer based on the - // previously created stream - Writer writer = new OutputStreamWriter(stream, "UTF-8"); - - // merge the context map with the - // template file and write the result - // to the output stream writer - template.merge(context, writer); - - // close both writer - // and output stream - writer.close(); - stream.close(); - - } catch(ResourceNotFoundException rnfexception) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_VELOCITY_FILE_NOT_FOUND - ), - rnfexception - ); - } catch(ParseErrorException peexception) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_VELOCITY_PARSE_EXCEPTION - ), - peexception - ); - } catch(MethodInvocationException miexception) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_VELOCITY_METHOD_INVOCATION_EXCEPTION - ), - miexception - ); - } catch (IOException ioexception) { - throw new AraraException( - messages.getMessage( - Messages.ERROR_VELOCITY_FILE_NOT_FOUND - ), - ioexception - ); - } - - } - -} |