View Javadoc
1   /*
2    * (c) Copyright 2006-2020 by rapiddweller GmbH & Volker Bergmann. All rights reserved.
3    *
4    * Redistribution and use in source and binary forms, with or without
5    * modification, is permitted under the terms of the
6    * GNU General Public License.
7    *
8    * For redistributing this software or a derivative work under a license other
9    * than the GPL-compatible Free Software License as defined by the Free
10   * Software Foundation or approved by OSI, you must first obtain a commercial
11   * license to this software product from rapiddweller GmbH & Volker Bergmann.
12   *
13   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
14   * WITHOUT A WARRANTY OF ANY KIND. ALL EXPRESS OR IMPLIED CONDITIONS,
15   * REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF
16   * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE
17   * HEREBY EXCLUDED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
18   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24   * POSSIBILITY OF SUCH DAMAGE.
25   */
26  
27  package com.rapiddweller.benerator.engine.parser.xml;
28  
29  import com.rapiddweller.benerator.engine.BeneratorRootStatement;
30  import com.rapiddweller.benerator.engine.Statement;
31  import com.rapiddweller.benerator.engine.expression.context.DefaultPageSizeExpression;
32  import com.rapiddweller.benerator.engine.statement.GenerateOrIterateStatement;
33  import com.rapiddweller.benerator.engine.statement.IfStatement;
34  import com.rapiddweller.benerator.engine.statement.RunTaskStatement;
35  import com.rapiddweller.benerator.engine.statement.WhileStatement;
36  import com.rapiddweller.common.CollectionUtil;
37  import com.rapiddweller.common.ConfigurationError;
38  import com.rapiddweller.common.ConversionException;
39  import com.rapiddweller.common.ErrorHandler;
40  import com.rapiddweller.script.DatabeneScriptParser;
41  import com.rapiddweller.script.Expression;
42  import com.rapiddweller.task.PageListener;
43  import com.rapiddweller.task.Task;
44  import org.w3c.dom.Element;
45  
46  import java.util.Set;
47  
48  import static com.rapiddweller.benerator.engine.DescriptorConstants.ATT_CLASS;
49  import static com.rapiddweller.benerator.engine.DescriptorConstants.ATT_COUNT;
50  import static com.rapiddweller.benerator.engine.DescriptorConstants.ATT_ID;
51  import static com.rapiddweller.benerator.engine.DescriptorConstants.ATT_ON_ERROR;
52  import static com.rapiddweller.benerator.engine.DescriptorConstants.ATT_PAGER;
53  import static com.rapiddweller.benerator.engine.DescriptorConstants.ATT_PAGESIZE;
54  import static com.rapiddweller.benerator.engine.DescriptorConstants.ATT_SPEC;
55  import static com.rapiddweller.benerator.engine.DescriptorConstants.ATT_STATS;
56  import static com.rapiddweller.benerator.engine.DescriptorConstants.ATT_THREADS;
57  import static com.rapiddweller.benerator.engine.DescriptorConstants.EL_RUN_TASK;
58  import static com.rapiddweller.benerator.engine.parser.xml.DescriptorParserUtil.parseBooleanExpressionAttribute;
59  import static com.rapiddweller.benerator.engine.parser.xml.DescriptorParserUtil.parseIntAttribute;
60  import static com.rapiddweller.benerator.engine.parser.xml.DescriptorParserUtil.parseLongAttribute;
61  
62  /**
63   * Parses a run-task descriptor.<br/><br/>
64   * Created: 25.10.2009 00:55:16
65   *
66   * @author Volker Bergmann
67   * @since 0.6.0
68   */
69  public class RunTaskParser extends AbstractBeneratorDescriptorParser {
70  
71    private static final Set<String> OPTIONAL_ATTRIBUTES =
72        CollectionUtil.toSet(ATT_ID, ATT_CLASS, ATT_SPEC, ATT_COUNT, ATT_PAGESIZE, ATT_THREADS, ATT_PAGER, ATT_STATS, ATT_ON_ERROR);
73    private static final DefaultPageSizeExpression/DefaultPageSizeExpression.html#DefaultPageSizeExpression">DefaultPageSizeExpression DEFAULT_PAGE_SIZE = new DefaultPageSizeExpression();
74  
75    /**
76     * Instantiates a new Run task parser.
77     */
78    public RunTaskParser() {
79      super(EL_RUN_TASK, null, OPTIONAL_ATTRIBUTES,
80          BeneratorRootStatement.class, IfStatement.class, WhileStatement.class, GenerateOrIterateStatement.class);
81    }
82  
83    @Override
84    @SuppressWarnings("unchecked")
85    public RunTaskStatement doParse(Element element, Statement[] parentPath, BeneratorParseContext context) {
86      try {
87        Expression<Task> taskProvider = (Expression<Task>) BeanParser.parseBeanExpression(element);
88        Expression<Long> count = parseLongAttribute(ATT_COUNT, element, 1);
89        Expression<Long> pageSize = parseLongAttribute(ATT_PAGESIZE, element, DEFAULT_PAGE_SIZE);
90        Expression<Integer> threads = parseIntAttribute(ATT_THREADS, element, 1);
91        Expression<PageListener> pager = parsePager(element);
92        Expression<Boolean> stats = parseBooleanExpressionAttribute(ATT_STATS, element, false);
93        Expression<ErrorHandler> errorHandler = parseOnErrorAttribute(element, element.getAttribute(ATT_ID));
94        boolean infoLog = containsLoop(parentPath);
95        return new RunTaskStatement(taskProvider, count, pageSize, pager, threads,
96            stats, errorHandler, infoLog);
97      } catch (ConversionException e) {
98        throw new ConfigurationError(e);
99      }
100   }
101 
102   @SuppressWarnings("unchecked")
103   private static Expression<PageListener> parsePager(Element element) {
104     String pagerSpec = element.getAttribute(ATT_PAGER);
105     return (Expression<PageListener>) DatabeneScriptParser.parseBeanSpec(pagerSpec);
106   }
107 
108 }