SHARE
TWEET

parse schema element

a guest Oct 8th, 2012 42 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.         public static void parseSchemaElement(Element schemaElement, Definition definition, String targetNamespace) throws WSDLException{
  2.             SchemaType type = new SchemaType();
  3.             NamedNodeMap attributes = schemaElement.getAttributes();
  4.             String nameA = getAttributeValue(attributes,"name");
  5.             String typeA = getAttributeValue(attributes,"type");
  6.             String  refA = getAttributeValue(attributes, "ref");
  7.             String description = getElementDescription(schemaElement);
  8.             QName currentElementQName = new QName(schemaElement.getNamespaceURI(),schemaElement.getLocalName());
  9.             boolean finished = false;
  10.  
  11.             if(SchemaConstants.Q_ELEMS_MAIN.contains(currentElementQName)){
  12.                 if(unusedType == null){
  13.                     type.setName(nameA);
  14.                     type.setNamespace(targetNamespace);
  15.                     type.setDescription(description);
  16.                 }else{
  17.                     type = unusedType;
  18.                     unusedType = null;
  19.                 }
  20.                 if(match(schemaElement, SchemaConstants.Q_ELEM_ELEM, AbstractElement.class)){
  21.                     if(!refA.isEmpty()){
  22.                         type.referenced = removeNamespaceFromString(refA);
  23.                     }else{
  24.                         if(!typeA.isEmpty()){
  25.                             type.simpleType = removeNamespaceFromString(typeA);
  26.                             finished = true;
  27.                         }else{
  28.                             Element child = util.getFirstChildElement(schemaElement);
  29.                             if(child==null || util.match(child, SchemaConstants.Q_ELEM_COMP, AbstractElement.class)||util.match(child, SchemaConstants.Q_ELEM_SIMP, AbstractElement.class)){
  30.                                 unusedType = type;
  31.                                 parseSchemaElement(child, definition, targetNamespace);
  32.                             }else{
  33.                                 throw new WSDLException(WSDLException.PARSER_ERROR, "Элемент не содержит ни внешнего, ни внутреннего указания ("+child.getLocalName()+"в пространстве имён"+child.getNamespaceURI()+")");
  34.                             }
  35.                         }
  36.                     }
  37.                 }else{
  38.                     if(util.match(schemaElement, SchemaConstants.Q_ELEM_SIMP, AbstractElement.class)){
  39.                         //simpleType
  40.                         Element restriction = util.getFirstChildElement(schemaElement);
  41.                         if(util.match(restriction, SchemaConstants.Q_ELEM_RESTRICTION, AbstractElement.class)){
  42.                             String baseA = removeNamespaceFromString(getAttributeValue(restriction.getAttributes(),"base"));
  43.                             if(!baseA.isEmpty()){
  44.                                 type.setSimpleType(baseA);
  45.  
  46.                                 Element simpleTypeChild = util.getFirstChildElement(restriction);
  47.                                 while(simpleTypeChild != null){
  48.                                     NamedNodeMap childAttributes = simpleTypeChild.getAttributes();
  49.                                     String value = getAttributeValue(childAttributes,"value");
  50.                                     if(util.match(simpleTypeChild, SchemaConstants.Q_ELEM_ENUMERATION, AbstractElement.class)){
  51.                                         if(type.enumeration == null){
  52.                                             type.enumeration = new java.util.HashMap();
  53.                                         }
  54.                                         type.enumeration.put(value,getElementDescription(simpleTypeChild));
  55.                                     }else if(util.match(simpleTypeChild, SchemaConstants.Q_ELEM_LENGTH, AbstractElement.class)){
  56.                                         type.length = value;
  57.                                     }else if(util.match(simpleTypeChild, SchemaConstants.Q_ELEM_PATTERN, AbstractElement.class)){
  58.                                         type.pattern = value;
  59.                                     }else{
  60.                                         throw new WSDLException(WSDLException.PARSER_ERROR,"Недокументированный элемент "+simpleTypeChild.getLocalName()+" внутри элемента simpleType.");
  61.                                     }
  62.  
  63.                                     simpleTypeChild = util.getNextSiblingElement(simpleTypeChild);
  64.                                 }
  65.                                 finished = true;
  66.                             }else{
  67.                                 throw new WSDLException(WSDLException.PARSER_ERROR, "Отсутсвует обязательный аттрибут base у элемента <simpleType>.");
  68.                             }
  69.                         }else{
  70.                             //not a restriction
  71.                             throw new WSDLException(WSDLException.PARSER_ERROR,"После элемента simpleType ожидался элемент restriction");
  72.                         }
  73.                     }else{
  74.                         //complexType
  75.                         description = getElementDescription(schemaElement);
  76.                         if(type.getDescription().isEmpty()){
  77.                             type.setDescription(description);
  78.                         }
  79.                         Element complexTypeChild = util.getFirstChildElement(schemaElement);
  80.                         if(SchemaConstants.Q_COMPLEX_CHILD.contains(new QName(complexTypeChild.getNamespaceURI(), complexTypeChild.getLocalName()))){
  81.                             Element subChild = util.getFirstChildElement(complexTypeChild);
  82.                             while(subChild!=null){
  83.                                 if(util.match(subChild, SchemaConstants.Q_ELEM_ELEM, AbstractElement.class)){
  84.                                     NamedNodeMap subChildAttributes = subChild.getAttributes();
  85.                                     String name = getAttributeValue(subChildAttributes, "name");
  86.  
  87.                                     if(name.isEmpty()){
  88.                                         name = getAttributeValue(subChildAttributes,"ref");
  89.                                     }
  90.                                     name = removeNamespaceFromString(name);
  91.                                     if(util.match(complexTypeChild, SchemaConstants.Q_ELEM_CHOICE, AbstractElement.class)){
  92.                                         if(type.choice == null){
  93.                                             type.choice = new ArrayList();
  94.                                         }
  95.                                         type.choice.add(name);
  96.                                     }else{
  97.                                         if(type.relatedTypes == null){
  98.                                             type.relatedTypes = new ArrayList();
  99.                                         }
  100.                                         type.relatedTypes.add(name);
  101.                                     }
  102.  
  103.                                     parseSchemaElement(subChild,definition,targetNamespace);
  104.                                 }else if(util.match(subChild, SchemaConstants.Q_ELEM_CHOICE, AbstractElement.class)){
  105.  
  106.                                 }else{
  107.                                     throw new WSDLException(WSDLException.OTHER_ERROR,"Разбор данного элемента не предусмотрен.(\""+subChild.getLocalName()+"\" пространства имён \""+subChild.getNamespaceURI()+"\").");
  108.                                 }
  109.                                 subChild = util.getNextSiblingElement(subChild);
  110.                             }
  111.                             finished = true;
  112.                         }else if(SchemaConstants.Q_CONTENT_ELEMENTS.contains(new QName(complexTypeChild.getNamespaceURI(), complexTypeChild.getLocalName()))){
  113.  
  114.                         }else{
  115.                             throw new WSDLException(WSDLException.PARSER_ERROR,"Внутри элемента complexType содержится элемент, которому не соответсвующий схеме: "+complexTypeChild.getLocalName());
  116.                         }
  117.                     }
  118.                 }
  119.             }else{
  120.                 throw new WSDLException(WSDLException.PARSER_ERROR, "Неопознанный элемент описания");
  121.             }
  122.             if(finished){
  123.                 definition.schemaTypes.put(type.getName(), type);
  124.             }
  125.         }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top