/*
* Copyright (c) 1998-2011 Caucho Technology -- all rights reserved
*
* This file is part of Resin(R) Open Source
*
* Each copy or derived work must preserve the copyright notice and this
* notice unmodified.
*
* Resin Open Source is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Resin Open Source is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
* of NON-INFRINGEMENT. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License
* along with Resin Open Source; if not, write to the
* Free SoftwareFoundation, Inc.
* 59 Temple Place, Suite 330
* Boston, MA 02111-1307 USA
*
* @author Emil Ong
*/
package com.caucho.xml.schema;
import java.io.*;
import java.util.*;
import static javax.xml.XMLConstants.*;
import javax.xml.bind.annotation.*;
import com.caucho.java.JavaWriter;
import com.caucho.jaxb.JAXBUtil;
import com.caucho.vfs.*;
/**
* JAXB annotated Schema data structure.
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="complexType", namespace=W3C_XML_SCHEMA_NS_URI)
public class ComplexType extends Type {
@XmlAttribute(name="name")
private String _name;
@XmlElements({
@XmlElement(name="sequence",
namespace=W3C_XML_SCHEMA_NS_URI,
type=com.caucho.xml.schema.Sequence.class)})
private List<Object> _contents;
@XmlTransient
private Schema _schema;
@XmlTransient
private String _className;
@XmlTransient
/** If set to false, generateJava does nothing. */
private boolean _emit = true;
@XmlTransient
/** If set to true, generateJava also generates a wrapper Exception class. */
private boolean _emitFaultWrapper = false;
@XmlTransient
public Schema getSchema()
{
return _schema;
}
public void setSchema(Schema schema)
{
_schema = schema;
if (_contents != null) {
for (int i = 0; i < _contents.size(); i++) {
Sequence sequence = (Sequence) _contents.get(i);
sequence.setSchema(_schema);
}
}
}
public String getName()
{
return _name;
}
public List<Object> getContents()
{
if (_contents == null)
_contents = new ArrayList<Object>();
return _contents;
}
public String getJavaType(int index)
{
if (_contents == null)
return "void";
if (_contents.size() == 0)
return "void";
if (_contents.size() != 1)
return null;
if (_contents.get(0) instanceof Sequence) {
Sequence sequence = (Sequence) _contents.get(0);
List<Object> sequenceContents = sequence.getContents();
int j = 0;
for (int i = 0; i < sequenceContents.size(); i++) {
Object o = sequenceContents.get(i);
if (o instanceof Element) {
Element element = (Element) o;
if (index == j) {
String className = element.getClassname();
if (className != null)
return className;
Type type = _schema.getType(element.getType());
if (type != null)
return type.getClassname();
return null;
}
j++;
}
}
}
return null;
}
public String getArgumentName(int index)
{
if (_contents == null)
return null;
if (_contents.size() == 0)
return null;
if (_contents.size() != 1)
return null;
if (_contents.get(0) instanceof Sequence) {
Sequence sequence = (Sequence) _contents.get(0);
List<Object> sequenceContents = sequence.getContents();
int j = 0;
for (int i = 0; i < sequenceContents.size(); i++) {
Object o = sequenceContents.get(i);
if (o instanceof Element) {
Element element = (Element) o;
if (index == j)
return element.getName();
j++;
}
}
}
return null;
}
public void writeJava(File outputDirectory, String pkg)
throws IOException
{
if (! _emit)
return;
File dir = new File(outputDirectory, pkg.replace(".", File.separator));
dir.mkdirs();
File output = new File(dir, getClassname() + ".java");
WriteStream os = null;
try {
os = Vfs.openWrite(output.toString());
JavaWriter out = new JavaWriter(os);
out.println("package " + pkg + ";");
out.println();
out.println("import java.math.BigDecimal;");
out.println("import java.math.BigInteger;");
out.println("import java.util.List;");
out.println("import javax.xml.bind.annotation.*;");
out.println();
out.print("@XmlType(name=\"" + getName() + "\"");
if (_schema != null && _schema.getTargetNamespace() != null)
out.print(", namespace=\"" + _schema.getTargetNamespace() + "\"");
out.println(")");
out.println("public class " + getClassname() + " {");
out.pushDepth();
if (_contents != null) {
for (int i = 0; i < _contents.size(); i++) {
if (_contents.get(i) instanceof Sequence) {
Sequence sequence = (Sequence) _contents.get(i);
for (Object o : sequence.getContents()) {
if (o instanceof Element) {
((Element) o).generateJavaField(out);
out.println();
}
}
}
}
}
out.popDepth();
out.println("}");
}
finally {
if (os != null)
os.close();
}
if (_emitFaultWrapper) {
os = null;
output = new File(dir, getFaultWrapperClassname() + ".java");
try {
os = Vfs.openWrite(output.toString());
JavaWriter out = new JavaWriter(os);
out.println("package " + pkg + ";");
out.println();
out.println("import java.math.BigDecimal;");
out.println("import java.math.BigInteger;");
out.println("import java.util.List;");
out.println();
out.println("public class " + getFaultWrapperClassname());
out.pushDepth();
out.println("extends Exception {");
out.println();
out.println("private " + getClassname() + " _faultInfo;");
out.println();
out.print("public " + getFaultWrapperClassname() + "(String message, ");
out.println(getClassname() + " faultInfo)");
out.println("{");
out.pushDepth();
out.println("super(message);");
out.println("_faultInfo = faultInfo;");
out.popDepth();
out.println("}");
out.println();
out.print("public " + getFaultWrapperClassname() + "(String message, ");
out.println(getClassname() + " faultInfo, Throwable cause)");
out.println("{");
out.pushDepth();
out.println("super(message, cause);");
out.println("_faultInfo = faultInfo;");
out.popDepth();
out.println("}");
out.println();
out.println("public " + getClassname() + " getFaultInfo()");
out.println("{");
out.pushDepth();
out.println("return _faultInfo;");
out.popDepth();
out.println("}");
out.popDepth();
out.println("}");
}
finally {
if (os != null)
os.close();
}
}
}
public String getClassname()
{
if (_className == null) {
_className = Character.toUpperCase(getName().charAt(0)) +
(getName().length() > 1 ? getName().substring(1) : "");
}
return _className;
}
public String getFaultWrapperClassname()
{
return getClassname() + "_Exception";
}
public void setEmit(boolean emit)
{
_emit = emit;
}
public void setEmitFaultWrapper(boolean emitFaultWrapper)
{
_emitFaultWrapper = emitFaultWrapper;
}
public String toString()
{
return "ComplexType[" + _name + "]";
}
}