Committed by
Gerrit Code Review
[ONOS-3904] Derived data type and formatting fixes
Change-Id: I1d68899e0056fa0db6322e83f7e9d3ff9b3b1ee0
Showing
19 changed files
with
429 additions
and
121 deletions
| 1 | +/*Copyright 2016.year Open Networking Laboratory | ||
| 2 | + | ||
| 3 | +Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 4 | +you may not use this file except in compliance with the License. | ||
| 5 | +You may obtain a copy of the License at | ||
| 6 | + | ||
| 7 | + http://www.apache.org/licenses/LICENSE-2.0 | ||
| 8 | + | ||
| 9 | +Unless required by applicable law or agreed to in writing, software | ||
| 10 | +distributed under the License is distributed on an "AS IS" BASIS, | ||
| 11 | +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 12 | +See the License for the specific language governing permissions and | ||
| 13 | +limitations under the License.*/ | ||
| 14 | +package org.onosproject.yangutils.datamodel; | ||
| 15 | + | ||
| 16 | +import org.onosproject.yangutils.datamodel.exceptions.DataModelException; | ||
| 17 | +import org.onosproject.yangutils.parser.Parsable; | ||
| 18 | +import org.onosproject.yangutils.parser.ParsableDataType; | ||
| 19 | + | ||
| 20 | +/*- | ||
| 21 | + * The typedef Statement | ||
| 22 | + * | ||
| 23 | + * The "typedef" statement defines a new type that may be used locally | ||
| 24 | + * in the module, in modules or submodules which include it, and by | ||
| 25 | + * other modules that import from it. The new type is called the | ||
| 26 | + * "derived type", and the type from which it was derived is called | ||
| 27 | + * the "base type". All derived types can be traced back to a YANG | ||
| 28 | + * built-in type. | ||
| 29 | + * | ||
| 30 | + * The "typedef" statement's argument is an identifier that is the name | ||
| 31 | + * of the type to be defined, and MUST be followed by a block of | ||
| 32 | + * sub-statements that holds detailed typedef information. | ||
| 33 | + * | ||
| 34 | + * The name of the type MUST NOT be one of the YANG built-in types. If | ||
| 35 | + * the typedef is defined at the top level of a YANG module or | ||
| 36 | + * submodule, the name of the type to be defined MUST be unique within | ||
| 37 | + * the module. | ||
| 38 | + */ | ||
| 39 | +/** | ||
| 40 | + * Derived type information. | ||
| 41 | + */ | ||
| 42 | +public class YangDerivedType implements Parsable { | ||
| 43 | + | ||
| 44 | + /** | ||
| 45 | + * All derived types can be traced back to a YANG built-in type. | ||
| 46 | + */ | ||
| 47 | + private YangDataTypes effectiveYangBuiltInType; | ||
| 48 | + | ||
| 49 | + /** | ||
| 50 | + * Base type from which the current type is derived. | ||
| 51 | + */ | ||
| 52 | + private YangType<?> baseType; | ||
| 53 | + | ||
| 54 | + /** | ||
| 55 | + * Default constructor. | ||
| 56 | + */ | ||
| 57 | + public YangDerivedType() { | ||
| 58 | + } | ||
| 59 | + | ||
| 60 | + /** | ||
| 61 | + * Get the effective YANG built-in type of the derived data type. | ||
| 62 | + * | ||
| 63 | + * @return effective YANG built-in type of the derived data type. | ||
| 64 | + */ | ||
| 65 | + public YangDataTypes getEffectiveYangBuiltInType() { | ||
| 66 | + return effectiveYangBuiltInType; | ||
| 67 | + } | ||
| 68 | + | ||
| 69 | + /** | ||
| 70 | + * Set the effective YANG built-in type of the derived data type. | ||
| 71 | + * | ||
| 72 | + * @param builtInType effective YANG built-in type of the derived data type. | ||
| 73 | + */ | ||
| 74 | + public void setEffectiveYangBuiltInType(YangDataTypes builtInType) { | ||
| 75 | + effectiveYangBuiltInType = builtInType; | ||
| 76 | + } | ||
| 77 | + | ||
| 78 | + /** | ||
| 79 | + * Get the base type information. | ||
| 80 | + * | ||
| 81 | + * @return base type information. | ||
| 82 | + */ | ||
| 83 | + public YangType<?> getBaseType() { | ||
| 84 | + return baseType; | ||
| 85 | + } | ||
| 86 | + | ||
| 87 | + /** | ||
| 88 | + * Get the base type information. | ||
| 89 | + * | ||
| 90 | + * @param baseType base type information. | ||
| 91 | + */ | ||
| 92 | + public void setBaseType(YangType<?> baseType) { | ||
| 93 | + this.baseType = baseType; | ||
| 94 | + } | ||
| 95 | + | ||
| 96 | + /** | ||
| 97 | + * Get the parsable type. | ||
| 98 | + */ | ||
| 99 | + @Override | ||
| 100 | + public ParsableDataType getParsableDataType() { | ||
| 101 | + return ParsableDataType.DERIVED; | ||
| 102 | + } | ||
| 103 | + | ||
| 104 | + /** | ||
| 105 | + * TODO. | ||
| 106 | + */ | ||
| 107 | + @Override | ||
| 108 | + public void validateDataOnEntry() throws DataModelException { | ||
| 109 | + // TODO Auto-generated method stub | ||
| 110 | + | ||
| 111 | + } | ||
| 112 | + | ||
| 113 | + /** | ||
| 114 | + * TODO. | ||
| 115 | + */ | ||
| 116 | + @Override | ||
| 117 | + public void validateDataOnExit() throws DataModelException { | ||
| 118 | + // TODO Auto-generated method stub | ||
| 119 | + | ||
| 120 | + } | ||
| 121 | + | ||
| 122 | +} |
| ... | @@ -16,13 +16,13 @@ | ... | @@ -16,13 +16,13 @@ |
| 16 | 16 | ||
| 17 | package org.onosproject.yangutils.datamodel; | 17 | package org.onosproject.yangutils.datamodel; |
| 18 | 18 | ||
| 19 | +import java.util.HashSet; | ||
| 20 | +import java.util.Set; | ||
| 21 | + | ||
| 19 | import org.onosproject.yangutils.datamodel.exceptions.DataModelException; | 22 | import org.onosproject.yangutils.datamodel.exceptions.DataModelException; |
| 20 | import org.onosproject.yangutils.parser.Parsable; | 23 | import org.onosproject.yangutils.parser.Parsable; |
| 21 | import org.onosproject.yangutils.parser.ParsableDataType; | 24 | import org.onosproject.yangutils.parser.ParsableDataType; |
| 22 | 25 | ||
| 23 | -import java.util.HashSet; | ||
| 24 | -import java.util.Set; | ||
| 25 | - | ||
| 26 | /* | 26 | /* |
| 27 | * The enumeration built-in type represents values from a set of | 27 | * The enumeration built-in type represents values from a set of |
| 28 | * assigned names. | 28 | * assigned names. | ... | ... |
| ... | @@ -438,7 +438,7 @@ public class YangList extends YangNode | ... | @@ -438,7 +438,7 @@ public class YangList extends YangNode |
| 438 | */ | 438 | */ |
| 439 | @Override | 439 | @Override |
| 440 | public void validateDataOnExit() throws DataModelException { | 440 | public void validateDataOnExit() throws DataModelException { |
| 441 | - List<String> keyList = getKeyList(); | 441 | + List<String> keys = getKeyList(); |
| 442 | List<YangLeaf> leaves = getListOfLeaf(); | 442 | List<YangLeaf> leaves = getListOfLeaf(); |
| 443 | List<YangLeafList> leafLists = getListOfLeafList(); | 443 | List<YangLeafList> leafLists = getListOfLeafList(); |
| 444 | 444 | ||
| ... | @@ -447,29 +447,32 @@ public class YangList extends YangNode | ... | @@ -447,29 +447,32 @@ public class YangList extends YangNode |
| 447 | 447 | ||
| 448 | /* A list must have atleast one key leaf if config is true */ | 448 | /* A list must have atleast one key leaf if config is true */ |
| 449 | if ((isConfig) | 449 | if ((isConfig) |
| 450 | - && ((keyList == null) || (leaves == null && leafLists == null))) { | 450 | + && ((keys == null) || ((leaves == null) && (leafLists == null)))) { |
| 451 | throw new DataModelException("A list must have atleast one key leaf if config is true;"); | 451 | throw new DataModelException("A list must have atleast one key leaf if config is true;"); |
| 452 | - } else if (keyList != null) { | 452 | + } else if (keys != null) { |
| 453 | if (leaves != null) { | 453 | if (leaves != null) { |
| 454 | - validateLeafKey(leaves, keyList); | 454 | + validateLeafKey(leaves, keys); |
| 455 | } | 455 | } |
| 456 | 456 | ||
| 457 | if (leafLists != null) { | 457 | if (leafLists != null) { |
| 458 | - validateLeafListKey(leafLists, keyList); | 458 | + validateLeafListKey(leafLists, keys); |
| 459 | } | 459 | } |
| 460 | } | 460 | } |
| 461 | } | 461 | } |
| 462 | 462 | ||
| 463 | /** | 463 | /** |
| 464 | - * Sets the config's value to all leaf if leaf's config statement is not specified. | 464 | + * Sets the config's value to all leaf if leaf's config statement is not |
| 465 | + * specified. | ||
| 465 | * | 466 | * |
| 466 | * @param leaves list of leaf attributes of YANG list. | 467 | * @param leaves list of leaf attributes of YANG list. |
| 467 | * @param leafLists list of leaf-list attributes of YANG list. | 468 | * @param leafLists list of leaf-list attributes of YANG list. |
| 468 | */ | 469 | */ |
| 469 | private void setDefaultConfigValueToChild(List<YangLeaf> leaves, List<YangLeafList> leafLists) { | 470 | private void setDefaultConfigValueToChild(List<YangLeaf> leaves, List<YangLeafList> leafLists) { |
| 470 | 471 | ||
| 471 | - /* If "config" is not specified, the default is the same as the parent | 472 | + /* |
| 472 | - schema node's "config" value.*/ | 473 | + * If "config" is not specified, the default is the same as the parent |
| 474 | + * schema node's "config" value. | ||
| 475 | + */ | ||
| 473 | if (leaves != null) { | 476 | if (leaves != null) { |
| 474 | for (YangLeaf leaf : leaves) { | 477 | for (YangLeaf leaf : leaves) { |
| 475 | if (leaf.isConfig() == null) { | 478 | if (leaf.isConfig() == null) { |
| ... | @@ -478,8 +481,10 @@ public class YangList extends YangNode | ... | @@ -478,8 +481,10 @@ public class YangList extends YangNode |
| 478 | } | 481 | } |
| 479 | } | 482 | } |
| 480 | 483 | ||
| 481 | - /* If "config" is not specified, the default is the same as the parent | 484 | + /* |
| 482 | - schema node's "config" value.*/ | 485 | + * If "config" is not specified, the default is the same as the parent |
| 486 | + * schema node's "config" value. | ||
| 487 | + */ | ||
| 483 | if (leafLists != null) { | 488 | if (leafLists != null) { |
| 484 | for (YangLeafList leafList : leafLists) { | 489 | for (YangLeafList leafList : leafLists) { |
| 485 | if (leafList.isConfig() == null) { | 490 | if (leafList.isConfig() == null) { |
| ... | @@ -498,8 +503,10 @@ public class YangList extends YangNode | ... | @@ -498,8 +503,10 @@ public class YangList extends YangNode |
| 498 | */ | 503 | */ |
| 499 | private void validateConfig(List<YangLeaf> leaves, List<YangLeafList> leafLists) throws DataModelException { | 504 | private void validateConfig(List<YangLeaf> leaves, List<YangLeafList> leafLists) throws DataModelException { |
| 500 | 505 | ||
| 501 | - /* If a node has "config" set to "false", no node underneath it can have | 506 | + /* |
| 502 | - "config" set to "true".*/ | 507 | + * If a node has "config" set to "false", no node underneath it can have |
| 508 | + * "config" set to "true". | ||
| 509 | + */ | ||
| 503 | if ((!isConfig) && (leaves != null)) { | 510 | if ((!isConfig) && (leaves != null)) { |
| 504 | for (YangLeaf leaf : leaves) { | 511 | for (YangLeaf leaf : leaves) { |
| 505 | if (leaf.isConfig()) { | 512 | if (leaf.isConfig()) { |
| ... | @@ -523,19 +530,21 @@ public class YangList extends YangNode | ... | @@ -523,19 +530,21 @@ public class YangList extends YangNode |
| 523 | * Validates key statement of list. | 530 | * Validates key statement of list. |
| 524 | * | 531 | * |
| 525 | * @param leaves list of leaf attributes of list. | 532 | * @param leaves list of leaf attributes of list. |
| 526 | - * @param keyList list of key attributes of list. | 533 | + * @param keys list of key attributes of list. |
| 527 | * @throws DataModelException a violation of data model rules. | 534 | * @throws DataModelException a violation of data model rules. |
| 528 | */ | 535 | */ |
| 529 | - private void validateLeafKey(List<YangLeaf> leaves, List<String> keyList) throws DataModelException { | 536 | + private void validateLeafKey(List<YangLeaf> leaves, List<String> keys) throws DataModelException { |
| 530 | boolean leafFound = false; | 537 | boolean leafFound = false; |
| 531 | List<YangLeaf> keyLeaves = new LinkedList<>(); | 538 | List<YangLeaf> keyLeaves = new LinkedList<>(); |
| 532 | 539 | ||
| 533 | - /* 1. Leaf identifier must refer to a child leaf of the list | 540 | + /* |
| 534 | - 2. A leaf that is part of the key must not be the built-in type "empty". */ | 541 | + * 1. Leaf identifier must refer to a child leaf of the list 2. A leaf |
| 535 | - for (String key : keyList) { | 542 | + * that is part of the key must not be the built-in type "empty". |
| 543 | + */ | ||
| 544 | + for (String key : keys) { | ||
| 536 | for (YangLeaf leaf : leaves) { | 545 | for (YangLeaf leaf : leaves) { |
| 537 | if (key.equals(leaf.getLeafName())) { | 546 | if (key.equals(leaf.getLeafName())) { |
| 538 | - if (leaf.getDataType().getDataTypeName().replace("\"", "").equals("empty")) { | 547 | + if (leaf.getDataType().getDataType() == YangDataTypes.EMPTY) { |
| 539 | throw new DataModelException(" A leaf that is part of the key must not be the built-in " + | 548 | throw new DataModelException(" A leaf that is part of the key must not be the built-in " + |
| 540 | "type \"empty\"."); | 549 | "type \"empty\"."); |
| 541 | } | 550 | } |
| ... | @@ -550,8 +559,10 @@ public class YangList extends YangNode | ... | @@ -550,8 +559,10 @@ public class YangList extends YangNode |
| 550 | leafFound = false; | 559 | leafFound = false; |
| 551 | } | 560 | } |
| 552 | 561 | ||
| 553 | - /* All key leafs in a list MUST have the same value for their "config" | 562 | + /* |
| 554 | - as the list itself. */ | 563 | + * All key leafs in a list MUST have the same value for their "config" |
| 564 | + * as the list itself. | ||
| 565 | + */ | ||
| 555 | for (YangLeaf keyLeaf : keyLeaves) { | 566 | for (YangLeaf keyLeaf : keyLeaves) { |
| 556 | if (isConfig != keyLeaf.isConfig()) { | 567 | if (isConfig != keyLeaf.isConfig()) { |
| 557 | throw new DataModelException("All key leafs in a list must have the same value for their" + | 568 | throw new DataModelException("All key leafs in a list must have the same value for their" + |
| ... | @@ -564,19 +575,21 @@ public class YangList extends YangNode | ... | @@ -564,19 +575,21 @@ public class YangList extends YangNode |
| 564 | * Validates key statement of list. | 575 | * Validates key statement of list. |
| 565 | * | 576 | * |
| 566 | * @param leafLists list of leaf-list attributes of list. | 577 | * @param leafLists list of leaf-list attributes of list. |
| 567 | - * @param keyList list of key attributes of list. | 578 | + * @param keys list of key attributes of list. |
| 568 | * @throws DataModelException a violation of data model rules. | 579 | * @throws DataModelException a violation of data model rules. |
| 569 | */ | 580 | */ |
| 570 | - private void validateLeafListKey(List<YangLeafList> leafLists, List<String> keyList) throws DataModelException { | 581 | + private void validateLeafListKey(List<YangLeafList> leafLists, List<String> keys) throws DataModelException { |
| 571 | boolean leafFound = false; | 582 | boolean leafFound = false; |
| 572 | List<YangLeafList> keyLeafLists = new LinkedList<>(); | 583 | List<YangLeafList> keyLeafLists = new LinkedList<>(); |
| 573 | 584 | ||
| 574 | - /* 1. Leaf identifier must refer to a child leaf of the list | 585 | + /* |
| 575 | - 2. A leaf that is part of the key must not be the built-in type "empty". */ | 586 | + * 1. Leaf identifier must refer to a child leaf of the list 2. A leaf |
| 576 | - for (String key : keyList) { | 587 | + * that is part of the key must not be the built-in type "empty". |
| 588 | + */ | ||
| 589 | + for (String key : keys) { | ||
| 577 | for (YangLeafList leafList : leafLists) { | 590 | for (YangLeafList leafList : leafLists) { |
| 578 | if (key.equals(leafList.getLeafName())) { | 591 | if (key.equals(leafList.getLeafName())) { |
| 579 | - if (leafList.getDataType().getDataTypeName().replace("\"", "").equals("empty")) { | 592 | + if (leafList.getDataType().getDataType() == YangDataTypes.EMPTY) { |
| 580 | throw new DataModelException(" A leaf-list that is part of the key must not be the built-in " + | 593 | throw new DataModelException(" A leaf-list that is part of the key must not be the built-in " + |
| 581 | "type \"empty\"."); | 594 | "type \"empty\"."); |
| 582 | } | 595 | } |
| ... | @@ -591,8 +604,10 @@ public class YangList extends YangNode | ... | @@ -591,8 +604,10 @@ public class YangList extends YangNode |
| 591 | leafFound = false; | 604 | leafFound = false; |
| 592 | } | 605 | } |
| 593 | 606 | ||
| 594 | - /* All key leafs in a list MUST have the same value for their "config" | 607 | + /* |
| 595 | - as the list itself. */ | 608 | + * All key leafs in a list MUST have the same value for their "config" |
| 609 | + * as the list itself. | ||
| 610 | + */ | ||
| 596 | for (YangLeafList keyLeafList : keyLeafLists) { | 611 | for (YangLeafList keyLeafList : keyLeafLists) { |
| 597 | if (isConfig() != keyLeafList.isConfig()) { | 612 | if (isConfig() != keyLeafList.isConfig()) { |
| 598 | throw new DataModelException("All key leaf-lists in a list must have the same value for their" + | 613 | throw new DataModelException("All key leaf-lists in a list must have the same value for their" + |
| ... | @@ -601,8 +616,9 @@ public class YangList extends YangNode | ... | @@ -601,8 +616,9 @@ public class YangList extends YangNode |
| 601 | } | 616 | } |
| 602 | } | 617 | } |
| 603 | 618 | ||
| 604 | - /* (non-Javadoc) | 619 | + /** |
| 605 | - * @see org.onosproject.yangutils.translator.CodeGenerator#generateJavaCodeEntry() | 620 | + * Populate the cached handle with information about the list attributes to |
| 621 | + * generate java code. | ||
| 606 | */ | 622 | */ |
| 607 | @Override | 623 | @Override |
| 608 | public void generateJavaCodeEntry() { | 624 | public void generateJavaCodeEntry() { | ... | ... |
| ... | @@ -166,6 +166,43 @@ public class YangModule extends YangNode | ... | @@ -166,6 +166,43 @@ public class YangModule extends YangNode |
| 166 | */ | 166 | */ |
| 167 | private CachedFileHandle fileHandle; | 167 | private CachedFileHandle fileHandle; |
| 168 | 168 | ||
| 169 | + /*- | ||
| 170 | + * Nested typedefs and groupings. | ||
| 171 | + * Typedefs and groupings may appear nested under many YANG statements, | ||
| 172 | + * allowing these to be lexically scoped by the hierarchy under which | ||
| 173 | + * they appear. This allows types and groupings to be defined near | ||
| 174 | + * where they are used, rather than placing them at the top level of the | ||
| 175 | + * hierarchy. The close proximity increases readability. | ||
| 176 | + * | ||
| 177 | + * Scoping also allows types to be defined without concern for naming | ||
| 178 | + * conflicts between types in different submodules. Type names can be | ||
| 179 | + * specified without adding leading strings designed to prevent name | ||
| 180 | + * collisions within large modules. | ||
| 181 | + * | ||
| 182 | + * Finally, scoping allows the module author to keep types and groupings | ||
| 183 | + * private to their module or submodule, preventing their reuse. Since | ||
| 184 | + * only top-level types and groupings (i.e., those appearing as | ||
| 185 | + * sub-statements to a module or submodule statement) can be used outside | ||
| 186 | + * the module or submodule, the developer has more control over what | ||
| 187 | + * pieces of their module are presented to the outside world, supporting | ||
| 188 | + * the need to hide internal information and maintaining a boundary | ||
| 189 | + * between what is shared with the outside world and what is kept | ||
| 190 | + * private. | ||
| 191 | + * | ||
| 192 | + * Scoped definitions MUST NOT shadow definitions at a higher scope. A | ||
| 193 | + * type or grouping cannot be defined if a higher level in the schema | ||
| 194 | + * hierarchy has a definition with a matching identifier. | ||
| 195 | + * | ||
| 196 | + * A reference to an unprefixed type or grouping, or one which uses the | ||
| 197 | + * prefix of the current module, is resolved by locating the closest | ||
| 198 | + * matching "typedef" or "grouping" statement among the immediate | ||
| 199 | + * sub-statements of each ancestor statement. | ||
| 200 | + */ | ||
| 201 | + /** | ||
| 202 | + * List of nodes which require nested reference resolution. | ||
| 203 | + */ | ||
| 204 | + private List<YangNode> nestedReferenceResoulutionList; | ||
| 205 | + | ||
| 169 | /** | 206 | /** |
| 170 | * Create a YANG node of module type. | 207 | * Create a YANG node of module type. |
| 171 | */ | 208 | */ |
| ... | @@ -173,16 +210,20 @@ public class YangModule extends YangNode | ... | @@ -173,16 +210,20 @@ public class YangModule extends YangNode |
| 173 | super(YangNodeType.MODULE_NODE); | 210 | super(YangNodeType.MODULE_NODE); |
| 174 | } | 211 | } |
| 175 | 212 | ||
| 176 | - /* (non-Javadoc) | 213 | + /** |
| 177 | - * @see org.onosproject.yangutils.datamodel.YangNode#getName() | 214 | + * Get name of the module. |
| 215 | + * | ||
| 216 | + * @return module name. | ||
| 178 | */ | 217 | */ |
| 179 | @Override | 218 | @Override |
| 180 | public String getName() { | 219 | public String getName() { |
| 181 | return name; | 220 | return name; |
| 182 | } | 221 | } |
| 183 | 222 | ||
| 184 | - /* (non-Javadoc) | 223 | + /** |
| 185 | - * @see org.onosproject.yangutils.datamodel.YangNode#setName(java.lang.String) | 224 | + * Set module name. |
| 225 | + * | ||
| 226 | + * @param moduleName module name. | ||
| 186 | */ | 227 | */ |
| 187 | @Override | 228 | @Override |
| 188 | public void setName(String moduleName) { | 229 | public void setName(String moduleName) { |
| ... | @@ -511,6 +552,37 @@ public class YangModule extends YangNode | ... | @@ -511,6 +552,37 @@ public class YangModule extends YangNode |
| 511 | } | 552 | } |
| 512 | 553 | ||
| 513 | /** | 554 | /** |
| 555 | + * Get the list of nested reference's which required resolution. | ||
| 556 | + * | ||
| 557 | + * @return list of nested reference's which required resolution. | ||
| 558 | + */ | ||
| 559 | + public List<YangNode> getNestedReferenceResoulutionList() { | ||
| 560 | + return nestedReferenceResoulutionList; | ||
| 561 | + } | ||
| 562 | + | ||
| 563 | + /** | ||
| 564 | + * Set list of nested reference's which requires resolution. | ||
| 565 | + * | ||
| 566 | + * @param nestedReferenceResoulutionList list of nested reference's which | ||
| 567 | + * requires resolution. | ||
| 568 | + */ | ||
| 569 | + private void setNestedReferenceResoulutionList(List<YangNode> nestedReferenceResoulutionList) { | ||
| 570 | + this.nestedReferenceResoulutionList = nestedReferenceResoulutionList; | ||
| 571 | + } | ||
| 572 | + | ||
| 573 | + /** | ||
| 574 | + * Set list of nested reference's which requires resolution. | ||
| 575 | + * | ||
| 576 | + * @param nestedReference nested reference which requires resolution. | ||
| 577 | + */ | ||
| 578 | + public void addToNestedReferenceResoulutionList(YangNode nestedReference) { | ||
| 579 | + if (getNestedReferenceResoulutionList() == null) { | ||
| 580 | + setNestedReferenceResoulutionList(new LinkedList<YangNode>()); | ||
| 581 | + } | ||
| 582 | + getNestedReferenceResoulutionList().add(nestedReference); | ||
| 583 | + } | ||
| 584 | + | ||
| 585 | + /** | ||
| 514 | * Returns the type of the parsed data. | 586 | * Returns the type of the parsed data. |
| 515 | * | 587 | * |
| 516 | * @return returns MODULE_DATA. | 588 | * @return returns MODULE_DATA. |
| ... | @@ -601,4 +673,28 @@ public class YangModule extends YangNode | ... | @@ -601,4 +673,28 @@ public class YangModule extends YangNode |
| 601 | } | 673 | } |
| 602 | } | 674 | } |
| 603 | 675 | ||
| 676 | + /** | ||
| 677 | + * Add a type to resolve the nested references. | ||
| 678 | + * | ||
| 679 | + * @param node grouping or typedef node which needs to be resolved. | ||
| 680 | + * @throws DataModelException data model exception. | ||
| 681 | + */ | ||
| 682 | + public static void addToResolveList(YangNode node) throws DataModelException { | ||
| 683 | + /* get the module node to add maintain the list of nested reference */ | ||
| 684 | + YangModule module; | ||
| 685 | + YangNode curNode = node; | ||
| 686 | + while (curNode.getNodeType() != YangNodeType.MODULE_NODE) { | ||
| 687 | + curNode = curNode.getParent(); | ||
| 688 | + if (curNode == null) { | ||
| 689 | + break; | ||
| 690 | + } | ||
| 691 | + } | ||
| 692 | + if (curNode == null) { | ||
| 693 | + throw new DataModelException("Datamodel tree is not correct"); | ||
| 694 | + } | ||
| 695 | + | ||
| 696 | + module = (YangModule) curNode; | ||
| 697 | + module.addToNestedReferenceResoulutionList(node); | ||
| 698 | + return; | ||
| 699 | + } | ||
| 604 | } | 700 | } | ... | ... |
| ... | @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and | ... | @@ -13,6 +13,7 @@ See the License for the specific language governing permissions and |
| 13 | limitations under the License.*/ | 13 | limitations under the License.*/ |
| 14 | package org.onosproject.yangutils.datamodel; | 14 | package org.onosproject.yangutils.datamodel; |
| 15 | 15 | ||
| 16 | +import java.util.LinkedList; | ||
| 16 | import java.util.List; | 17 | import java.util.List; |
| 17 | 18 | ||
| 18 | /*- | 19 | /*- |
| ... | @@ -51,7 +52,7 @@ public class YangPatternRestriction { | ... | @@ -51,7 +52,7 @@ public class YangPatternRestriction { |
| 51 | /** | 52 | /** |
| 52 | * Pattern restriction defined for the current type. | 53 | * Pattern restriction defined for the current type. |
| 53 | */ | 54 | */ |
| 54 | - private List<String> pattern; | 55 | + private List<String> patternList; |
| 55 | 56 | ||
| 56 | /** | 57 | /** |
| 57 | * Effective pattern restriction that needs inherited from base type. | 58 | * Effective pattern restriction that needs inherited from base type. |
| ... | @@ -62,6 +63,7 @@ public class YangPatternRestriction { | ... | @@ -62,6 +63,7 @@ public class YangPatternRestriction { |
| 62 | * Default constructor. | 63 | * Default constructor. |
| 63 | */ | 64 | */ |
| 64 | public YangPatternRestriction() { | 65 | public YangPatternRestriction() { |
| 66 | + setPatternList(new LinkedList<String>()); | ||
| 65 | } | 67 | } |
| 66 | 68 | ||
| 67 | /** | 69 | /** |
| ... | @@ -69,8 +71,8 @@ public class YangPatternRestriction { | ... | @@ -69,8 +71,8 @@ public class YangPatternRestriction { |
| 69 | * | 71 | * |
| 70 | * @return pattern restriction defined for the current type. | 72 | * @return pattern restriction defined for the current type. |
| 71 | */ | 73 | */ |
| 72 | - public List<String> getPattern() { | 74 | + public List<String> getPatternList() { |
| 73 | - return pattern; | 75 | + return patternList; |
| 74 | } | 76 | } |
| 75 | 77 | ||
| 76 | /** | 78 | /** |
| ... | @@ -78,8 +80,17 @@ public class YangPatternRestriction { | ... | @@ -78,8 +80,17 @@ public class YangPatternRestriction { |
| 78 | * | 80 | * |
| 79 | * @param pattern pattern restriction defined for the current type.. | 81 | * @param pattern pattern restriction defined for the current type.. |
| 80 | */ | 82 | */ |
| 81 | - public void setPattern(List<String> pattern) { | 83 | + private void setPatternList(List<String> pattern) { |
| 82 | - this.pattern = pattern; | 84 | + patternList = pattern; |
| 85 | + } | ||
| 86 | + | ||
| 87 | + /** | ||
| 88 | + * Add a new pattern to the list of pattern restriction. | ||
| 89 | + * | ||
| 90 | + * @param newPattern pattern restriction. | ||
| 91 | + */ | ||
| 92 | + public void addPattern(String newPattern) { | ||
| 93 | + getPatternList().add(newPattern); | ||
| 83 | } | 94 | } |
| 84 | 95 | ||
| 85 | /** | 96 | /** | ... | ... |
| ... | @@ -143,7 +143,7 @@ public class YangRangeRestriction<T extends Comparable<T>> implements YangDesc, | ... | @@ -143,7 +143,7 @@ public class YangRangeRestriction<T extends Comparable<T>> implements YangDesc, |
| 143 | * @param newInterval restricted length interval. | 143 | * @param newInterval restricted length interval. |
| 144 | * @throws DataModelException data model exception for range restriction. | 144 | * @throws DataModelException data model exception for range restriction. |
| 145 | */ | 145 | */ |
| 146 | - public void addLenghtRestrictionInterval(YangRangeInterval<T> newInterval) throws DataModelException { | 146 | + public void addRangeRestrictionInterval(YangRangeInterval<T> newInterval) throws DataModelException { |
| 147 | 147 | ||
| 148 | checkNotNull(newInterval); | 148 | checkNotNull(newInterval); |
| 149 | checkNotNull(newInterval.getStartValue()); | 149 | checkNotNull(newInterval.getStartValue()); | ... | ... |
| ... | @@ -109,7 +109,19 @@ public class YangStringRestriction { | ... | @@ -109,7 +109,19 @@ public class YangStringRestriction { |
| 109 | * | 109 | * |
| 110 | * @param patternRestriction pattern restriction for the type. | 110 | * @param patternRestriction pattern restriction for the type. |
| 111 | */ | 111 | */ |
| 112 | - public void setPatternRestriction(YangPatternRestriction patternRestriction) { | 112 | + private void setPatternRestriction(YangPatternRestriction patternRestriction) { |
| 113 | this.patternRestriction = patternRestriction; | 113 | this.patternRestriction = patternRestriction; |
| 114 | } | 114 | } |
| 115 | + | ||
| 116 | + /** | ||
| 117 | + * Add a new pattern restriction for the type. | ||
| 118 | + * | ||
| 119 | + * @param newPattern new pattern restriction for the type. | ||
| 120 | + */ | ||
| 121 | + public void addPattern(String newPattern) { | ||
| 122 | + if (getPatternRestriction() == null) { | ||
| 123 | + setPatternRestriction(new YangPatternRestriction()); | ||
| 124 | + } | ||
| 125 | + getPatternRestriction().addPattern(newPattern); | ||
| 126 | + } | ||
| 115 | } | 127 | } | ... | ... |
| ... | @@ -54,10 +54,6 @@ import org.onosproject.yangutils.translator.CachedFileHandle; | ... | @@ -54,10 +54,6 @@ import org.onosproject.yangutils.translator.CachedFileHandle; |
| 54 | */ | 54 | */ |
| 55 | public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable { | 55 | public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable { |
| 56 | 56 | ||
| 57 | - /** | ||
| 58 | - * Name of derived data type. | ||
| 59 | - */ | ||
| 60 | - private String derivedName; | ||
| 61 | 57 | ||
| 62 | /** | 58 | /** |
| 63 | * Default value in string, needs to be converted to the target object, | 59 | * Default value in string, needs to be converted to the target object, |
| ... | @@ -81,14 +77,9 @@ public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable { | ... | @@ -81,14 +77,9 @@ public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable { |
| 81 | private YangStatusType status; | 77 | private YangStatusType status; |
| 82 | 78 | ||
| 83 | /** | 79 | /** |
| 84 | - * Derived data type. The type will be set when the parser detects the type | 80 | + * Maintain the derived type information. |
| 85 | - * parsing. Hence it is of raw type and it not know at the time of creation | ||
| 86 | - * of the object. i.e. in entry parse, it will not be know, in the exit | ||
| 87 | - * parse we may know the type implicitly based on the restriction. We must | ||
| 88 | - * know and validate the base built in type, by the linking phase. It is a | ||
| 89 | - * RAW type and it usage needs to be validate in linking phase. | ||
| 90 | */ | 81 | */ |
| 91 | - private YangType<?> derivedType; | 82 | + private YangType<YangDerivedType> derivedType; |
| 92 | 83 | ||
| 93 | /** | 84 | /** |
| 94 | * Units of the data type. | 85 | * Units of the data type. |
| ... | @@ -96,11 +87,6 @@ public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable { | ... | @@ -96,11 +87,6 @@ public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable { |
| 96 | private String units; | 87 | private String units; |
| 97 | 88 | ||
| 98 | /** | 89 | /** |
| 99 | - * YANG base built in data type. | ||
| 100 | - */ | ||
| 101 | - private YangDataTypes baseBuiltInType; | ||
| 102 | - | ||
| 103 | - /** | ||
| 104 | * package of the generated java code. | 90 | * package of the generated java code. |
| 105 | */ | 91 | */ |
| 106 | private String pkg; | 92 | private String pkg; |
| ... | @@ -112,23 +98,7 @@ public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable { | ... | @@ -112,23 +98,7 @@ public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable { |
| 112 | super(YangNodeType.TYPEDEF_NODE); | 98 | super(YangNodeType.TYPEDEF_NODE); |
| 113 | } | 99 | } |
| 114 | 100 | ||
| 115 | - /** | ||
| 116 | - * Get the data type name. | ||
| 117 | - * | ||
| 118 | - * @return the data type name. | ||
| 119 | - */ | ||
| 120 | - public String getDerivedName() { | ||
| 121 | - return derivedName; | ||
| 122 | - } | ||
| 123 | 101 | ||
| 124 | - /** | ||
| 125 | - * Set the data type name. | ||
| 126 | - * | ||
| 127 | - * @param derrivedName data type name. | ||
| 128 | - */ | ||
| 129 | - public void setDerivedName(String derrivedName) { | ||
| 130 | - derivedName = derrivedName; | ||
| 131 | - } | ||
| 132 | 102 | ||
| 133 | /** | 103 | /** |
| 134 | * Get the default value. | 104 | * Get the default value. |
| ... | @@ -209,20 +179,20 @@ public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable { | ... | @@ -209,20 +179,20 @@ public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable { |
| 209 | } | 179 | } |
| 210 | 180 | ||
| 211 | /** | 181 | /** |
| 212 | - * Get the referenced type. | 182 | + * Get the derived type. |
| 213 | * | 183 | * |
| 214 | - * @return the referenced type. | 184 | + * @return the derived type. |
| 215 | */ | 185 | */ |
| 216 | - public YangType<?> getDerivedType() { | 186 | + public YangType<YangDerivedType> getDerivedType() { |
| 217 | return derivedType; | 187 | return derivedType; |
| 218 | } | 188 | } |
| 219 | 189 | ||
| 220 | /** | 190 | /** |
| 221 | - * Get the referenced type. | 191 | + * Set the derived type. |
| 222 | * | 192 | * |
| 223 | - * @param derivedType the referenced type. | 193 | + * @param derivedType the derived type. |
| 224 | */ | 194 | */ |
| 225 | - public void setDerivedType(YangType<?> derivedType) { | 195 | + public void setDerivedType(YangType<YangDerivedType> derivedType) { |
| 226 | this.derivedType = derivedType; | 196 | this.derivedType = derivedType; |
| 227 | } | 197 | } |
| 228 | 198 | ||
| ... | @@ -245,24 +215,6 @@ public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable { | ... | @@ -245,24 +215,6 @@ public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable { |
| 245 | } | 215 | } |
| 246 | 216 | ||
| 247 | /** | 217 | /** |
| 248 | - * Get the base built in YANG data type. | ||
| 249 | - * | ||
| 250 | - * @return base built in YANG data type. | ||
| 251 | - */ | ||
| 252 | - public YangDataTypes getBaseBuiltInType() { | ||
| 253 | - return baseBuiltInType; | ||
| 254 | - } | ||
| 255 | - | ||
| 256 | - /** | ||
| 257 | - * Set the base built in YANG data type. | ||
| 258 | - * | ||
| 259 | - * @param baseBuiltInType base built in YANG data type. | ||
| 260 | - */ | ||
| 261 | - public void setBaseBuiltInType(YangDataTypes baseBuiltInType) { | ||
| 262 | - this.baseBuiltInType = baseBuiltInType; | ||
| 263 | - } | ||
| 264 | - | ||
| 265 | - /** | ||
| 266 | * Returns the type of the data. | 218 | * Returns the type of the data. |
| 267 | * | 219 | * |
| 268 | * @return returns TYPEDEF_DATA | 220 | * @return returns TYPEDEF_DATA |
| ... | @@ -289,7 +241,34 @@ public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable { | ... | @@ -289,7 +241,34 @@ public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable { |
| 289 | */ | 241 | */ |
| 290 | @Override | 242 | @Override |
| 291 | public void validateDataOnExit() throws DataModelException { | 243 | public void validateDataOnExit() throws DataModelException { |
| 292 | - // TODO auto-generated method stub, to be implemented by parser | 244 | + YangType<YangDerivedType> type = getDerivedType(); |
| 245 | + if (type == null) { | ||
| 246 | + throw new DataModelException("Typedef does not have type info."); | ||
| 247 | + } | ||
| 248 | + if ((type.getDataType() != YangDataTypes.DERIVED) | ||
| 249 | + || (type.getDataTypeName() == null)) { | ||
| 250 | + throw new DataModelException("Typedef type is not derived."); | ||
| 251 | + } | ||
| 252 | + | ||
| 253 | + YangDerivedType derivedTypeInfo = type.getDataTypeExtendedInfo(); | ||
| 254 | + if (derivedTypeInfo == null) { | ||
| 255 | + throw new DataModelException("derrived type does not have derived info."); | ||
| 256 | + } | ||
| 257 | + | ||
| 258 | + YangType<?> baseType = derivedTypeInfo.getBaseType(); | ||
| 259 | + if (baseType == null) { | ||
| 260 | + throw new DataModelException("Base type of a derived type is missing."); | ||
| 261 | + } | ||
| 262 | + | ||
| 263 | + if (derivedTypeInfo.getEffectiveYangBuiltInType() == null) { | ||
| 264 | + /* resolve the effective type from the data tree. */ | ||
| 265 | + /* | ||
| 266 | + * TODO: try to resolve the nested reference, if possible in the | ||
| 267 | + * partial tree, otherwise we need to resolve finally when the | ||
| 268 | + * complete module is created. | ||
| 269 | + */ | ||
| 270 | + YangModule.addToResolveList(this); | ||
| 271 | + } | ||
| 293 | } | 272 | } |
| 294 | 273 | ||
| 295 | /** | 274 | /** |
| ... | @@ -299,7 +278,10 @@ public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable { | ... | @@ -299,7 +278,10 @@ public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable { |
| 299 | */ | 278 | */ |
| 300 | @Override | 279 | @Override |
| 301 | public String getName() { | 280 | public String getName() { |
| 302 | - return derivedName; | 281 | + if (getDerivedType() != null) { |
| 282 | + return getDerivedType().getDataTypeName(); | ||
| 283 | + } | ||
| 284 | + return null; | ||
| 303 | } | 285 | } |
| 304 | 286 | ||
| 305 | /** | 287 | /** |
| ... | @@ -309,8 +291,12 @@ public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable { | ... | @@ -309,8 +291,12 @@ public class YangTypeDef extends YangNode implements YangCommonInfo, Parsable { |
| 309 | */ | 291 | */ |
| 310 | @Override | 292 | @Override |
| 311 | public void setName(String name) { | 293 | public void setName(String name) { |
| 312 | - // TODO Auto-generated method stub | 294 | + if (getDerivedType() == null) { |
| 313 | - | 295 | + throw new RuntimeException( |
| 296 | + "Derrived Type info needs to be set in parser when the typedef listner is processed"); | ||
| 297 | + } | ||
| 298 | + getDerivedType().setDataTypeName(name); | ||
| 299 | + getDerivedType().setDataType(YangDataTypes.DERIVED); | ||
| 314 | } | 300 | } |
| 315 | 301 | ||
| 316 | /** | 302 | /** | ... | ... |
| ... | @@ -222,7 +222,12 @@ public enum ParsableDataType { | ... | @@ -222,7 +222,12 @@ public enum ParsableDataType { |
| 222 | /** | 222 | /** |
| 223 | * Identifies the YANG organization parsed data. | 223 | * Identifies the YANG organization parsed data. |
| 224 | */ | 224 | */ |
| 225 | - ORGANIZATION_DATA; | 225 | + ORGANIZATION_DATA, |
| 226 | + | ||
| 227 | + /** | ||
| 228 | + * Identifies the derived data type. | ||
| 229 | + */ | ||
| 230 | + DERIVED; | ||
| 226 | 231 | ||
| 227 | /** | 232 | /** |
| 228 | * Returns the YANG construct keyword corresponding to enum values. | 233 | * Returns the YANG construct keyword corresponding to enum values. |
| ... | @@ -315,6 +320,8 @@ public enum ParsableDataType { | ... | @@ -315,6 +320,8 @@ public enum ParsableDataType { |
| 315 | return "value"; | 320 | return "value"; |
| 316 | case DEFAULT_DATA: | 321 | case DEFAULT_DATA: |
| 317 | return "default"; | 322 | return "default"; |
| 323 | + case DERIVED: | ||
| 324 | + return "derived"; | ||
| 318 | default: | 325 | default: |
| 319 | return "yang"; | 326 | return "yang"; |
| 320 | } | 327 | } | ... | ... |
| ... | @@ -16,6 +16,8 @@ | ... | @@ -16,6 +16,8 @@ |
| 16 | 16 | ||
| 17 | package org.onosproject.yangutils.parser.impl; | 17 | package org.onosproject.yangutils.parser.impl; |
| 18 | 18 | ||
| 19 | +import java.util.Stack; | ||
| 20 | + | ||
| 19 | import org.antlr.v4.runtime.ParserRuleContext; | 21 | import org.antlr.v4.runtime.ParserRuleContext; |
| 20 | import org.antlr.v4.runtime.tree.ErrorNode; | 22 | import org.antlr.v4.runtime.tree.ErrorNode; |
| 21 | import org.antlr.v4.runtime.tree.TerminalNode; | 23 | import org.antlr.v4.runtime.tree.TerminalNode; |
| ... | @@ -57,8 +59,6 @@ import org.onosproject.yangutils.parser.impl.listeners.UnitsListener; | ... | @@ -57,8 +59,6 @@ import org.onosproject.yangutils.parser.impl.listeners.UnitsListener; |
| 57 | import org.onosproject.yangutils.parser.impl.listeners.ValueListener; | 59 | import org.onosproject.yangutils.parser.impl.listeners.ValueListener; |
| 58 | import org.onosproject.yangutils.parser.impl.listeners.VersionListener; | 60 | import org.onosproject.yangutils.parser.impl.listeners.VersionListener; |
| 59 | 61 | ||
| 60 | -import java.util.Stack; | ||
| 61 | - | ||
| 62 | /** | 62 | /** |
| 63 | * ANTLR generates a parse-tree listener interface that responds to events | 63 | * ANTLR generates a parse-tree listener interface that responds to events |
| 64 | * triggered by the built-in tree walker. The methods in listener are just | 64 | * triggered by the built-in tree walker. The methods in listener are just | ... | ... |
| ... | @@ -16,6 +16,8 @@ | ... | @@ -16,6 +16,8 @@ |
| 16 | 16 | ||
| 17 | package org.onosproject.yangutils.parser.impl; | 17 | package org.onosproject.yangutils.parser.impl; |
| 18 | 18 | ||
| 19 | +import java.io.IOException; | ||
| 20 | + | ||
| 19 | import org.antlr.v4.runtime.ANTLRFileStream; | 21 | import org.antlr.v4.runtime.ANTLRFileStream; |
| 20 | import org.antlr.v4.runtime.ANTLRInputStream; | 22 | import org.antlr.v4.runtime.ANTLRInputStream; |
| 21 | import org.antlr.v4.runtime.CommonTokenStream; | 23 | import org.antlr.v4.runtime.CommonTokenStream; |
| ... | @@ -28,8 +30,6 @@ import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser; | ... | @@ -28,8 +30,6 @@ import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser; |
| 28 | import org.onosproject.yangutils.parser.exceptions.ParserException; | 30 | import org.onosproject.yangutils.parser.exceptions.ParserException; |
| 29 | import org.onosproject.yangutils.parser.impl.parserutils.ParseTreeErrorListener; | 31 | import org.onosproject.yangutils.parser.impl.parserutils.ParseTreeErrorListener; |
| 30 | 32 | ||
| 31 | -import java.io.IOException; | ||
| 32 | - | ||
| 33 | /** | 33 | /** |
| 34 | * Manages file parsing, parse tree creation and data model tree creation | 34 | * Manages file parsing, parse tree creation and data model tree creation |
| 35 | * corresponding to an input YANG file. | 35 | * corresponding to an input YANG file. |
| ... | @@ -88,8 +88,8 @@ public class YangUtilsParserManager implements YangUtilsParser { | ... | @@ -88,8 +88,8 @@ public class YangUtilsParserManager implements YangUtilsParser { |
| 88 | TreeWalkListener treeWalker = new TreeWalkListener(); | 88 | TreeWalkListener treeWalker = new TreeWalkListener(); |
| 89 | 89 | ||
| 90 | /** | 90 | /** |
| 91 | - * Walk parse tree, provide call backs to methods in listener and | 91 | + * Walk parse tree, provide call backs to methods in listener and build |
| 92 | - * build data model tree. | 92 | + * data model tree. |
| 93 | */ | 93 | */ |
| 94 | try { | 94 | try { |
| 95 | walker.walk(treeWalker, tree); | 95 | walker.walk(treeWalker, tree); | ... | ... |
| ... | @@ -48,10 +48,13 @@ package org.onosproject.yangutils.parser.impl.listeners; | ... | @@ -48,10 +48,13 @@ package org.onosproject.yangutils.parser.impl.listeners; |
| 48 | */ | 48 | */ |
| 49 | 49 | ||
| 50 | import org.onosproject.yangutils.datamodel.YangContainer; | 50 | import org.onosproject.yangutils.datamodel.YangContainer; |
| 51 | +import org.onosproject.yangutils.datamodel.YangDataTypes; | ||
| 52 | +import org.onosproject.yangutils.datamodel.YangDerivedType; | ||
| 51 | import org.onosproject.yangutils.datamodel.YangList; | 53 | import org.onosproject.yangutils.datamodel.YangList; |
| 52 | import org.onosproject.yangutils.datamodel.YangModule; | 54 | import org.onosproject.yangutils.datamodel.YangModule; |
| 53 | import org.onosproject.yangutils.datamodel.YangNode; | 55 | import org.onosproject.yangutils.datamodel.YangNode; |
| 54 | import org.onosproject.yangutils.datamodel.YangSubModule; | 56 | import org.onosproject.yangutils.datamodel.YangSubModule; |
| 57 | +import org.onosproject.yangutils.datamodel.YangType; | ||
| 55 | import org.onosproject.yangutils.datamodel.YangTypeDef; | 58 | import org.onosproject.yangutils.datamodel.YangTypeDef; |
| 56 | import org.onosproject.yangutils.datamodel.exceptions.DataModelException; | 59 | import org.onosproject.yangutils.datamodel.exceptions.DataModelException; |
| 57 | import org.onosproject.yangutils.parser.Parsable; | 60 | import org.onosproject.yangutils.parser.Parsable; |
| ... | @@ -111,8 +114,16 @@ public final class TypeDefListener { | ... | @@ -111,8 +114,16 @@ public final class TypeDefListener { |
| 111 | throw new ParserException(constructListenerErrorMessage(INVALID_CARDINALITY, yangConstruct, "", ENTRY)); | 114 | throw new ParserException(constructListenerErrorMessage(INVALID_CARDINALITY, yangConstruct, "", ENTRY)); |
| 112 | } | 115 | } |
| 113 | 116 | ||
| 117 | + /* | ||
| 118 | + * Create a derived type information, the base type must be set in type | ||
| 119 | + * listener. | ||
| 120 | + */ | ||
| 121 | + YangType<YangDerivedType> derivedType = new YangType<YangDerivedType>(); | ||
| 122 | + derivedType.setDataType(YangDataTypes.DERIVED); | ||
| 123 | + derivedType.setDataTypeName(ctx.IDENTIFIER().getText()); | ||
| 124 | + | ||
| 114 | YangTypeDef typeDefNode = new YangTypeDef(); | 125 | YangTypeDef typeDefNode = new YangTypeDef(); |
| 115 | - typeDefNode.setDerivedName(ctx.IDENTIFIER().getText()); | 126 | + typeDefNode.setDerivedType(derivedType); |
| 116 | 127 | ||
| 117 | Parsable curData = listener.getParsedDataStack().peek(); | 128 | Parsable curData = listener.getParsedDataStack().peek(); |
| 118 | 129 | ||
| ... | @@ -149,6 +160,14 @@ public final class TypeDefListener { | ... | @@ -149,6 +160,14 @@ public final class TypeDefListener { |
| 149 | checkStackIsNotEmpty(listener, MISSING_HOLDER, TYPEDEF_DATA, ctx.IDENTIFIER().getText(), EXIT); | 160 | checkStackIsNotEmpty(listener, MISSING_HOLDER, TYPEDEF_DATA, ctx.IDENTIFIER().getText(), EXIT); |
| 150 | 161 | ||
| 151 | if (listener.getParsedDataStack().peek() instanceof YangTypeDef) { | 162 | if (listener.getParsedDataStack().peek() instanceof YangTypeDef) { |
| 163 | + YangTypeDef typeDefNode = (YangTypeDef) listener.getParsedDataStack().peek(); | ||
| 164 | + try { | ||
| 165 | + typeDefNode.validateDataOnExit(); | ||
| 166 | + } catch (DataModelException e) { | ||
| 167 | + // TODO Auto-generated catch block | ||
| 168 | + e.printStackTrace(); | ||
| 169 | + } | ||
| 170 | + | ||
| 152 | listener.getParsedDataStack().pop(); | 171 | listener.getParsedDataStack().pop(); |
| 153 | } else { | 172 | } else { |
| 154 | throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, TYPEDEF_DATA, | 173 | throw new ParserException(constructListenerErrorMessage(MISSING_CURRENT_HOLDER, TYPEDEF_DATA, | ... | ... |
| ... | @@ -17,14 +17,17 @@ | ... | @@ -17,14 +17,17 @@ |
| 17 | package org.onosproject.yangutils.parser.impl.listeners; | 17 | package org.onosproject.yangutils.parser.impl.listeners; |
| 18 | 18 | ||
| 19 | import org.onosproject.yangutils.datamodel.YangDataTypes; | 19 | import org.onosproject.yangutils.datamodel.YangDataTypes; |
| 20 | +import org.onosproject.yangutils.datamodel.YangDerivedType; | ||
| 20 | import org.onosproject.yangutils.datamodel.YangLeaf; | 21 | import org.onosproject.yangutils.datamodel.YangLeaf; |
| 21 | import org.onosproject.yangutils.datamodel.YangLeafList; | 22 | import org.onosproject.yangutils.datamodel.YangLeafList; |
| 22 | import org.onosproject.yangutils.datamodel.YangType; | 23 | import org.onosproject.yangutils.datamodel.YangType; |
| 24 | +import org.onosproject.yangutils.datamodel.YangTypeDef; | ||
| 23 | import org.onosproject.yangutils.parser.Parsable; | 25 | import org.onosproject.yangutils.parser.Parsable; |
| 24 | -import static org.onosproject.yangutils.parser.ParsableDataType.TYPE_DATA; | ||
| 25 | import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser; | 26 | import org.onosproject.yangutils.parser.antlrgencode.GeneratedYangParser; |
| 26 | import org.onosproject.yangutils.parser.exceptions.ParserException; | 27 | import org.onosproject.yangutils.parser.exceptions.ParserException; |
| 27 | import org.onosproject.yangutils.parser.impl.TreeWalkListener; | 28 | import org.onosproject.yangutils.parser.impl.TreeWalkListener; |
| 29 | + | ||
| 30 | +import static org.onosproject.yangutils.parser.ParsableDataType.TYPE_DATA; | ||
| 28 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY; | 31 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.ENTRY; |
| 29 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT; | 32 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorLocation.EXIT; |
| 30 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage; | 33 | import static org.onosproject.yangutils.parser.impl.parserutils.ListenerErrorMessageConstruction.constructListenerErrorMessage; |
| ... | @@ -72,8 +75,9 @@ public final class TypeListener { | ... | @@ -72,8 +75,9 @@ public final class TypeListener { |
| 72 | // Check for stack to be non empty. | 75 | // Check for stack to be non empty. |
| 73 | checkStackIsNotEmpty(listener, MISSING_HOLDER, TYPE_DATA, ctx.string().getText(), ENTRY); | 76 | checkStackIsNotEmpty(listener, MISSING_HOLDER, TYPE_DATA, ctx.string().getText(), ENTRY); |
| 74 | 77 | ||
| 75 | - YangType type = new YangType(); | ||
| 76 | YangDataTypes yangDataTypes = YangDataTypes.getType(ctx.string().getText()); | 78 | YangDataTypes yangDataTypes = YangDataTypes.getType(ctx.string().getText()); |
| 79 | + YangType<?> type = new YangType(); | ||
| 80 | + | ||
| 77 | type.setDataTypeName(ctx.string().getText()); | 81 | type.setDataTypeName(ctx.string().getText()); |
| 78 | type.setDataType(yangDataTypes); | 82 | type.setDataType(yangDataTypes); |
| 79 | 83 | ||
| ... | @@ -112,8 +116,32 @@ public final class TypeListener { | ... | @@ -112,8 +116,32 @@ public final class TypeListener { |
| 112 | YangLeafList leafList = (YangLeafList) tmpData; | 116 | YangLeafList leafList = (YangLeafList) tmpData; |
| 113 | leafList.setDataType((YangType) type); | 117 | leafList.setDataType((YangType) type); |
| 114 | break; | 118 | break; |
| 115 | - case TYPEDEF_DATA: //TODO | 119 | + case TYPEDEF_DATA: |
| 120 | + | ||
| 121 | + /* Prepare the base type info and set in derived type */ | ||
| 122 | + YangTypeDef typeDef = (YangTypeDef) tmpData; | ||
| 123 | + YangType<YangDerivedType> derivedType = typeDef.getDerivedType(); | ||
| 124 | + if (derivedType == null) { | ||
| 125 | + //TODO: set the error info correctly, to depict missing info | ||
| 126 | + throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, TYPE_DATA, | ||
| 127 | + ctx.string().getText(), ENTRY)); | ||
| 128 | + } | ||
| 129 | + | ||
| 130 | + YangDerivedType derivedTypeInfo = new YangDerivedType(); | ||
| 131 | + if (((YangType) type).getDataType() != YangDataTypes.DERIVED) { | ||
| 132 | + derivedTypeInfo.setEffectiveYangBuiltInType(((YangType) type).getDataType()); | ||
| 133 | + } else { | ||
| 134 | + /* | ||
| 135 | + * It will be resolved in the validate data model at exit. | ||
| 136 | + * Nothing needs to be done. | ||
| 137 | + */ | ||
| 138 | + } | ||
| 139 | + derivedTypeInfo.setBaseType((YangType) type); | ||
| 140 | + derivedType.setDataTypeExtendedInfo(derivedTypeInfo); | ||
| 141 | + | ||
| 116 | break; | 142 | break; |
| 143 | + //TODO: union, deviate replacement statement.case TYPEDEF_DATA: //TODO | ||
| 144 | + | ||
| 117 | default: | 145 | default: |
| 118 | throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, TYPE_DATA, | 146 | throw new ParserException(constructListenerErrorMessage(INVALID_HOLDER, TYPE_DATA, |
| 119 | ctx.string().getText(), EXIT)); | 147 | ctx.string().getText(), EXIT)); | ... | ... |
| ... | @@ -24,8 +24,7 @@ import org.onosproject.yangutils.parser.exceptions.ParserException; | ... | @@ -24,8 +24,7 @@ import org.onosproject.yangutils.parser.exceptions.ParserException; |
| 24 | /** | 24 | /** |
| 25 | * By default, ANTLR sends all errors to standard error, this is changed by | 25 | * By default, ANTLR sends all errors to standard error, this is changed by |
| 26 | * providing this new implementation of interface ANTLRErrorListener. The | 26 | * providing this new implementation of interface ANTLRErrorListener. The |
| 27 | - * interface has a syntaxError() method that applies to both lexer and | 27 | + * interface has a syntaxError() method that applies to both lexer and parser. |
| 28 | - * parser. | ||
| 29 | */ | 28 | */ |
| 30 | public class ParseTreeErrorListener extends BaseErrorListener { | 29 | public class ParseTreeErrorListener extends BaseErrorListener { |
| 31 | 30 | ... | ... |
| ... | @@ -53,11 +53,10 @@ public final class JavaCodeGenerator { | ... | @@ -53,11 +53,10 @@ public final class JavaCodeGenerator { |
| 53 | curTraversal = TraversalType.SIBILING; | 53 | curTraversal = TraversalType.SIBILING; |
| 54 | curNode = curNode.getNextSibling(); | 54 | curNode = curNode.getNextSibling(); |
| 55 | } else { | 55 | } else { |
| 56 | - curTraversal = TraversalType.PARENT; | ||
| 57 | curNode.generateJavaCodeExit(); | 56 | curNode.generateJavaCodeExit(); |
| 57 | + curTraversal = TraversalType.PARENT; | ||
| 58 | curNode = curNode.getParent(); | 58 | curNode = curNode.getParent(); |
| 59 | } | 59 | } |
| 60 | } | 60 | } |
| 61 | - | ||
| 62 | } | 61 | } |
| 63 | } | 62 | } | ... | ... |
| ... | @@ -16,6 +16,9 @@ | ... | @@ -16,6 +16,9 @@ |
| 16 | 16 | ||
| 17 | package org.onosproject.yangutils.translator.tojava.utils; | 17 | package org.onosproject.yangutils.translator.tojava.utils; |
| 18 | 18 | ||
| 19 | +import java.util.List; | ||
| 20 | +import java.util.SortedSet; | ||
| 21 | + | ||
| 19 | import org.onosproject.yangutils.datamodel.YangType; | 22 | import org.onosproject.yangutils.datamodel.YangType; |
| 20 | import org.onosproject.yangutils.translator.GeneratedFileType; | 23 | import org.onosproject.yangutils.translator.GeneratedFileType; |
| 21 | import org.onosproject.yangutils.translator.tojava.GeneratedMethodTypes; | 24 | import org.onosproject.yangutils.translator.tojava.GeneratedMethodTypes; |
| ... | @@ -47,6 +50,17 @@ public final class JavaCodeSnippetGen { | ... | @@ -47,6 +50,17 @@ public final class JavaCodeSnippetGen { |
| 47 | } | 50 | } |
| 48 | 51 | ||
| 49 | /** | 52 | /** |
| 53 | + * reorder the import list based on the ONOS import rules. | ||
| 54 | + * | ||
| 55 | + * @param importInfo the set of classes/interfaces to be imported. | ||
| 56 | + * @return string of import info. | ||
| 57 | + */ | ||
| 58 | + public List<ImportInfo> sortImportOrder(SortedSet<ImportInfo> importInfo) { | ||
| 59 | + /* TODO: reorder the import list based on the ONOS import rules. */ | ||
| 60 | + return null; | ||
| 61 | + } | ||
| 62 | + | ||
| 63 | + /** | ||
| 50 | * Get the textual java code information corresponding to the import list. | 64 | * Get the textual java code information corresponding to the import list. |
| 51 | * | 65 | * |
| 52 | * @param importInfo import info. | 66 | * @param importInfo import info. | ... | ... |
| ... | @@ -109,7 +109,6 @@ public final class MethodsGenerator { | ... | @@ -109,7 +109,6 @@ public final class MethodsGenerator { |
| 109 | * @param returnType return type of method | 109 | * @param returnType return type of method |
| 110 | * @return constructed method impl | 110 | * @return constructed method impl |
| 111 | */ | 111 | */ |
| 112 | - @SuppressWarnings("rawtypes") | ||
| 113 | public static String constructMethodInfo(GeneratedFileType genFileTypes, String yangName, | 112 | public static String constructMethodInfo(GeneratedFileType genFileTypes, String yangName, |
| 114 | GeneratedMethodTypes methodTypes, YangType<?> returnType) { | 113 | GeneratedMethodTypes methodTypes, YangType<?> returnType) { |
| 115 | 114 | ... | ... |
-
Please register or login to post a comment