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.plugins.ear;
20  
21  import java.io.IOException;
22  import java.io.Writer;
23  
24  import org.apache.maven.plugins.ear.util.JavaEEVersion;
25  import org.codehaus.plexus.util.xml.XMLWriter;
26  
27  /**
28   * An <code>XmlWriter</code> based implementation used to generate an {@code application.xml} file.
29   *
30   * @author <a href="snicoll@apache.org">Stephane Nicoll</a>
31   */
32  final class ApplicationXmlWriter extends AbstractXmlWriter {
33      // @formatter:off
34      public static final String DOCTYPE_1_3 = "application PUBLIC\n"
35              + "\t\"-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN\"\n"
36              + "\t\"http://java.sun.com/dtd/application_1_3.dtd\"";
37      // @formatter:on
38  
39      private static final String APPLICATION_ELEMENT = "application";
40  
41      private final JavaEEVersion version;
42  
43      private final Boolean generateModuleId;
44  
45      ApplicationXmlWriter(JavaEEVersion version, String encoding, Boolean generateModuleId) {
46          super(encoding);
47          this.version = version;
48          this.generateModuleId = generateModuleId;
49      }
50  
51      void write(ApplicationXmlWriterContext context) throws EarPluginException {
52          try (Writer w = initializeWriter(context.getDestinationFile())) {
53              XMLWriter writer = null;
54              if (JavaEEVersion.ONE_DOT_THREE.eq(version)) {
55                  writer = initializeRootElementOneDotThree(w);
56              } else if (JavaEEVersion.ONE_DOT_FOUR.eq(version)) {
57                  writer = initializeRootElementOneDotFour(w);
58              } else if (JavaEEVersion.FIVE.eq(version)) {
59                  writer = initializeRootElementFive(w);
60              } else if (JavaEEVersion.SIX.eq(version)) {
61                  writer = initializeRootElementSix(w);
62              } else if (JavaEEVersion.SEVEN.eq(version)) {
63                  writer = initializeRootElementSeven(w);
64              } else if (JavaEEVersion.EIGHT.eq(version)) {
65                  writer = initializeRootElementEight(w);
66              } else if (JavaEEVersion.NINE.eq(version)) {
67                  writer = initializeRootElementNine(w);
68              } else if (JavaEEVersion.TEN.eq(version)) {
69                  writer = initializeRootElementTen(w);
70              } else if (JavaEEVersion.ELEVEN.eq(version)) {
71                  writer = initializeRootElementEleven(w);
72              }
73  
74              // writer is still on root element, so we can still add this attribute
75              if (context.getApplicationId() != null) {
76                  writer.addAttribute("id", context.getApplicationId());
77              }
78  
79              // As from JavaEE6
80              if (version.ge(JavaEEVersion.SIX)) {
81                  writeApplicationName(context.getApplicationName(), writer);
82              }
83  
84              // IMPORTANT: the order of the description and display-name elements was
85              // reversed between J2EE 1.3 and J2EE 1.4.
86              if (version.eq(JavaEEVersion.ONE_DOT_THREE)) {
87                  writeDisplayName(context.getDisplayName(), writer);
88                  writeDescription(context.getDescription(), writer);
89              } else {
90                  writeDescription(context.getDescription(), writer);
91                  writeDisplayName(context.getDisplayName(), writer);
92              }
93  
94              // As from JavaEE6
95              if (version.ge(JavaEEVersion.SIX)) {
96                  writeInitializeInOrder(context.getInitializeInOrder(), writer);
97              }
98  
99              // Do not change this unless you really know what you're doing :)
100             for (EarModule module : context.getEarModules()) {
101                 module.appendModule(writer, version.getVersion(), generateModuleId);
102             }
103 
104             for (SecurityRole securityRole : context.getSecurityRoles()) {
105                 securityRole.appendSecurityRole(writer);
106             }
107 
108             if (version.ge(JavaEEVersion.FIVE)) {
109                 writeLibraryDirectory(context.getLibraryDirectory(), writer);
110             }
111 
112             if (version.ge(JavaEEVersion.SIX)) {
113                 for (EnvEntry envEntry : context.getEnvEntries()) {
114                     envEntry.appendEnvEntry(writer);
115                 }
116                 for (EjbRef ejbEntry : context.getEjbEntries()) {
117                     ejbEntry.appendEjbRefEntry(writer);
118                 }
119                 for (ResourceRef resourceEntry : context.getResourceRefs()) {
120                     resourceEntry.appendResourceRefEntry(writer);
121                 }
122             }
123 
124             writer.endElement();
125         } catch (IOException ex) {
126             // ignore
127         }
128     }
129 
130     private void writeApplicationName(String applicationName, XMLWriter writer) {
131         if (applicationName != null) {
132             writer.startElement("application-name");
133             writer.writeText(applicationName);
134             writer.endElement();
135         }
136     }
137 
138     private void writeDescription(String description, XMLWriter writer) {
139         if (description != null) {
140             writer.startElement("description");
141             writer.writeText(description);
142             writer.endElement();
143         }
144     }
145 
146     private void writeDisplayName(String displayName, XMLWriter writer) {
147         if (displayName != null) {
148             writer.startElement("display-name");
149             writer.writeText(displayName);
150             writer.endElement();
151         }
152     }
153 
154     private void writeInitializeInOrder(Boolean initializeInOrder, XMLWriter writer) {
155         if (initializeInOrder != null) {
156             writer.startElement("initialize-in-order");
157             writer.writeText(initializeInOrder.toString());
158             writer.endElement();
159         }
160     }
161 
162     private void writeLibraryDirectory(String libraryDirectory, XMLWriter writer) {
163         if (libraryDirectory != null) {
164             writer.startElement("library-directory");
165             writer.writeText(libraryDirectory);
166             writer.endElement();
167         }
168     }
169 
170     private XMLWriter initializeRootElementOneDotThree(Writer w) {
171         XMLWriter writer = initializeXmlWriter(w, DOCTYPE_1_3);
172         writer.startElement(APPLICATION_ELEMENT);
173         return writer;
174     }
175 
176     private XMLWriter initializeRootElementOneDotFour(Writer w) {
177         XMLWriter writer = initializeXmlWriter(w, null);
178         writer.startElement(APPLICATION_ELEMENT);
179         writer.addAttribute("xmlns", "http://java.sun.com/xml/ns/j2ee");
180         writer.addAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
181         writer.addAttribute(
182                 "xsi:schemaLocation",
183                 "http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/application_1_4.xsd");
184         writer.addAttribute("version", "1.4");
185         return writer;
186     }
187 
188     private XMLWriter initializeRootElementFive(Writer w) {
189         XMLWriter writer = initializeXmlWriter(w, null);
190         writer.startElement(APPLICATION_ELEMENT);
191         writer.addAttribute("xmlns", "http://java.sun.com/xml/ns/javaee");
192         writer.addAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
193         writer.addAttribute(
194                 "xsi:schemaLocation",
195                 "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd");
196         writer.addAttribute("version", "5");
197         return writer;
198     }
199 
200     private XMLWriter initializeRootElementSix(Writer w) {
201         XMLWriter writer = initializeXmlWriter(w, null);
202         writer.startElement(APPLICATION_ELEMENT);
203         writer.addAttribute("xmlns", "http://java.sun.com/xml/ns/javaee");
204         writer.addAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
205         writer.addAttribute(
206                 "xsi:schemaLocation",
207                 "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_6.xsd");
208         writer.addAttribute("version", "6");
209         return writer;
210     }
211 
212     private XMLWriter initializeRootElementSeven(Writer w) {
213         XMLWriter writer = initializeXmlWriter(w, null);
214         writer.startElement(APPLICATION_ELEMENT);
215         writer.addAttribute("xmlns", "http://xmlns.jcp.org/xml/ns/javaee");
216         writer.addAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
217         writer.addAttribute(
218                 "xsi:schemaLocation",
219                 "http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/application_7.xsd");
220         writer.addAttribute("version", "7");
221         return writer;
222     }
223 
224     private XMLWriter initializeRootElementEight(Writer w) {
225         XMLWriter writer = initializeXmlWriter(w, null);
226         writer.startElement(APPLICATION_ELEMENT);
227         writer.addAttribute("xmlns", "http://xmlns.jcp.org/xml/ns/javaee");
228         writer.addAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
229         writer.addAttribute(
230                 "xsi:schemaLocation",
231                 "http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/application_8.xsd");
232         writer.addAttribute("version", "8");
233         return writer;
234     }
235 
236     private XMLWriter initializeRootElementNine(Writer w) {
237         XMLWriter writer = initializeXmlWriter(w, null);
238         writer.startElement(APPLICATION_ELEMENT);
239         writer.addAttribute("xmlns", "https://jakarta.ee/xml/ns/jakartaee");
240         writer.addAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
241         writer.addAttribute(
242                 "xsi:schemaLocation",
243                 "https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/application_9.xsd");
244         writer.addAttribute("version", "9");
245         return writer;
246     }
247 
248     private XMLWriter initializeRootElementTen(Writer w) {
249         XMLWriter writer = initializeXmlWriter(w, null);
250         writer.startElement(APPLICATION_ELEMENT);
251         writer.addAttribute("xmlns", "https://jakarta.ee/xml/ns/jakartaee");
252         writer.addAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
253         writer.addAttribute(
254                 "xsi:schemaLocation",
255                 "https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/application_10.xsd");
256         writer.addAttribute("version", "10");
257         return writer;
258     }
259 
260     private XMLWriter initializeRootElementEleven(Writer w) {
261         XMLWriter writer = initializeXmlWriter(w, null);
262         writer.startElement(APPLICATION_ELEMENT);
263         writer.addAttribute("xmlns", "https://jakarta.ee/xml/ns/jakartaee");
264         writer.addAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
265         writer.addAttribute(
266                 "xsi:schemaLocation",
267                 "https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/application_11.xsd");
268         writer.addAttribute("version", "11");
269         return writer;
270     }
271 }