00001 /* 00002 * wsdlpull - A C++ parser for WSDL (Web services description language) 00003 * Copyright (C) 2005-2007 Vivek Krishna 00004 * 00005 * This library is free software; you can redistribute it and/or 00006 * modify it under the terms of the GNU Library General Public 00007 * License as published by the Free Software Foundation; either 00008 * version 2 of the License, or (at your option) any later version. 00009 * 00010 * This library is distributed in the hope that it will be useful, 00011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 * Library General Public License for more details. 00014 * 00015 * You should have received a copy of the GNU Library General Public 00016 * License along with this library; if not, write to the Free 00017 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00018 * 00019 */ 00020 00021 #include "schemaparser/ContentModel.h" 00022 #include "schemaparser/Element.h" 00023 #include "schemaparser/Group.h" 00024 00025 namespace Schema { 00026 void 00027 ContentModel::addElement(const Element & elem) 00028 { 00029 ContentType ct; 00030 00031 if(m_compositor==Schema::All){ 00032 if(elem.getMax()>1) 00033 { 00034 SchemaParserException spe("<all> MUST not have multiple occurrences of an element "+ 00035 elem.getName()); 00036 throw spe; 00037 } 00038 00039 } 00040 ct.e=new Element(elem); 00041 ContentHolder c(ct,ContentModel::Particle); 00042 contents_.push_back(c); 00043 if (elem.getType() == Schema::XSD_ANY) { 00044 00045 anyContent_ = true; 00046 } 00047 nParticles++; 00048 } 00049 00050 void 00051 ContentModel::addGroup(const Group & g,bool isRef) 00052 { 00053 ContentType ct; 00054 if(m_compositor==Schema::All){ 00055 00056 SchemaParserException spe("<all> MUST have only element "); 00057 throw spe; 00058 } 00059 ct.g=new Group(g); 00060 ct.g->setContents(g.getContents (),isRef); 00061 ContentHolder c(ct,ContentModel::ParticleGroup); 00062 contents_.push_back(c); 00063 } 00064 00065 void 00066 ContentModel::addContentModel(const ContentModel * container) 00067 { 00068 if(m_compositor==Schema::All){ 00069 SchemaParserException spe("<all> MUST have only elements within"); 00070 throw spe; 00071 } 00072 00073 ContentType ct; 00074 ct.c=const_cast<ContentModel*> (container); 00075 ContentHolder c(ct,ContentModel::Container); 00076 contents_.push_back(c); 00077 } 00078 00079 ContentModel::ContentModel(Schema::Compositor c) 00080 :m_compositor(c), 00081 nParticles(0), 00082 anyContent_(false) 00083 { 00084 contents_.clear(); 00085 00086 } 00087 00088 00089 ContentModel::~ContentModel() 00090 { 00091 for(ContentsIterator ci=begin();ci!=end();ci++){ 00092 00093 if(ci->second==ContentModel::Container) 00094 delete (ci->first).c; 00095 else if(ci->second==ContentModel::Particle) 00096 delete (ci->first).e; 00097 else if(ci->second==ContentModel::ParticleGroup) 00098 delete (ci->first).g; 00099 } 00100 } 00101 00102 void 00103 ContentModel::matchforwardRef(const std::string &name,Element &e) 00104 { 00105 for(ContentsIterator ci=begin();ci!=end();ci++){ 00106 if(ci->second==ContentModel::Particle) 00107 if((ci->first).e->getName()==name){ 00108 *((ci->first).e)=e; 00109 } 00110 } 00111 } 00112 }