View Javadoc
1   /*
2    * SPDX-FileCopyrightText: Copyright (c) 2011-2026 Yegor Bugayenko
3    * SPDX-License-Identifier: MIT
4    */
5   package com.qulice.maven;
6   
7   import com.jcabi.xml.XML;
8   import com.jcabi.xml.XMLDocument;
9   import com.qulice.spi.Environment;
10  import com.qulice.spi.ValidationException;
11  import java.io.File;
12  import java.io.IOException;
13  import java.nio.charset.StandardCharsets;
14  import org.apache.commons.io.FileUtils;
15  
16  /**
17   * Check pom.xml with XPath validation queries.
18   *
19   * <p>Restrictions:
20   *
21   * <ol>
22   * <li>Each xpath component should contains namespace prefix pom:</li>
23   * <li>Each xpath query should end with /text()</li>
24   * </ol>
25   *
26   * @since 0.6
27   */
28  public final class PomXpathValidator implements MavenValidator {
29  
30      /**
31       * Default constructor.
32       */
33      public PomXpathValidator() {
34          // nothing to initialize
35      }
36  
37      @Override
38      public void validate(final MavenEnvironment env)
39          throws ValidationException {
40          PomXpathValidator.validate(PomXpathValidator.pom(env), env.asserts());
41      }
42  
43      /**
44       * Validate pom against xpath queries.
45       * @param pom POM
46       * @param xpaths Xpath queries
47       * @throws ValidationException validation exception
48       */
49      private static void validate(final XML pom, final Iterable<String> xpaths)
50          throws ValidationException {
51          for (final String xpath : xpaths) {
52              if (pom.xpath(xpath).isEmpty()) {
53                  throw new ValidationException(
54                      String.format(
55                          "pom.xml don't match the xpath query [%s]", xpath
56                      )
57                  );
58              }
59          }
60      }
61  
62      /**
63       * Parse pom.xml.
64       * @param env Environment
65       * @return XML instance
66       */
67      private static XML pom(final Environment env) {
68          try {
69              return new XMLDocument(
70                  FileUtils.readFileToString(
71                      new File(
72                          String.format(
73                              "%s%s%s",
74                              env.basedir(),
75                              File.separator,
76                              "pom.xml"
77                          )
78                      ),
79                      StandardCharsets.UTF_8
80                  )
81              ).registerNs("pom", "http://maven.apache.org/POM/4.0.0");
82          } catch (final IOException exc) {
83              throw new IllegalArgumentException(exc);
84          }
85      }
86  }