1 package org.apache.maven.plugin.changes;
2
3 /*
4 * Licensed to the Apache Software Foundation (ASF) under one
5 * or more contributor license agreements. See the NOTICE file
6 * distributed with this work for additional information
7 * regarding copyright ownership. The ASF licenses this file
8 * to you under the Apache License, Version 2.0 (the
9 * "License"); you may not use this file except in compliance
10 * with the License. You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing,
15 * software distributed under the License is distributed on an
16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17 * KIND, either express or implied. See the License for the
18 * specific language governing permissions and limitations
19 * under the License.
20 */
21
22 import java.io.File;
23 import java.io.FileInputStream;
24 import java.util.Collections;
25 import java.util.List;
26
27 /*
28 * Licensed to the Apache Software Foundation (ASF) under one
29 * or more contributor license agreements. See the NOTICE file
30 * distributed with this work for additional information
31 * regarding copyright ownership. The ASF licenses this file
32 * to you under the Apache License, Version 2.0 (the
33 * "License"); you may not use this file except in compliance
34 * with the License. You may obtain a copy of the License at
35 *
36 * http://www.apache.org/licenses/LICENSE-2.0
37 *
38 * Unless required by applicable law or agreed to in writing,
39 * software distributed under the License is distributed on an
40 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
41 * KIND, either express or implied. See the License for the
42 * specific language governing permissions and limitations
43 * under the License.
44 */
45
46 import org.apache.maven.plugin.logging.Log;
47 import org.apache.maven.plugins.changes.model.Body;
48 import org.apache.maven.plugins.changes.model.ChangesDocument;
49 import org.apache.maven.plugins.changes.model.Properties;
50 import org.apache.maven.plugins.changes.model.Release;
51 import org.apache.maven.plugins.changes.model.io.xpp3.ChangesXpp3Reader;
52 import org.codehaus.plexus.util.IOUtil;
53
54 /**
55 * A facade for a changes.xml file.
56 *
57 * @version $Id: ChangesXML.java 1742353 2016-05-05 03:22:53Z schulte $
58 */
59 public class ChangesXML
60 {
61
62 /** The list of releases in the changes.xml file. */
63 private List<Release> releaseList;
64
65 /** The author in the changes.xml file. */
66 private String author;
67
68 /** The title of the changes.xml file. */
69 private String title;
70
71 /** The e-mail address of the author in the changes.xml file. */
72 private String authorEmail;
73
74 /** The changes.xml document. */
75 private ChangesDocument changesDocument;
76
77 /**
78 * Constructor that sets the changes.xml file and the logger.
79 *
80 * @param xmlPath the changes.xml file
81 * @param log the logger
82 * @throws ChangesXMLRuntimeException if there was a fatal error while parsing the changes.xml file
83 */
84 public ChangesXML( File xmlPath, Log log )
85 throws ChangesXMLRuntimeException
86 {
87
88 if ( xmlPath == null || !xmlPath.exists() )
89 {
90 log.error( "changes xml file is null or not exists " );
91 return;
92 }
93
94 FileInputStream fileInputStream = null;
95
96 try
97 {
98
99 ChangesXpp3Reader reader = new ChangesXpp3Reader();
100
101 fileInputStream = new FileInputStream( xmlPath );
102 changesDocument = reader.read( fileInputStream, false );
103 fileInputStream.close();
104 fileInputStream = null;
105
106 if ( changesDocument == null )
107 {
108 log.error( "Cannot build Changes Report from file: " + xmlPath.getPath() );
109 return;
110 }
111
112 Properties properties = changesDocument.getProperties();
113
114 if ( properties != null )
115 {
116 if ( properties.getAuthor() != null )
117 {
118 this.author = properties.getAuthor().getName();
119 this.authorEmail = properties.getAuthor().getName();
120 }
121 this.title = properties.getTitle();
122 }
123
124 Body body = changesDocument.getBody();
125
126 if ( body != null )
127 {
128 this.releaseList = body.getReleases();
129 }
130
131 }
132 catch ( Throwable e )
133 {
134 log.error( "An error occurred when parsing the changes.xml file: ", e );
135 throw new ChangesXMLRuntimeException( "An error occurred when parsing the changes.xml file", e );
136 }
137 finally
138 {
139 IOUtil.close( fileInputStream );
140 }
141 }
142
143 /**
144 * Sets the {@link ChangesXML#author} attribute.
145 *
146 * @param author the new value of the {@link ChangesXML#author} attribute
147 */
148 public void setAuthor( String author )
149 {
150 this.author = author;
151 }
152
153 /**
154 * Returns the current value of the author attribute.
155 *
156 * @return the current value of the author attribute
157 */
158 public String getAuthor()
159 {
160 return author;
161 }
162
163 /**
164 * Sets the {@link ChangesXML#releaseList} attribute.
165 *
166 * @param releaseList the new value of the {@link ChangesXML#releaseList} attribute
167 */
168 public void setReleaseList( List<Release> releaseList )
169 {
170 this.releaseList = releaseList;
171 }
172
173 /**
174 * Returns the current value of the {@link ChangesXML#releaseList} attribute.
175 *
176 * @return the current value of the {@link ChangesXML#releaseList} attribute
177 */
178 public List<Release> getReleaseList()
179 {
180 return releaseList == null ? Collections.<Release>emptyList() : releaseList;
181 }
182
183 /**
184 * Sets the {@link ChangesXML#title} attribute.
185 *
186 * @param title the new value of the {@link ChangesXML#title} attribute
187 */
188 public void setTitle( String title )
189 {
190 this.title = title;
191 }
192
193 /**
194 * Returns the current value of the {@link ChangesXML#title} attribute.
195 *
196 * @return the current value of the {@link ChangesXML#title} attribute
197 */
198 public String getTitle()
199 {
200 return title;
201 }
202
203 /**
204 * Returns the current value of the {@link ChangesXML#changesDocument} attribute.
205 *
206 * @return the current value of the {@link ChangesXML#changesDocument} attribute
207 */
208 public ChangesDocument getChangesDocument()
209 {
210 return changesDocument;
211 }
212
213 /**
214 * Returns the current value of the {@link ChangesXML#authorEmail} attribute.
215 *
216 * @return the current value of the {@link ChangesXML#authorEmail} attribute
217 */
218 public String getAuthorEmail()
219 {
220 return authorEmail;
221 }
222
223 /**
224 * Sets the {@link ChangesXML#authorEmail} attribute.
225 *
226 * @param authorEmail the new value of the {@link ChangesXML#authorEmail} attribute
227 */
228 public void setAuthorEmail( String authorEmail )
229 {
230 this.authorEmail = authorEmail;
231 }
232
233 }