All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.viadee.bpm.vPAV.config.reader.XmlConfigReader Maven / Gradle / Ivy

Go to download

The tool checks Camunda projects for consistency and discovers errors in process-driven applications. Called as a Maven plugin or JUnit test, it discovers esp. inconsistencies of a given BPMN model in the classpath and the sourcecode of an underlying java project, such as a delegate reference to a non-existing java class or a non-existing Spring bean.

There is a newer version: 3.0.8
Show newest version
/**
 * BSD 3-Clause License
 *
 * Copyright © 2019, viadee Unternehmensberatung AG
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * * Redistributions of source code must retain the above copyright notice, this
 *   list of conditions and the following disclaimer.
 *
 * * 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.
 *
 * * Neither the name of the copyright holder 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 de.viadee.bpm.vPAV.config.reader;

import de.viadee.bpm.vPAV.RuntimeConfig;
import de.viadee.bpm.vPAV.config.model.*;
import de.viadee.bpm.vPAV.constants.ConfigConstants;
import de.viadee.bpm.vPAV.processing.checker.DataFlowChecker;
import de.viadee.bpm.vPAV.processing.checker.ProcessVariablesModelChecker;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

/**
 * Used to read the config file (ruleSet.xml) and extract the configured rules Requirements:
 * Existing ruleSet.xml in src/test/resources
 */
public final class XmlConfigReader implements ConfigReader {
    private static final Logger LOGGER = Logger.getLogger(XmlConfigReader.class.getName());

    /**
     * @param file Location of file relative to project
     * @throws ConfigReaderException If file can not be found in classpath
     */
    @Override
    public Map> read(final String file) throws ConfigReaderException {

        try {
            final JAXBContext jaxbContext = JAXBContext.newInstance(XmlRuleSet.class);
            final Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

            InputStream fRuleSet = RuntimeConfig.getInstance().getClassLoader().getResourceAsStream(file);

            if (fRuleSet != null) {
                final XmlRuleSet ruleSet = (XmlRuleSet) jaxbUnmarshaller.unmarshal(fRuleSet);
                return transformFromXmlDatastructues(ruleSet);
            } else {
                throw new ConfigReaderException("ConfigFile could not be found");
            }
        } catch (JAXBException e) {
            throw new ConfigReaderException(e);
        }
    }

    /**
     * Retrieves all rules, by default deactivated
     *
     * @return rules
     */
    public Map> getDeactivatedRuleSet() {
        final Map> rules = new HashMap<>();
        Map newrule;

        for (String name : RuntimeConfig.getInstance().getViadeeRules()) {
            newrule = new HashMap<>();

            if (name.equals("CreateOutputHTML")) {
                newrule.put(
                        name,
                        new Rule(
                                name,
                                true,
                                null,
                                new HashMap(),
                                new ArrayList(),
                                new ArrayList()));
            } else {
                newrule.put(
                        name,
                        new Rule(
                                name,
                                false,
                                null,
                                new HashMap(),
                                new ArrayList(),
                                new ArrayList()));
            }
            rules.put(name, newrule);
        }

        return rules;
    }

    /**
     * Transforms XmlRuleSet to rules
     *
     * @param ruleSet
     * @return rules
     * @throws ConfigReaderException If file could not be read properly
     */
    private static Map> transformFromXmlDatastructues(
            final XmlRuleSet ruleSet) throws ConfigReaderException {
        final Map> rules = new HashMap<>();

        final Collection xmlRules = ruleSet.getRules();
        for (final XmlRule rule : xmlRules) {
            final String id = (rule.getId() == null) ? rule.getName() : rule.getId();
            final String name = rule.getName();
            if (name == null) throw new ConfigReaderException("rule name is not set");
            final boolean state = rule.isState();
            final String ruleDescription = rule.getDescription();
            final Collection xmlElementConventions = rule.getElementConventions();
            final ArrayList elementConventions = new ArrayList();
            if (xmlElementConventions != null) {
                for (final XmlElementConvention xmlElementConvention : xmlElementConventions) {
                    final XmlElementFieldTypes xmlElementFieldTypes =
                            xmlElementConvention.getElementFieldTypes();
                    ElementFieldTypes elementFieldTypes = null;
                    if (xmlElementFieldTypes != null) {
                        elementFieldTypes =
                                new ElementFieldTypes(
                                        xmlElementFieldTypes.getElementFieldTypes(), xmlElementFieldTypes.isExcluded());
                    }
                    if (!checkRegEx(xmlElementConvention.getPattern()))
                        throw new ConfigReaderException(
                                "RegEx ("
                                        + xmlElementConvention.getPattern()
                                        + ") of "
                                        + name
                                        + " ("
                                        + xmlElementConvention.getName()
                                        + ") is incorrect");
                    elementConventions.add(
                            new ElementConvention(
                                    xmlElementConvention.getName(),
                                    elementFieldTypes,
                                    xmlElementConvention.getDescription(),
                                    xmlElementConvention.getPattern()));
                }
            }
            final Collection xmlModelConventions = rule.getModelConventions();
            final ArrayList modelConventions = new ArrayList();
            if (xmlModelConventions != null) {
                for (final XmlModelConvention xmlModelConvention : xmlModelConventions) {
                    modelConventions.add(new ModelConvention(xmlModelConvention.getType()));
                }
            }
            final Collection xmlSettings = rule.getSettings();
            final Map settings = new HashMap();
            if (xmlSettings != null) {
                for (final XmlSetting xmlSetting : xmlSettings) {
                    if (!settings.containsKey(xmlSetting.getName())) {
                        settings.put(
                                xmlSetting.getName(),
                                new Setting(
                                        xmlSetting.getName(),
                                        xmlSetting.getScript(),
                                        xmlSetting.getType(),
                                        xmlSetting.getId(),
                                        xmlSetting.getRequired(),
                                        xmlSetting.getValue()));
                    } else {
                        settings.get(xmlSetting.getName()).addScriptPlace(xmlSetting.getScript());
                    }
                }
            }

            if (!rules.containsKey(name)) {
                rules.put(name, new HashMap());
            }
            rules.get(name).put(id, new Rule(id, name, state, ruleDescription, settings, elementConventions, modelConventions));
        }

        // TODO as soon as we finally move the properties to an external file, we don't need this checks anymore
        // Some rules are only allowed once. Check this.
        checkSingletonRule(rules, ConfigConstants.HASPARENTRULESET);
        checkSingletonRule(rules, ConfigConstants.CREATE_OUTPUT_RULE);
        checkSingletonRule(rules, "language");

        if (ProcessVariablesModelChecker.isSingletonChecker()) {
            checkSingletonRule(rules, ProcessVariablesModelChecker.class.getSimpleName());
        }

        if (DataFlowChecker.isSingletonChecker()) {
            checkSingletonRule(rules, DataFlowChecker.class.getSimpleName());
        }

        return rules;
    }

    private static void checkSingletonRule(Map> rules, String rulename) {
        Map rulesSubset = rules.get(rulename);
        if (rulesSubset != null) {
            if (rulesSubset.size() > 1 || rulesSubset.get(rulename) == null) {
                LOGGER.severe("Rule '" + rulename + "' is only allowed once and without defining an ID.");
            }
        }
    }

    private static boolean checkRegEx(String regEx) {
        boolean correct = false;

        if (regEx.isEmpty()) return correct;

        try {
            Pattern.compile(regEx);
            correct = true;
        } catch (PatternSyntaxException e) {
        }
        return correct;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy