Advertisement
Guest User

parse schema element

a guest
Oct 8th, 2012
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.95 KB | None | 0 0
  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.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement