View Javadoc
1   /*
2    * Copyright 2019-2022 the original author or authors.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package org.bremersee.gpx;
18  
19  import jakarta.xml.bind.JAXBContext;
20  import jakarta.xml.bind.Marshaller;
21  import java.util.ArrayList;
22  import java.util.Collection;
23  import java.util.List;
24  import org.bremersee.gpx.model.ExtensionsType;
25  import org.bremersee.xml.XmlDocumentBuilder;
26  import org.w3c.dom.Element;
27  
28  /**
29   * The extensions builder interface.
30   *
31   * @author Christian Bremer
32   */
33  public interface ExtensionsTypeBuilder {
34  
35    /**
36     * Use document builder.
37     *
38     * @param documentBuilder the document builder
39     * @return the extensions builder
40     */
41    ExtensionsTypeBuilder use(XmlDocumentBuilder documentBuilder);
42  
43    /**
44     * Add element to the extensions.
45     *
46     * @param extensionElement the extension element
47     * @return the extensions type builder
48     */
49    ExtensionsTypeBuilder addElement(Element extensionElement);
50  
51    /**
52     * Add element to the extensions.
53     *
54     * @param extensionElement the extension element
55     * @param jaxbContext the jaxb context
56     * @return the extensions type builder
57     */
58    ExtensionsTypeBuilder addElement(Object extensionElement, JAXBContext jaxbContext);
59  
60    /**
61     * Add element to the extensions.
62     *
63     * @param extensionElement the extension element
64     * @param marshaller the marshaller
65     * @return the extensions type builder
66     */
67    ExtensionsTypeBuilder addElement(Object extensionElement, Marshaller marshaller);
68  
69    /**
70     * Build extensions
71     *
72     * @param returnNullIfEmpty the return null if empty
73     * @return the extensions type
74     */
75    ExtensionsType build(boolean returnNullIfEmpty);
76  
77    /**
78     * Create default extensions builder.
79     *
80     * @return the extensions builder
81     */
82    static ExtensionsTypeBuilder newInstance() {
83      return new DefaultBuilder();
84    }
85  
86    /**
87     * Create default extensions builder.
88     *
89     * @param extensionElements the extension elements
90     * @return the extensions type builder
91     */
92    static ExtensionsTypeBuilder newInstance(Collection<? extends Element> extensionElements) {
93      return new DefaultBuilder(extensionElements);
94    }
95  
96    /**
97     * Create default extensions builder.
98     *
99     * @param extensionsType the extensions type
100    * @return the extensions type builder
101    */
102   static ExtensionsTypeBuilder newInstance(ExtensionsType extensionsType) {
103     return new DefaultBuilder(extensionsType);
104   }
105 
106   /**
107    * The default builder.
108    */
109   class DefaultBuilder implements ExtensionsTypeBuilder {
110 
111     private final List<Element> anies = new ArrayList<>();
112 
113     private XmlDocumentBuilder documentBuilder = XmlDocumentBuilder.newInstance();
114 
115     /**
116      * Instantiates a new default builder.
117      */
118     DefaultBuilder() {
119     }
120 
121     /**
122      * Instantiates a new default builder.
123      *
124      * @param extensionElements the extension elements
125      */
126     DefaultBuilder(Collection<? extends Element> extensionElements) {
127       if (extensionElements != null) {
128         anies.addAll(extensionElements);
129       }
130     }
131 
132     /**
133      * Instantiates a new default builder.
134      *
135      * @param extensionsType the extensions type
136      */
137     DefaultBuilder(ExtensionsType extensionsType) {
138       if (extensionsType != null) {
139         anies.addAll(extensionsType.getAnies());
140       }
141     }
142 
143     @Override
144     public ExtensionsTypeBuilder use(XmlDocumentBuilder documentBuilder) {
145       if (documentBuilder != null) {
146         this.documentBuilder = documentBuilder;
147       }
148       return this;
149     }
150 
151     @Override
152     public ExtensionsTypeBuilder addElement(Element extensionElement) {
153       if (extensionElement != null) {
154         anies.add(extensionElement);
155       }
156       return this;
157     }
158 
159     @Override
160     public ExtensionsTypeBuilder addElement(Object extensionElement, JAXBContext jaxbContext) {
161       if (extensionElement == null) {
162         return this;
163       }
164       return addElement(
165           documentBuilder.buildDocument(extensionElement, jaxbContext).getDocumentElement());
166     }
167 
168     @Override
169     public ExtensionsTypeBuilder addElement(Object extensionElement, Marshaller marshaller) {
170       if (extensionElement == null) {
171         return this;
172       }
173       return addElement(
174           documentBuilder.buildDocument(extensionElement, marshaller).getDocumentElement());
175     }
176 
177     @Override
178     public ExtensionsType build(boolean returnNullIfEmpty) {
179       if (returnNullIfEmpty && anies.isEmpty()) {
180         return null;
181       }
182       final ExtensionsType extensionsType = new ExtensionsType();
183       extensionsType.getAnies().addAll(anies);
184       return extensionsType;
185     }
186 
187   }
188 }