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   * @author Guillaume Nodet
38   */
39  class DefaultModelBuilderTest {
40  
41      private static final String BASE1_ID = "thegroup:base1:pom";
42  
43      private static final String BASE1 = "<project>\n" + "  <modelVersion>4.0.0</modelVersion>\n"
44              + "  <groupId>thegroup</groupId>\n"
45              + "  <artifactId>base1</artifactId>\n"
46              + "  <version>1</version>\n"
47              + "  <packaging>pom</packaging>\n"
48              + "  <dependencyManagement>\n"
49              + "    <dependencies>\n"
50              + "      <dependency>\n"
51              + "        <groupId>thegroup</groupId>\n"
52              + "        <artifactId>base2</artifactId>\n"
53              + "        <version>1</version>\n"
54              + "        <type>pom</type>\n"
55              + "        <scope>import</scope>\n"
56              + "      </dependency>\n"
57              + "    </dependencies>\n"
58              + "  </dependencyManagement>\n"
59              + "</project>\n";
60  
61      private static final String BASE2_ID = "thegroup:base2:pom";
62  
63      private static final String BASE2 = "<project>\n" + "  <modelVersion>4.0.0</modelVersion>\n"
64              + "  <groupId>thegroup</groupId>\n"
65              + "  <artifactId>base2</artifactId>\n"
66              + "  <version>1</version>\n"
67              + "  <packaging>pom</packaging>\n"
68              + "  <dependencyManagement>\n"
69              + "    <dependencies>\n"
70              + "      <dependency>\n"
71              + "        <groupId>thegroup</groupId>\n"
72              + "        <artifactId>base1</artifactId>\n"
73              + "        <version>1</version>\n"
74              + "        <type>pom</type>\n"
75              + "        <scope>import</scope>\n"
76              + "      </dependency>\n"
77              + "    </dependencies>\n"
78              + "  </dependencyManagement>\n"
79              + "</project>\n";
80  
81      @Test
82      void testCycleInImports() throws Exception {
83          ModelBuilder builder = new DefaultModelBuilderFactory().newInstance();
84          assertNotNull(builder);
85  
86          DefaultModelBuildingRequest request = new DefaultModelBuildingRequest();
87          request.setModelSource(new StringModelSource(BASE1));
88          request.setModelResolver(new CycleInImportsResolver());
89  
90          assertThrows(ModelBuildingException.class, () -> builder.build(request));
91      }
92  
93      static class CycleInImportsResolver extends BaseModelResolver {
94          @Override
95          public ModelSource resolveModel(org.apache.maven.model.Dependency dependency)
96                  throws UnresolvableModelException {
97              switch (dependency.getManagementKey()) {
98                  case BASE1_ID:
99                      return new StringModelSource(BASE1);
100                 case BASE2_ID:
101                     return new StringModelSource(BASE2);
102             }
103             return null;
104         }
105     }
106 
107     static class BaseModelResolver implements ModelResolver {
108         @Override
109         public ModelSource resolveModel(String groupId, String artifactId, String version)
110                 throws UnresolvableModelException {
111             return null;
112         }
113 
114         @Override
115         public ModelSource resolveModel(Parent parent, AtomicReference<Parent> modified)
116                 throws UnresolvableModelException {
117             return null;
118         }
119 
120         @Override
121         public ModelSource resolveModel(Dependency dependency, AtomicReference<Dependency> modified)
122                 throws UnresolvableModelException {
123             return null;
124         }
125 
126         @Override
127         public void addRepository(Repository repository) throws InvalidRepositoryException {}
128 
129         @Override
130         public void addRepository(Repository repository, boolean replace) throws InvalidRepositoryException {}
131 
132         @Override
133         public ModelResolver newCopy() {
134             return this;
135         }
136 
137         @Override
138         public ModelSource resolveModel(org.apache.maven.model.Parent parent) throws UnresolvableModelException {
139             return null;
140         }
141 
142         @Override
143         public ModelSource resolveModel(org.apache.maven.model.Dependency dependency)
144                 throws UnresolvableModelException {
145             return null;
146         }
147 
148         @Override
149         public void addRepository(org.apache.maven.model.Repository repository) throws InvalidRepositoryException {}
150 
151         @Override
152         public void addRepository(org.apache.maven.model.Repository repository, boolean replace)
153                 throws InvalidRepositoryException {}
154     }
155 
156     @Test
157     void testBuildRawModel() throws Exception {
158         ModelBuilder builder = new DefaultModelBuilderFactory().newInstance();
159         assertNotNull(builder);
160 
161         Result<? extends Model> res = builder.buildRawModel(
162                 new File(getClass().getResource("/poms/factory/simple.xml").getFile()),
163                 ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL,
164                 false);
165         assertNotNull(res.get());
166     }
167 }