From 29cbeb6235f6637f2584715cf3ea37cf6a371653 Mon Sep 17 00:00:00 2001 From: dave Date: Thu, 1 Feb 2007 00:17:28 +0000 Subject: [PATCH] Thrift: Fix xsd:sequence and xsd:all minOccurs/maxOccurs generation The minOccurs and maxOccurs attributes should appear on the elements, rather than the containers. for a thrift struct, we produce: ... for a thrift list, we produce for a thrift struct tagged with xsd_all, we produce Reviewed By: mcslee Test Plan: sandbox Revert Plan: revertible Notes: git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@664962 13f79535-47bb-0310-9956-ffa450edef68 --- compiler/cpp/src/generate/t_xsd_generator.cc | 20 ++++++++++++-------- compiler/cpp/src/generate/t_xsd_generator.h | 2 +- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/compiler/cpp/src/generate/t_xsd_generator.cc b/compiler/cpp/src/generate/t_xsd_generator.cc index 988aac89..7f53f9f5 100644 --- a/compiler/cpp/src/generate/t_xsd_generator.cc +++ b/compiler/cpp/src/generate/t_xsd_generator.cc @@ -41,14 +41,14 @@ void t_xsd_generator::generate_struct(t_struct* tstruct) { indent(s_xsd_types_) << "get_name() << "\">" << endl; indent_up(); if (xsd_all) { - indent(s_xsd_types_) << "" << endl; + indent(s_xsd_types_) << "" << endl; } else { indent(s_xsd_types_) << "" << endl; } indent_up(); for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { - generate_element(s_xsd_types_, (*m_iter)->get_name(), (*m_iter)->get_type(), (*m_iter)->get_xsd_optional()); + generate_element(s_xsd_types_, (*m_iter)->get_name(), (*m_iter)->get_type(), (*m_iter)->get_xsd_optional() || xsd_all, false); } indent_down(); @@ -66,8 +66,12 @@ void t_xsd_generator::generate_struct(t_struct* tstruct) { void t_xsd_generator::generate_element(ostream& out, string name, t_type* ttype, - bool optional) { - string soptional = optional ? " minOccurs=\"0\" maxOccurs=\"1\"" : ""; + bool optional, + bool list_element) { + string sminOccurs = (optional || list_element) ? " minOccurs=\"0\"" : ""; + string smaxOccurs = list_element ? " maxOccurs=\"unbounded\"" : ""; + + string soptional = sminOccurs + smaxOccurs; if (ttype->is_void() || ttype->is_list()) { indent(out) << @@ -79,7 +83,7 @@ void t_xsd_generator::generate_element(ostream& out, } else if (ttype->is_list()) { indent(out) << "" << endl; indent_up(); - indent(out) << "" << endl; + indent(out) << "" << endl; indent_up(); string subname; t_type* subtype = ((t_list*)ttype)->get_elem_type(); @@ -89,7 +93,7 @@ void t_xsd_generator::generate_element(ostream& out, subname = type_name(subtype); } f_php_ << "$GLOBALS['" << program_->get_name() << "_xsd_elt_" << name << "'] = '" << subname << "';" << endl; - generate_element(out, subname, subtype); + generate_element(out, subname, subtype, false, true); indent_down(); indent(out) << "" << endl; indent(out) << "" << endl; @@ -136,7 +140,7 @@ void t_xsd_generator::generate_service(t_service* tservice) { for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) { string elemname = (*f_iter)->get_name() + "_response"; t_type* returntype = (*f_iter)->get_returntype(); - generate_element(f_xsd_, elemname, returntype); + generate_element(f_xsd_, elemname, returntype, false, false); f_xsd_ << endl; t_struct* xs = (*f_iter)->get_xceptions(); @@ -149,7 +153,7 @@ void t_xsd_generator::generate_service(t_service* tservice) { map::iterator ax_iter; for (ax_iter = all_xceptions.begin(); ax_iter != all_xceptions.end(); ++ax_iter) { - generate_element(f_xsd_, ax_iter->first, ax_iter->second); + generate_element(f_xsd_, ax_iter->first, ax_iter->second, false, false); } // Close the XSD document diff --git a/compiler/cpp/src/generate/t_xsd_generator.h b/compiler/cpp/src/generate/t_xsd_generator.h index 0f6a41b8..04136704 100644 --- a/compiler/cpp/src/generate/t_xsd_generator.h +++ b/compiler/cpp/src/generate/t_xsd_generator.h @@ -40,7 +40,7 @@ class t_xsd_generator : public t_generator { private: - void generate_element(std::ostream& out, std::string name, t_type* ttype, bool optional=false); + void generate_element(std::ostream& out, std::string name, t_type* ttype, bool optional, bool list_element); std::string ns(std::string in, std::string ns) { return ns + ":" + in; -- 2.17.1