View Javadoc
1   package org.codehaus.mojo.jaxb2.schemageneration.postprocessing.schemaenhancement;
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 org.codehaus.mojo.jaxb2.shared.Validate;
23  
24  /**
25   * <p>Data holder for schema transformation operations, to permit customization of the
26   * schema namespace prefix and file name of generated schema. As the <code>schemagen</code>
27   * tool has no mechanics to control namespace prefix and file name of generated schema,
28   * the Jaxb2-Maven-plugin must supply a post-processing step to work around this situation.</p>
29   * <p>Each <code>TransformSchema</code> object holds data pertaining to changes for one namespace
30   * URI - either namespace prefix used within the generated XSD or resulting filename for
31   * the schema definition.</p>
32   * <ol>
33   * <li><strong>Namespace prefix</strong>. Each XML element within a namespace uses the supplied
34   * prefix. (As a reference, in the XML element <code>&lt;foo:bar/&gt;</code>, the namespace prefix
35   * is "foo" and the element name is "bar"). The Schemagen tool by default only generates namespace
36   * prefixes on the form "ns1", "ns2" etc., which means that the generated schema will contain elements
37   * on the form <code>&lt;xs:extension base="ns1:nazgulEntity"&gt;</code>.
38   * Use a <code>toPrefix</code> element to change the namespace prefix of a particular XML URI to
39   * simplify understanding the schema.</li>
40   * <li><strong>Filename</strong>. By default, the Schemagen tool creates files called "schema1.xsd",
41   * "schema2.xsd" etc. Since the XSD imports one another, simply changing the filename will frequently
42   * break the schema structure - you will need to change all import statements in all generated XSD files
43   * to match the new file names. The Jaxb2 Maven plugin can do all this housekeeping automatically, if you
44   * create a transformSchema element containing a <code>toFile</code> element to change the filename for a
45   * particular XML URI. Changing the file names frequently improves overview and usability of the generated schema
46   * files.</li>
47   * </ol>
48   * <h2>Example TransformSchemas</h2>
49   * <p>The URI element is mandatory for each TransformSchema element. The first example illustrates how
50   * to use the TransformSchema element to change the prefix and file name of 3 XML URIs. This is the recommended
51   * use of a TransformSchema - change both prefix and filename to something meaningful for each URI:</p>
52   * <pre>
53   * &lt;transformSchemas&gt;
54   *      &lt;transformSchema&gt;
55   *          &lt;uri&gt;http://some/namespace&lt;/uri&gt;
56   *          &lt;toPrefix&gt;some&lt;/toPrefix&gt;
57   *          &lt;toFile&gt;some_schema.xsd&lt;/toFile&gt;
58   *      &lt;/transformSchema&gt;
59   *      &lt;transformSchema&gt;
60   *          &lt;uri&gt;http://another/namespace&lt;/uri&gt;
61   *          &lt;toPrefix&gt;another&lt;/toPrefix&gt;
62   *          &lt;toFile&gt;another_schema.xsd&lt;/toFile&gt;
63   *      &lt;/transformSchema&gt;
64   *      &lt;transformSchema&gt;
65   *          &lt;uri&gt;http://yet/another/namespace&lt;/uri&gt;
66   *          &lt;toPrefix&gt;yetAnother&lt;/toPrefix&gt;
67   *          &lt;toFile&gt;yet_another_schema.xsd&lt;/toFile&gt;
68   *      &lt;/transformSchema&gt;
69   * &lt;/transformSchemas&gt;
70   * </pre>
71   * <p>The URI element is mandatory for each TransformSchema element, along with at least one of the other two
72   * elements in the TransformSchema. This implies that partial configuration for TransformSchema can be used,
73   * although <em>this is not recommended</em> since the readability and usability of the automatically generated
74   * namespace prefixes and file names are poor. The second example illustrates how to use the TransformSchema element
75   * to change either prefix or file name for 2 XML URIs:</p>
76   * <pre>
77   * &lt;transformSchemas&gt;
78   *      &lt;transformSchema&gt;
79   *          &lt;uri&gt;http://another/namespace&lt;/uri&gt;
80   *          &lt;toPrefix&gt;another&lt;/toPrefix&gt;
81   *      &lt;/transformSchema&gt;
82   *      &lt;transformSchema&gt;
83   *          &lt;uri&gt;http://yet/another/namespace&lt;/uri&gt;
84   *          &lt;toFile&gt;yet_another_schema.xsd&lt;/toFile&gt;
85   *      &lt;/transformSchema&gt;
86   * &lt;/transformSchemas&gt;
87   * </pre>
88   *
89   * @author <a href="mailto:lj@jguru.se">Lennart J&ouml;relid</a>
90   * @since 1.4
91   */
92  public class TransformSchema {
93  
94      /**
95       * The empty XML Namespace.
96       */
97      public static final String EMPTY_NAMESPACE = "";
98  
99      // Internal state
100     private String uri = EMPTY_NAMESPACE;
101     private String toPrefix;
102     private String toFile;
103 
104     /**
105      * Default constructor.
106      */
107     public TransformSchema() {
108     }
109 
110     /**
111      * Compound constructor, creating a TransformSchema instruction wrapping the supplied data.
112      *
113      * @param uri      The URI of this Schema, such as
114      *                 <code>http://www.jguru.se/some/namespace</code>. Cannot be null or empty.
115      * @param toPrefix The new namespace prefix for this Schema. Optional.
116      * @param toFile   The new name of the generated schema file.
117      */
118     public TransformSchema(final String uri, final String toPrefix, final String toFile) {
119         this.uri = uri;
120         this.toPrefix = toPrefix;
121         this.toFile = toFile;
122     }
123 
124     /**
125      * @return The URI of this Schema, such as <code>http://www.jguru.se/some/namespace</code>.
126      * The namespace URI is mapped to its prefix in the schema element, i.e:
127      * <code>xmlns:xs="http://www.w3.org/2001/XMLSchema"</code> or
128      * <code>xmlns:foo="http://www.acme.com/xml/schema/foo"</code>.
129      */
130     public String getUri() {
131         return uri;
132     }
133 
134     /**
135      * @return The namespace prefix of this Schema. Each schema element is related to its namespace using the prefix.
136      * For an XML element <code>&lt;foo:bar/&gt;</code>, the prefix is "foo" (and the element name is "bar").
137      */
138     public String getToPrefix() {
139         return toPrefix;
140     }
141 
142     /**
143      * @return the name of the target file if/when renamed.
144      */
145     public String getToFile() {
146         return toFile;
147     }
148 
149     /**
150      * Assigns the URI of this Schema, such as <code>http://www.jguru.se/some/namespace</code>.
151      * The namespace URI is mapped to its prefix in the schema element, i.e:
152      * <code>xmlns:xs="http://www.w3.org/2001/XMLSchema"</code> or
153      * <code>xmlns:foo="http://www.acme.com/xml/schema/foo"</code>.
154      *
155      * @param uri The non-empty uri of this Schema.
156      */
157     public void setUri(final String uri) {
158 
159         // Check sanity
160         Validate.notEmpty(uri, "uri");
161 
162         // Assign internal state
163         this.uri = uri;
164     }
165 
166     /**
167      * Assigns the namespace prefix of this Schema. Each schema element is related to its namespace
168      * using the prefix. For an XML element <code>&lt;foo:bar/&gt;</code>, the prefix is "foo"
169      * (and the element name is "bar").
170      *
171      * @param toPrefix The non-empty prefix to assign.
172      */
173     public void setToPrefix(final String toPrefix) {
174 
175         // Check sanity
176         Validate.notEmpty(toPrefix, "toPrefix");
177 
178         // Assign internal state
179         this.toPrefix = toPrefix;
180     }
181 
182     /**
183      * Assigns the the name of the target file if/when renamed.
184      *
185      * @param toFile The non-empty filename to assign.
186      */
187     public void setToFile(final String toFile) {
188 
189         // Check sanity
190         Validate.notEmpty(toFile, "toFile");
191 
192         // Assign internal state
193         this.toFile = toFile;
194     }
195 
196     /**
197      * {@inheritDoc}
198      */
199     public String toString() {
200         return "[ uri: " + uri + " --> prefix: " + toPrefix + ", file: " + toFile + " ]";
201     }
202 }