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.shared.release.transform.jdom2;
20  
21  import java.util.ArrayList;
22  import java.util.Collections;
23  import java.util.List;
24  import java.util.Properties;
25  
26  import org.apache.maven.model.Build;
27  import org.apache.maven.model.Dependency;
28  import org.apache.maven.model.DependencyManagement;
29  import org.apache.maven.model.Model;
30  import org.apache.maven.model.Parent;
31  import org.apache.maven.model.Profile;
32  import org.apache.maven.model.Reporting;
33  import org.apache.maven.model.Scm;
34  import org.jdom2.Document;
35  import org.jdom2.Element;
36  import org.jdom2.Text;
37  
38  /**
39   * JDOM2 implementation of poms PROJECT element
40   *
41   * @author Robert Scholte
42   * @since 3.0
43   */
44  public class JDomModel extends Model {
45      private final Element project;
46  
47      private final JDomModelBase modelBase;
48  
49      /**
50       * <p>Constructor for JDomModel.</p>
51       *
52       * @param document a {@link org.jdom2.Document} object
53       */
54      public JDomModel(Document document) {
55          this(document.getRootElement());
56      }
57  
58      /**
59       * <p>Constructor for JDomModel.</p>
60       *
61       * @param project a {@link org.jdom2.Element} object
62       */
63      public JDomModel(Element project) {
64          this.project = project;
65          this.modelBase = new JDomModelBase(project);
66      }
67  
68      @Override
69      public Build getBuild() {
70          return modelBase.getBuild();
71      }
72  
73      @Override
74      public List<Dependency> getDependencies() {
75          return modelBase.getDependencies();
76      }
77  
78      @Override
79      public DependencyManagement getDependencyManagement() {
80          return modelBase.getDependencyManagement();
81      }
82  
83      @Override
84      public Parent getParent() {
85          Element elm = getParentElement();
86          if (elm == null) {
87              return null;
88          } else {
89              // this way scm setters change DOM tree immediately
90              return new JDomParent(elm);
91          }
92      }
93  
94      private Element getParentElement() {
95          return project.getChild("parent", project.getNamespace());
96      }
97  
98      @Override
99      public List<Profile> getProfiles() {
100         Element profilesElm = project.getChild("profiles", project.getNamespace());
101         if (profilesElm == null) {
102             return Collections.emptyList();
103         } else {
104             List<Element> profileElms = profilesElm.getChildren("profile", project.getNamespace());
105 
106             List<Profile> profiles = new ArrayList<>(profileElms.size());
107 
108             for (Element profileElm : profileElms) {
109                 profiles.add(new JDomProfile(profileElm));
110             }
111 
112             return profiles;
113         }
114     }
115 
116     @Override
117     public Properties getProperties() {
118         Element properties = project.getChild("properties", project.getNamespace());
119 
120         if (properties == null) {
121             return null;
122         } else {
123             return new JDomProperties(properties);
124         }
125     }
126 
127     @Override
128     public Reporting getReporting() {
129         Element reporting = project.getChild("reporting", project.getNamespace());
130 
131         if (reporting == null) {
132             return null;
133         } else {
134             return new JDomReporting(reporting);
135         }
136     }
137 
138     @Override
139     public void setScm(Scm scm) {
140         if (scm == null) {
141             JDomUtils.rewriteElement("scm", null, project, project.getNamespace());
142         } else {
143             Element scmRoot = new Element("scm");
144             scmRoot.addContent("\n  ");
145 
146             // Write current values to JDOM2 tree
147             Scm jdomScm = new JDomScm(scmRoot);
148             jdomScm.setConnection(scm.getConnection());
149             jdomScm.setDeveloperConnection(scm.getDeveloperConnection());
150             jdomScm.setTag(scm.getTag());
151             jdomScm.setUrl(scm.getUrl());
152 
153             project.addContent("\n  ").addContent(scmRoot).addContent("\n");
154         }
155     }
156 
157     @Override
158     public Scm getScm() {
159         Element elm = project.getChild("scm", project.getNamespace());
160         if (elm == null) {
161             return null;
162         } else {
163             // this way scm setters change DOM tree immediately
164             return new JDomScm(elm);
165         }
166     }
167 
168     @Override
169     public void setVersion(String version) {
170         Element versionElement = project.getChild("version", project.getNamespace());
171 
172         String parentVersion;
173         Element parent = getParentElement();
174         if (parent != null) {
175             parentVersion = parent.getChildTextTrim("version", project.getNamespace());
176         } else {
177             parentVersion = null;
178         }
179 
180         if (versionElement == null) {
181             if (!version.equals(parentVersion)) {
182                 // we will add this after artifactId, since it was missing but different from the inherited version
183                 Element artifactIdElement = project.getChild("artifactId", project.getNamespace());
184                 int index = project.indexOf(artifactIdElement);
185 
186                 versionElement = new Element("version", project.getNamespace());
187                 versionElement.setText(version);
188                 project.addContent(index + 1, new Text("\n  "));
189                 project.addContent(index + 2, versionElement);
190             }
191         } else {
192             JDomUtils.rewriteValue(versionElement, version);
193         }
194     }
195 }