2
* Copyright © 2008-2012 NetAllied Systems GmbH, Ravensburg, Germany.
4
* Licensed under the MIT Open Source License,
5
* for details please see LICENSE file or the website
6
* http://www.opensource.org/licenses/mit-license.php
8
package de.netallied.xsd2cppsax.printers;
10
import java.io.PrintStream;
11
import java.util.ArrayList;
12
import java.util.List;
14
import java.util.SortedMap;
16
import org.apache.xerces.xs.XSElementDeclaration;
18
import de.netallied.xsd2cppsax.Config;
19
import de.netallied.xsd2cppsax.IGenerationDataProvider;
22
* Abstract base class which prints an implementation of the generated parser.
25
public abstract class AbstractParserImplementationPrinter implements ICodePrinter {
27
/** {@link IGenerationDataProvider} */
28
private IGenerationDataProvider dataProvider;
34
public AbstractParserImplementationPrinter(IGenerationDataProvider dataProvider) {
35
this.dataProvider = dataProvider;
39
* @return List of additional base classes of printed parser.
41
protected abstract List<String> getAdditionalBaseClasses();
44
* @return Class name of printed parser.
46
protected abstract String getClassName();
49
* @return Configuration.
51
public Config getConfig() {
52
return dataProvider.getConfig();
56
* @return Parameters for constructor.
58
abstract protected String getCtorParas();
61
* @return Code template for C++ constructor.
63
abstract protected String getCtorTmpl();
66
* @return Code template for C++ destructor.
68
abstract protected String getDtorTmpl();
73
* @see de.netallied.xsd2cppsax.printers.ICodePrinter#getGenerationDataProvider()
75
public IGenerationDataProvider getGenerationDataProvider() {
80
* @return C++ header file to print to.
82
protected abstract PrintStream getHeaderFile();
85
* @return C++ header file name. For include in cpp file.
87
protected abstract String getHeaderFileName();
90
* @return List of include files printed parser requires.
92
protected abstract List<String> getIncludeFiles();
95
* @return C++ c-tor initialization list.
97
abstract protected List<String> getInitializationList();
100
* @return A map of class member. Key is member name, value is member type.
102
abstract protected SortedMap<String, String> getMembers();
105
* @return C++ namespace of printed parser.
107
protected abstract String getNamespace();
110
* @return C++ source file to print to.
112
protected abstract PrintStream getSourceFile();
115
* Prints implementation of SAX begin element method. Method head is printed
120
* @param parameterList
121
* C++ method parameters.
122
* @param cppElementName
123
* C++ name of element.
126
* @param attributesRequired
127
* Indicates if element has attributes.
129
protected abstract void printBeginMethodImpl(String methodName, String parameterList, String cppElementName,
130
XSElementDeclaration element, boolean attributesRequired);
135
* @see de.netallied.xsd2cppsax.printers.ICodePrinter#printBeginMethodToHeader(java.lang.String,
136
* java.lang.String, java.lang.String,
137
* com.sun.org.apache.xerces.internal.xs.XSElementDeclaration, boolean)
139
public void printBeginMethodToHeader(String methodName, String parameterList, String cppElementName,
140
XSElementDeclaration element, boolean attributesRequired) {
141
PrinterUtils.printBeginConvenienceMethodDeclTypeModifiers(getHeaderFile());
142
getHeaderFile().print(" ");
143
PrinterUtils.printBeginConvenienceMethodReturnType(getHeaderFile());
144
getHeaderFile().print(" ");
145
getHeaderFile().print(methodName);
146
getHeaderFile().print(parameterList);
147
getHeaderFile().println(";");
153
* @see de.netallied.xsd2cppsax.printers.ICodePrinter#printBeginMethodToSource(java.lang.String,
154
* java.lang.String, java.lang.String,
155
* com.sun.org.apache.xerces.internal.xs.XSElementDeclaration, boolean)
157
public void printBeginMethodToSource(String methodName, String parameterList, String cppElementName,
158
XSElementDeclaration element, boolean attributesRequired) {
159
getSourceFile().println(getConfig().getOutputSourceFileMethodDelimiter());
160
PrinterUtils.printBeginConvenienceMethodReturnType(getSourceFile());
161
getSourceFile().print(" ");
162
getSourceFile().print(getClassName() + "::");
163
getSourceFile().print(methodName);
164
getSourceFile().println(parameterList);
166
printBeginMethodImpl(methodName, parameterList, cppElementName, element, attributesRequired);
168
getSourceFile().println();
169
getSourceFile().println();
173
* Prints implementation of SAX data method. Method head is printed before.
177
* @param parameterList
178
* C++ method parameters.
179
* @param cppElementName
180
* C++ name of element.
184
protected abstract void printDataMethodImpl(String methodName, String parameterList, String cppElementName,
185
XSElementDeclaration element);
190
* @see de.netallied.xsd2cppsax.printers.ICodePrinter#printDataMethodToHeader(java.lang.String,
191
* java.lang.String, java.lang.String,
192
* com.sun.org.apache.xerces.internal.xs.XSElementDeclaration)
194
public void printDataMethodToHeader(String methodName, String parameterList, String cppElementName,
195
XSElementDeclaration element) {
196
PrinterUtils.printDataConvenienceMethodDeclTypeModifiers(getHeaderFile());
197
getHeaderFile().print(" ");
198
PrinterUtils.printDataConvenienceMethodReturnType(getHeaderFile());
199
getHeaderFile().print(" ");
200
getHeaderFile().print(methodName);
201
getHeaderFile().print(parameterList);
202
getHeaderFile().println(";");
208
* @see de.netallied.xsd2cppsax.printers.ICodePrinter#printDataMethodToSource(java.lang.String,
209
* java.lang.String, java.lang.String,
210
* com.sun.org.apache.xerces.internal.xs.XSElementDeclaration)
212
public void printDataMethodToSource(String methodName, String parameterList, String cppElementName,
213
XSElementDeclaration element) {
214
getSourceFile().println(getConfig().getOutputSourceFileMethodDelimiter());
215
PrinterUtils.printDataConvenienceMethodReturnType(getSourceFile());
216
getSourceFile().print(" ");
217
getSourceFile().print(getClassName() + "::");
218
getSourceFile().print(methodName);
219
getSourceFile().println(parameterList);
221
printDataMethodImpl(methodName, parameterList, cppElementName, element);
223
getSourceFile().println();
224
getSourceFile().println();
228
* Prints implementation of SAX end element method. Method head is printed
233
* @param parameterList
234
* C++ method parameters.
235
* @param cppElementName
236
* C++ name of element.
240
protected abstract void printEndMethodImpl(String methodName, String parameterList, String cppElementName,
241
XSElementDeclaration element);
246
* @see de.netallied.xsd2cppsax.printers.ICodePrinter#printEndMethodToHeader(java.lang.String,
247
* java.lang.String, java.lang.String,
248
* com.sun.org.apache.xerces.internal.xs.XSElementDeclaration)
250
public void printEndMethodToHeader(String methodName, String parameterList, String cppElementName,
251
XSElementDeclaration element) {
252
PrinterUtils.printEndMethodDeclTypeModifiers(getHeaderFile());
253
getHeaderFile().print(" ");
254
PrinterUtils.printEndMethodReturnType(getHeaderFile());
255
getHeaderFile().print(" ");
256
getHeaderFile().print(methodName);
257
getHeaderFile().print(parameterList);
258
getHeaderFile().println(";");
264
* @see de.netallied.xsd2cppsax.printers.ICodePrinter#printEndMethodToSource(java.lang.String,
265
* java.lang.String, java.lang.String,
266
* com.sun.org.apache.xerces.internal.xs.XSElementDeclaration)
268
public void printEndMethodToSource(String methodName, String parameterList, String cppElementName,
269
XSElementDeclaration element) {
270
getSourceFile().println(getConfig().getOutputSourceFileMethodDelimiter());
271
PrinterUtils.printEndMethodReturnType(getSourceFile());
272
getSourceFile().print(" ");
273
getSourceFile().print(getClassName() + "::");
274
getSourceFile().print(methodName);
275
getSourceFile().println(parameterList);
277
printEndMethodImpl(methodName, parameterList, cppElementName, element);
279
getSourceFile().println();
280
getSourceFile().println();
286
* @see de.netallied.xsd2cppsax.printers.ICodePrinter#printHeaderFileBeginning()
288
public void printHeaderFileBeginning() {
289
getHeaderFile().println(getConfig().getOutFileHeader());
290
getHeaderFile().println();
291
getHeaderFile().println();
292
String namespace = getNamespace();
293
String className = getClassName();
294
PrinterUtils.printIncludeProtection(getHeaderFile(), PrinterUtils.createIncludeProtectionMacro(namespace,
296
getHeaderFile().println();
297
getHeaderFile().println();
298
PrinterUtils.printIncludeGeneratedHeader(getHeaderFile(), getConfig().getOutputAttributesFileName());
299
PrinterUtils.printIncludeGeneratedHeader(getHeaderFile(), getConfig().getOutputHeaderFileNamePublic());
300
PrinterUtils.printIncludes(getHeaderFile(), getIncludeFiles());
301
getHeaderFile().println();
302
getHeaderFile().println();
304
getHeaderFile().println("using namespace " + getConfig().getNamespace() + ";");
305
getHeaderFile().println();
306
getHeaderFile().println();
308
PrinterUtils.printNamespaceOpen(getHeaderFile(), namespace);
309
getHeaderFile().println();
311
PrinterUtils.printConvenienceTypedefs(getHeaderFile(), false, getConfig());
312
getHeaderFile().println();
313
getHeaderFile().println();
315
getHeaderFile().print("class " + className);
316
getHeaderFile().print(" : public " + getConfig().getNamespace() + "::" + getConfig().getClassNamePublic());
317
List<String> baseClasses = getAdditionalBaseClasses();
318
if (baseClasses != null) {
319
for (String baseClass : baseClasses) {
320
getHeaderFile().print(", " + baseClass);
323
getHeaderFile().println();
324
getHeaderFile().println("{");
326
getHeaderFile().println("public:");
327
PrinterUtils.printCtorDtorHeaderDecl(getHeaderFile(), className, false, false, getCtorParas(), getConfig());
328
getHeaderFile().println();
329
getHeaderFile().println();
336
* @see de.netallied.xsd2cppsax.printers.ICodePrinter#printHeaderFileEnd()
338
public void printHeaderFileEnd() {
339
getHeaderFile().println();
340
getHeaderFile().println();
341
getHeaderFile().println("private:");
342
PrinterUtils.printDisableDefaultMethods(getHeaderFile(), getClassName());
343
getHeaderFile().println();
345
SortedMap<String, String> members = getMembers();
346
for (Map.Entry<String, String> entry : members.entrySet()) {
347
getHeaderFile().print(entry.getValue() + " ");
348
getHeaderFile().println(entry.getKey() + ";");
350
getHeaderFile().println();
352
getHeaderFile().println("};");
354
getHeaderFile().println();
355
PrinterUtils.printNamespaceClose(getHeaderFile(), getConfig());
357
getHeaderFile().println("#endif");
363
* @see de.netallied.xsd2cppsax.printers.ICodePrinter#printNewLine()
365
public void printNewLine() {
366
getHeaderFile().println();
372
* @see de.netallied.xsd2cppsax.printers.ICodePrinter#printSourceFileBeginning()
375
public void printSourceFileBeginning() {
376
getSourceFile().println(getConfig().getOutFileHeader());
377
List<String> exampleSourceIncludeList = new ArrayList<String>();
378
exampleSourceIncludeList.add(getConfig().getIncludePrecompiledHeader());
379
String header = getHeaderFileName();
380
exampleSourceIncludeList.add(header.substring(header.lastIndexOf('/') + 1));
381
PrinterUtils.printIncludes(getSourceFile(), exampleSourceIncludeList);
382
getSourceFile().println();
383
getSourceFile().println();
384
PrinterUtils.printNamespaceOpen(getSourceFile(), getNamespace());
385
getSourceFile().println();
386
getSourceFile().println();
387
IGenerationDataProvider dataProvoider = getGenerationDataProvider();
388
PrinterUtils.printCtorDtorImpl(getSourceFile(), getClassName(), getConfig().getNamespace() + "::"
389
+ getConfig().getClassNamePrivate(), false, false, dataProvoider, getCtorParas(),
390
getInitializationList(), getCtorTmpl(), getDtorTmpl());
391
getSourceFile().println();
397
* @see de.netallied.xsd2cppsax.printers.ICodePrinter#printSourceFileEnd()
399
public void printSourceFileEnd() {
400
getSourceFile().println();
401
getSourceFile().println();
402
getSourceFile().println();
403
PrinterUtils.printNamespaceClose(getSourceFile(), getConfig());