View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.maven.model.building;
20  
21  import java.io.File;
22  import java.util.concurrent.atomic.AtomicReference;
23  
24  import org.apache.maven.api.model.Dependency;
25  import org.apache.maven.api.model.Parent;
26  import org.apache.maven.api.model.Repository;
27  import org.apache.maven.model.Model;
28  import org.apache.maven.model.resolution.InvalidRepositoryException;
29  import org.apache.maven.model.resolution.ModelResolver;
30  import org.apache.maven.model.resolution.UnresolvableModelException;
31  import org.junit.jupiter.api.Test;
32  
33  import static org.junit.jupiter.api.Assertions.assertNotNull;
34  import static org.junit.jupiter.api.Assertions.assertThrows;
35  
36  /**
37   */
38  class DefaultModelBuilderTest {
39  
40      private static final String BASE1_ID = "thegroup:base1:pom";
41  
42      private static final String BASE1 = "<project>\n" + "  <modelVersion>4.0.0</modelVersion>\n"
43              + "  <groupId>thegroup</groupId>\n"
44              + "  <artifactId>base1</artifactId>\n"
45              + "  <version>1</version>\n"
46              + "  <packaging>pom</packaging>\n"
47              + "  <dependencyManagement>\n"
48              + "    <dependencies>\n"
49              + "      <dependency>\n"
50              + "        <groupId>thegroup</groupId>\n"
51              + "        <artifactId>base2</artifactId>\n"
52              + "        <version>1</version>\n"
53              + "        <type>pom</type>\n"
54              + "        <scope>import</scope>\n"
55              + "      </dependency>\n"
56              + "    </dependencies>\n"
57              + "  </dependencyManagement>\n"
58              + "</project>\n";
59  
60      private static final String BASE2_ID = "thegroup:base2:pom";
61  
62      private static final String BASE2 = "<project>\n" + "  <modelVersion>4.0.0</modelVersion>\n"
63              + "  <groupId>thegroup</groupId>\n"
64              + "  <artifactId>base2</artifactId>\n"
65              + "  <version>1</version>\n"
66              + "  <packaging>pom</packaging>\n"
67              + "  <dependencyManagement>\n"
68              + "    <dependencies>\n"
69              + "      <dependency>\n"
70              + "        <groupId>thegroup</groupId>\n"
71              + "        <artifactId>base1</artifactId>\n"
72              + "        <version>1</version>\n"
73              + "        <type>pom</type>\n"
74              + "        <scope>import</scope>\n"
75              + "      </dependency>\n"
76              + "    </dependencies>\n"
77              + "  </dependencyManagement>\n"
78              + "</project>\n";
79  
80      @Test
81      void testCycleInImports() throws Exception {
82          ModelBuilder builder = new DefaultModelBuilderFactory().newInstance();
83          assertNotNull(builder);
84  
85          DefaultModelBuildingRequest request = new DefaultModelBuildingRequest();
86          request.setModelSource(new StringModelSource(BASE1));
87          request.setModelResolver(new CycleInImportsResolver());
88  
89          assertThrows(ModelBuildingException.class, () -> builder.build(request));
90      }
91  
92      static class CycleInImportsResolver extends BaseModelResolver {
93          @Override
94          public ModelSource resolveModel(org.apache.maven.model.Dependency dependency)
95                  throws UnresolvableModelException {
96              switch (dependency.getManagementKey()) {
97                  case BASE1_ID:
98                      return new StringModelSource(BASE1);
99                  case BASE2_ID:
100                     return new StringModelSource(BASE2);
101             }
102             return null;
103         }
104     }
105 
106     static class BaseModelResolver implements ModelResolver {
107         @Override
108         public ModelSource resolveModel(String groupId, String artifactId, String version)
109                 throws UnresolvableModelException {
110             return null;
111         }
112 
113         @Override
114         public ModelSource resolveModel(Parent parent, AtomicReference<Parent> modified)
115                 throws UnresolvableModelException {
116             return null;
117         }
118 
119         @Override
120         public ModelSource resolveModel(Dependency dependency, AtomicReference<Dependency> modified)
121                 throws UnresolvableModelException {
122             return null;
123         }
124 
125         @Override
126         public void addRepository(Repository repository) throws InvalidRepositoryException {}
127 
128         @Override
129         public void addRepository(Repository repository, boolean replace) throws InvalidRepositoryException {}
130 
131         @Override
132         public ModelResolver newCopy() {
133             return this;
134         }
135 
136         @Override
137         public ModelSource resolveModel(org.apache.maven.model.Parent parent) throws UnresolvableModelException {
138             return null;
139         }
140 
141         @Override
142         public ModelSource resolveModel(org.apache.maven.model.Dependency dependency)
143                 throws UnresolvableModelException {
144             return null;
145         }
146 
147         @Override
148         public void addRepository(org.apache.maven.model.Repository repository) throws InvalidRepositoryException {}
149 
150         @Override
151         public void addRepository(org.apache.maven.model.Repository repository, boolean replace)
152                 throws InvalidRepositoryException {}
153     }
154 
155     @Test
156     void testBuildRawModel() throws Exception {
157         ModelBuilder builder = new DefaultModelBuilderFactory().newInstance();
158         assertNotNull(builder);
159 
160         Result<? extends Model> res = builder.buildRawModel(
161                 new File(getClass().getResource("/poms/factory/simple.xml").getFile()),
162                 ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL,
163                 false);
164         assertNotNull(res.get());
165     }
166 }