return null;
}
checkArgument(arguments.size() == 1);
- for (QName qName : arguments) {
- //previous.getDataChildByName(qName);
- }
for(TypeDefinition<?> typedef : previous.getTypeDefinitions()) {
if(typedef.getQName().equals(typeQName)) {
return typedef;
*/
package org.opendaylight.yangtools.binding.generator.util.generated.type.builder;
-import static org.opendaylight.yangtools.binding.generator.util.BindingGeneratorUtil.parseToClassName;
-
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.opendaylight.yangtools.sal.binding.model.api.Type;
import org.opendaylight.yangtools.sal.binding.model.api.type.builder.AnnotationTypeBuilder;
import org.opendaylight.yangtools.sal.binding.model.api.type.builder.EnumBuilder;
+import org.opendaylight.yangtools.yang.binding.BindingMapping;
import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition.EnumPair;
/*
* (non-Javadoc)
- *
+ *
* @see java.lang.Object#hashCode()
*/
@Override
/*
* (non-Javadoc)
- *
+ *
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
/*
* (non-Javadoc)
- *
+ *
* @see java.lang.Object#toString()
*/
@Override
int listIndex = 0;
for (final EnumPair enumPair : enums) {
if (enumPair != null) {
- final String enumPairName = parseToClassName(enumPair.getName());
+ final String enumPairName = BindingMapping.getClassName(enumPair.getName());
Integer enumPairValue = enumPair.getValue();
if (enumPairValue == null) {
/*
* (non-Javadoc)
- *
+ *
* @see java.lang.Object#hashCode()
*/
@Override
/*
* (non-Javadoc)
- *
+ *
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
/*
* (non-Javadoc)
- *
+ *
* @see java.lang.Object#toString()
*/
@Override
/*
* (non-Javadoc)
- *
+ *
* @see java.lang.Object#hashCode()
*/
@Override
/*
* (non-Javadoc)
- *
+ *
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
/*
* (non-Javadoc)
- *
+ *
* @see java.lang.Object#toString()
*/
@Override
// TODO Auto-generated method stub
return Collections.emptyList();
}
-
+
@Override
public List<GeneratedProperty> getProperties() {
return Collections.emptyList();
import java.util.Set;
import org.junit.Test;
+import org.opendaylight.yangtools.yang.binding.BindingMapping;
import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
import org.opendaylight.yangtools.yang.model.api.Module;
import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
public void testParsingMethods() {
// parseToClassName method testing
assertEquals("Class name has incorrect format", "SomeTestingClassName",
- BindingGeneratorUtil.parseToClassName(" some-testing_class name "));
+ BindingMapping.getClassName(" some-testing_class name "));
assertEquals("Class name has incorrect format", "_0SomeTestingClassName",
- BindingGeneratorUtil.parseToClassName(" 0 some-testing_class name "));
+ BindingMapping.getClassName(" 0 some-testing_class name "));
// parseToValidParamName
assertEquals("Parameter name has incorrect format", "someTestingParameterName",
*/
public static void putTypeIntoImports(final GeneratedType parentGenType, final Type type,
final Map<String, String> imports) {
- checkArgument(parentGenType != null,
- "Parent Generated Type parameter MUST be specified and cannot be " + "NULL!");
+ checkArgument(parentGenType != null, "Parent Generated Type parameter MUST be specified and cannot be "
+ + "NULL!");
checkArgument(parentGenType.getName() != null, "Parent Generated Type name cannot be NULL!");
checkArgument(parentGenType.getPackageName() != null,
"Parent Generated Type cannot have Package Name referenced as NULL!");
final String typeName = type.getName();
final String typePackageName = type.getPackageName();
final String parentTypeName = parentGenType.getName();
- final String parentTypePackageName = parentGenType.getPackageName();
- if (typeName.equals(parentTypeName) || typePackageName.startsWith("java.lang")
- || typePackageName.isEmpty()) {
+ if (typeName.equals(parentTypeName) || typePackageName.startsWith("java.lang") || typePackageName.isEmpty()) {
return;
}
if (!imports.containsKey(typeName)) {
}
private void verifyBindingDifference(SchemaContext schemaContext, YangModuleInfo oldModule, YangModuleInfo newModule) {
-
- Map<Module, ModuleContext> generatedTypes = generatedTypesVerified(schemaContext, oldModule, newModule);
-
+ generatedTypesVerified(schemaContext, oldModule, newModule);
}
private Map<Module, ModuleContext> generatedTypesVerified(SchemaContext schemaContext, YangModuleInfo oldModule,
<?xml version="1.0" encoding="UTF-8"?>
-<!-- vi: set et smarttab sw=4 tabstop=4: -->
<!--
- Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
-
- This program and the accompanying materials are made available under the
- terms of the Eclipse Public License v1.0 which accompanies this distribution,
- and is available at http://www.eclipse.org/legal/epl-v10.html
+/*
+* Copyright (c) 2014 Brocade Communications Systems, Inc. and others. All rights reserved.
+*
+* This program and the accompanying materials are made available under the
+* terms of the Eclipse Public License v1.0 which accompanies this distribution,
+* and is available at http://www.eclipse.org/legal/epl-v10.html
+*/
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<groupId>org.opendaylight.yangtools.model</groupId>
<artifactId>ietf-inet-types</artifactId>
</dependency>
+ <!-- TODO: We need a better way to handle versioning... -->
<dependency>
<groupId>org.opendaylight.yangtools.model</groupId>
- <artifactId>ietf-yang-types</artifactId>
+ <artifactId>ietf-yang-types-20130715</artifactId>
+ <version>2013.07.15.1-SNAPSHOT</version>
+ </dependency>
+
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
</dependency>
</dependencies>
--- /dev/null
+/*
+* Copyright (c) 2014 Brocade Communications Systems, Inc. and others. All rights reserved.
+*
+* This program and the accompanying materials are made available under the
+* terms of the Eclipse Public License v1.0 which accompanies this distribution,
+* and is available at http://www.eclipse.org/legal/epl-v10.html
+*/
+package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.rev131019;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.rev131019.DatastoreIdentifier;
+
+
+/**
+**/
+public class DatastoreIdentifierBuilder {
+
+ public static DatastoreIdentifier getDefaultInstance(String defaultValue) {
+ throw new UnsupportedOperationException("Not yet implemented");
+ }
+
+}
--- /dev/null
+/*
+ * Copyright (c) 2014 Brocade Communications Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.rev131019.restconf.restconf.modules;
+
+import java.util.regex.Pattern;
+
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.rev131019.RevisionIdentifier;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.rev131019.restconf.restconf.modules.Module.Revision;
+
+/**
+**/
+public class RevisionBuilder {
+
+ /**
+ * Defines the pattern for revisions. NOTE: This pattern will likely be
+ * updated in future versions of the ietf and should be adjusted accordingly
+ */
+ private static final Pattern REVISION_PATTERN = Pattern.compile("\\d{4}-\\d{2}-\\d{2}");
+
+ public static Revision getDefaultInstance(String defaultValue) {
+
+ if (defaultValue != null) {
+ if (REVISION_PATTERN.matcher(defaultValue).matches()) {
+ RevisionIdentifier id = new RevisionIdentifier(defaultValue);
+ return new Revision(id);
+ }
+ if (defaultValue.isEmpty()) {
+ return new Revision(defaultValue);
+ }
+ }
+
+ throw new IllegalArgumentException("Cannot create Revision from " + defaultValue
+ + ". Default value does not match pattern " + REVISION_PATTERN.pattern()
+ + " or empty string.");
+ }
+
+}
+++ /dev/null
-module ietf-restconf {
- // RFC Ed.: replace XXXX with 'ietf' and remove this note
- namespace "urn:XXXX:params:xml:ns:yang:ietf-restconf";
- prefix "restconf";
-
- import ietf-yang-types { prefix yang; }
- import ietf-inet-types { prefix inet; }
-
- organization
- "IETF NETCONF (Network Configuration) Working Group";
-
- contact
- "Editor: Andy Bierman
- <mailto:andy@yumaworks.com>
-
- Editor: Martin Bjorklund
- <mailto:mbj@tail-f.com>
-
- Editor: Kent Watsen
- <mailto:kwatsen@juniper.net>
-
- Editor: Rex Fernando
- <mailto:rex@cisco.com>";
-
- description
- "This module contains conceptual YANG specifications
- for the YANG Patch and error content that is used in
- RESTCONF protocol messages. A conceptual container
- representing the RESTCONF API nodes (type vnd.yang.api).
-
- Note that the YANG definitions within this module do not
- represent configuration data of any kind.
- The YANG grouping statements provide a normative syntax
- for XML and JSON message encoding purposes.
-
- Copyright (c) 2013 IETF Trust and the persons identified as
- authors of the code. All rights reserved.
-
- Redistribution and use in source and binary forms, with or
- without modification, is permitted pursuant to, and subject
- to the license terms contained in, the Simplified BSD License
- set forth in Section 4.c of the IETF Trust's Legal Provisions
- Relating to IETF Documents
- (http://trustee.ietf.org/license-info).
-
- This version of this YANG module is part of RFC XXXX; see
- the RFC itself for full legal notices.";
-
- // RFC Ed.: replace XXXX with actual RFC number and remove this
- // note.
-
- // RFC Ed.: remove this note
- // Note: extracted from draft-bierman-netconf-restconf-00.txt
-
- // RFC Ed.: update the date below with the date of RFC publication
- // and remove this note.
- revision 2013-09-04 {
- description
- "Initial revision.";
- reference
- "RFC XXXX: RESTCONF Protocol.";
- }
-
- typedef data-resource-identifier {
- type string {
- length "1 .. max";
- }
- description
- "Contains a Data Resource Identifier formatted string
- to identify a specific data node.";
- reference
- "RFC XXXX: [sec. 5.3.1.1 ABNF For Data Resource Identifiers]";
- }
-
- // this typedef is TBD; not currently used
- typedef datastore-identifier {
- type union {
- type enumeration {
- enum candidate {
- description
- "Identifies the NETCONF shared candidate datastore.";
- reference
- "RFC 6241, section 8.3";
- }
- enum running {
- description
- "Identifies the NETCONF running datastore.";
- reference
- "RFC 6241, section 5.1";
- }
- enum startup {
- description
- "Identifies the NETCONF startup datastore.";
- reference
- "RFC 6241, section 8.7";
- }
- }
- type string;
- }
- description
- "Contains a string to identify a specific datastore.
- The enumerated datastore identifier values are
- reserved for standard datastore names.";
- }
-
- grouping yang-patch {
-
- description
- "A grouping that contains a YANG container
- representing the syntax and semantics of a
- YANG Patch edit request message.";
-
- container yang-patch {
- description
- "Represents a conceptual sequence of datastore edits,
- called a patch. Each patch is given a client-assigned
- patch identifier. A patch is applied with client-specified
- error handling to control how the ordered list of edits
- is applied if an error is encountered.
-
- A patch MUST be validated by the server to be a
- well-formed message before any of the patch edits
- are validated or attempted.
-
- The validation model for patches closely follows
- the constraint enforcement model in YANG, except it
- is conceptually enforced on an ordered list of edits.
-
- The server MUST conceptually perform field validation
- for each edit in ascending order, as defined in RFC 6020,
- section 8.3.1 and 8.3.2. This is most relevant if the edit
- error-action is 'stop-on-error', since the identification
- of the first error determines where edit processing is
- terminated.
-
- If YANG datastore validation (defined in RFC 6020, section
- 8.3.3) is required, then it performed after all edits have
- been individually validated.
-
- It is possible for a datastore constraint violation to occur
- due to any node in the datastore, including nodes not
- included in the edit list. Any validation errors SHOULD
- be reported in the reply message.
-
- If datastore validation is required and fails, the server
- SHOULD NOT allow the datastore to remain invalid. It is an
- implementation-specific matter how the server fixes the
- invalid datastore. For example, the server might prune
- invalid nodes causing the datastore validation error,
- or undo the entire patch.";
-
- reference
- "RFC 6020, section 8.3.";
-
- leaf patch-id {
- type string;
- description
- "An arbitrary string provided by the client to identify
- the entire patch. This value SHOULD be present in any
- audit logging records generated by the server for the
- patch. Error messages returned by the server pertaining
- to this patch will be identified by this patch-id value.";
- }
-
- leaf error-action {
- type enumeration {
- enum all-or-none {
- description
- "The server will apply all edits in the patch only
- if no errors occur. If any errors occur then
- none of the edits will be applied and the
- contents of the target datastore MUST be unchanged.";
- }
- enum stop-on-error {
- description
- "The server will apply edits in the specified order
- and will stop processing edits if any error occurs.
- Any previous edits which were successfully applied
- will remain applied. No further edits will be
- attempted after the first error is encountered.";
- }
- enum continue-on-error {
- description
- "The server will apply edits in the specified order
- and will continue processing edits if any error
- occurs.";
- }
- }
- default all-or-none;
- description
- "The error handling behavior for the ordered list of
- edits.";
- }
-
- list edit {
- key edit-id;
-
- description
- "Represents one edit within the YANG Patch
- request message.";
-
- leaf edit-id {
- type uint32;
- description
- "Arbitrary integer index for the edit.
- The server MUST process edits in ascending order.
- Error messages returned by the server pertaining
- to a specific edit will be identified by this
- identifier value.";
- }
-
- leaf operation {
- type enumeration {
- enum create {
- description
- "The target data node is created using the
- supplied value, only if it does not already
- exist.";
- }
- enum delete {
- description
- "Delete the target node, only if the data resource
- currently exists, otherwise return an error.";
- }
- enum insert {
- description
- "Insert the supplied value into a user-ordered
- list or leaf-list entry. The target node must
- represent a new data resource.";
- }
- enum merge {
- description
- "The supplied value is merged with the target data
- node.";
- }
- enum move {
- description
- "Move the target node. Reorder a user-ordered
- list or leaf-list. The target node must represent
- an existing data resource.";
- }
- enum replace {
- description
- "The supplied value is used to replace the target
- data node.";
- }
- enum remove {
- description
- "Delete the target node if it currently exists.";
- }
- }
- mandatory true;
- description
- "The datastore operation requested for the associated
- edit entry";
- }
-
- leaf target {
- type data-resource-identifier;
- mandatory true;
- description
- "Identifies the target data resource for the edit
- operation.";
- }
-
- leaf point {
- when "(../operation = 'insert' or " +
- "../operation = 'move') and " +
- "(../where = 'before' or ../where = 'after')" {
- description
- "Point leaf only applies for insert or move
- operations, before or after an existing entry.";
- }
- type data-resource-identifier;
- description
- "The absolute URL path for the data node that is being
- used as the insertion point or move point for the
- target of this edit entry.";
- }
-
- leaf where {
- when "../operation = 'insert' or ../operation = 'move'" {
- description
- "Where leaf only applies for insert or move
- operations.";
- }
- type enumeration {
- enum before {
- description
- "Insert or move a data node before the data resource
- identified by the 'point' parameter.";
- }
- enum after {
- description
- "Insert or move a data node after the data resource
- identified by the 'point' parameter.";
- }
- enum first {
- description
- "Insert or move a data node so it becomes ordered
- as the first entry.";
- }
- enum last {
- description
- "Insert or move a data node so it becomes ordered
- as the last entry.";
- }
-
- }
- default last;
- description
- "Identifies where a data resource will be inserted or
- moved. YANG only allows these operations for
- list and leaf-list data nodes that are ordered-by
- user.";
- }
-
- anyxml value {
- when "(../operation = 'create' or " +
- "../operation = 'merge' " +
- "or ../operation = 'replace' or " +
- "../operation = 'insert')" {
- description
- "Value node only used for create, merge,
- replace, and insert operations";
- }
- description
- "Value used for this edit operation.";
- }
- }
- }
-
- } // grouping yang-patch
-
-
- grouping yang-patch-status {
-
- description
- "A grouping that contains a YANG container
- representing the syntax and semantics of
- YANG Patch status response message.";
-
- container yang-patch-status {
- description
- "A container representing the response message
- sent by the server after a YANG Patch edit
- request message has been processed.";
-
- leaf patch-id {
- type string;
- description
- "The patch-id value used in the request";
- }
-
- container global-errors {
- uses errors;
- description
- "This container will be present if global
- errors unrelated to a specific edit occurred.";
- }
-
- container edit-status {
- description
- "This container will be present if there are
- edit-specific status responses to report.";
-
- list edit {
- key edit-id;
-
- description
- "Represents a list of status responses,
- corresponding to edits in the YANG Patch
- request message.";
-
- leaf edit-id {
- type uint32;
- description
- "Response status is for the edit list entry
- with this edit-id value.";
- }
- choice edit-status-choice {
- description
- "A choice between different types of status
- responses for each edit entry.";
-
- leaf ok {
- type empty;
- description
- "This edit entry was invoked without any
- errors detected by the server associated
- with this edit.";
- }
- leaf location {
- type inet:uri;
- description
- "Contains the Location header value that would be
- returned if this edit causes a new resource to be
- created. If the edit identified by the same edit-id
- value was successfully invoked and a new resource
- was created, then this field will be returned
- instead of 'ok'.";
- }
- leaf skipped {
- type empty;
- description
- "This edit entry was skipped or not reached
- by the server.";
- }
- case errors {
- uses errors;
- description
- "The server detected errors associated with the
- edit identified by the same edit-id value.";
- }
- }
- }
- }
- }
- } // grouping yang-patch-status
-
- grouping errors {
-
- description
- "A grouping that contains a YANG container
- representing the syntax and semantics of a
- YANG Patch errors report within a response message.";
-
- container errors {
- config false; // needed so list error does not need a key
- description
- "Represents an error report returned by the server if
- a request results in an error.";
-
- list error {
- description
- "An entry containing information about one
- specific error that occurred while processing
- a RESTCONF request.";
- reference "RFC 6241, Section 4.3";
-
- leaf error-type {
- type enumeration {
- enum transport {
- description "The transport layer";
- }
- enum rpc {
- description "The rpc or notification layer";
- }
- enum protocol {
- description "The protocol operation layer";
- }
- enum application {
- description "The server application layer";
- }
- }
- mandatory true;
- description
- "The protocol layer where the error occurred.";
- }
-
- leaf error-tag {
- type string;
- mandatory true;
- description
- "The enumerated error tag.";
- }
-
- leaf error-app-tag {
- type string;
- description
- "The application-specific error tag.";
- }
- leaf error-path {
- type data-resource-identifier;
- description
- "The target data resource identifier associated
- with the error, if any.";
- }
-
- leaf error-message {
- type string;
- description
- "A message describing the error.";
- }
-
- container error-info {
- description
- "A container allowing additional information
- to be included in the error report.";
- // arbitrary anyxml content here
- }
- }
- }
- } // grouping errors
-
-
- grouping restconf {
-
- description
- "A grouping that contains a YANG container
- representing the syntax and semantics of
- the RESTCONF API resource.";
-
- container restconf {
- description
- "Conceptual container representing the vnd.yang.api
- resource type.";
-
- container datastore {
- description
- "Container representing the vnd.yang.datastore resource
- type. Represents the conceptual root of the unified
- datastore containing YANG data nodes. The child nodes
- of this container can be data resources (vnd.yang.data)
- defined as top-level YANG data nodes from the modules
- advertised by the server in /restconf/modules.";
- }
- container modules {
- description
- "Contains a list of module description entries.
- These modules are currently loaded into the server.";
-
- list module {
- key "name revision";
- description
- "Each entry represents one module currently
- supported by the server.";
-
- leaf name {
- type string;
- description "The YANG module name.";
- }
- leaf revision {
- type union {
- type yang:date-and-time;
- type string { length 0; }
- }
- description
- "The YANG module revision date. An empty string is
- used if no revision statement is present in the
- YANG module.";
- }
- leaf namespace {
- type inet:uri;
- mandatory true;
- description
- "The XML namespace identifier for this module.";
- }
- leaf-list feature {
- type string;
- description
- "List of YANG feature names from this module that are
- supported by the server.";
- }
- leaf-list deviation {
- type string;
- description
- "List of YANG deviation module names used by this
- server to modify the conformance of the module
- associated with this entry.";
- }
- }
- }
- container operations {
- description
- "Container for all operation resources
- (vnd.yang.operation),
- Each resource is represented as an empty leaf with the
- name of the RPC operation from the YANG rpc statement.
-
- E.g.;
-
- POST /restconf/operations/show-log-errors
-
- leaf show-log-errors {
- type empty;
- }
- ";
- }
- leaf version {
- type enumeration {
- enum "1.0" {
- description
- "Version 1.0 of the RESTCONF protocol.";
- }
- }
- config false;
- description
- "Contains the RESTCONF protocol version.";
- }
- }
- } // grouping restconf
-
- }
\ No newline at end of file
--- /dev/null
+module ietf-restconf {
+ namespace "urn:ietf:params:xml:ns:yang:ietf-restconf";
+ prefix "restconf";
+
+ import ietf-yang-types { prefix yang; }
+ import ietf-inet-types { prefix inet; }
+
+ organization
+ "IETF NETCONF (Network Configuration) Working Group";
+
+ contact
+ "Editor: Andy Bierman
+ <mailto:andy@yumaworks.com>
+
+ Editor: Martin Bjorklund
+ <mailto:mbj@tail-f.com>
+
+ Editor: Kent Watsen
+ <mailto:kwatsen@juniper.net>
+
+ Editor: Rex Fernando
+ <mailto:rex@cisco.com>";
+
+ description
+ "This module contains conceptual YANG specifications
+ for the YANG Patch and error content that is used in
+ RESTCONF protocol messages. A conceptual container
+ representing the RESTCONF API nodes (media type
+ application/yang.api).
+
+ Note that the YANG definitions within this module do not
+ represent configuration data of any kind.
+ The YANG grouping statements provide a normative syntax
+ for XML and JSON message encoding purposes.
+
+ Copyright (c) 2013 IETF Trust and the persons identified as
+ authors of the code. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or
+ without modification, is permitted pursuant to, and subject
+ to the license terms contained in, the Simplified BSD License
+ set forth in Section 4.c of the IETF Trust's Legal Provisions
+ Relating to IETF Documents
+ (http://trustee.ietf.org/license-info).
+
+ This version of this YANG module is part of RFC XXXX; see
+ the RFC itself for full legal notices.";
+
+ // RFC Ed.: replace XXXX with actual RFC number and remove this
+ // note.
+
+ // RFC Ed.: remove this note
+ // Note: extracted from draft-bierman-netconf-restconf-02.txt
+
+ // RFC Ed.: update the date below with the date of RFC publication
+ // and remove this note.
+ revision 2013-10-19 {
+ description
+ "Initial revision.";
+ reference
+ "RFC XXXX: RESTCONF Protocol.";
+ }
+
+ typedef data-resource-identifier {
+ type string {
+ length "1 .. max";
+ }
+ description
+ "Contains a Data Resource Identifier formatted string
+ to identify a specific data node. The data node that
+ uses this data type SHOULD define the document root
+ for data resource identifiers. The default document
+ root is the target datastore conceptual root node.
+ Data resource identifiers are defined relative to
+ this document root.";
+ reference
+ "RFC XXXX: [sec. 5.3.1.1 ABNF For Data Resource Identifiers]";
+ }
+
+ // this typedef is TBD; not currently used
+ typedef datastore-identifier {
+ type union {
+ type enumeration {
+ enum candidate {
+ description
+ "Identifies the NETCONF shared candidate datastore.";
+ reference
+ "RFC 6241, section 8.3";
+ }
+ enum running {
+ description
+ "Identifies the NETCONF running datastore.";
+ reference
+ "RFC 6241, section 5.1";
+ }
+ enum startup {
+ description
+ "Identifies the NETCONF startup datastore.";
+ reference
+ "RFC 6241, section 8.7";
+ }
+ }
+ type string;
+ }
+ description
+ "Contains a string to identify a specific datastore.
+ The enumerated datastore identifier values are
+ reserved for standard datastore names.";
+ }
+
+ typedef revision-identifier {
+ type string {
+ pattern '\d{4}-\d{2}-\d{2}';
+ }
+ description
+ "Represents a specific date in YYYY-MM-DD format.
+ TBD: make pattern more precise to exclude leading zeros.";
+ }
+
+ grouping yang-patch {
+
+ description
+ "A grouping that contains a YANG container
+ representing the syntax and semantics of a
+ YANG Patch edit request message.";
+
+ container yang-patch {
+ description
+ "Represents a conceptual sequence of datastore edits,
+ called a patch. Each patch is given a client-assigned
+ patch identifier. Each edit MUST be applied
+ in ascending order, and all edits MUST be applied.
+ If any errors occur, then the target datastore MUST NOT
+ be changed by the patch operation.
+
+ A patch MUST be validated by the server to be a
+ well-formed message before any of the patch edits
+ are validated or attempted.
+
+ YANG datastore validation (defined in RFC 6020, section
+ 8.3.3) is performed after all edits have been
+ individually validated.
+
+ It is possible for a datastore constraint violation to occur
+ due to any node in the datastore, including nodes not
+ included in the edit list. Any validation errors MUST
+ be reported in the reply message.";
+
+ reference
+ "RFC 6020, section 8.3.";
+
+ leaf patch-id {
+ type string;
+ description
+ "An arbitrary string provided by the client to identify
+ the entire patch. This value SHOULD be present in any
+ audit logging records generated by the server for the
+ patch. Error messages returned by the server pertaining
+ to this patch will be identified by this patch-id value.";
+ }
+
+ leaf comment {
+ type string {
+ length "0 .. 1024";
+ }
+ description
+ "An arbitrary string provided by the client to describe
+ the entire patch. This value SHOULD be present in any
+ audit logging records generated by the server for the
+ patch.";
+ }
+
+ list edit {
+ key edit-id;
+ ordered-by user;
+
+ description
+ "Represents one edit within the YANG Patch
+ request message.";
+
+ leaf edit-id {
+ type string;
+ description
+ "Arbitrary string index for the edit.
+ Error messages returned by the server pertaining
+ to a specific edit will be identified by this
+ value.";
+ }
+
+ leaf operation {
+ type enumeration {
+ enum create {
+ description
+ "The target data node is created using the
+ supplied value, only if it does not already
+ exist.";
+ }
+ enum delete {
+ description
+ "Delete the target node, only if the data resource
+ currently exists, otherwise return an error.";
+ }
+ enum insert {
+ description
+ "Insert the supplied value into a user-ordered
+ list or leaf-list entry. The target node must
+ represent a new data resource.";
+ }
+ enum merge {
+ description
+ "The supplied value is merged with the target data
+ node.";
+ }
+ enum move {
+ description
+ "Move the target node. Reorder a user-ordered
+ list or leaf-list. The target node must represent
+ an existing data resource.";
+ }
+ enum replace {
+ description
+ "The supplied value is used to replace the target
+ data node.";
+ }
+ enum remove {
+ description
+ "Delete the target node if it currently exists.";
+ }
+ }
+ mandatory true;
+ description
+ "The datastore operation requested for the associated
+ edit entry";
+ }
+
+ leaf target {
+ type data-resource-identifier;
+ mandatory true;
+ description
+ "Identifies the target data resource for the edit
+ operation.";
+ }
+
+ leaf point {
+ when "(../operation = 'insert' or " +
+ "../operation = 'move') and " +
+ "(../where = 'before' or ../where = 'after')" {
+ description
+ "Point leaf only applies for insert or move
+ operations, before or after an existing entry.";
+ }
+ type data-resource-identifier;
+ description
+ "The absolute URL path for the data node that is being
+ used as the insertion point or move point for the
+ target of this edit entry.";
+ }
+
+ leaf where {
+ when "../operation = 'insert' or ../operation = 'move'" {
+ description
+ "Where leaf only applies for insert or move
+ operations.";
+ }
+ type enumeration {
+ enum before {
+ description
+ "Insert or move a data node before the data resource
+ identified by the 'point' parameter.";
+ }
+ enum after {
+ description
+ "Insert or move a data node after the data resource
+ identified by the 'point' parameter.";
+ }
+ enum first {
+ description
+ "Insert or move a data node so it becomes ordered
+ as the first entry.";
+ }
+ enum last {
+ description
+ "Insert or move a data node so it becomes ordered
+ as the last entry.";
+ }
+
+ }
+ default last;
+ description
+ "Identifies where a data resource will be inserted or
+ moved. YANG only allows these operations for
+ list and leaf-list data nodes that are ordered-by
+ user.";
+ }
+
+ anyxml value {
+ when "(../operation = 'create' or " +
+ "../operation = 'merge' " +
+ "or ../operation = 'replace' or " +
+ "../operation = 'insert')" {
+ description
+ "Value node only used for create, merge,
+ replace, and insert operations";
+ }
+ description
+ "Value used for this edit operation.";
+ }
+ }
+ }
+
+ } // grouping yang-patch
+
+
+ grouping yang-patch-status {
+
+ description
+ "A grouping that contains a YANG container
+ representing the syntax and semantics of
+ YANG Patch status response message.";
+
+ container yang-patch-status {
+ description
+ "A container representing the response message
+ sent by the server after a YANG Patch edit
+ request message has been processed.";
+
+ leaf patch-id {
+ type string;
+ description
+ "The patch-id value used in the request";
+ }
+
+ choice global-status {
+ description
+ "Report global errors or complete success.
+ If there is no case selected then errors
+ are reported in the edit-status container.";
+
+ case global-errors {
+ uses errors;
+ description
+ "This container will be present if global
+ errors unrelated to a specific edit occurred.";
+ }
+ leaf ok {
+ type empty;
+ description
+ "This leaf will be present if the request succeeded
+ and there are no errors reported in the edit-status
+ container.";
+ }
+ }
+
+ container edit-status {
+ description
+ "This container will be present if there are
+ edit-specific status responses to report.";
+
+ list edit {
+ key edit-id;
+
+ description
+ "Represents a list of status responses,
+ corresponding to edits in the YANG Patch
+ request message. If an edit entry was
+ skipped or not reached by the server,
+ then this list will not contain a corresponding
+ entry for that edit.";
+
+ leaf edit-id {
+ type string;
+ description
+ "Response status is for the edit list entry
+ with this edit-id value.";
+ }
+ choice edit-status-choice {
+ description
+ "A choice between different types of status
+ responses for each edit entry.";
+ leaf ok {
+ type empty;
+ description
+ "This edit entry was invoked without any
+ errors detected by the server associated
+ with this edit.";
+ }
+ leaf location {
+ type inet:uri;
+ description
+ "Contains the Location header value that would be
+ returned if this edit causes a new resource to be
+ created. If the edit identified by the same edit-id
+ value was successfully invoked and a new resource
+ was created, then this field will be returned
+ instead of 'ok'.";
+ }
+ case errors {
+ uses errors;
+ description
+ "The server detected errors associated with the
+ edit identified by the same edit-id value.";
+ }
+ }
+ }
+ }
+ }
+ } // grouping yang-patch-status
+
+
+ grouping errors {
+
+ description
+ "A grouping that contains a YANG container
+ representing the syntax and semantics of a
+ YANG Patch errors report within a response message.";
+
+ container errors {
+ config false; // needed so list error does not need a key
+ description
+ "Represents an error report returned by the server if
+ a request results in an error.";
+
+ list error {
+ description
+ "An entry containing information about one
+ specific error that occurred while processing
+ a RESTCONF request.";
+ reference "RFC 6241, Section 4.3";
+
+ leaf error-type {
+ type enumeration {
+ enum transport {
+ description "The transport layer";
+ }
+ enum rpc {
+ description "The rpc or notification layer";
+ }
+ enum protocol {
+ description "The protocol operation layer";
+ }
+ enum application {
+ description "The server application layer";
+ }
+ }
+ mandatory true;
+ description
+ "The protocol layer where the error occurred.";
+ }
+
+ leaf error-tag {
+ type string;
+ mandatory true;
+ description
+ "The enumerated error tag.";
+ }
+
+ leaf error-app-tag {
+ type string;
+ description
+ "The application-specific error tag.";
+ }
+
+ leaf error-path {
+ type data-resource-identifier;
+ description
+ "The target data resource identifier associated
+ with the error, if any.";
+ }
+
+ leaf error-message {
+ type string;
+ description
+ "A message describing the error.";
+ }
+
+ container error-info {
+ description
+ "A container allowing additional information
+ to be included in the error report.";
+ // arbitrary anyxml content here
+ }
+ }
+ }
+ } // grouping errors
+
+
+ grouping restconf {
+
+ description
+ "A grouping that contains a YANG container
+ representing the syntax and semantics of
+ the RESTCONF API resource.";
+
+ container restconf {
+ description
+ "Conceptual container representing the
+ application/yang.api resource type.";
+
+ container config {
+ description
+ "Container representing the application/yang.datastore
+ resource type. Represents the conceptual root of the
+ unified configuration datastore containing YANG data
+ nodes. The child nodes of this container are
+ configuration data resources (application/yang.data)
+ defined as top-level YANG data nodes from the modules
+ advertised by the server in /restconf/modules.";
+ }
+
+ container operational {
+ description
+ "Container representing the application/yang.datastore
+ resource type. Represents the conceptual root of the
+ operational data supported by the server. The child
+ nodes of this container are operational data resources
+ (application/yang.data) defined as top-level
+ YANG data nodes from the modules advertised by
+ the server in /restconf/modules.";
+ }
+
+ container modules {
+ description
+ "Contains a list of module description entries.
+ These modules are currently loaded into the server.";
+
+ list module {
+ key "name revision";
+ description
+ "Each entry represents one module currently
+ supported by the server.";
+
+ leaf name {
+ type yang:yang-identifier;
+ description "The YANG module name.";
+ }
+ leaf revision {
+ type union {
+ type revision-identifier;
+ type string { length 0; }
+ }
+ description
+ "The YANG module revision date. An empty string is
+ used if no revision statement is present in the
+ YANG module.";
+ }
+ leaf namespace {
+ type inet:uri;
+ mandatory true;
+ description
+ "The XML namespace identifier for this module.";
+ }
+ leaf-list feature {
+ type yang:yang-identifier;
+ description
+ "List of YANG feature names from this module that are
+ supported by the server.";
+ }
+ leaf-list deviation {
+ type yang:yang-identifier;
+ description
+ "List of YANG deviation module names used by this
+ server to modify the conformance of the module
+ associated with this entry.";
+ }
+ }
+ }
+
+ container operations {
+ description
+ "Container for all operation resources
+ (application/yang.operation),
+
+ Each resource is represented as an empty leaf with the
+ name of the RPC operation from the YANG rpc statement.
+
+ E.g.;
+
+ POST /restconf/operations/show-log-errors
+
+ leaf show-log-errors {
+ type empty;
+ }
+ ";
+ }
+
+ container streams {
+ description
+ "Container representing the notification event streams
+ supported by the server.";
+ reference
+ "RFC 5277, Section 3.4, <streams> element.";
+
+ list stream {
+ key name;
+ description
+ "Each entry describes an event stream supported by
+ the server.";
+
+ leaf name {
+ type string;
+ description "The stream name";
+ reference "RFC 5277, Section 3.4, <name> element.";
+ }
+
+ leaf description {
+ type string;
+ description "Description of stream content";
+ reference
+ "RFC 5277, Section 3.4, <description> element.";
+ }
+
+ leaf replay-support {
+ type boolean;
+ description
+ "Indicates if replay buffer supported for this stream";
+ reference
+ "RFC 5277, Section 3.4, <replaySupport> element.";
+ }
+
+ leaf replay-log-creation-time {
+ type yang:date-and-time;
+ description
+ "Indicates the time the replay log for this stream
+ was created.";
+ reference
+ "RFC 5277, Section 3.4, <replayLogCreationTime>
+ element.";
+ }
+
+ leaf events {
+ type empty;
+ description
+ "Represents the entry point for establishing
+ notification delivery via server sent events.";
+ }
+ }
+ }
+
+ leaf version {
+ type enumeration {
+ enum "1.0" {
+ description
+ "Version 1.0 of the RESTCONF protocol.";
+ }
+ }
+ config false;
+ description
+ "Contains the RESTCONF protocol version.";
+ }
+ }
+ } // grouping restconf
+
+
+ grouping notification {
+ description
+ "Contains the notification message wrapper definition.";
+
+ container notification {
+ description
+ "RESTCONF notification message wrapper.";
+
+ leaf event-time {
+ type yang:date-and-time;
+ mandatory true;
+ description
+ "The time the event was generated by the
+ event source.";
+ reference
+ "RFC 5277, section 4, <eventTime> element.";
+ }
+
+ /* The YANG-specific notification container is encoded
+ * after the 'event-time' element. The format
+ * corresponds to the notificationContent element
+ * in RFC 5277, section 4. For example:
+ *
+ * module example-one {
+ * ...
+ * notification event1 { ... }
+ *
+ * }
+ *
+ * Encoded as element 'event1' in the namespace
+ * for module 'example-one'.
+ */
+ }
+ } // grouping notification
+
+}
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) 2014 Brocade Communications Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.rev131019.restconf.restconf.modules;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.rev131019.RevisionIdentifier;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.rev131019.restconf.restconf.modules.Module.Revision;
+
+public class RevisionBuilderTest {
+
+ private RevisionBuilder builder;
+
+ @Before
+ public void setUp() {
+ builder = new RevisionBuilder();
+ }
+
+ @Test
+ public void testEmptyString() {
+ Revision revision = builder.getDefaultInstance("");
+ validate(revision, "", null);
+ }
+
+ @Test
+ public void testValidDataString() {
+ String dateString = "2014-04-23";
+ Revision revision = builder.getDefaultInstance(dateString);
+ validate(revision, null, new RevisionIdentifier(dateString));
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testNullString() {
+ builder.getDefaultInstance(null);
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testBadFormatString() {
+ builder.getDefaultInstance("badFormat");
+ }
+
+ private void validate(Revision revisionUnderTest, String expectedRevisionString,
+ RevisionIdentifier expectedRevisionIdentifier) {
+ assertNotNull(revisionUnderTest);
+ assertEquals(expectedRevisionString, revisionUnderTest.getString());
+ assertEquals(expectedRevisionIdentifier, revisionUnderTest.getRevisionIdentifier());
+ }
+}
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+* Copyright (c) 2014 Brocade Communications Systems, Inc. and others. All rights reserved.
+*
+* This program and the accompanying materials are made available under the
+* terms of the Eclipse Public License v1.0 which accompanies this distribution,
+* and is available at http://www.eclipse.org/legal/epl-v10.html
+*/
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+ <parent>
+ <artifactId>model-ietf</artifactId>
+ <groupId>org.opendaylight.yangtools.model</groupId>
+ <version>0.6.2-SNAPSHOT</version>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>ietf-yang-types-20130715</artifactId>
+ <version>2013.07.15.1-SNAPSHOT</version>
+ <name>${project.artifactId}</name>
+ <description>${project.artifactId}</description>
+
+ <build>
+ <plugins>
+ <plugin>
+ <artifactId>maven-jar-plugin</artifactId>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Bundle-Name>${project.groupId}.${project.artifactId}</Bundle-Name>
+ </instructions>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
--- /dev/null
+module ietf-yang-types {
+
+ namespace "urn:ietf:params:xml:ns:yang:ietf-yang-types";
+ prefix "yang";
+
+ organization
+ "IETF NETMOD (NETCONF Data Modeling Language) Working Group";
+
+ contact
+ "WG Web: <http://tools.ietf.org/wg/netmod/>
+ WG List: <mailto:netmod@ietf.org>
+ WG Chair: David Kessens
+ <mailto:david.kessens@nsn.com>
+
+ WG Chair: Juergen Schoenwaelder
+ <mailto:j.schoenwaelder@jacobs-university.de>
+
+ Editor: Juergen Schoenwaelder
+ <mailto:j.schoenwaelder@jacobs-university.de>";
+
+ description
+ "This module contains a collection of generally useful derived
+ YANG data types.
+
+ Copyright (c) 2013 IETF Trust and the persons identified as
+ authors of the code. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or
+ without modification, is permitted pursuant to, and subject
+ to the license terms contained in, the Simplified BSD License
+ set forth in Section 4.c of the IETF Trust's Legal Provisions
+ Relating to IETF Documents
+ (http://trustee.ietf.org/license-info).
+
+ This version of this YANG module is part of RFC 6991; see
+ the RFC itself for full legal notices.";
+
+ revision 2013-07-15 {
+ description
+ "This revision adds the following new data types:
+ - yang-identifier
+ - hex-string
+ - uuid
+ - dotted-quad";
+ reference
+ "RFC 6991: Common YANG Data Types";
+ }
+
+ revision 2010-09-24 {
+ description
+ "Initial revision.";
+ reference
+ "RFC 6021: Common YANG Data Types";
+ }
+
+ /*** collection of counter and gauge types ***/
+
+ typedef counter32 {
+ type uint32;
+ description
+ "The counter32 type represents a non-negative integer
+ that monotonically increases until it reaches a
+ maximum value of 2^32-1 (4294967295 decimal), when it
+ wraps around and starts increasing again from zero.
+
+ Counters have no defined 'initial' value, and thus, a
+ single value of a counter has (in general) no information
+ content. Discontinuities in the monotonically increasing
+ value normally occur at re-initialization of the
+ management system, and at other times as specified in the
+ description of a schema node using this type. If such
+ other times can occur, for example, the creation of
+ a schema node of type counter32 at times other than
+ re-initialization, then a corresponding schema node
+ should be defined, with an appropriate type, to indicate
+ the last discontinuity.
+
+ The counter32 type should not be used for configuration
+ schema nodes. A default statement SHOULD NOT be used in
+ combination with the type counter32.
+
+ In the value set and its semantics, this type is equivalent
+ to the Counter32 type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef zero-based-counter32 {
+ type yang:counter32;
+ default "0";
+ description
+ "The zero-based-counter32 type represents a counter32
+ that has the defined 'initial' value zero.
+
+ A schema node of this type will be set to zero (0) on creation
+ and will thereafter increase monotonically until it reaches
+ a maximum value of 2^32-1 (4294967295 decimal), when it
+ wraps around and starts increasing again from zero.
+
+ Provided that an application discovers a new schema node
+ of this type within the minimum time to wrap, it can use the
+ 'initial' value as a delta. It is important for a management
+ station to be aware of this minimum time and the actual time
+ between polls, and to discard data if the actual time is too
+ long or there is no defined minimum time.
+ In the value set and its semantics, this type is equivalent
+ to the ZeroBasedCounter32 textual convention of the SMIv2.";
+ reference
+ "RFC 4502: Remote Network Monitoring Management Information
+ Base Version 2";
+ }
+
+ typedef counter64 {
+ type uint64;
+ description
+ "The counter64 type represents a non-negative integer
+ that monotonically increases until it reaches a
+ maximum value of 2^64-1 (18446744073709551615 decimal),
+ when it wraps around and starts increasing again from zero.
+
+ Counters have no defined 'initial' value, and thus, a
+ single value of a counter has (in general) no information
+ content. Discontinuities in the monotonically increasing
+ value normally occur at re-initialization of the
+ management system, and at other times as specified in the
+ description of a schema node using this type. If such
+ other times can occur, for example, the creation of
+ a schema node of type counter64 at times other than
+ re-initialization, then a corresponding schema node
+ should be defined, with an appropriate type, to indicate
+ the last discontinuity.
+
+ The counter64 type should not be used for configuration
+ schema nodes. A default statement SHOULD NOT be used in
+ combination with the type counter64.
+
+ In the value set and its semantics, this type is equivalent
+ to the Counter64 type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef zero-based-counter64 {
+ type yang:counter64;
+ default "0";
+ description
+ "The zero-based-counter64 type represents a counter64 that
+ has the defined 'initial' value zero.
+ A schema node of this type will be set to zero (0) on creation
+ and will thereafter increase monotonically until it reaches
+ a maximum value of 2^64-1 (18446744073709551615 decimal),
+ when it wraps around and starts increasing again from zero.
+
+ Provided that an application discovers a new schema node
+ of this type within the minimum time to wrap, it can use the
+ 'initial' value as a delta. It is important for a management
+ station to be aware of this minimum time and the actual time
+ between polls, and to discard data if the actual time is too
+ long or there is no defined minimum time.
+
+ In the value set and its semantics, this type is equivalent
+ to the ZeroBasedCounter64 textual convention of the SMIv2.";
+ reference
+ "RFC 2856: Textual Conventions for Additional High Capacity
+ Data Types";
+ }
+
+ typedef gauge32 {
+ type uint32;
+ description
+ "The gauge32 type represents a non-negative integer, which
+ may increase or decrease, but shall never exceed a maximum
+ value, nor fall below a minimum value. The maximum value
+ cannot be greater than 2^32-1 (4294967295 decimal), and
+ the minimum value cannot be smaller than 0. The value of
+ a gauge32 has its maximum value whenever the information
+ being modeled is greater than or equal to its maximum
+ value, and has its minimum value whenever the information
+ being modeled is smaller than or equal to its minimum value.
+ If the information being modeled subsequently decreases
+ below (increases above) the maximum (minimum) value, the
+ gauge32 also decreases (increases).
+
+ In the value set and its semantics, this type is equivalent
+ to the Gauge32 type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef gauge64 {
+ type uint64;
+ description
+ "The gauge64 type represents a non-negative integer, which
+ may increase or decrease, but shall never exceed a maximum
+ value, nor fall below a minimum value. The maximum value
+ cannot be greater than 2^64-1 (18446744073709551615), and
+ the minimum value cannot be smaller than 0. The value of
+ a gauge64 has its maximum value whenever the information
+ being modeled is greater than or equal to its maximum
+ value, and has its minimum value whenever the information
+ being modeled is smaller than or equal to its minimum value.
+ If the information being modeled subsequently decreases
+ below (increases above) the maximum (minimum) value, the
+ gauge64 also decreases (increases).
+
+ In the value set and its semantics, this type is equivalent
+ to the CounterBasedGauge64 SMIv2 textual convention defined
+ in RFC 2856";
+ reference
+ "RFC 2856: Textual Conventions for Additional High Capacity
+ Data Types";
+ }
+
+ /*** collection of identifier-related types ***/
+
+ typedef object-identifier {
+ type string {
+ pattern '(([0-1](\.[1-3]?[0-9]))|(2\.(0|([1-9]\d*))))'
+ + '(\.(0|([1-9]\d*)))*';
+ }
+ description
+ "The object-identifier type represents administratively
+ assigned names in a registration-hierarchical-name tree.
+
+ Values of this type are denoted as a sequence of numerical
+ non-negative sub-identifier values. Each sub-identifier
+ value MUST NOT exceed 2^32-1 (4294967295). Sub-identifiers
+ are separated by single dots and without any intermediate
+ whitespace.
+
+ The ASN.1 standard restricts the value space of the first
+ sub-identifier to 0, 1, or 2. Furthermore, the value space
+ of the second sub-identifier is restricted to the range
+ 0 to 39 if the first sub-identifier is 0 or 1. Finally,
+ the ASN.1 standard requires that an object identifier
+ has always at least two sub-identifiers. The pattern
+ captures these restrictions.
+
+ Although the number of sub-identifiers is not limited,
+ module designers should realize that there may be
+ implementations that stick with the SMIv2 limit of 128
+ sub-identifiers.
+ This type is a superset of the SMIv2 OBJECT IDENTIFIER type
+ since it is not restricted to 128 sub-identifiers. Hence,
+ this type SHOULD NOT be used to represent the SMIv2 OBJECT
+ IDENTIFIER type; the object-identifier-128 type SHOULD be
+ used instead.";
+ reference
+ "ISO9834-1: Information technology -- Open Systems
+ Interconnection -- Procedures for the operation of OSI
+ Registration Authorities: General procedures and top
+ arcs of the ASN.1 Object Identifier tree";
+ }
+
+ typedef object-identifier-128 {
+ type object-identifier {
+ pattern '\d*(\.\d*){1,127}';
+ }
+ description
+ "This type represents object-identifiers restricted to 128
+ sub-identifiers.
+
+ In the value set and its semantics, this type is equivalent
+ to the OBJECT IDENTIFIER type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef yang-identifier {
+ type string {
+ length "1..max";
+ pattern '[a-zA-Z_][a-zA-Z0-9\-_.]*';
+ pattern '.|..|[^xX].*|.[^mM].*|..[^lL].*';
+ }
+ description
+ "A YANG identifier string as defined by the 'identifier'
+ rule in Section 12 of RFC 6020. An identifier must
+ start with an alphabetic character or an underscore
+ followed by an arbitrary sequence of alphabetic or
+ numeric characters, underscores, hyphens, or dots.
+
+ A YANG identifier MUST NOT start with any possible
+ combination of the lowercase or uppercase character
+ sequence 'xml'.";
+ reference
+ "RFC 6020: YANG - A Data Modeling Language for the Network
+ Configuration Protocol (NETCONF)";
+ }
+ /*** collection of types related to date and time***/
+
+ typedef date-and-time {
+ type string {
+ pattern '\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?'
+ + '(Z|[\+\-]\d{2}:\d{2})';
+ }
+ description
+ "The date-and-time type is a profile of the ISO 8601
+ standard for representation of dates and times using the
+ Gregorian calendar. The profile is defined by the
+ date-time production in Section 5.6 of RFC 3339.
+
+ The date-and-time type is compatible with the dateTime XML
+ schema type with the following notable exceptions:
+
+ (a) The date-and-time type does not allow negative years.
+
+ (b) The date-and-time time-offset -00:00 indicates an unknown
+ time zone (see RFC 3339) while -00:00 and +00:00 and Z
+ all represent the same time zone in dateTime.
+
+ (c) The canonical format (see below) of data-and-time values
+ differs from the canonical format used by the dateTime XML
+ schema type, which requires all times to be in UTC using
+ the time-offset 'Z'.
+
+ This type is not equivalent to the DateAndTime textual
+ convention of the SMIv2 since RFC 3339 uses a different
+ separator between full-date and full-time and provides
+ higher resolution of time-secfrac.
+
+ The canonical format for date-and-time values with a known time
+ zone uses a numeric time zone offset that is calculated using
+ the device's configured known offset to UTC time. A change of
+ the device's offset to UTC time will cause date-and-time values
+ to change accordingly. Such changes might happen periodically
+ in case a server follows automatically daylight saving time
+ (DST) time zone offset changes. The canonical format for
+ date-and-time values with an unknown time zone (usually
+ referring to the notion of local time) uses the time-offset
+ -00:00.";
+ reference
+ "RFC 3339: Date and Time on the Internet: Timestamps
+ RFC 2579: Textual Conventions for SMIv2
+ XSD-TYPES: XML Schema Part 2: Datatypes Second Edition";
+ }
+ typedef timeticks {
+ type uint32;
+ description
+ "The timeticks type represents a non-negative integer that
+ represents the time, modulo 2^32 (4294967296 decimal), in
+ hundredths of a second between two epochs. When a schema
+ node is defined that uses this type, the description of
+ the schema node identifies both of the reference epochs.
+
+ In the value set and its semantics, this type is equivalent
+ to the TimeTicks type of the SMIv2.";
+ reference
+ "RFC 2578: Structure of Management Information Version 2
+ (SMIv2)";
+ }
+
+ typedef timestamp {
+ type yang:timeticks;
+ description
+ "The timestamp type represents the value of an associated
+ timeticks schema node at which a specific occurrence
+ happened. The specific occurrence must be defined in the
+ description of any schema node defined using this type. When
+ the specific occurrence occurred prior to the last time the
+ associated timeticks attribute was zero, then the timestamp
+ value is zero. Note that this requires all timestamp values
+ to be reset to zero when the value of the associated timeticks
+ attribute reaches 497+ days and wraps around to zero.
+
+ The associated timeticks schema node must be specified
+ in the description of any schema node using this type.
+
+ In the value set and its semantics, this type is equivalent
+ to the TimeStamp textual convention of the SMIv2.";
+ reference
+ "RFC 2579: Textual Conventions for SMIv2";
+ }
+
+ /*** collection of generic address types ***/
+
+ typedef phys-address {
+ type string {
+ pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
+ }
+ description
+ "Represents media- or physical-level addresses represented
+ as a sequence octets, each octet represented by two hexadecimal
+ numbers. Octets are separated by colons. The canonical
+ representation uses lowercase characters.
+
+ In the value set and its semantics, this type is equivalent
+ to the PhysAddress textual convention of the SMIv2.";
+ reference
+ "RFC 2579: Textual Conventions for SMIv2";
+ }
+
+ typedef mac-address {
+ type string {
+ pattern '[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}';
+ }
+ description
+ "The mac-address type represents an IEEE 802 MAC address.
+ The canonical representation uses lowercase characters.
+
+ In the value set and its semantics, this type is equivalent
+ to the MacAddress textual convention of the SMIv2.";
+ reference
+ "IEEE 802: IEEE Standard for Local and Metropolitan Area
+ Networks: Overview and Architecture
+ RFC 2579: Textual Conventions for SMIv2";
+ }
+
+ /*** collection of XML-specific types ***/
+
+ typedef xpath1.0 {
+ type string;
+ description
+ "This type represents an XPATH 1.0 expression.
+
+ When a schema node is defined that uses this type, the
+ description of the schema node MUST specify the XPath
+ context in which the XPath expression is evaluated.";
+ reference
+ "XPATH: XML Path Language (XPath) Version 1.0";
+ }
+
+ /*** collection of string types ***/
+
+ typedef hex-string {
+ type string {
+ pattern '([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?';
+ }
+ description
+ "A hexadecimal string with octets represented as hex digits
+ separated by colons. The canonical representation uses
+ lowercase characters.";
+ }
+
+ typedef uuid {
+ type string {
+ pattern '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-'
+ + '[0-9a-fA-F]{4}-[0-9a-fA-F]{12}';
+ }
+ description
+ "A Universally Unique IDentifier in the string representation
+ defined in RFC 4122. The canonical representation uses
+ lowercase characters.
+
+ The following is an example of a UUID in string representation:
+ f81d4fae-7dec-11d0-a765-00a0c91e6bf6
+ ";
+ reference
+ "RFC 4122: A Universally Unique IDentifier (UUID) URN
+ Namespace";
+ }
+
+ typedef dotted-quad {
+ type string {
+ pattern
+ '(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}'
+ + '([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])';
+ }
+ description
+ "An unsigned 32-bit number expressed in the dotted-quad
+ notation, i.e., four octets written as decimal numbers
+ and separated with the '.' (full stop) character.";
+ }
+ }
\ No newline at end of file
<modules>
<module>ietf-inet-types</module>
<module>ietf-yang-types</module>
+ <module>ietf-yang-types-20130715</module>
<module>ietf-ted</module>
<module>ietf-topology</module>
<module>ietf-topology-isis</module>
import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
import org.opendaylight.yangtools.yang.model.api.Module;
import org.opendaylight.yangtools.yang.model.api.SchemaContext;
-import org.opendaylight.yangtools.yang.model.api.SchemaNode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import java.util.regex.Pattern;
import org.opendaylight.yangtools.concepts.Immutable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/**
* The QName from XML consists of local name of element and XML namespace, but
*/
public final class QName implements Immutable, Serializable, Comparable<QName> {
private static final long serialVersionUID = 5398411242927766414L;
- private static final Logger LOGGER = LoggerFactory.getLogger(QName.class);
static final String QNAME_REVISION_DELIMITER = "?revision=";
static final String QNAME_LEFT_PARENTHESIS = "(";
private static final char[] ILLEGAL_CHARACTERS = new char[] {'?', '(', ')', '&'};
- //Nullable
- private final URI namespace;
+ //Mandatory
+ private final QNameModule module;
//Mandatory
private final String localName;
//Nullable
private final String prefix;
- //Nullable
- private final String formattedRevision;
- //Nullable
- private final Date revision;
/**
* QName Constructor.
*/
public QName(final URI namespace, final Date revision, final String prefix, final String localName) {
this.localName = checkLocalName(localName);
- this.namespace = namespace;
- this.revision = revision;
this.prefix = prefix;
- if(revision != null) {
- this.formattedRevision = getRevisionFormat().format(revision);
- } else {
- this.formattedRevision = null;
- }
+ this.module = QNameModule.create(namespace, revision);
}
/**
*/
@Deprecated
public QName(final String input) throws ParseException {
- Date revision = null;
- String nsAndRev = input.substring(input.indexOf("(") + 1, input.indexOf(")"));
+ final String nsAndRev = input.substring(input.indexOf("(") + 1, input.indexOf(")"));
+ final Date revision;
+ final URI namespace;
if (nsAndRev.contains("?")) {
String[] splitted = nsAndRev.split("\\?");
- this.namespace = URI.create(splitted[0]);
+ namespace = URI.create(splitted[0]);
revision = getRevisionFormat().parse(splitted[1]);
} else {
- this.namespace = URI.create(nsAndRev);
+ namespace = URI.create(nsAndRev);
+ revision = null;
}
this.localName = checkLocalName(input.substring(input.indexOf(")") + 1));
- this.revision = revision;
this.prefix = null;
- if (revision != null) {
- this.formattedRevision = getRevisionFormat().format(revision);
- } else {
- this.formattedRevision = null;
- }
+ this.module = QNameModule.create(namespace, revision);
}
public static QName create(final String input) {
* @return XMLNamespace assigned to the YANG module.
*/
public URI getNamespace() {
- return namespace;
+ return module.getNamespace();
}
/**
* otherwise returns <code>null</code>
*/
public Date getRevision() {
- return revision;
+ return module.getRevision();
}
/**
final int prime = 31;
int result = 1;
result = prime * result + ((localName == null) ? 0 : localName.hashCode());
- result = prime * result + ((namespace == null) ? 0 : namespace.hashCode());
- result = prime * result + ((formattedRevision == null) ? 0 : formattedRevision.hashCode());
+ result = prime * result + ((getNamespace() == null) ? 0 : getNamespace().hashCode());
+ result = prime * result + ((getFormattedRevision() == null) ? 0 : getFormattedRevision().hashCode());
return result;
}
if (this == obj) {
return true;
}
- if (obj == null) {
- return false;
- }
- if (getClass() != obj.getClass()) {
+ if (!(obj instanceof QName)) {
return false;
}
- QName other = (QName) obj;
+ final QName other = (QName) obj;
if (localName == null) {
if (other.localName != null) {
return false;
} else if (!localName.equals(other.localName)) {
return false;
}
- if (namespace == null) {
- if (other.namespace != null) {
+ if (getNamespace() == null) {
+ if (other.getNamespace() != null) {
return false;
}
- } else if (!namespace.equals(other.namespace)) {
+ } else if (!getNamespace().equals(other.getNamespace())) {
return false;
}
- if (formattedRevision == null) {
- if (other.formattedRevision != null) {
+ if (getFormattedRevision() == null) {
+ if (other.getFormattedRevision() != null) {
return false;
}
- } else if (!revision.equals(other.revision)) {
+ } else if (!getRevision().equals(other.getRevision())) {
return false;
}
return true;
}
-
public static QName create(final QName base, final String localName){
return new QName(base, localName);
}
public static QName create(final String namespace, final String revision, final String localName) throws IllegalArgumentException{
+ final URI namespaceUri;
try {
- URI namespaceUri = new URI(namespace);
- Date revisionDate = parseRevision(revision);
- return create(namespaceUri, revisionDate, localName);
+ namespaceUri = new URI(namespace);
} catch (URISyntaxException ue) {
- throw new IllegalArgumentException("Namespace is is not valid URI", ue);
+ throw new IllegalArgumentException(String.format("Namespace '%s' is not a valid URI", namespace), ue);
}
+
+ Date revisionDate = parseRevision(revision);
+ return create(namespaceUri, revisionDate, localName);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
- if (namespace != null) {
- sb.append(QNAME_LEFT_PARENTHESIS + namespace);
+ if (getNamespace() != null) {
+ sb.append(QNAME_LEFT_PARENTHESIS + getNamespace());
- if (formattedRevision != null) {
- sb.append(QNAME_REVISION_DELIMITER + formattedRevision);
+ if (getFormattedRevision() != null) {
+ sb.append(QNAME_REVISION_DELIMITER + getFormattedRevision());
}
sb.append(QNAME_RIGHT_PARENTHESIS);
}
return sb.toString();
}
- /**
- * Returns a namespace in form defined by section 5.6.4. of {@link https
- * ://tools.ietf.org/html/rfc6020}, if namespace is not correctly defined,
- * the method will return <code>null</code> <br>
- * example "http://example.acme.com/system?revision=2008-04-01"
- *
- * @return namespace in form defined by section 5.6.4. of {@link https
- * ://tools.ietf.org/html/rfc6020}, if namespace is not correctly
- * defined, the method will return <code>null</code>
- *
- */
- URI getRevisionNamespace() {
-
- if (namespace == null) {
- return null;
- }
-
- String query = "";
- if (revision != null) {
- query = "revision=" + formattedRevision;
- }
-
- URI compositeURI = null;
- try {
- compositeURI = new URI(namespace.getScheme(), namespace.getUserInfo(), namespace.getHost(),
- namespace.getPort(), namespace.getPath(), query, namespace.getFragment());
- } catch (URISyntaxException e) {
- LOGGER.error("", e);
- }
- return compositeURI;
- }
-
public String getFormattedRevision() {
- return formattedRevision;
+ return module.getFormattedRevision();
}
public QName withoutRevision() {
- return QName.create(namespace, null, localName);
+ return QName.create(getNamespace(), null, localName);
}
public static Date parseRevision(final String formatedDate) {
try {
return getRevisionFormat().parse(formatedDate);
} catch (ParseException| RuntimeException e) {
- throw new IllegalArgumentException("Revision is not in supported format:" + formatedDate,e);
+ throw new IllegalArgumentException(String.format("Revision '%s'is not in a supported format", formatedDate), e);
}
}
}
public boolean isEqualWithoutRevision(final QName other) {
- return localName.equals(other.getLocalName()) && Objects.equals(namespace, other.getNamespace());
+ return localName.equals(other.getLocalName()) && Objects.equals(getNamespace(), other.getNamespace());
}
@Override
}
// compare nullable namespace parameter
- if (namespace == null) {
- if (other.namespace != null) {
+ if (getNamespace() == null) {
+ if (other.getNamespace() != null) {
return -1;
}
} else {
- if (other.namespace == null) {
+ if (other.getNamespace() == null) {
return 1;
}
- result = namespace.compareTo(other.namespace);
+ result = getNamespace().compareTo(other.getNamespace());
if (result != 0) {
return result;
}
}
// compare nullable revision parameter
- if (revision == null) {
- if (other.revision != null) {
+ if (getRevision() == null) {
+ if (other.getRevision() != null) {
return -1;
}
} else {
- if (other.revision == null) {
+ if (other.getRevision() == null) {
return 1;
}
- result = revision.compareTo(other.revision);
+ result = getRevision().compareTo(other.getRevision());
if (result != 0) {
return result;
}
--- /dev/null
+/*
+ * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.common;
+
+import java.io.Serializable;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Date;
+
+import org.opendaylight.yangtools.concepts.Immutable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+final class QNameModule implements Immutable, Serializable {
+ private static final Logger LOG = LoggerFactory.getLogger(QNameModule.class);
+ private static final long serialVersionUID = 1L;
+
+ //Nullable
+ private final URI namespace;
+
+ //Nullable
+ private final Date revision;
+
+ //Nullable
+ private final String formattedRevision;
+
+ private QNameModule(final URI namespace, final Date revision) {
+ this.namespace = namespace;
+ this.revision = revision;
+ if(revision != null) {
+ this.formattedRevision = SimpleDateFormatUtil.getRevisionFormat().format(revision);
+ } else {
+ this.formattedRevision = null;
+ }
+ }
+
+ public static QNameModule create(final URI namespace, final Date revision) {
+ return new QNameModule(namespace, revision);
+ }
+
+ public String getFormattedRevision() {
+ return formattedRevision;
+ }
+
+ public URI getNamespace() {
+ return namespace;
+ }
+
+ public Date getRevision() {
+ return revision;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = (namespace == null) ? 0 : namespace.hashCode();
+ result = prime * result + ((formattedRevision == null) ? 0 : formattedRevision.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(final Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof QNameModule)) {
+ return false;
+ }
+ final QNameModule other = (QNameModule) obj;
+ if (namespace == null) {
+ if (other.namespace != null) {
+ return false;
+ }
+ } else if (!namespace.equals(other.namespace)) {
+ return false;
+ }
+ if (formattedRevision == null) {
+ if (other.formattedRevision != null) {
+ return false;
+ }
+ } else if (!revision.equals(other.revision)) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Returns a namespace in form defined by section 5.6.4. of {@link https
+ * ://tools.ietf.org/html/rfc6020}, if namespace is not correctly defined,
+ * the method will return <code>null</code> <br>
+ * example "http://example.acme.com/system?revision=2008-04-01"
+ *
+ * @return namespace in form defined by section 5.6.4. of {@link https
+ * ://tools.ietf.org/html/rfc6020}, if namespace is not correctly
+ * defined, the method will return <code>null</code>
+ *
+ */
+ URI getRevisionNamespace() {
+
+ if (namespace == null) {
+ return null;
+ }
+
+ String query = "";
+ if (revision != null) {
+ query = "revision=" + formattedRevision;
+ }
+
+ URI compositeURI = null;
+ try {
+ compositeURI = new URI(namespace.getScheme(), namespace.getUserInfo(), namespace.getHost(),
+ namespace.getPort(), namespace.getPath(), query, namespace.getFragment());
+ } catch (URISyntaxException e) {
+ LOG.error("", e);
+ }
+ return compositeURI;
+ }
+}
*/
package org.opendaylight.yangtools.yang.data.impl;
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableMap;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.*;
-import java.net.URI;
-import java.util.Map;
-
/**
* @author michal.rehak
* @param <T>
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
-import java.util.Map;
/**
* @author michal.rehak
import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode;
import com.google.common.base.Preconditions;
-import com.google.common.base.Supplier;
public class ImmutableChoiceNodeSchemaAwareBuilder extends ImmutableChoiceNodeBuilder {
"root");
private static final QName LIST_A_QNAME = QName.create(ROOT_QNAME, "list-a");
private static final QName LIST_B_QNAME = QName.create(ROOT_QNAME, "list-b");
- private static final QName CHOICE_A_QNAME = QName.create(ROOT_QNAME, "choice-a");
private static final QName LEAF_A_QNAME = QName.create(ROOT_QNAME, "leaf-a");
private static final QName LEAF_B_QNAME = QName.create(ROOT_QNAME, "leaf-b");
private static final String FOO = "foo";
import javax.xml.transform.stream.StreamResult;
import org.custommonkey.xmlunit.Diff;
-import org.custommonkey.xmlunit.XMLAssert;
import org.custommonkey.xmlunit.XMLUnit;
import org.junit.Test;
import org.junit.runner.RunWith;
<nm2>abcd2=a.b.c.d.2</nm2>
</additionalConfiguration>
<resourceBaseDir>/target/resourcesGenerated</resourceBaseDir>
+ <outputBaseDir>
+ target/AdditionalConfig
+ </outputBaseDir>
</generator>
<generator>
<codeGeneratorClass>
<additionalConfiguration>
<c1>config</c1>
</additionalConfiguration>
+ <outputBaseDir>
+ target/AdditionalConfig
+ </outputBaseDir>
</generator>
</codeGenerators>
</configuration>
<codeGeneratorClass>
org.opendaylight.yangtools.yang2sources.spi.CodeGeneratorTestImpl
</codeGeneratorClass>
+ <outputBaseDir>
+ target/correct
+ </outputBaseDir>
</generator>
</codeGenerators>
</configuration>
<codeGeneratorClass>
org.opendaylight.yangtools.yang2sources.spi.CodeGeneratorTestImpl
</codeGeneratorClass>
+ <outputBaseDir>
+ target/GenerateTest1
+ </outputBaseDir>
</generator>
</codeGenerators>
</configuration>
<codeGeneratorClass>
org.opendaylight.yangtools.yang2sources.spi.CodeGeneratorTestImpl
</codeGeneratorClass>
+ <outputBaseDir>
+ target/NoOutputDir
+ </outputBaseDir>
</generator>
</codeGenerators>
</configuration>
File outputDir = codeGeneratorCfg.getOutputBaseDir(project);
+ if (outputDir != null) {
+ project.addCompileSourceRoot(outputDir.getAbsolutePath());
+ } else {
+ throw new NullPointerException("outputBaseDir is null. Please provide a valid outputBaseDir value in the pom.xml");
+ }
+
log.info(Util.message("Sources will be generated to %s", LOG_PREFIX, outputDir));
log.debug(Util.message("Project root dir is %s", LOG_PREFIX, project.getBasedir()));
log.debug(Util.message("Additional configuration picked up for : %s: %s", LOG_PREFIX,
codeGeneratorCfg.getCodeGeneratorClass(), codeGeneratorCfg.getAdditionalConfiguration()));
- if (outputDir != null) {
- project.addCompileSourceRoot(outputDir.getAbsolutePath());
- }
-
if (g instanceof BuildContextAware) {
((BuildContextAware)g).setBuildContext(buildContext);
}
import java.util.Set;
import org.apache.maven.model.Plugin;
-import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.project.MavenProject;
import org.junit.Before;