javabeanwriter.java
来自「开源的axis2框架的源码。用于开发WEBSERVER」· Java 代码 · 共 1,368 行 · 第 1/4 页
JAVA
1,368 行
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.axis2.schema.writer;
import org.apache.axis2.schema.*;
import org.apache.axis2.schema.i18n.SchemaCompilerMessages;
import org.apache.axis2.schema.typemap.JavaTypeMap;
import org.apache.axis2.schema.util.PrimitiveTypeFinder;
import org.apache.axis2.schema.util.SchemaPropertyLoader;
import org.apache.axis2.schema.util.PrimitiveTypeWrapper;
import org.apache.axis2.util.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.ws.commons.schema.XmlSchemaElement;
import org.apache.ws.commons.schema.XmlSchemaSimpleType;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMAttribute;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import javax.xml.namespace.QName;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Templates;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.stream.StreamSource;
import java.io.*;
import java.util.*;
import com.ibm.wsdl.util.xml.DOM2Writer;
/**
* Java Bean writer for the schema compiler.
*/
public class JavaBeanWriter implements BeanWriter {
private static final Log log = LogFactory.getLog(JavaBeanWriter .class);
public static final String WRAPPED_DATABINDING_CLASS_NAME = "WrappedDatabinder";
private String javaBeanTemplateName = null;
private boolean templateLoaded = false;
private Templates templateCache;
private List namesList;
private static int count = 0;
private boolean wrapClasses = false;
private boolean writeClasses = false;
private String packageName = null;
private File rootDir;
private Document globalWrappedDocument;
private Map modelMap = new HashMap();
private static final String DEFAULT_PACKAGE = "adb";
private Map baseTypeMap = new JavaTypeMap().getTypeMap();
private Map ns2packageNameMap = new HashMap();
private boolean isHelperMode = false;
private boolean isSuppressPrefixesMode = false;
/**
* package for the mapping class
*/
private String mappingClassPackage = null;
public static final String EXTENSION_MAPPER_CLASSNAME = "ExtensionMapper";
// a list of externally identified QNames to be processed. This becomes
// useful when only a list of external elements need to be processed
public static final String DEFAULT_CLASS_NAME = OMElement.class.getName();
public static final String DEFAULT_CLASS_ARRAY_NAME = "org.apache.axiom.om.OMElement[]";
public static final String DEFAULT_ATTRIB_CLASS_NAME = OMAttribute.class.getName();
public static final String DEFAULT_ATTRIB_ARRAY_CLASS_NAME = "org.apache.axiom.om.OMAttribute[]";
/**
* Default constructor
*/
public JavaBeanWriter() {
}
/**
* This returns a map of Qnames vs DOMDocument models. One can use this
* method to obtain the raw DOMmodels used to write the classes. This has no
* meaning when the classes are supposed to be wrapped so the
*
* @return Returns Map.
* @see BeanWriter#getModelMap()
*/
public Map getModelMap() {
return modelMap;
}
public String getDefaultClassName() {
return DEFAULT_CLASS_NAME;
}
public String getDefaultClassArrayName() {
return DEFAULT_CLASS_ARRAY_NAME;
}
public String getDefaultAttribClassName() {
return DEFAULT_ATTRIB_CLASS_NAME;
}
public String getDefaultAttribArrayClassName() {
return DEFAULT_ATTRIB_ARRAY_CLASS_NAME;
}
public void init(CompilerOptions options) throws SchemaCompilationException {
try {
// set all state variables to default values
modelMap = new HashMap();
ns2packageNameMap = new HashMap();
mappingClassPackage = null;
initWithFile(options.getOutputLocation());
packageName = options.getPackageName();
writeClasses = options.isWriteOutput();
if (!writeClasses) {
wrapClasses = false;
} else {
wrapClasses = options.isWrapClasses();
}
// if the wrap mode is set then create a global document to keep the
// wrapped
// element models
if (options.isWrapClasses()) {
globalWrappedDocument = XSLTUtils.getDocument();
Element rootElement = XSLTUtils.getElement(
globalWrappedDocument, "beans");
globalWrappedDocument.appendChild(rootElement);
XSLTUtils.addAttribute(globalWrappedDocument, "name",
WRAPPED_DATABINDING_CLASS_NAME, rootElement);
String tempPackageName;
if (packageName != null && packageName.endsWith(".")) {
tempPackageName = this.packageName.substring(0,
this.packageName.lastIndexOf("."));
} else {
tempPackageName = DEFAULT_PACKAGE;
}
XSLTUtils.addAttribute(globalWrappedDocument, "package",
tempPackageName, rootElement);
}
// add the ns mappings
this.ns2packageNameMap = options.getNs2PackageMap();
//set helper mode
this.isHelperMode = options.isHelperMode();
// set suppress prefixes mode
this.isSuppressPrefixesMode = options.isSuppressPrefixesMode();
//set mapper class package if present
if (options.isMapperClassPackagePresent()) {
this.mappingClassPackage = options.getMapperClassPackage();
}
} catch (IOException e) {
throw new SchemaCompilationException(e);
} catch (ParserConfigurationException e) {
throw new SchemaCompilationException(e); // todo need to put
// correct error
// messages
}
}
/**
* @param element
* @param typeMap
* @param metainf
* @return Returns String.
* @throws SchemaCompilationException
*/
public String write(XmlSchemaElement element, Map typeMap,
BeanWriterMetaInfoHolder metainf) throws SchemaCompilationException {
try {
QName qName = element.getQName();
return process(qName, metainf, typeMap, true, false);
} catch (Exception e) {
e.printStackTrace();
throw new SchemaCompilationException(e);
}
}
/**
* `
* @param qName
* @param typeMap
* @param metainf
* @param isAbstract
* @return
* @throws SchemaCompilationException
*/
public String write(QName qName,
Map typeMap,
BeanWriterMetaInfoHolder metainf,
boolean isAbstract)
throws SchemaCompilationException {
try {
// determine the package for this type.
return process(qName, metainf, typeMap, false,isAbstract);
} catch (SchemaCompilationException e) {
throw e;
} catch (Exception e) {
throw new SchemaCompilationException(e);
}
}
/**
* @throws Exception
* @see BeanWriter#writeBatch()
*/
public void writeBatch() throws SchemaCompilationException {
try {
if (wrapClasses) {
String tempPackage;
if (packageName == null) {
tempPackage = DEFAULT_PACKAGE;
} else {
tempPackage = packageName;
}
File out = createOutFile(tempPackage,
WRAPPED_DATABINDING_CLASS_NAME);
// parse with the template and create the files
parse(globalWrappedDocument, out);
}
} catch (Exception e) {
throw new SchemaCompilationException(e);
}
}
/**
* @param simpleType
* @param typeMap
* @param metainf
* @return Returns String.
* @throws SchemaCompilationException
* @see BeanWriter#write(org.apache.ws.commons.schema.XmlSchemaSimpleType,
* java.util.Map, org.apache.axis2.schema.BeanWriterMetaInfoHolder)
*/
public String write(XmlSchemaSimpleType simpleType, Map typeMap,
BeanWriterMetaInfoHolder metainf) throws SchemaCompilationException {
try {
QName qName = simpleType.getQName();
if (qName == null) {
qName = (QName) simpleType.getMetaInfoMap().get(SchemaConstants.SchemaCompilerInfoHolder.FAKE_QNAME);
}
metainf.addtStatus(qName, SchemaConstants.SIMPLE_TYPE_OR_CONTENT);
return process(qName, metainf, typeMap, true, false);
} catch (Exception e) {
throw new SchemaCompilationException(e);
}
}
/**
* @param rootDir
* @throws IOException
* @see BeanWriter#init(java.io.File)
*/
private void initWithFile(File rootDir) throws IOException {
if (rootDir == null) {
this.rootDir = new File(".");
} else if (!rootDir.isDirectory()) {
throw new IOException(SchemaCompilerMessages
.getMessage("schema.rootnotfolderexception"));
} else {
this.rootDir = rootDir;
}
namesList = new ArrayList();
javaBeanTemplateName = SchemaPropertyLoader.getBeanTemplate();
}
/**
* Make the fully qualified class name for an element or named type
*
* @param qName the qualified Name for this element or type in the schema
* @return the appropriate fully qualified class name to use in generated
* code
*/
public String makeFullyQualifiedClassName(QName qName) {
String namespaceURI = qName.getNamespaceURI();
String basePackageName;
String packageName = getPackage(namespaceURI);
String originalName = qName.getLocalPart();
String className = makeUniqueJavaClassName(this.namesList, originalName);
String packagePrefix = null;
String fullyqualifiedClassName;
if (wrapClasses)
packagePrefix = (this.packageName == null ? DEFAULT_PACKAGE + "."
: this.packageName)
+ WRAPPED_DATABINDING_CLASS_NAME;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?