Initial commit of yangide codebase. 10/36410/1
authorDavid M. Karr <davidmichaelkarr@gmail.com>
Thu, 17 Mar 2016 20:09:33 +0000 (13:09 -0700)
committerDavid M. Karr <davidmichaelkarr@gmail.com>
Thu, 17 Mar 2016 20:09:33 +0000 (13:09 -0700)
Replaced hard-stored jars with maven-dependency-plugin copy.
Moved up to 0.6.2-Helium for yang.

Change-Id: I0e9de5403ed160538cc5373f5c5521bdad88406a
Signed-off-by: David M. Karr <davidmichaelkarr@gmail.com>
728 files changed:
.gitignore [new file with mode: 0644]
.gitreview [new file with mode: 0644]
README.md [new file with mode: 0644]
epl-v10.html [new file with mode: 0644]
features/com.cisco.yangide.feature/.gitignore [new file with mode: 0644]
features/com.cisco.yangide.feature/.project [new file with mode: 0644]
features/com.cisco.yangide.feature/build.properties [new file with mode: 0644]
features/com.cisco.yangide.feature/feature.properties [new file with mode: 0644]
features/com.cisco.yangide.feature/feature.xml [new file with mode: 0644]
features/com.cisco.yangide.feature/license.html [new file with mode: 0644]
features/com.cisco.yangide.feature/pom.xml [new file with mode: 0644]
features/com.cisco.yangide.m2e.yang.feature/.gitignore [new file with mode: 0644]
features/com.cisco.yangide.m2e.yang.feature/.project [new file with mode: 0644]
features/com.cisco.yangide.m2e.yang.feature/build.properties [new file with mode: 0644]
features/com.cisco.yangide.m2e.yang.feature/feature.properties [new file with mode: 0644]
features/com.cisco.yangide.m2e.yang.feature/feature.xml [new file with mode: 0644]
features/com.cisco.yangide.m2e.yang.feature/license.html [new file with mode: 0644]
features/com.cisco.yangide.m2e.yang.feature/pom.xml [new file with mode: 0644]
plugins/com.cisco.yangide.core.tests/.gitignore [new file with mode: 0644]
plugins/com.cisco.yangide.core.tests/.project [new file with mode: 0644]
plugins/com.cisco.yangide.core.tests/META-INF/MANIFEST.MF [new file with mode: 0644]
plugins/com.cisco.yangide.core.tests/build.properties [new file with mode: 0644]
plugins/com.cisco.yangide.core.tests/pom.xml [new file with mode: 0644]
plugins/com.cisco.yangide.core.tests/projects/yang/yang-p001/pom.xml [new file with mode: 0644]
plugins/com.cisco.yangide.core.tests/projects/yang/yang-p001/src/main/yang/simple-string-demo.yang [new file with mode: 0644]
plugins/com.cisco.yangide.core.tests/projects/yang/yang-p002/pom.xml [new file with mode: 0644]
plugins/com.cisco.yangide.core.tests/projects/yang/yang-p002/src/main/yang/flow-errors.yang [new file with mode: 0644]
plugins/com.cisco.yangide.core.tests/src/com/cisco/yangide/core/tests/YangModelManagerTest.java [new file with mode: 0644]
plugins/com.cisco.yangide.core.tests/src/com/cisco/yangide/core/tests/YangParserTest.java [new file with mode: 0644]
plugins/com.cisco.yangide.core.tests/yang/acme-types.yang [new file with mode: 0644]
plugins/com.cisco.yangide.core.tests/yang/simple-string-demo.yang [new file with mode: 0644]
plugins/com.cisco.yangide.core.tests/yang/simple_import.yang [new file with mode: 0644]
plugins/com.cisco.yangide.core.tests/yang/simple_import_incomplete.yang [new file with mode: 0644]
plugins/com.cisco.yangide.core.tests/yang/yang-ext.yang [new file with mode: 0644]
plugins/com.cisco.yangide.core/.gitignore [new file with mode: 0644]
plugins/com.cisco.yangide.core/.project [new file with mode: 0644]
plugins/com.cisco.yangide.core/META-INF/MANIFEST.MF [new file with mode: 0644]
plugins/com.cisco.yangide.core/build.properties [new file with mode: 0644]
plugins/com.cisco.yangide.core/plugin.xml [new file with mode: 0644]
plugins/com.cisco.yangide.core/pom.xml [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/CoreUtil.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/ElementChangedEvent.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/IOpenable.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/IYangElementChangedListener.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/IYangElementDelta.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/OpenableElementCache.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/OpenableElementInfo.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/YangCorePlugin.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/YangJarFileEntryResource.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/YangModelException.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/YangTypeUtil.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/Buffer.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/BufferCache.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/BufferChangedEvent.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/BufferManager.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/IBuffer.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/IBufferChangedListener.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/ICacheEnumeration.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/ILRUCacheable.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/LRUCache.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/LRUCacheEnumerator.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/NullBuffer.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/OverflowingLRUCache.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/ToStringSorter.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/ASTCompositeNode.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/ASTNamedNode.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/ASTNode.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/ASTVisitor.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/AnyXmlSchemaNode.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/AugmentationSchema.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/BaseReference.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/ChoiceCaseNode.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/ChoiceNode.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/ContrainerSchemaNode.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/Deviation.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/ExtensionDefinition.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/FeatureDefinition.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/GroupingDefinition.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/IdentitySchemaNode.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/LeafListSchemaNode.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/LeafSchemaNode.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/ListSchemaNode.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/Module.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/ModuleImport.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/NotificationDefinition.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/QName.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/RevisionNode.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/RpcDefinition.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/RpcInputNode.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/RpcOutputNode.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/SimpleNamedNode.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/SimpleNode.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/SubModule.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/SubModuleInclude.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/TypeDefinition.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/TypeReference.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/UsesNode.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/DeltaProcessor.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/ElementIndexInfo.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/ElementIndexReferenceInfo.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/ElementIndexReferenceType.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/ElementIndexType.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/IJob.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/IndexAllProject.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/IndexFileRequest.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/IndexJarFileRequest.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/IndexManager.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/IndexRequest.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/JobAdapter.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/JobManager.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/YangElementDelta.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangElement.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangElementType.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangFile.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangFileInfo.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangFolder.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangJarEntry.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangJarFile.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangModel.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangModelManager.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangModelUtil.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangProject.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangProjectInfo.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/BasicValidations.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/ITokenFormatter.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/IYangValidationListener.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/SemanticValidations.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/ValidationUtil.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/YangFormattingPreferences.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/YangModelBasicValidationListener.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/YangParserModelListener.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/YangParserUtil.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/YangTokenFormatter.java [new file with mode: 0644]
plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/YangValidationException.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/.gitignore [new file with mode: 0644]
plugins/com.cisco.yangide.editor/.project [new file with mode: 0644]
plugins/com.cisco.yangide.editor/META-INF/MANIFEST.MF [new file with mode: 0644]
plugins/com.cisco.yangide.editor/build.properties [new file with mode: 0644]
plugins/com.cisco.yangide.editor/help/keywords/module.txt [new file with mode: 0644]
plugins/com.cisco.yangide.editor/help/keywords/namespace.txt [new file with mode: 0644]
plugins/com.cisco.yangide.editor/help/types/binary.txt [new file with mode: 0644]
plugins/com.cisco.yangide.editor/help/types/bits.txt [new file with mode: 0644]
plugins/com.cisco.yangide.editor/help/types/boolean.txt [new file with mode: 0644]
plugins/com.cisco.yangide.editor/help/types/decimal64.txt [new file with mode: 0644]
plugins/com.cisco.yangide.editor/help/types/empty.txt [new file with mode: 0644]
plugins/com.cisco.yangide.editor/help/types/enumeration.txt [new file with mode: 0644]
plugins/com.cisco.yangide.editor/help/types/identityref.txt [new file with mode: 0644]
plugins/com.cisco.yangide.editor/help/types/instance-identifier.txt [new file with mode: 0644]
plugins/com.cisco.yangide.editor/help/types/int16.txt [new file with mode: 0644]
plugins/com.cisco.yangide.editor/help/types/int32.txt [new file with mode: 0644]
plugins/com.cisco.yangide.editor/help/types/int64.txt [new file with mode: 0644]
plugins/com.cisco.yangide.editor/help/types/int8.txt [new file with mode: 0644]
plugins/com.cisco.yangide.editor/help/types/leafref.txt [new file with mode: 0644]
plugins/com.cisco.yangide.editor/help/types/string.txt [new file with mode: 0644]
plugins/com.cisco.yangide.editor/help/types/uint16.txt [new file with mode: 0644]
plugins/com.cisco.yangide.editor/help/types/uint32.txt [new file with mode: 0644]
plugins/com.cisco.yangide.editor/help/types/uint64.txt [new file with mode: 0644]
plugins/com.cisco.yangide.editor/help/types/uint8.txt [new file with mode: 0644]
plugins/com.cisco.yangide.editor/help/types/union.txt [new file with mode: 0644]
plugins/com.cisco.yangide.editor/icons/yang_file.png [new file with mode: 0644]
plugins/com.cisco.yangide.editor/plugin.properties [new file with mode: 0644]
plugins/com.cisco.yangide.editor/plugin.xml [new file with mode: 0644]
plugins/com.cisco.yangide.editor/pom.xml [new file with mode: 0644]
plugins/com.cisco.yangide.editor/resources/ColorSettingPreviewCode.txt [new file with mode: 0644]
plugins/com.cisco.yangide.editor/resources/FormatterSettingPreviewCode.txt [new file with mode: 0644]
plugins/com.cisco.yangide.editor/resources/HoverStyleSheet.css [new file with mode: 0644]
plugins/com.cisco.yangide.editor/schema/actionGroup.exsd [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/EditorUtility.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/YangEditorPlugin.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/actions/AddBlockCommentAction.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/actions/BlockCommentAction.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/actions/IYangEditorActionDefinitionIds.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/actions/OpenDeclarationAction.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/actions/RemoveBlockCommentAction.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/actions/ToggleCommentAction.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/compare/YangFileMergeViewer.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/compare/YangFileMergeViewerCreator.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/compare/YangFileViewerCreator.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/dialogs/StatusInfo.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/dialogs/StatusUtil.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/AbstractYangScanner.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/IActionGroup.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/IReconcileHandler.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/IYangEditor.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/SemanticHighlighting.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/SemanticHighlightingManager.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/SemanticHighlightingPresenter.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/SemanticHighlightingReconciler.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/SemanticHighlightings.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangAutoIndentStrategy.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangColorManager.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangCommentScanner.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangContentOutlinePage.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangDocumentProvider.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangDoubleClickStrategy.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangEditor.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangEditorActionContributor.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangEditorMessages.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangEditorMessages.properties [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangElementHyperlink.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangElementHyperlinkDetector.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangPartitionScanner.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangPresentationReconciler.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangScanner.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangSourceViewer.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangSourceViewerConfiguration.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangStorageDocumentProvider.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangStringScanner.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangWhitespaceDetector.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangWordDetector.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/CompositeReconcilingStrategy.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/DocumentCharacterIterator.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/Symbols.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/YangAnnotationModel.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/YangCodeFormatter.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/YangFoldingStructureProvider.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/YangFormattingStrategy.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/YangHeuristicScanner.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/YangIndenter.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/YangMarkerAnnotation.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/YangProblem.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/YangReconcilingStrategy.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/YangSyntaxAnnotation.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/help/HelpCompositionUtils.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/help/IProposalHelpGenerator.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/help/IndexInfoProposalHelpGenerator.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/help/LanguageProposalHelpGenerator.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/help/YangCompletionProposal.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/help/YangLanguageHelpLoader.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/help/YangSimpleCompletionProcessor.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/hover/HoverControlCreator.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/hover/PresenterControlCreator.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/hover/YangTextHover.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/preferences/AbstractConfigurationBlock.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/preferences/AbstractConfigurationBlockPreferencePage.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/preferences/IPreferenceConfigurationBlock.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/preferences/YangDocumentSetupParticipant.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/preferences/YangEditorColoringConfigurationBlock.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/preferences/YangEditorColoringPreferencePage.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/preferences/YangFormatterPreferencePage.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/preferences/YangPreferencesMessages.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/preferences/YangPreferencesMessages.properties [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/preferences/YangPreviewerUpdater.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/templates/GeneralContextType.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/templates/YangEditorTemplatesPage.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/templates/YangTemplateAccess.java [new file with mode: 0644]
plugins/com.cisco.yangide.editor/templates/yang.xml [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/.gitignore [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/.project [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/META-INF/MANIFEST.MF [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/build.properties [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/etool16/add_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/etool16/collapseall_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/etool16/delete_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/etool16/editor_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/anyxml_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/augment_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/choice_case_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/choice_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/container_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/custom_type_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/deviation_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/error_alt_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/error_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/extension_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/feature_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/grouping_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/identity_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/import_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/include_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/key_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/keyword_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/leaf_list_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/leaf_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/list_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/module_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/notification_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/rpc_input_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/rpc_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/rpc_output_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/submodule_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/template_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/type_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/uses_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/icons/yang_file.png [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/plugin.xml [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/pom.xml [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/Activator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/YangMultiPageEditorPart.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/YangMutiPageEditorActionContributor.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/diagram/EditorDiagramTypeProvider.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/diagram/EditorFeatureProvider.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/diagram/YangDiagramGraphicsAlgorithmRendererFactory.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/diagram/YangDiagramToolBehaviorProvider.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/dialog/AddImportDialog.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/dialog/ChooseParentModuleDialog.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/dialog/ElementLabelProvider.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/dialog/MultilineTextDialog.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/dialog/YangElementListSelectionDialog.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/editors/IModelChangeHandler.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/editors/ISourceModelManager.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/editors/YangDiagramBehavior.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/editors/YangDiagramEditor.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/editors/YangDiagramEditorInput.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/editors/YangDiagramModuleInfoPanel.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/editors/YangDiagramPersistencyBehavior.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/editors/YangDiagramRefreshBehavior.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/editors/YangPaletteBehavior.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/features/AddReferenceConnectionFeature.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/features/DiagramLayoutFeature.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/features/DirectEditingOnDoubleClickFeature.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/features/ExtractGroupingCustomFeature.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/features/RemoveConnectionFeature.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/features/TextDirectEditingFeature.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/features/UpdateTextFeature.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/figures/FeedbackEditPolicy.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/figures/FeedbackFigure.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/connections/DomainConnectionPattern.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/AnyxmlPattern.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/AugmentPattern.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/ChoiceCasePattern.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/ChoicePattern.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/ContainerPattern.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/DeviationPattern.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/DomainObjectPattern.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/ExtensionPattern.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/FeaturePattern.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/GroupingPattern.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/IdentityPattern.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/LeafListPattern.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/LeafPattern.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/ListKeyPattern.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/ListPattern.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/ModulePattern.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/NotificationPattern.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/RpcIOPattern.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/RpcPattern.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/SubmodulePattern.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/TypedefPattern.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/TyperefPattern.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/UsesPattern.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/preferences/ModelEditorPreferencePage.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/preferences/ModelEditorPreferences.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/AttributesTabContentFilter.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/AttributesTabContentSource.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/DialogTextPropertyDescriptor.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/GeneralTabDescriptionFilter.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/GeneralTabDescriptionSection.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/GeneralTabNameFilter.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/GeneralTabNameSection.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/GeneralTabReferenceFilter.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/GeneralTabReferenceSection.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/GeneralTabTypeFilter.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/GeneralTabTypeSection.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/GraphitiEditPartToIPropertySourceAdapterFactory.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/TypeTabFilter.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/TypeTabSection.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/YangPropertySection.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/sync/ChoicePropertyUpdater.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/sync/ContainerPropertyUpdater.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/sync/DiagramModelAdapter.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/sync/DiagramModelMergeAdapter.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/sync/LeafPropertyUpdater.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/sync/ListPropertyUpdater.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/sync/ModelSynchronizer.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/sync/ModulePropertyUpdater.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/sync/SourceNodePropertyUpdater.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/sync/TypedefPropertyUpdater.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/BusinessObjectWrapper.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/DiagramImportSupport.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/LayoutUtil.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/PropertyUtil.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/Strings.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/StyleUtil.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/YangDiagramImageProvider.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/YangModelUIUtil.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/YangModelUtil.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/YangTag.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/connection/AbstractHighwayMatrix.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/connection/DirectPathFinder.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/connection/Highway.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/connection/HighwayMatrix.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/connection/HighwayMatrixWave.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/connection/IHighwayMatrix.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/connection/IPathFinder.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/connection/Position.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/connection/RectilinearAvoidObstaclesPathFinder.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/connection/RoutePath.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/widget/DialogText.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/templates/nodes/anyxml.txt [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/templates/nodes/augment.txt [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/templates/nodes/case.txt [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/templates/nodes/choice.txt [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/templates/nodes/container.txt [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/templates/nodes/deviation.txt [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/templates/nodes/extension.txt [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/templates/nodes/feature.txt [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/templates/nodes/grouping.txt [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/templates/nodes/identity.txt [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/templates/nodes/input.txt [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/templates/nodes/leaf list.txt [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/templates/nodes/leaf.txt [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/templates/nodes/list.txt [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/templates/nodes/notification.txt [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/templates/nodes/output.txt [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/templates/nodes/rpc.txt [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/templates/nodes/submodule.txt [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/templates/nodes/typedef.txt [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model.editor/templates/nodes/uses.txt [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/.gitignore [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/.project [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/META-INF/MANIFEST.MF [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/build.properties [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/model/model.aird [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/model/model.ecore [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/model/model.genmodel [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/model/model.notation [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/plugin.properties [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/plugin.xml [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/pom.xml [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Anyxml.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Augment.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/BelongsTo.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Choice.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/ChoiceCase.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Container.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/ContainingNode.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Deviation.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Extension.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Feature.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Grouping.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Identity.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Import.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Include.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Leaf.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/LeafList.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/List.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/ListKey.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/ModelFactory.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/ModelPackage.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Module.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/NamedContainingNode.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/NamedNode.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Node.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Notification.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/ReferenceNode.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Revision.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Rpc.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/RpcIO.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Submodule.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Tag.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/TaggedNode.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/TypedNode.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Typedef.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Typeref.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Uses.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/AnyxmlImpl.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/AugmentImpl.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/BelongsToImpl.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/ChoiceCaseImpl.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/ChoiceImpl.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/ContainerImpl.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/DeviationImpl.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/ExtensionImpl.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/FeatureImpl.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/GroupingImpl.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/IdentityImpl.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/ImportImpl.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/IncludeImpl.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/LeafImpl.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/LeafListImpl.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/ListImpl.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/ListKeyImpl.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/ModelFactoryImpl.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/ModelPackageImpl.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/ModuleImpl.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/NotificationImpl.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/RevisionImpl.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/RpcIOImpl.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/RpcImpl.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/SubmoduleImpl.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/TagImpl.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/TypedefImpl.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/TyperefImpl.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/UsesImpl.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/util/ModelAdapterFactory.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/util/ModelSwitch.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/AnyxmlValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/AugmentValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/BelongsToValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/ChoiceCaseValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/ChoiceValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/ContainerValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/ContainingNodeValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/DeviationValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/ExtensionValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/FeatureValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/GroupingValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/IdentityValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/ImportValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/IncludeValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/LeafListValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/LeafValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/ListKeyValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/ListValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/ModuleValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/NamedContainingNodeValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/NamedNodeValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/NodeValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/NotificationValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/ReferenceNodeValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/RevisionValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/RpcIOValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/RpcValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/SubmoduleValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/TagValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/TaggedNodeValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/TypedNodeValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/TypedefValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/TyperefValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/UsesValidator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.model/text/description.txt [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/.gitignore [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/.project [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/META-INF/MANIFEST.MF [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/build.properties [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/icons/calendar.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/plugin.properties [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/plugin.xml [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/pom.xml [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/CreateYangFileChange.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/RefactorActionGroup.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/RefactorUtil.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/YangCompositeChange.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/YangRefactoringPlugin.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/actions/ChangeRevisionAction.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/actions/ExtractGroupingAction.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/actions/InlineGroupingAction.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/actions/RenameAction.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/actions/RenameSupport.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/actions/SelectionDispatchAction.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/code/ChangeRevisionRefactoring.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/code/ExtractGroupingRefactoring.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/code/InlineGroupingRefactoring.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/nls/Messages.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/nls/messages.properties [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/rename/RenameGroupingProcessor.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/rename/RenameIdentityProcessor.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/rename/RenameModuleProcessor.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/rename/RenameSubModuleProcessor.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/rename/RenameTypeProcessor.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/rename/YangRenameProcessor.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/scripting/RenameGroupingRefactoringContribution.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/ChangeRevisionInputWizardPage.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/ChangeRevisionRefactoringWizard.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/EditorHighlightingSynchronizer.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/ExtractGroupingInputWizardPage.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/ExtractGroupingRefactoringWizard.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/InlineGroupingInputWizardPage.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/InlineGroupingRefactoringWizard.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/RefactoringImages.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/RenameInformationPopup.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/RenameInputWizardPage.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/RenameLinkedMode.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/RenameRefactoringWizard.java [new file with mode: 0644]
plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/RevisionDialog.java [new file with mode: 0644]
plugins/com.cisco.yangide.m2e.yang.tests/.gitignore [new file with mode: 0644]
plugins/com.cisco.yangide.m2e.yang.tests/.project [new file with mode: 0644]
plugins/com.cisco.yangide.m2e.yang.tests/META-INF/MANIFEST.MF [new file with mode: 0644]
plugins/com.cisco.yangide.m2e.yang.tests/build.properties [new file with mode: 0644]
plugins/com.cisco.yangide.m2e.yang.tests/plugin_customization.ini [new file with mode: 0644]
plugins/com.cisco.yangide.m2e.yang.tests/pom.xml [new file with mode: 0644]
plugins/com.cisco.yangide.m2e.yang.tests/projects/yang/yang-p001/pom.xml [new file with mode: 0644]
plugins/com.cisco.yangide.m2e.yang.tests/projects/yang/yang-p001/src/main/yang/simple-string-demo.yang [new file with mode: 0644]
plugins/com.cisco.yangide.m2e.yang.tests/settings.xml [new file with mode: 0644]
plugins/com.cisco.yangide.m2e.yang.tests/src/com/cisco/yangide/m2e/yang/tests/YangGenerationTest.java [new file with mode: 0644]
plugins/com.cisco.yangide.m2e.yang/.gitignore [new file with mode: 0644]
plugins/com.cisco.yangide.m2e.yang/.project [new file with mode: 0644]
plugins/com.cisco.yangide.m2e.yang/META-INF/MANIFEST.MF [new file with mode: 0644]
plugins/com.cisco.yangide.m2e.yang/build.properties [new file with mode: 0644]
plugins/com.cisco.yangide.m2e.yang/lifecycle-mapping-metadata.xml [new file with mode: 0644]
plugins/com.cisco.yangide.m2e.yang/plugin.xml [new file with mode: 0644]
plugins/com.cisco.yangide.m2e.yang/pom.xml [new file with mode: 0644]
plugins/com.cisco.yangide.m2e.yang/src/com/cisco/yangide/m2e/yang/LifecycleMapping.java [new file with mode: 0644]
plugins/com.cisco.yangide.m2e.yang/src/com/cisco/yangide/m2e/yang/MavenProjectChangedListener.java [new file with mode: 0644]
plugins/com.cisco.yangide.m2e.yang/src/com/cisco/yangide/m2e/yang/YangBuildParticipant.java [new file with mode: 0644]
plugins/com.cisco.yangide.m2e.yang/src/com/cisco/yangide/m2e/yang/YangGeneratorConfiguration.java [new file with mode: 0644]
plugins/com.cisco.yangide.m2e.yang/src/com/cisco/yangide/m2e/yang/YangM2EPlugin.java [new file with mode: 0644]
plugins/com.cisco.yangide.m2e.yang/src/com/cisco/yangide/m2e/yang/YangProjectConfigurator.java [new file with mode: 0644]
plugins/com.cisco.yangide.ui/.gitignore [new file with mode: 0644]
plugins/com.cisco.yangide.ui/.project [new file with mode: 0644]
plugins/com.cisco.yangide.ui/META-INF/MANIFEST.MF [new file with mode: 0644]
plugins/com.cisco.yangide.ui/build.properties [new file with mode: 0644]
plugins/com.cisco.yangide.ui/icons/full/elcl16/view_menu.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ui/icons/full/etool16/newfile_wiz.png [new file with mode: 0644]
plugins/com.cisco.yangide.ui/icons/full/etool16/newprj_wiz.png [new file with mode: 0644]
plugins/com.cisco.yangide.ui/icons/full/obj16/augment_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ui/icons/full/obj16/container_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ui/icons/full/obj16/custom_type_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ui/icons/full/obj16/deviation_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ui/icons/full/obj16/error_alt_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ui/icons/full/obj16/error_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ui/icons/full/obj16/extension_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ui/icons/full/obj16/grouping_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ui/icons/full/obj16/identity_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ui/icons/full/obj16/import_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ui/icons/full/obj16/include_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ui/icons/full/obj16/keyword_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ui/icons/full/obj16/leaf_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ui/icons/full/obj16/module_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ui/icons/full/obj16/notification_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ui/icons/full/obj16/rpc_input_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ui/icons/full/obj16/rpc_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ui/icons/full/obj16/rpc_output_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ui/icons/full/obj16/submodule_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ui/icons/full/obj16/template_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ui/icons/full/obj16/type_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ui/icons/full/obj16/uses_obj.gif [new file with mode: 0644]
plugins/com.cisco.yangide.ui/icons/full/obj16/yang_file.png [new file with mode: 0644]
plugins/com.cisco.yangide.ui/icons/full/wizban/newfile_wiz.png [new file with mode: 0644]
plugins/com.cisco.yangide.ui/icons/full/wizban/newprj_wiz.png [new file with mode: 0644]
plugins/com.cisco.yangide.ui/plugin.properties [new file with mode: 0644]
plugins/com.cisco.yangide.ui/plugin.xml [new file with mode: 0644]
plugins/com.cisco.yangide.ui/pom.xml [new file with mode: 0644]
plugins/com.cisco.yangide.ui/resources/yang/acme-system.yang [new file with mode: 0644]
plugins/com.cisco.yangide.ui/resources/yang/new_yang_file.yang [new file with mode: 0644]
plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/YangUIPlugin.java [new file with mode: 0644]
plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/internal/IYangUIConstants.java [new file with mode: 0644]
plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/internal/ImageDescriptorRegistry.java [new file with mode: 0644]
plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/internal/YangUIImages.java [new file with mode: 0644]
plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/internal/preferences/YangBasePreferencePage.java [new file with mode: 0644]
plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/internal/preferences/YangUIPreferenceInitializer.java [new file with mode: 0644]
plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/nls/Messages.java [new file with mode: 0644]
plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/nls/messages.properties [new file with mode: 0644]
plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/preferences/IYangColorConstants.java [new file with mode: 0644]
plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/preferences/OverlayPreferenceStore.java [new file with mode: 0644]
plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/preferences/YangPreferenceConstants.java [new file with mode: 0644]
plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/wizards/CodeGeneratorConfig.java [new file with mode: 0644]
plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/wizards/YangCodeGeneratorDialog.java [new file with mode: 0644]
plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/wizards/YangFileWizard.java [new file with mode: 0644]
plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/wizards/YangFileWizardPage.java [new file with mode: 0644]
plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/wizards/YangProjectWizard.java [new file with mode: 0644]
plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/wizards/YangProjectWizardPage.java [new file with mode: 0644]
pom.xml [new file with mode: 0644]
product/codeformatter.xml [new file with mode: 0644]
product/codetemplates.xml [new file with mode: 0644]
product/m2e-yang-catalog.xml [new file with mode: 0644]
product/rfc6020.pdf [new file with mode: 0644]
product/target-platform/.gitignore [new file with mode: 0644]
product/target-platform/.project [new file with mode: 0644]
product/target-platform/.settings/org.eclipse.core.resources.prefs [new file with mode: 0644]
product/target-platform/com.cisco.yangide.target-platform.target [new file with mode: 0644]
product/target-platform/pom.xml [new file with mode: 0644]
product/update-site/category.xml [new file with mode: 0644]
product/update-site/pom.xml [new file with mode: 0644]
product/yang-ide/.project [new file with mode: 0644]
samples/yang-module1/.gitignore [new file with mode: 0644]
samples/yang-module1/.project [new file with mode: 0644]
samples/yang-module1/pom.xml [new file with mode: 0644]
samples/yang-module1/src/main/yang/acme-system.yang [new file with mode: 0644]
samples/yang-module2/.gitignore [new file with mode: 0644]
samples/yang-module2/.project [new file with mode: 0644]
samples/yang-module2/pom.xml [new file with mode: 0644]
samples/yang-module2/src/main/yang/yang-ext.yang [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/.gitignore [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/.project [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/Contexts/ModelFlowProjectFolder.ctx [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/Contexts/YangIDEpreferencesContext.ctx [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/Contexts/YangIDEworkbenchCleanContext.ctx [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/Contexts/YangIDEworkbenchFileContext.ctx [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/Contexts/YangIDEworkspaceCleanContext.ctx [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/Contexts/YangIDEworkspaceComplexContext.ctx [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/Contexts/YangIDEworkspaceSimpleContext.ctx [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/AllTests.suite [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/AutoCompletion/AutoComplete.suite [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/AutoCompletion/AutoCompletionTestCase1.test [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/AutoCompletion/AutoCompletionTestCase2.test [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/AutoCompletion/AutoCompletionValidation1.verification [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/AutoCompletion/AutoCompletionValidation2.verification [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/AutoIndenting/AutoIndent.suite [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/AutoIndenting/AutoIndentingTestCase.test [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/AutoIndenting/AutoIndentingValidation.verification [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/AutoIndenting/SmartPasteTestCase1.test [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/AutoIndenting/SmartPasteTestCase2.test [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/AutoIndenting/SmartPasteValidation1.verification [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/AutoIndenting/SmartPasteValidation2.verification [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/OutlinePage/Outline.suite [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/OutlinePage/OutlineViewTestCase.test [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/InvalidFileSyntaxColoringTestCase1.test [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/InvalidFileSyntaxColoringTestCase2.test [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/InvalidFileSyntaxColoringTestCase3.test [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/InvalidFileSyntaxColoringTestCase4.test [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/InvalidFileSyntaxColoringTestCase5.test [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/InvalidFileSyntaxColoringTestCase6.test [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/SyntaxColor.suite [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/SyntaxValidations/InvalidFileSyntaxValidation1.verification [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/SyntaxValidations/InvalidFileSyntaxValidation2.verification [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/SyntaxValidations/InvalidFileSyntaxValidation3.verification [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/SyntaxValidations/InvalidFileSyntaxValidation4.verification [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/SyntaxValidations/InvalidFileSyntaxValidation5.verification [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/SyntaxValidations/InvalidFileSyntaxValidation6.verification [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/SyntaxValidations/ValidFileSyntaxValidation1.verification [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/SyntaxValidations/ValidFileSyntaxValidation2.verification [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/ValidFileSyntaxColoringTestCase.test [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/Wizards/ImportYangProjectTest.test [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/Wizards/NewYangFileTest.test [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/Wizards/NewYangProjectTest.test [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/Wizards/Wizards.suite [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/TestCases/Wizards/asserts/NewProjectExist.verification [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/pom.xml [new file with mode: 0644]
tests/com.cisco.yangide.editor.test/rcptt.properties [new file with mode: 0644]
tests/com.cisco.yangide.ext.refactoring.test/.gitignore [new file with mode: 0644]
tests/com.cisco.yangide.ext.refactoring.test/.project [new file with mode: 0644]
tests/com.cisco.yangide.ext.refactoring.test/Contexts/DefaultPreferences.ctx [new file with mode: 0644]
tests/com.cisco.yangide.ext.refactoring.test/Contexts/DefaultWorkbench.ctx [new file with mode: 0644]
tests/com.cisco.yangide.ext.refactoring.test/Contexts/DefaultWorkspace.ctx [new file with mode: 0644]
tests/com.cisco.yangide.ext.refactoring.test/Contexts/UpdateMavenProjects.ctx [new file with mode: 0644]
tests/com.cisco.yangide.ext.refactoring.test/TestCases/AllTests.suite [new file with mode: 0644]
tests/com.cisco.yangide.ext.refactoring.test/TestCases/ChangeRevision/ChangeRevision.test [new file with mode: 0644]
tests/com.cisco.yangide.ext.refactoring.test/TestCases/ExtractGrouping/ExtractGrouping.test [new file with mode: 0644]
tests/com.cisco.yangide.ext.refactoring.test/TestCases/InlineGrouping/InlineGroupingDirect.test [new file with mode: 0644]
tests/com.cisco.yangide.ext.refactoring.test/TestCases/InlineGrouping/InlineGroupingIndirect.test [new file with mode: 0644]
tests/com.cisco.yangide.ext.refactoring.test/TestCases/Rename/RenameGrouping.test [new file with mode: 0644]
tests/com.cisco.yangide.ext.refactoring.test/TestCases/Rename/RenameModule.test [new file with mode: 0644]
tests/com.cisco.yangide.ext.refactoring.test/TestCases/Rename/RenameType.test [new file with mode: 0644]
tests/com.cisco.yangide.ext.refactoring.test/pom.xml [new file with mode: 0644]
tests/com.cisco.yangide.ext.refactoring.test/rcptt.properties [new file with mode: 0644]
tests/pom.xml [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..096b7eb
--- /dev/null
@@ -0,0 +1,6 @@
+**/target/
+/.settings/
+.classpath
+bin/
+libs/
+.options
\ No newline at end of file
diff --git a/.gitreview b/.gitreview
new file mode 100644 (file)
index 0000000..95de087
--- /dev/null
@@ -0,0 +1,5 @@
+[gerrit]
+host=git.opendaylight.org
+port=29418
+project=yangide.git
+defaultbranch=master
diff --git a/README.md b/README.md
new file mode 100644 (file)
index 0000000..e020563
--- /dev/null
+++ b/README.md
@@ -0,0 +1,10 @@
+# Yang-IDE
+## Overview
+YANG IDE is an integrated development environment for a Yang Language(http://www.yang-central.org).
+
+It is licensed with [Eclipse Public License v1.0](http://www.eclipse.org/legal/epl-v10.html)
+
+## Install instructions are here: 
+  [Install Yang-IDE](https://github.com/xored/yang-ide/wiki/Installing)
+## Documentation are here:
+  [Wiki](https://github.com/xored/yang-ide/wiki)
diff --git a/epl-v10.html b/epl-v10.html
new file mode 100644 (file)
index 0000000..fd39122
--- /dev/null
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {          
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+       margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
diff --git a/features/com.cisco.yangide.feature/.gitignore b/features/com.cisco.yangide.feature/.gitignore
new file mode 100644 (file)
index 0000000..f3de6a8
--- /dev/null
@@ -0,0 +1,3 @@
+/target/
+/.settings/
+.classpath
diff --git a/features/com.cisco.yangide.feature/.project b/features/com.cisco.yangide.feature/.project
new file mode 100644 (file)
index 0000000..b7b2c81
--- /dev/null
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>com.cisco.yangide.feature</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.pde.FeatureBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.m2e.core.maven2Builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.m2e.core.maven2Nature</nature>
+               <nature>org.eclipse.pde.FeatureNature</nature>
+       </natures>
+</projectDescription>
diff --git a/features/com.cisco.yangide.feature/build.properties b/features/com.cisco.yangide.feature/build.properties
new file mode 100644 (file)
index 0000000..c01be09
--- /dev/null
@@ -0,0 +1,11 @@
+###############################################################################
+# Copyright (c) 2014, 2015 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
+#  
+###############################################################################
+bin.includes = feature.xml,\
+               feature.properties,\
+               license.html
diff --git a/features/com.cisco.yangide.feature/feature.properties b/features/com.cisco.yangide.feature/feature.properties
new file mode 100644 (file)
index 0000000..48732b2
--- /dev/null
@@ -0,0 +1,251 @@
+###############################################################################
+# Copyright (c) 2014, 2015 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
+#  
+###############################################################################
+
+featureName=YANG IDE
+providerName=com.cisco.yangide.feature
+description=YANG IDE
+copyright=\
+Copyright (c) 2014 Cisco Systems, Inc.\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+which accompanies this distribution, and is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+\n\
+Contributors:\n\
+     Cisco Systems, Inc. - initial API and implementation\n
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+\n\
+    Eclipse Public License - v 1.0\n\
+\n\
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE\n\
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF\n\
+THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.\n\
+\n\
+*1. DEFINITIONS*\n\
+\n\
+"Contribution" means:\n\
+\n\
+a) in the case of the initial Contributor, the initial code and\n\
+documentation distributed under this Agreement, and\n\
+\n\
+b) in the case of each subsequent Contributor:\n\
+\n\
+i) changes to the Program, and\n\
+\n\
+ii) additions to the Program;\n\
+\n\
+where such changes and/or additions to the Program originate from and\n\
+are distributed by that particular Contributor. A Contribution\n\
+'originates' from a Contributor if it was added to the Program by such\n\
+Contributor itself or anyone acting on such Contributor's behalf.\n\
+Contributions do not include additions to the Program which: (i) are\n\
+separate modules of software distributed in conjunction with the Program\n\
+under their own license agreement, and (ii) are not derivative works of\n\
+the Program.\n\
+\n\
+"Contributor" means any person or entity that distributes the Program.\n\
+\n\
+"Licensed Patents" mean patent claims licensable by a Contributor which\n\
+are necessarily infringed by the use or sale of its Contribution alone\n\
+or when combined with the Program.\n\
+\n\
+"Program" means the Contributions distributed in accordance with this\n\
+Agreement.\n\
+\n\
+"Recipient" means anyone who receives the Program under this Agreement,\n\
+including all Contributors.\n\
+\n\
+*2. GRANT OF RIGHTS*\n\
+\n\
+a) Subject to the terms of this Agreement, each Contributor hereby\n\
+grants Recipient a non-exclusive, worldwide, royalty-free copyright\n\
+license to reproduce, prepare derivative works of, publicly display,\n\
+publicly perform, distribute and sublicense the Contribution of such\n\
+Contributor, if any, and such derivative works, in source code and\n\
+object code form.\n\
+\n\
+b) Subject to the terms of this Agreement, each Contributor hereby\n\
+grants Recipient a non-exclusive, worldwide, royalty-free patent license\n\
+under Licensed Patents to make, use, sell, offer to sell, import and\n\
+otherwise transfer the Contribution of such Contributor, if any, in\n\
+source code and object code form. This patent license shall apply to the\n\
+combination of the Contribution and the Program if, at the time the\n\
+Contribution is added by the Contributor, such addition of the\n\
+Contribution causes such combination to be covered by the Licensed\n\
+Patents. The patent license shall not apply to any other combinations\n\
+which include the Contribution. No hardware per se is licensed hereunder.\n\
+\n\
+c) Recipient understands that although each Contributor grants the\n\
+licenses to its Contributions set forth herein, no assurances are\n\
+provided by any Contributor that the Program does not infringe the\n\
+patent or other intellectual property rights of any other entity. Each\n\
+Contributor disclaims any liability to Recipient for claims brought by\n\
+any other entity based on infringement of intellectual property rights\n\
+or otherwise. As a condition to exercising the rights and licenses\n\
+granted hereunder, each Recipient hereby assumes sole responsibility to\n\
+secure any other intellectual property rights needed, if any. For\n\
+example, if a third party patent license is required to allow Recipient\n\
+to distribute the Program, it is Recipient's responsibility to acquire\n\
+that license before distributing the Program.\n\
+\n\
+d) Each Contributor represents that to its knowledge it has sufficient\n\
+copyright rights in its Contribution, if any, to grant the copyright\n\
+license set forth in this Agreement.\n\
+\n\
+*3. REQUIREMENTS*\n\
+\n\
+A Contributor may choose to distribute the Program in object code form\n\
+under its own license agreement, provided that:\n\
+\n\
+a) it complies with the terms and conditions of this Agreement; and\n\
+\n\
+b) its license agreement:\n\
+\n\
+i) effectively disclaims on behalf of all Contributors all warranties\n\
+and conditions, express and implied, including warranties or conditions\n\
+of title and non-infringement, and implied warranties or conditions of\n\
+merchantability and fitness for a particular purpose;\n\
+\n\
+ii) effectively excludes on behalf of all Contributors all liability for\n\
+damages, including direct, indirect, special, incidental and\n\
+consequential damages, such as lost profits;\n\
+\n\
+iii) states that any provisions which differ from this Agreement are\n\
+offered by that Contributor alone and not by any other party; and\n\
+\n\
+iv) states that source code for the Program is available from such\n\
+Contributor, and informs licensees how to obtain it in a reasonable\n\
+manner on or through a medium customarily used for software exchange.\n\
+\n\
+When the Program is made available in source code form:\n\
+\n\
+a) it must be made available under this Agreement; and\n\
+\n\
+b) a copy of this Agreement must be included with each copy of the Program.\n\
+\n\
+Contributors may not remove or alter any copyright notices contained\n\
+within the Program.\n\
+\n\
+Each Contributor must identify itself as the originator of its\n\
+Contribution, if any, in a manner that reasonably allows subsequent\n\
+Recipients to identify the originator of the Contribution.\n\
+\n\
+*4. COMMERCIAL DISTRIBUTION*\n\
+\n\
+Commercial distributors of software may accept certain responsibilities\n\
+with respect to end users, business partners and the like. While this\n\
+license is intended to facilitate the commercial use of the Program, the\n\
+Contributor who includes the Program in a commercial product offering\n\
+should do so in a manner which does not create potential liability for\n\
+other Contributors. Therefore, if a Contributor includes the Program in\n\
+a commercial product offering, such Contributor ("Commercial\n\
+Contributor") hereby agrees to defend and indemnify every other\n\
+Contributor ("Indemnified Contributor") against any losses, damages and\n\
+costs (collectively "Losses") arising from claims, lawsuits and other\n\
+legal actions brought by a third party against the Indemnified\n\
+Contributor to the extent caused by the acts or omissions of such\n\
+Commercial Contributor in connection with its distribution of the\n\
+Program in a commercial product offering. The obligations in this\n\
+section do not apply to any claims or Losses relating to any actual or\n\
+alleged intellectual property infringement. In order to qualify, an\n\
+Indemnified Contributor must: a) promptly notify the Commercial\n\
+Contributor in writing of such claim, and b) allow the Commercial\n\
+Contributor to control, and cooperate with the Commercial Contributor\n\
+in, the defense and any related settlement negotiations. The Indemnified\n\
+Contributor may participate in any such claim at its own expense.\n\
+\n\
+For example, a Contributor might include the Program in a commercial\n\
+product offering, Product X. That Contributor is then a Commercial\n\
+Contributor. If that Commercial Contributor then makes performance\n\
+claims, or offers warranties related to Product X, those performance\n\
+claims and warranties are such Commercial Contributor's responsibility\n\
+alone. Under this section, the Commercial Contributor would have to\n\
+defend claims against the other Contributors related to those\n\
+performance claims and warranties, and if a court requires any other\n\
+Contributor to pay any damages as a result, the Commercial Contributor\n\
+must pay those damages.\n\
+\n\
+*5. NO WARRANTY*\n\
+\n\
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED\n\
+ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,\n\
+EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES\n\
+OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR\n\
+A PARTICULAR PURPOSE. Each Recipient is solely responsible for\n\
+determining the appropriateness of using and distributing the Program\n\
+and assumes all risks associated with its exercise of rights under this\n\
+Agreement , including but not limited to the risks and costs of program\n\
+errors, compliance with applicable laws, damage to or loss of data,\n\
+programs or equipment, and unavailability or interruption of operations.\n\
+\n\
+*6. DISCLAIMER OF LIABILITY*\n\
+\n\
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR\n\
+ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,\n\
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING\n\
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF\n\
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n\
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR\n\
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED\n\
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\n\
+\n\
+*7. GENERAL*\n\
+\n\
+If any provision of this Agreement is invalid or unenforceable under\n\
+applicable law, it shall not affect the validity or enforceability of\n\
+the remainder of the terms of this Agreement, and without further action\n\
+by the parties hereto, such provision shall be reformed to the minimum\n\
+extent necessary to make such provision valid and enforceable.\n\
+\n\
+If Recipient institutes patent litigation against any entity (including\n\
+a cross-claim or counterclaim in a lawsuit) alleging that the Program\n\
+itself (excluding combinations of the Program with other software or\n\
+hardware) infringes such Recipient's patent(s), then such Recipient's\n\
+rights granted under Section 2(b) shall terminate as of the date such\n\
+litigation is filed.\n\
+\n\
+All Recipient's rights under this Agreement shall terminate if it fails\n\
+to comply with any of the material terms or conditions of this Agreement\n\
+and does not cure such failure in a reasonable period of time after\n\
+becoming aware of such noncompliance. If all Recipient's rights under\n\
+this Agreement terminate, Recipient agrees to cease use and distribution\n\
+of the Program as soon as reasonably practicable. However, Recipient's\n\
+obligations under this Agreement and any licenses granted by Recipient\n\
+relating to the Program shall continue and survive.\n\
+\n\
+Everyone is permitted to copy and distribute copies of this Agreement,\n\
+but in order to avoid inconsistency the Agreement is copyrighted and may\n\
+only be modified in the following manner. The Agreement Steward reserves\n\
+the right to publish new versions (including revisions) of this\n\
+Agreement from time to time. No one other than the Agreement Steward has\n\
+the right to modify this Agreement. The Eclipse Foundation is the\n\
+initial Agreement Steward. The Eclipse Foundation may assign the\n\
+responsibility to serve as the Agreement Steward to a suitable separate\n\
+entity. Each new version of the Agreement will be given a distinguishing\n\
+version number. The Program (including Contributions) may always be\n\
+distributed subject to the version of the Agreement under which it was\n\
+received. In addition, after a new version of the Agreement is\n\
+published, Contributor may elect to distribute the Program (including\n\
+its Contributions) under the new version. Except as expressly stated in\n\
+Sections 2(a) and 2(b) above, Recipient receives no rights or licenses\n\
+to the intellectual property of any Contributor under this Agreement,\n\
+whether expressly, by implication, estoppel or otherwise. All rights in\n\
+the Program not expressly granted under this Agreement are reserved.\n\
+\n\
+This Agreement is governed by the laws of the State of New York and the\n\
+intellectual property laws of the United States of America. No party to\n\
+this Agreement will bring a legal action under this Agreement more than\n\
+one year after the cause of action arose. Each party waives its rights\n\
+to a jury trial in any resulting litigation.\n\
+\n
+########### end of license property ##########################################
diff --git a/features/com.cisco.yangide.feature/feature.xml b/features/com.cisco.yangide.feature/feature.xml
new file mode 100644 (file)
index 0000000..e7ddb71
--- /dev/null
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2014, 2015 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
+     
+ -->
+<feature
+      id="com.cisco.yangide.feature"
+      label="%featureName"
+      version="1.1.1.qualifier"
+      provider-name="%providerName"
+      plugin="com.cisco.yangide.ui">
+
+   <description>
+      %description
+   </description>
+
+   <copyright>
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+   <requires>
+      <import feature="org.eclipse.graphiti.feature" version="0.11.0.v20140528-0646" match="greaterOrEqual"/>
+      <import feature="org.eclipse.emf.compare" version="3.0.0.201406111328" match="greaterOrEqual"/>
+      <import feature="org.eclipse.emf" version="2.10.0.v20140519-0339"/>
+   </requires>
+
+   <plugin
+         id="com.cisco.yangide.core"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="com.cisco.yangide.ui"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="com.cisco.yangide.editor"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="com.cisco.yangide.ext.refactoring"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="com.cisco.yangide.ext.model"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="com.cisco.yangide.ext.model.editor"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+</feature>
diff --git a/features/com.cisco.yangide.feature/license.html b/features/com.cisco.yangide.feature/license.html
new file mode 100644 (file)
index 0000000..fd39122
--- /dev/null
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {          
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+       margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
diff --git a/features/com.cisco.yangide.feature/pom.xml b/features/com.cisco.yangide.feature/pom.xml
new file mode 100644 (file)
index 0000000..078c383
--- /dev/null
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2014, 2015 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
+     
+ -->
+<!--                                                                                -->
+<!-- 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">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>com.cisco.yangide</groupId>
+    <artifactId>com.cisco.yangide.parent</artifactId>
+    <version>1.1.1-SNAPSHOT</version>
+    <relativePath>../..</relativePath>
+  </parent>
+  
+  <artifactId>com.cisco.yangide.feature</artifactId>
+  <packaging>eclipse-feature</packaging>
+  <version>1.1.1-SNAPSHOT</version>
+
+</project>
diff --git a/features/com.cisco.yangide.m2e.yang.feature/.gitignore b/features/com.cisco.yangide.m2e.yang.feature/.gitignore
new file mode 100644 (file)
index 0000000..b77461b
--- /dev/null
@@ -0,0 +1,3 @@
+/target/
+/.settings/
+.classpath
\ No newline at end of file
diff --git a/features/com.cisco.yangide.m2e.yang.feature/.project b/features/com.cisco.yangide.m2e.yang.feature/.project
new file mode 100644 (file)
index 0000000..52e3303
--- /dev/null
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>com.cisco.yangide.m2e.yang.feature</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.pde.FeatureBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.m2e.core.maven2Builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.m2e.core.maven2Nature</nature>
+               <nature>org.eclipse.pde.FeatureNature</nature>
+       </natures>
+</projectDescription>
diff --git a/features/com.cisco.yangide.m2e.yang.feature/build.properties b/features/com.cisco.yangide.m2e.yang.feature/build.properties
new file mode 100644 (file)
index 0000000..c01be09
--- /dev/null
@@ -0,0 +1,11 @@
+###############################################################################
+# Copyright (c) 2014, 2015 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
+#  
+###############################################################################
+bin.includes = feature.xml,\
+               feature.properties,\
+               license.html
diff --git a/features/com.cisco.yangide.m2e.yang.feature/feature.properties b/features/com.cisco.yangide.m2e.yang.feature/feature.properties
new file mode 100644 (file)
index 0000000..326718b
--- /dev/null
@@ -0,0 +1,251 @@
+###############################################################################
+# Copyright (c) 2014, 2015 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
+#  
+###############################################################################
+
+featureName=m2e connector for YANG
+providerName=com.cisco.yangide.m2e.yang.feature
+description=m2e connector for YANG
+copyright=\
+Copyright (c) 2014 Cisco Systems, Inc.\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+which accompanies this distribution, and is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+\n\
+Contributors:\n\
+     Cisco Systems, Inc. - initial API and implementation\n
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+\n\
+    Eclipse Public License - v 1.0\n\
+\n\
+THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE\n\
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF\n\
+THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.\n\
+\n\
+*1. DEFINITIONS*\n\
+\n\
+"Contribution" means:\n\
+\n\
+a) in the case of the initial Contributor, the initial code and\n\
+documentation distributed under this Agreement, and\n\
+\n\
+b) in the case of each subsequent Contributor:\n\
+\n\
+i) changes to the Program, and\n\
+\n\
+ii) additions to the Program;\n\
+\n\
+where such changes and/or additions to the Program originate from and\n\
+are distributed by that particular Contributor. A Contribution\n\
+'originates' from a Contributor if it was added to the Program by such\n\
+Contributor itself or anyone acting on such Contributor's behalf.\n\
+Contributions do not include additions to the Program which: (i) are\n\
+separate modules of software distributed in conjunction with the Program\n\
+under their own license agreement, and (ii) are not derivative works of\n\
+the Program.\n\
+\n\
+"Contributor" means any person or entity that distributes the Program.\n\
+\n\
+"Licensed Patents" mean patent claims licensable by a Contributor which\n\
+are necessarily infringed by the use or sale of its Contribution alone\n\
+or when combined with the Program.\n\
+\n\
+"Program" means the Contributions distributed in accordance with this\n\
+Agreement.\n\
+\n\
+"Recipient" means anyone who receives the Program under this Agreement,\n\
+including all Contributors.\n\
+\n\
+*2. GRANT OF RIGHTS*\n\
+\n\
+a) Subject to the terms of this Agreement, each Contributor hereby\n\
+grants Recipient a non-exclusive, worldwide, royalty-free copyright\n\
+license to reproduce, prepare derivative works of, publicly display,\n\
+publicly perform, distribute and sublicense the Contribution of such\n\
+Contributor, if any, and such derivative works, in source code and\n\
+object code form.\n\
+\n\
+b) Subject to the terms of this Agreement, each Contributor hereby\n\
+grants Recipient a non-exclusive, worldwide, royalty-free patent license\n\
+under Licensed Patents to make, use, sell, offer to sell, import and\n\
+otherwise transfer the Contribution of such Contributor, if any, in\n\
+source code and object code form. This patent license shall apply to the\n\
+combination of the Contribution and the Program if, at the time the\n\
+Contribution is added by the Contributor, such addition of the\n\
+Contribution causes such combination to be covered by the Licensed\n\
+Patents. The patent license shall not apply to any other combinations\n\
+which include the Contribution. No hardware per se is licensed hereunder.\n\
+\n\
+c) Recipient understands that although each Contributor grants the\n\
+licenses to its Contributions set forth herein, no assurances are\n\
+provided by any Contributor that the Program does not infringe the\n\
+patent or other intellectual property rights of any other entity. Each\n\
+Contributor disclaims any liability to Recipient for claims brought by\n\
+any other entity based on infringement of intellectual property rights\n\
+or otherwise. As a condition to exercising the rights and licenses\n\
+granted hereunder, each Recipient hereby assumes sole responsibility to\n\
+secure any other intellectual property rights needed, if any. For\n\
+example, if a third party patent license is required to allow Recipient\n\
+to distribute the Program, it is Recipient's responsibility to acquire\n\
+that license before distributing the Program.\n\
+\n\
+d) Each Contributor represents that to its knowledge it has sufficient\n\
+copyright rights in its Contribution, if any, to grant the copyright\n\
+license set forth in this Agreement.\n\
+\n\
+*3. REQUIREMENTS*\n\
+\n\
+A Contributor may choose to distribute the Program in object code form\n\
+under its own license agreement, provided that:\n\
+\n\
+a) it complies with the terms and conditions of this Agreement; and\n\
+\n\
+b) its license agreement:\n\
+\n\
+i) effectively disclaims on behalf of all Contributors all warranties\n\
+and conditions, express and implied, including warranties or conditions\n\
+of title and non-infringement, and implied warranties or conditions of\n\
+merchantability and fitness for a particular purpose;\n\
+\n\
+ii) effectively excludes on behalf of all Contributors all liability for\n\
+damages, including direct, indirect, special, incidental and\n\
+consequential damages, such as lost profits;\n\
+\n\
+iii) states that any provisions which differ from this Agreement are\n\
+offered by that Contributor alone and not by any other party; and\n\
+\n\
+iv) states that source code for the Program is available from such\n\
+Contributor, and informs licensees how to obtain it in a reasonable\n\
+manner on or through a medium customarily used for software exchange.\n\
+\n\
+When the Program is made available in source code form:\n\
+\n\
+a) it must be made available under this Agreement; and\n\
+\n\
+b) a copy of this Agreement must be included with each copy of the Program.\n\
+\n\
+Contributors may not remove or alter any copyright notices contained\n\
+within the Program.\n\
+\n\
+Each Contributor must identify itself as the originator of its\n\
+Contribution, if any, in a manner that reasonably allows subsequent\n\
+Recipients to identify the originator of the Contribution.\n\
+\n\
+*4. COMMERCIAL DISTRIBUTION*\n\
+\n\
+Commercial distributors of software may accept certain responsibilities\n\
+with respect to end users, business partners and the like. While this\n\
+license is intended to facilitate the commercial use of the Program, the\n\
+Contributor who includes the Program in a commercial product offering\n\
+should do so in a manner which does not create potential liability for\n\
+other Contributors. Therefore, if a Contributor includes the Program in\n\
+a commercial product offering, such Contributor ("Commercial\n\
+Contributor") hereby agrees to defend and indemnify every other\n\
+Contributor ("Indemnified Contributor") against any losses, damages and\n\
+costs (collectively "Losses") arising from claims, lawsuits and other\n\
+legal actions brought by a third party against the Indemnified\n\
+Contributor to the extent caused by the acts or omissions of such\n\
+Commercial Contributor in connection with its distribution of the\n\
+Program in a commercial product offering. The obligations in this\n\
+section do not apply to any claims or Losses relating to any actual or\n\
+alleged intellectual property infringement. In order to qualify, an\n\
+Indemnified Contributor must: a) promptly notify the Commercial\n\
+Contributor in writing of such claim, and b) allow the Commercial\n\
+Contributor to control, and cooperate with the Commercial Contributor\n\
+in, the defense and any related settlement negotiations. The Indemnified\n\
+Contributor may participate in any such claim at its own expense.\n\
+\n\
+For example, a Contributor might include the Program in a commercial\n\
+product offering, Product X. That Contributor is then a Commercial\n\
+Contributor. If that Commercial Contributor then makes performance\n\
+claims, or offers warranties related to Product X, those performance\n\
+claims and warranties are such Commercial Contributor's responsibility\n\
+alone. Under this section, the Commercial Contributor would have to\n\
+defend claims against the other Contributors related to those\n\
+performance claims and warranties, and if a court requires any other\n\
+Contributor to pay any damages as a result, the Commercial Contributor\n\
+must pay those damages.\n\
+\n\
+*5. NO WARRANTY*\n\
+\n\
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED\n\
+ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,\n\
+EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES\n\
+OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR\n\
+A PARTICULAR PURPOSE. Each Recipient is solely responsible for\n\
+determining the appropriateness of using and distributing the Program\n\
+and assumes all risks associated with its exercise of rights under this\n\
+Agreement , including but not limited to the risks and costs of program\n\
+errors, compliance with applicable laws, damage to or loss of data,\n\
+programs or equipment, and unavailability or interruption of operations.\n\
+\n\
+*6. DISCLAIMER OF LIABILITY*\n\
+\n\
+EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR\n\
+ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,\n\
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING\n\
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF\n\
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n\
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR\n\
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED\n\
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\n\
+\n\
+*7. GENERAL*\n\
+\n\
+If any provision of this Agreement is invalid or unenforceable under\n\
+applicable law, it shall not affect the validity or enforceability of\n\
+the remainder of the terms of this Agreement, and without further action\n\
+by the parties hereto, such provision shall be reformed to the minimum\n\
+extent necessary to make such provision valid and enforceable.\n\
+\n\
+If Recipient institutes patent litigation against any entity (including\n\
+a cross-claim or counterclaim in a lawsuit) alleging that the Program\n\
+itself (excluding combinations of the Program with other software or\n\
+hardware) infringes such Recipient's patent(s), then such Recipient's\n\
+rights granted under Section 2(b) shall terminate as of the date such\n\
+litigation is filed.\n\
+\n\
+All Recipient's rights under this Agreement shall terminate if it fails\n\
+to comply with any of the material terms or conditions of this Agreement\n\
+and does not cure such failure in a reasonable period of time after\n\
+becoming aware of such noncompliance. If all Recipient's rights under\n\
+this Agreement terminate, Recipient agrees to cease use and distribution\n\
+of the Program as soon as reasonably practicable. However, Recipient's\n\
+obligations under this Agreement and any licenses granted by Recipient\n\
+relating to the Program shall continue and survive.\n\
+\n\
+Everyone is permitted to copy and distribute copies of this Agreement,\n\
+but in order to avoid inconsistency the Agreement is copyrighted and may\n\
+only be modified in the following manner. The Agreement Steward reserves\n\
+the right to publish new versions (including revisions) of this\n\
+Agreement from time to time. No one other than the Agreement Steward has\n\
+the right to modify this Agreement. The Eclipse Foundation is the\n\
+initial Agreement Steward. The Eclipse Foundation may assign the\n\
+responsibility to serve as the Agreement Steward to a suitable separate\n\
+entity. Each new version of the Agreement will be given a distinguishing\n\
+version number. The Program (including Contributions) may always be\n\
+distributed subject to the version of the Agreement under which it was\n\
+received. In addition, after a new version of the Agreement is\n\
+published, Contributor may elect to distribute the Program (including\n\
+its Contributions) under the new version. Except as expressly stated in\n\
+Sections 2(a) and 2(b) above, Recipient receives no rights or licenses\n\
+to the intellectual property of any Contributor under this Agreement,\n\
+whether expressly, by implication, estoppel or otherwise. All rights in\n\
+the Program not expressly granted under this Agreement are reserved.\n\
+\n\
+This Agreement is governed by the laws of the State of New York and the\n\
+intellectual property laws of the United States of America. No party to\n\
+this Agreement will bring a legal action under this Agreement more than\n\
+one year after the cause of action arose. Each party waives its rights\n\
+to a jury trial in any resulting litigation.\n\
+\n
+########### end of license property ##########################################
diff --git a/features/com.cisco.yangide.m2e.yang.feature/feature.xml b/features/com.cisco.yangide.m2e.yang.feature/feature.xml
new file mode 100644 (file)
index 0000000..cccf5aa
--- /dev/null
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2014, 2015 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
+     
+ -->
+
+<!-- ============================================================================== -->
+<feature
+      id="com.cisco.yangide.m2e.yang.feature"
+      label="%featureName"
+      version="1.1.1.qualifier"
+      provider-name="%providerName"
+      plugin="com.cisco.yangide.m2e.yang">
+
+   <description>
+      %description
+   </description>
+
+   <copyright>
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+   <requires>
+      <import feature="org.eclipse.m2e.feature" version="1.5.0.20140606-0033"/>
+      <import feature="com.cisco.yangide.feature" version="1.1.1.qualifier"/>
+   </requires>
+
+   <plugin
+         id="com.cisco.yangide.m2e.yang"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="com.cisco.yangide.core"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+</feature>
diff --git a/features/com.cisco.yangide.m2e.yang.feature/license.html b/features/com.cisco.yangide.m2e.yang.feature/license.html
new file mode 100644 (file)
index 0000000..fd39122
--- /dev/null
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {          
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+       margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>&quot;Contribution&quot; means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>&quot;Contributor&quot; means any person or entity that distributes
+the Program.</p>
+
+<p>&quot;Licensed Patents&quot; mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>&quot;Program&quot; means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>&quot;Recipient&quot; means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+(&quot;Commercial Contributor&quot;) hereby agrees to defend and
+indemnify every other Contributor (&quot;Indemnified Contributor&quot;)
+against any losses, damages and costs (collectively &quot;Losses&quot;)
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body>
+
+</html>
diff --git a/features/com.cisco.yangide.m2e.yang.feature/pom.xml b/features/com.cisco.yangide.m2e.yang.feature/pom.xml
new file mode 100644 (file)
index 0000000..c78e499
--- /dev/null
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2014, 2015 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
+     
+ -->
+<!--                                                                                -->
+<!-- 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">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>com.cisco.yangide</groupId>
+    <artifactId>com.cisco.yangide.parent</artifactId>
+    <version>1.1.1-SNAPSHOT</version>
+    <relativePath>../..</relativePath>
+  </parent>
+  
+  <artifactId>com.cisco.yangide.m2e.yang.feature</artifactId>
+  <packaging>eclipse-feature</packaging>
+  <version>1.1.1-SNAPSHOT</version>
+
+</project>
diff --git a/plugins/com.cisco.yangide.core.tests/.gitignore b/plugins/com.cisco.yangide.core.tests/.gitignore
new file mode 100644 (file)
index 0000000..1a79925
--- /dev/null
@@ -0,0 +1,4 @@
+/bin/
+/target/
+/.settings/
+.classpath
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.core.tests/.project b/plugins/com.cisco.yangide.core.tests/.project
new file mode 100644 (file)
index 0000000..563cf4d
--- /dev/null
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>com.cisco.yangide.core.tests</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.m2e.core.maven2Builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.m2e.core.maven2Nature</nature>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/plugins/com.cisco.yangide.core.tests/META-INF/MANIFEST.MF b/plugins/com.cisco.yangide.core.tests/META-INF/MANIFEST.MF
new file mode 100644 (file)
index 0000000..ddf2abd
--- /dev/null
@@ -0,0 +1,14 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: YANG IDE Core Tests Plug-in
+Bundle-SymbolicName: com.cisco.yangide.core.tests
+Bundle-Version: 1.1.1.qualifier
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Require-Bundle: org.eclipse.m2e.tests.common;bundle-version="1.4.0",
+ org.junit;bundle-version="3.8.2",
+ org.eclipse.core.resources;bundle-version="3.4.2",
+ org.eclipse.core.runtime;bundle-version="3.4.0",
+ org.eclipse.jdt.core;bundle-version="3.4.4",
+ com.cisco.yangide.core;bundle-version="0.1.0",
+ org.eclipse.m2e.core;bundle-version="1.4.0"
+Bundle-Vendor: Cisco Systems, Inc.
diff --git a/plugins/com.cisco.yangide.core.tests/build.properties b/plugins/com.cisco.yangide.core.tests/build.properties
new file mode 100644 (file)
index 0000000..cc7ca24
--- /dev/null
@@ -0,0 +1,14 @@
+###############################################################################
+# Copyright (c) 2014, 2015 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
+#  
+###############################################################################
+source.. = src/
+output.. = target/classes/
+bin.includes = META-INF/,\
+               .,\
+               projects/,\
+               yang/
diff --git a/plugins/com.cisco.yangide.core.tests/pom.xml b/plugins/com.cisco.yangide.core.tests/pom.xml
new file mode 100644 (file)
index 0000000..8d2bb5a
--- /dev/null
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2014, 2015 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
+     
+ -->
+<!--                                                                                -->
+<!-- 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">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>com.cisco.yangide</groupId>
+    <artifactId>com.cisco.yangide.parent</artifactId>
+    <version>1.1.1-SNAPSHOT</version>
+    <relativePath>../..</relativePath>
+  </parent>
+  
+  <artifactId>com.cisco.yangide.core.tests</artifactId>
+  <packaging>eclipse-test-plugin</packaging>
+  <version>1.1.1-SNAPSHOT</version>
+  
+  <build>
+    <sourceDirectory>src</sourceDirectory>
+  </build>
+</project>
diff --git a/plugins/com.cisco.yangide.core.tests/projects/yang/yang-p001/pom.xml b/plugins/com.cisco.yangide.core.tests/projects/yang/yang-p001/pom.xml
new file mode 100644 (file)
index 0000000..8b51abe
--- /dev/null
@@ -0,0 +1,85 @@
+<!--
+    Copyright (c) 2014, 2015 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
+     
+ -->
+<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/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>com.cisco.yangide.m2e.yang.tests</groupId>
+  <artifactId>yang-p001</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+
+  <properties>
+      <maven.compiler.source>1.7</maven.compiler.source>
+      <maven.compiler.target>1.7</maven.compiler.target>
+  </properties>
+
+  <build>
+      <plugins>
+          <plugin>
+              <groupId>org.opendaylight.yangtools</groupId>
+              <artifactId>yang-maven-plugin</artifactId>
+              <version>0.6.2-Helium</version>
+              <executions>
+                  <execution>
+                    <id>generate-sources</id>
+                      <goals>
+                          <goal>generate-sources</goal>
+                      </goals>
+                      <configuration>
+                          <yangFilesRootDir>src/main/yang</yangFilesRootDir>
+                          <codeGenerators>
+                              <generator>
+                                  <codeGeneratorClass>
+                                      org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl
+                                  </codeGeneratorClass>
+                                  <outputBaseDir>
+                                      target/generated-sources/sal
+                                  </outputBaseDir>
+                              </generator>
+                          </codeGenerators>
+                          <inspectDependencies>false</inspectDependencies>
+                      </configuration>
+                  </execution>
+              </executions>
+
+              <dependencies>
+                  <dependency>
+                      <groupId>org.opendaylight.yangtools</groupId>
+                      <artifactId>maven-sal-api-gen-plugin</artifactId>
+                      <version>0.6.2-Helium</version>
+                      <type>jar</type>
+                  </dependency>
+              </dependencies>
+          </plugin>
+          <plugin>
+              <groupId>org.codehaus.mojo</groupId>
+              <artifactId>build-helper-maven-plugin</artifactId>
+              <executions>
+                  <execution>
+                      <phase>generate-sources</phase>
+                      <goals>
+                          <goal>add-source</goal>
+                      </goals>
+                      <configuration>
+                          <sources>
+                              <source>target/generated-sources/sal</source>
+                          </sources>
+                      </configuration>
+                  </execution>
+              </executions>
+          </plugin>
+      </plugins>
+  </build>
+  <dependencies>
+      <dependency>
+          <groupId>org.opendaylight.yangtools</groupId>
+          <artifactId>yang-binding</artifactId>
+          <version>0.6.2-Helium</version>
+      </dependency>
+  </dependencies>
+</project>
diff --git a/plugins/com.cisco.yangide.core.tests/projects/yang/yang-p001/src/main/yang/simple-string-demo.yang b/plugins/com.cisco.yangide.core.tests/projects/yang/yang-p001/src/main/yang/simple-string-demo.yang
new file mode 100644 (file)
index 0000000..271d489
--- /dev/null
@@ -0,0 +1,22 @@
+module simple-string-demo {
+
+    namespace "urn:simple:string:demo";
+    prefix "sbd";
+
+    organization "OPEN DAYLIGHT";
+    contact "http://www.opendaylight.org/";
+
+    revision 2013-06-18 {
+        
+    }
+       // This is also comment
+    typedef typedef-string {
+        type string {
+            length "50";
+            pattern "[0-9A-F]\.*";
+            pattern "[B-D]*";
+            pattern "[4-7]*";
+        }
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.core.tests/projects/yang/yang-p002/pom.xml b/plugins/com.cisco.yangide.core.tests/projects/yang/yang-p002/pom.xml
new file mode 100644 (file)
index 0000000..910fd73
--- /dev/null
@@ -0,0 +1,85 @@
+<!--
+    Copyright (c) 2014, 2015 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
+     
+ -->
+<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/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>com.cisco.yangide.m2e.yang.tests</groupId>
+  <artifactId>yang-p002</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+
+  <properties>
+      <maven.compiler.source>1.7</maven.compiler.source>
+      <maven.compiler.target>1.7</maven.compiler.target>
+  </properties>
+
+  <build>
+      <plugins>
+          <plugin>
+              <groupId>org.opendaylight.yangtools</groupId>
+              <artifactId>yang-maven-plugin</artifactId>
+              <version>0.6.2-Helium</version>
+              <executions>
+                  <execution>
+                    <id>generate-sources</id>
+                      <goals>
+                          <goal>generate-sources</goal>
+                      </goals>
+                      <configuration>
+                          <yangFilesRootDir>src/main/yang</yangFilesRootDir>
+                          <codeGenerators>
+                              <generator>
+                                  <codeGeneratorClass>
+                                      org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl
+                                  </codeGeneratorClass>
+                                  <outputBaseDir>
+                                      target/generated-sources/sal
+                                  </outputBaseDir>
+                              </generator>
+                          </codeGenerators>
+                          <inspectDependencies>false</inspectDependencies>
+                      </configuration>
+                  </execution>
+              </executions>
+
+              <dependencies>
+                  <dependency>
+                      <groupId>org.opendaylight.yangtools</groupId>
+                      <artifactId>maven-sal-api-gen-plugin</artifactId>
+                      <version>0.6.2-Helium</version>
+                      <type>jar</type>
+                  </dependency>
+              </dependencies>
+          </plugin>
+          <plugin>
+              <groupId>org.codehaus.mojo</groupId>
+              <artifactId>build-helper-maven-plugin</artifactId>
+              <executions>
+                  <execution>
+                      <phase>generate-sources</phase>
+                      <goals>
+                          <goal>add-source</goal>
+                      </goals>
+                      <configuration>
+                          <sources>
+                              <source>target/generated-sources/sal</source>
+                          </sources>
+                      </configuration>
+                  </execution>
+              </executions>
+          </plugin>
+      </plugins>
+  </build>
+  <dependencies>
+      <dependency>
+          <groupId>org.opendaylight.yangtools</groupId>
+          <artifactId>yang-binding</artifactId>
+          <version>0.6.2-Helium</version>
+      </dependency>
+  </dependencies>
+</project>
diff --git a/plugins/com.cisco.yangide.core.tests/projects/yang/yang-p002/src/main/yang/flow-errors.yang b/plugins/com.cisco.yangide.core.tests/projects/yang/yang-p002/src/main/yang/flow-errors.yang
new file mode 100644 (file)
index 0000000..3e9d1ee
--- /dev/null
@@ -0,0 +1,62 @@
+module flow-errors {
+       namespace "urn:opendaylight:flow:errors";
+    prefix error;
+    
+    revision "2013-11-16" {
+        description "Initial revision of error";
+    }
+
+    typedef error-type {
+        type enumeration {
+            enum hello-failed;
+            enum bad-request;
+            enum bad-action;
+            enum bad-instruction;
+            enum bad-match;
+            enum flow-mod-failed;
+            enum group-mod-failed;
+            enum port-mod-failed;
+            enum table-mod-failed;
+            enum queue-op-failed;
+            enum switch-config-failed;
+            enum role-request-failed;
+            enum meter-mod-failed;
+            enum table-features-failed;
+            enum experimenter {
+                value "65535";
+            }
+        }
+    }
+    
+    grouping error-message {
+        leaf type {
+            type error-type;
+        }
+        
+        leaf code {
+            type uint16;
+        }
+        
+        leaf data {
+            type string;
+        }
+    }
+    
+    grouping experimenter-error-message {
+        leaf type {
+            type error-type;
+        }
+        
+        leaf exp-type {
+            type uint16;
+        }
+        
+        leaf experimenter-id {
+            type uint32;
+        }
+        
+        leaf data {
+            type string;
+        }
+    }
+}
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.core.tests/src/com/cisco/yangide/core/tests/YangModelManagerTest.java b/plugins/com.cisco.yangide.core.tests/src/com/cisco/yangide/core/tests/YangModelManagerTest.java
new file mode 100644 (file)
index 0000000..17c6f9e
--- /dev/null
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.tests;
+
+import org.eclipse.m2e.core.project.ResolverConfiguration;
+import org.eclipse.m2e.tests.common.AbstractMavenProjectTestCase;
+
+import com.cisco.yangide.core.IOpenable;
+import com.cisco.yangide.core.YangCorePlugin;
+import com.cisco.yangide.core.model.YangFile;
+import com.cisco.yangide.core.model.YangFileInfo;
+import com.cisco.yangide.core.model.YangFolder;
+import com.cisco.yangide.core.model.YangModel;
+import com.cisco.yangide.core.model.YangProject;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 30, 2014
+ */
+@SuppressWarnings("restriction")
+public class YangModelManagerTest extends AbstractMavenProjectTestCase {
+
+    public void testFileInfoLoading() throws Exception {
+        YangModel model = YangCorePlugin.getYangModel();
+        assertNotNull(model);
+        YangProject[] projects = model.getYangProjects();
+        assertEquals(0, projects.length);
+
+        ResolverConfiguration configuration = new ResolverConfiguration();
+        importProject("projects/yang/yang-p001/pom.xml", configuration);
+        waitForJobsToComplete();
+
+        projects = model.getYangProjects();
+        assertEquals(1, projects.length);
+        YangProject prj = projects[0];
+
+        assertNotNull(prj.getChildren());
+        assertEquals(1, prj.getChildren().length);
+        YangFolder folder = (YangFolder) prj.getChildren()[0];
+        assertEquals("src/main/yang", folder.getName());
+        IOpenable[] files = folder.getChildren();
+        assertEquals(1, files.length);
+        YangFile file = (YangFile) files[0];
+        assertEquals("simple-string-demo.yang", file.getName());
+        YangFileInfo elementInfo = (YangFileInfo) file.getElementInfo(null);
+        assertNotNull(elementInfo);
+        // check that AST parsed
+        assertNotNull(elementInfo.getModule());
+        YangFile newFile = YangCorePlugin.createYangFile(file.getResource());
+        // check new handler with the same info
+        assertTrue(newFile != file);
+        assertTrue(newFile.getElementInfo(null) == elementInfo);
+    }
+}
diff --git a/plugins/com.cisco.yangide.core.tests/src/com/cisco/yangide/core/tests/YangParserTest.java b/plugins/com.cisco.yangide.core.tests/src/com/cisco/yangide/core/tests/YangParserTest.java
new file mode 100644 (file)
index 0000000..1c6d5bf
--- /dev/null
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.tests;
+
+import java.io.CharArrayWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+import junit.framework.TestCase;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.core.dom.SubModule;
+import com.cisco.yangide.core.parser.YangParserUtil;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 14, 2014
+ */
+public class YangParserTest extends TestCase {
+    public void testSimpleParser() throws Exception {
+        try (InputStream in = FileLocator.openStream(Platform.getBundle("com.cisco.yangide.core.tests"), new Path(
+                "yang/simple_import.yang"), false)) {
+
+            Module module = YangParserUtil.parseYangFile(getContent(in));
+            assertEquals("my-crypto", module.getName());
+            assertEquals(7, module.getNameStartPosition());
+            assertEquals(0, module.getStartPosition());
+            // assertEquals(328, module.getLength());
+        }
+    }
+
+    public void testNodeAtPostion() throws Exception {
+        try (InputStream in = FileLocator.openStream(Platform.getBundle("com.cisco.yangide.core.tests"), new Path(
+                "yang/simple_import.yang"), false)) {
+
+            Module module = YangParserUtil.parseYangFile(getContent(in));
+            assertEquals(module, module.getNodeAtPosition(1));
+            assertEquals(module.getImports().get("crypto-base"), module.getNodeAtPosition(100));
+        }
+    }
+
+    public void testIncompleteParse() throws Exception {
+        try (InputStream in = FileLocator.openStream(Platform.getBundle("com.cisco.yangide.core.tests"), new Path(
+                "yang/simple_import_incomplete.yang"), false)) {
+
+            Module module = YangParserUtil.parseYangFile(getContent(in));
+            assertNotNull(module);
+            assertEquals(1, module.getImports().size());
+        }
+    }
+
+    public void testSubmoduleParse() throws Exception {
+        try (InputStream in = FileLocator.openStream(Platform.getBundle("com.cisco.yangide.core.tests"), new Path(
+                "yang/acme-types.yang"), false)) {
+
+            SubModule module = (SubModule) YangParserUtil.parseYangFile(getContent(in));
+            assertNotNull(module);
+            assertEquals("acme-system", module.getParentModule().getValue());
+            assertEquals("acme", module.getParentPrefix());
+        }
+    }
+
+    public void testParseComments() throws Exception {
+        try (InputStream in = FileLocator.openStream(Platform.getBundle("com.cisco.yangide.core.tests"), new Path(
+                "yang/yang-ext.yang"), false)) {
+
+            Module module = YangParserUtil.parseYangFile(getContent(in));
+            assertNotNull(module);
+        }
+    }
+
+    private static char[] getContent(InputStream in) throws IOException {
+        char[] buff = new char[1024];
+        int len = 0;
+        InputStreamReader reader = new InputStreamReader(in, "UTF-8");
+        CharArrayWriter out = new CharArrayWriter();
+        while ((len = reader.read(buff)) > 0) {
+            out.write(buff, 0, len);
+        }
+        return out.toCharArray();
+    }
+}
diff --git a/plugins/com.cisco.yangide.core.tests/yang/acme-types.yang b/plugins/com.cisco.yangide.core.tests/yang/acme-types.yang
new file mode 100644 (file)
index 0000000..cf5ef06
--- /dev/null
@@ -0,0 +1,33 @@
+submodule acme-types {
+    belongs-to "acme-system" {
+        prefix "acme";
+    }
+    
+    import ietf-yang-types {
+        prefix "yang";
+    }
+
+    organization "ACME Inc.";
+    contact
+        "Joe L. User
+         ACME, Inc.
+         42 Anywhere Drive
+         Nowhere, CA 95134
+         USA
+         Phone: +1 800 555 0100
+         EMail: joe@acme.example.com";
+    
+    description
+        "This submodule defines common ACME types.";
+    
+    revision "2007-06-09" {
+        description "Initial revision.";
+    }
+    
+    container test {
+        leaf test {
+            type acme:mytype;
+        }
+    }
+    // definitions follows...
+}
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.core.tests/yang/simple-string-demo.yang b/plugins/com.cisco.yangide.core.tests/yang/simple-string-demo.yang
new file mode 100644 (file)
index 0000000..560ff62
--- /dev/null
@@ -0,0 +1,23 @@
+// This is comments
+/* This is also comments*/
+module simple-string-demo {
+
+    namespace "urn:simple:string:demo";
+    prefix "sbd";
+       
+    organization "OPEN DAYLIGHT";
+    contact "http://www.opendaylight.org/";
+
+    revision 2013-06-18 {
+    }
+
+    typedef typedef-string {
+        type string {
+            length "40";
+            pattern "[0-9A-F]\.*";
+            pattern "[B-D]*";
+            pattern "[4-7]*";
+        }
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.core.tests/yang/simple_import.yang b/plugins/com.cisco.yangide.core.tests/yang/simple_import.yang
new file mode 100644 (file)
index 0000000..287b9b2
--- /dev/null
@@ -0,0 +1,18 @@
+module my-crypto {
+    namespace "http://example.com/my-crypto";
+    prefix mc;
+    
+    import "crypto-base" {
+        prefix "crypto";
+    }
+    
+    identity aes {
+        base "crypto:crypto-alg";
+    }
+    
+    leaf crypto {
+        type identityref {
+            base "crypto:crypto-alg";
+        }
+    }
+}
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.core.tests/yang/simple_import_incomplete.yang b/plugins/com.cisco.yangide.core.tests/yang/simple_import_incomplete.yang
new file mode 100644 (file)
index 0000000..df1fca3
--- /dev/null
@@ -0,0 +1,16 @@
+module my-crypto {
+    namespace "http://example.com/my-crypto";
+    prefix mc;
+    
+    import
+    
+    identity aes {
+        base "crypto:crypto-alg";
+    }
+    
+    leaf crypto {
+        type identityref {
+            base "crypto:crypto-alg";
+        }
+    }
+}
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.core.tests/yang/yang-ext.yang b/plugins/com.cisco.yangide.core.tests/yang/yang-ext.yang
new file mode 100644 (file)
index 0000000..d34cb8b
--- /dev/null
@@ -0,0 +1,86 @@
+// test commend
+
+/*
+asdasd
+asdasd
+asdasd
+*/
+module yang-ext {
+    yang-version 1;
+    namespace "urn:opendaylight:yang:extension:yang-ext";
+    prefix "ext";
+       
+    contact "Anton Tkacik <ttkacik@cisco.com>";
+
+    description
+            "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";
+
+    revision "2013-07-09" {
+        description "";
+    }
+
+    // Augmentation name
+
+    extension "augment-identifier" {
+        description 
+           "YANG language extension which assigns an identifier to 
+            augmentation. Augment identifier is used to identify
+            specific augment statement by name. 
+
+            The identifier syntax is defined formally defined by the rule
+            'identifier' in Section 12 of RFC 6020.
+
+            All augment identifiers defined in a namespace MUST be unique.
+            The namespace of augment identifiers is shared by module and
+            its submodules.";
+
+            /*
+                Discussion:
+                This extension allows for ease of development / debug
+                of YANG modules and it is suitable for code generation,
+                where each augment statement is nicely identified by
+                unique name instead of combination of augment target
+                and when condition. 
+            */
+        argument "identifier";
+    }
+
+
+    // Context-aware RPCs
+
+    grouping rpc-context-ref {
+        description 
+           "A reference to RPC context.";
+        leaf context-instance {
+            type instance-identifier;
+            description "Pointer to the context. ";
+        }
+    }
+
+    extension "rpc-context-instance" {
+        description
+           "YANG language extension which defines enclosing (parent) 
+            schema node as referencable context for RPCs.
+
+            The argument is identity which is used to identify RPC context
+            type.";
+
+        argument "context-type";
+    }
+
+    extension "context-reference" {
+        argument "context-type";
+    }
+
+    extension "context-instance" {
+        argument "context-type";
+    }
+    
+    extension "instance-target" {
+       argument "path";
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/.gitignore b/plugins/com.cisco.yangide.core/.gitignore
new file mode 100644 (file)
index 0000000..b77461b
--- /dev/null
@@ -0,0 +1,3 @@
+/target/
+/.settings/
+.classpath
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.core/.project b/plugins/com.cisco.yangide.core/.project
new file mode 100644 (file)
index 0000000..526ad6b
--- /dev/null
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>com.cisco.yangide.core</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.m2e.core.maven2Builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.m2e.core.maven2Nature</nature>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/plugins/com.cisco.yangide.core/META-INF/MANIFEST.MF b/plugins/com.cisco.yangide.core/META-INF/MANIFEST.MF
new file mode 100644 (file)
index 0000000..25039da
--- /dev/null
@@ -0,0 +1,26 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: com.cisco.yangide.core
+Bundle-SymbolicName: com.cisco.yangide.core;singleton:=true
+Bundle-Version: 1.1.1.qualifier
+Bundle-Activator: com.cisco.yangide.core.YangCorePlugin
+Bundle-Vendor: Cisco Systems, Inc.
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.jdt.core;visibility:=reexport,
+ org.eclipse.text,
+ org.eclipse.core.resources,
+ org.eclipse.core.filesystem
+Bundle-ClassPath: .,
+ libs/yang-parser-impl-0.6.1.jar,
+ libs/yang-model-api-0.6.1.jar,
+ libs/antlr4-runtime-4.0.jar,
+ libs/mapdb-1.0.4.jar
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-ActivationPolicy: lazy
+Export-Package: com.cisco.yangide.core,
+ com.cisco.yangide.core.buffer,
+ com.cisco.yangide.core.dom,
+ com.cisco.yangide.core.indexing,
+ com.cisco.yangide.core.parser,
+ com.cisco.yangide.core.model,
+ org.antlr.v4.runtime
diff --git a/plugins/com.cisco.yangide.core/build.properties b/plugins/com.cisco.yangide.core/build.properties
new file mode 100644 (file)
index 0000000..49fcce4
--- /dev/null
@@ -0,0 +1,17 @@
+###############################################################################
+# Copyright (c) 2014, 2015 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
+#  
+###############################################################################
+source.. = src/
+output.. = target/classes
+bin.includes = META-INF/,\
+               .,\
+               libs/yang-parser-impl-0.6.1.jar,\
+               libs/antlr4-runtime-4.0.jar,\
+               libs/mapdb-1.0.4.jar,\
+               plugin.xml,\
+               libs/yang-model-api-0.6.1.jar
diff --git a/plugins/com.cisco.yangide.core/plugin.xml b/plugins/com.cisco.yangide.core/plugin.xml
new file mode 100644 (file)
index 0000000..8a55b50
--- /dev/null
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<!--
+    Copyright (c) 2014, 2015 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
+     
+ -->
+<!--                                                                                -->
+<!-- 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                  -->
+<!-- ============================================================================== -->
+<plugin>
+    <extension point="org.eclipse.core.contenttype.contentTypes">
+        <content-type 
+            id="com.cisco.yangide.core.yangFile" 
+            name="YANG File" 
+            base-type="org.eclipse.core.runtime.text"
+            priority="high"/>
+        <file-association content-type="yangFile" file-extensions="yang"/>
+    </extension>
+    
+   <extension point="org.eclipse.core.resources.markers"
+         id="problem"
+         name="YANG Problem">
+      <persistent value="true"/>
+      <super type="org.eclipse.core.resources.problemmarker"/>
+      <super type="org.eclipse.core.resources.textmarker"/>
+   </extension>
+
+   <extension point="org.eclipse.core.resources.markers"
+         id="syntaxproblem"
+         name="YANG Syntax Problem">
+      <super type="org.eclipse.core.resources.textmarker"/>
+   </extension>
+   
+    <extension
+      point="org.eclipse.ui.editors.markerAnnotationSpecification">
+      
+        <specification
+            annotationType="com.cisco.yangide.core.error"
+            symbolicIcon="error"
+            includeOnPreferencePage="true"
+            label="YANG Problem"
+            colorPreferenceKey="com.cisco.yangide.core.error.color"
+            colorPreferenceValue="192,255,192"
+            overviewRulerPreferenceKey="com.cisco.yangide.core.error.overview"
+            textPreferenceKey="com.cisco.yangide.core.error.text"
+            >
+        </specification>
+    </extension>
+    
+    <extension
+          point="org.eclipse.ui.editors.annotationTypes">
+        <type
+            name="com.cisco.yangide.core.error"
+            super="org.eclipse.ui.workbench.texteditor.error"
+            markerType="com.cisco.yangide.core.problem"
+            markerSeverity="2">
+        </type>
+      <type
+            name="com.cisco.yangide.core.syntax"
+            super="org.eclipse.ui.workbench.texteditor.error"
+            markerType="com.cisco.yangide.core.syntaxproblem"
+            markerSeverity="2">
+      </type>
+    </extension>
+</plugin>
diff --git a/plugins/com.cisco.yangide.core/pom.xml b/plugins/com.cisco.yangide.core/pom.xml
new file mode 100644 (file)
index 0000000..0e7b4eb
--- /dev/null
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2014, 2015 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
+     
+ -->
+<!--                                                                                -->
+<!-- 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">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>com.cisco.yangide</groupId>
+    <artifactId>com.cisco.yangide.parent</artifactId>
+    <version>1.1.1-SNAPSHOT</version>
+    <relativePath>../..</relativePath>
+  </parent>
+
+  <artifactId>com.cisco.yangide.core</artifactId>
+  <packaging>eclipse-plugin</packaging>
+  <version>1.1.1-SNAPSHOT</version>
+  <build>
+    <sourceDirectory>src</sourceDirectory>
+    <plugins>
+        <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-clean-plugin</artifactId>
+            <configuration>
+                <filesets>
+                    <fileset>
+                        <directory>libs</directory>
+                    </fileset>
+                </filesets>
+            </configuration>
+        </plugin>
+        <plugin>
+            <!-- Tycho cannot use Maven dependencies directly, and we can't store the jars directly
+            in the project (as they were originally), so we use this goal to copy the required
+            dependencies into the location expected in the manifest.
+             -->
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-dependency-plugin</artifactId>
+            <executions>
+                <execution>
+                    <id>copy</id>
+                    <phase>process-resources</phase>
+                    <goals>
+                        <goal>copy</goal>
+                    </goals>
+                    <configuration>
+                        <outputDirectory>./libs</outputDirectory>
+                        <artifactItems>
+                            <artifactItem>
+                                <groupId>org.antlr</groupId>
+                                <artifactId>antlr4-runtime</artifactId>
+                                <version>4.0</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <destFileName>antlr4-runtime-4.0.jar</destFileName>
+                            </artifactItem>
+                            <artifactItem>
+                                <groupId>org.mapdb</groupId>
+                                <artifactId>mapdb</artifactId>
+                                <version>1.0.4</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <destFileName>mapdb-1.0.4.jar</destFileName>
+                            </artifactItem>
+                            <artifactItem>
+                                <groupId>org.opendaylight.yangtools</groupId>
+                                <artifactId>yang-model-api</artifactId>
+                                <version>0.6.1</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <destFileName>yang-model-api-0.6.1.jar</destFileName>
+                            </artifactItem>
+                            <artifactItem>
+                                <groupId>org.opendaylight.yangtools</groupId>
+                                <artifactId>yang-parser-impl</artifactId>
+                                <version>0.6.1</version>
+                                <type>jar</type>
+                                <overWrite>true</overWrite>
+                                <destFileName>yang-parser-impl-0.6.1.jar</destFileName>
+                            </artifactItem>
+                        </artifactItems>
+                    </configuration>
+                </execution>
+            </executions>
+        </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/CoreUtil.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/CoreUtil.java
new file mode 100644 (file)
index 0000000..2445b45
--- /dev/null
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 30, 2014
+ */
+public final class CoreUtil {
+
+    /**
+     * Protect from initialization.
+     */
+    private CoreUtil() {
+        // empty block
+    }
+
+    /**
+     * Combines two hash codes to make a new one.
+     */
+    public static int combineHashCodes(int hashCode1, int hashCode2) {
+        return hashCode1 * 17 + hashCode2;
+    }
+
+    public static boolean isYangLikeFileName(String name) {
+        if (name == null || name.length() == 0) {
+            return false;
+        }
+
+        return name.toLowerCase().endsWith(".yang");
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/ElementChangedEvent.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/ElementChangedEvent.java
new file mode 100644 (file)
index 0000000..f95f829
--- /dev/null
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core;
+
+import java.util.EventObject;
+
+import org.eclipse.jdt.core.IJavaElementDelta;
+
+/**
+ * An element changed event describes a change to the structure or contents of a tree of Yang
+ * elements. The changes to the elements are described by the associated delta object carried by
+ * this event.
+ *
+ * @author Konstantin Zaitsev
+ * date: Jun 30, 2014
+ */
+public class ElementChangedEvent extends EventObject {
+
+    /** Serial version UID. */
+    private static final long serialVersionUID = 3695215681338659142L;
+
+    /**
+     * Event type constant (bit mask) indicating an after-the-fact report of creations, deletions,
+     * and modifications to one or more Yang element(s) expressed as a hierarchical java element
+     * delta as returned by <code>getDelta()</code>. Note: this notification occurs during the
+     * corresponding POST_CHANGE resource change notification, and contains a full delta accounting
+     * for any YangModel operation and/or resource change.
+     *
+     * @see org.eclipse.core.resources.IResourceChangeEvent
+     * @see #getDelta()
+     */
+    public static final int POST_CHANGE = 1;
+
+    /**
+     * Event type constant (bit mask) indicating an after-the-fact report of creations, deletions,
+     * and modifications to one or more Yang element(s) expressed as a hierarchical yang element
+     * delta as returned by <code>getDelta</code>. Note: this notification occurs as a result of a
+     * working copy reconcile operation.
+     *
+     * @see IJavaElementDelta
+     * @see #getDelta()
+     */
+    public static final int POST_RECONCILE = 4;
+
+    /**
+     * Event type indicating the nature of this event. It can be a combination either: - POST_CHANGE
+     * - POST_RECONCILE
+     */
+    private int type;
+
+    /**
+     * Creates an new element changed event (based on a <code>IJavaElementDelta</code>).
+     *
+     * @param delta the Java element delta.
+     * @param type the type of delta (ADDED, REMOVED, CHANGED) this event contains
+     */
+    public ElementChangedEvent(IYangElementDelta delta, int type) {
+        super(delta);
+        this.type = type;
+    }
+
+    /**
+     * Returns the delta describing the change.
+     *
+     * @return the delta describing the change
+     */
+    public IYangElementDelta getDelta() {
+        return (IYangElementDelta) this.source;
+    }
+
+    /**
+     * Returns the type of event being reported.
+     *
+     * @return one of the event type constants
+     * @see #POST_CHANGE
+     * @see #POST_RECONCILE
+     */
+    public int getType() {
+        return this.type;
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/IOpenable.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/IOpenable.java
new file mode 100644 (file)
index 0000000..093f377
--- /dev/null
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+import com.cisco.yangide.core.buffer.IBuffer;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 24, 2014
+ */
+public interface IOpenable {
+
+    /**
+     * Closes this element and its buffer (if any). Closing an element which is not open has no
+     * effect.
+     *
+     * @exception YangModelException if an error occurs closing this element
+     */
+    public void close() throws YangModelException;
+
+    /**
+     * Returns the buffer opened for this element, or <code>null</code> if this element does not
+     * have a buffer.
+     *
+     * @exception YangModelException if this element does not exist or if an exception occurs while
+     * accessing its corresponding resource.
+     * @return the buffer opened for this element, or <code>null</code> if this element does not
+     * have a buffer
+     */
+    public IBuffer getBuffer() throws YangModelException;
+
+    /**
+     * Returns whether this openable is open. This is a handle-only method.
+     *
+     * @return true if this openable is open, false otherwise
+     */
+    boolean isOpen();
+
+    /**
+     * Opens this element and all parent elements that are not already open. For compilation units,
+     * a buffer is opened on the contents of the underlying resource.
+     *
+     * @param progress the given progress monitor
+     * @exception YangModelException if an error occurs accessing the contents of its underlying
+     * resource.
+     */
+    public void open(IProgressMonitor progress) throws YangModelException;
+
+    /**
+     * Returns whether this Yang element exists in the model.
+     *
+     * @return <code>true</code> if this element exists in the model, and <code>false</code> if this
+     * element does not exist
+     */
+    boolean exists();
+
+    /**
+     * Returns the element directly containing this element, or <code>null</code> if this element
+     * has no parent. This is a handle-only method.
+     *
+     * @return the parent element, or <code>null</code> if this element has no parent
+     */
+    IOpenable getParent();
+
+    /**
+     * Returns the path to the resource enclosing this element.
+     *
+     * @return the path to the resource enclosing this element
+     */
+    IPath getPath();
+
+    /**
+     * Returns the resource enclosing this element.
+     *
+     * @return the resource enclosing this element, <code>null</code> if this element is included in
+     * an external archive
+     */
+    IResource getResource();
+
+    /**
+     * Returns whether this element is read-only. An element is read-only if its structure cannot be
+     * modified by the model.
+     *
+     * @return <code>true</code> if this element is read-only
+     */
+    boolean isReadOnly();
+
+    /**
+     * @return name of element (file path for example)
+     */
+    String getName();
+
+    /**
+     * @return string representation element with all parent hierarchy.
+     */
+    String toStringWithAncestors();
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/IYangElementChangedListener.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/IYangElementChangedListener.java
new file mode 100644 (file)
index 0000000..728ffab
--- /dev/null
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core;
+
+/**
+ * An element changed listener receives notification of changes to Yang elements maintained by the
+ * Yang model.
+ *
+ * @author Konstantin Zaitsev
+ * date: Jun 30, 2014
+ */
+public interface IYangElementChangedListener {
+
+    /**
+     * Notifies that one or more attributes of one or more Yang elements have changed. The specific
+     * details of the change are described by the given event.
+     *
+     * @param event the change event
+     */
+    public void elementChanged(ElementChangedEvent event);
+
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/IYangElementDelta.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/IYangElementDelta.java
new file mode 100644 (file)
index 0000000..cb104cc
--- /dev/null
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core;
+
+import com.cisco.yangide.core.model.YangElement;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 30, 2014
+ */
+public interface IYangElementDelta {
+
+    /**
+     * Status constant indicating that the element has been added. Note that an added yang element
+     * delta has no children, as they are all implicitely added.
+     */
+    public int ADDED = 1;
+
+    /**
+     * Status constant indicating that the element has been removed. Note that a removed yang
+     * element delta has no children, as they are all implicitely removed.
+     */
+    public int REMOVED = 2;
+
+    /**
+     * Status constant indicating that the element has been changed, as described by the change
+     * flags.
+     *
+     * @see #getFlags()
+     */
+    public int CHANGED = 4;
+
+    /**
+     * Change flag indicating that the content of the element has changed. This flag is only valid
+     * for elements which correspond to files.
+     */
+    public int F_CONTENT = 0x000001;
+
+    /**
+     * Change flag indicating that the modifiers of the element have changed.
+     */
+    public int F_MODIFIERS = 0x000002;
+
+    /**
+     * Change flag indicating that there are changes to the children of the element.
+     */
+    public int F_CHILDREN = 0x000008;
+
+    /**
+     * @return
+     */
+    YangElement getElement();
+
+    /**
+     * @return
+     */
+    int getKind();
+
+    /**
+     * @return
+     */
+    int getFlags();
+
+    /**
+     * @return
+     */
+    IYangElementDelta[] getAffectedChildren();
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/OpenableElementCache.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/OpenableElementCache.java
new file mode 100644 (file)
index 0000000..d20d78e
--- /dev/null
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core;
+
+import com.cisco.yangide.core.buffer.LRUCache;
+import com.cisco.yangide.core.buffer.OverflowingLRUCache;
+import com.cisco.yangide.core.model.YangElement;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 25, 2014
+ */
+public class OpenableElementCache extends OverflowingLRUCache {
+
+    IOpenable spaceLimitParent = null;
+
+    /**
+     * Constructs a new element cache of the given size.
+     */
+    public OpenableElementCache(int size) {
+        super(size);
+    }
+
+    /**
+     * Constructs a new element cache of the given size.
+     */
+    public OpenableElementCache(int size, int overflow) {
+        super(size, overflow);
+    }
+
+    /**
+     * Returns true if the element is successfully closed and removed from the cache, otherwise
+     * false.
+     * <p>
+     * NOTE: this triggers an external removal of this element by closing the element.
+     */
+    protected boolean close(LRUCacheEntry entry) {
+        YangElement element = (YangElement) entry.key;
+        try {
+            if (!element.canBeRemovedFromCache()) {
+                return false;
+            } else {
+                element.close();
+                return true;
+            }
+        } catch (YangModelException npe) {
+            return false;
+        }
+    }
+
+    /*
+     * Ensures that there is enough room for adding the children of the given info. If the space
+     * limit must be increased, record the parent that needed this space limit.
+     */
+    protected void ensureSpaceLimit(Object info, IOpenable parent) {
+        // ensure the children can be put without closing other elements
+        int childrenSize = ((OpenableElementInfo) info).getChildren().length;
+        int spaceNeeded = 1 + (int) ((1 + this.loadFactor) * (childrenSize + this.overflow));
+        if (this.spaceLimit < spaceNeeded) {
+            // parent is being opened with more children than the space limit
+            shrink(); // remove overflow
+            setSpaceLimit(spaceNeeded);
+            this.spaceLimitParent = parent;
+        }
+    }
+
+    /*
+     * Returns a new instance of the receiver.
+     */
+    protected LRUCache newInstance(int size, int newOverflow) {
+        return new OpenableElementCache(size, newOverflow);
+    }
+
+    /*
+     * If the given parent was the one that increased the space limit, reset the space limit to the
+     * given default value.
+     */
+    protected void resetSpaceLimit(int defaultLimit, IOpenable parent) {
+        if (parent.equals(this.spaceLimitParent)) {
+            setSpaceLimit(defaultLimit);
+            this.spaceLimitParent = null;
+        }
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/OpenableElementInfo.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/OpenableElementInfo.java
new file mode 100644 (file)
index 0000000..03b8472
--- /dev/null
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core;
+
+import com.cisco.yangide.core.model.YangElement;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 25, 2014
+ */
+public class OpenableElementInfo implements Cloneable {
+
+    /**
+     * Collection of handles of immediate children of this object. This is an empty array if this
+     * element has no children.
+     */
+    protected IOpenable[] children = YangElement.NO_ELEMENTS;
+
+    /**
+     * Is the structure of this element known
+     *
+     * @see IOpenable#isStructureKnown()
+     */
+    protected boolean isStructureKnown = false;
+
+    public Object clone() {
+        try {
+            return super.clone();
+        } catch (CloneNotSupportedException e) {
+            throw new Error();
+        }
+    }
+
+    public void addChild(IOpenable child) {
+        int length = this.children.length;
+        if (length == 0) {
+            this.children = new IOpenable[] { child };
+        } else {
+            for (int i = 0; i < length; i++) {
+                if (this.children[i].equals(child))
+                    return; // already included
+            }
+            System.arraycopy(this.children, 0, this.children = new IOpenable[length + 1], 0, length);
+            this.children[length] = child;
+        }
+    }
+
+    public IOpenable[] getChildren() {
+        return this.children;
+    }
+
+    /**
+     * @see IOpenable#isStructureKnown()
+     */
+    public boolean isStructureKnown() {
+        return this.isStructureKnown;
+    }
+
+    public void removeChild(IOpenable child) {
+        for (int i = 0, length = this.children.length; i < length; i++) {
+            IOpenable element = this.children[i];
+            if (element.equals(child)) {
+                if (length == 1) {
+                    this.children = YangElement.NO_ELEMENTS;
+                } else {
+                    IOpenable[] newChildren = new IOpenable[length - 1];
+                    System.arraycopy(this.children, 0, newChildren, 0, i);
+                    if (i < length - 1)
+                        System.arraycopy(this.children, i + 1, newChildren, i, length - 1 - i);
+                    this.children = newChildren;
+                }
+                break;
+            }
+        }
+    }
+
+    public void setChildren(IOpenable[] children) {
+        this.children = children;
+    }
+
+    /**
+     * Sets whether the structure of this element known
+     *
+     * @see IOpenable#isStructureKnown()
+     */
+    public void setIsStructureKnown(boolean newIsStructureKnown) {
+        this.isStructureKnown = newIsStructureKnown;
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/YangCorePlugin.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/YangCorePlugin.java
new file mode 100644 (file)
index 0000000..1224502
--- /dev/null
@@ -0,0 +1,242 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core;
+
+import java.io.File;
+
+import org.eclipse.core.filesystem.URIUtil;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.core.runtime.Status;
+import org.osgi.framework.BundleContext;
+
+import com.cisco.yangide.core.model.YangElement;
+import com.cisco.yangide.core.model.YangFile;
+import com.cisco.yangide.core.model.YangFolder;
+import com.cisco.yangide.core.model.YangJarEntry;
+import com.cisco.yangide.core.model.YangJarFile;
+import com.cisco.yangide.core.model.YangModel;
+import com.cisco.yangide.core.model.YangModelManager;
+import com.cisco.yangide.core.model.YangProject;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class YangCorePlugin extends Plugin {
+
+    /** The plug-in ID */
+    public static final String PLUGIN_ID = "com.cisco.yangide.core"; //$NON-NLS-1$
+
+    /** Problem marker ID. */
+    public static final String YANGIDE_PROBLEM_MARKER = "com.cisco.yangide.core.problem";
+
+    /** The shared instance */
+    private static YangCorePlugin plugin;
+
+    @Override
+    public void start(BundleContext context) throws Exception {
+        super.start(context);
+        plugin = this;
+        YangModelManager.getYangModelManager().startup();
+    }
+
+    @Override
+    public void stop(BundleContext context) throws Exception {
+        plugin = null;
+        try {
+            YangModelManager.getYangModelManager().shutdown();
+        } finally {
+            super.stop(context);
+        }
+    }
+
+    /**
+     * Returns the shared instance
+     *
+     * @return the shared instance
+     */
+    public static YangCorePlugin getDefault() {
+        return plugin;
+    }
+
+    /**
+     * @return global YangModel instance
+     */
+    public static YangModel getYangModel() {
+        return YangModelManager.getYangModelManager().getYangModel();
+    }
+
+    /**
+     * Reports log to Error Log view.
+     *
+     * @param statusErrorID plugin related error ID
+     * @param message error message
+     */
+    public static void log(Throwable e, String message) {
+        Throwable nestedException;
+        if (e instanceof YangModelException && (nestedException = ((YangModelException) e).getException()) != null) {
+            e = nestedException;
+        }
+        log(new Status(IStatus.ERROR, PLUGIN_ID, IStatus.ERROR, message, e));
+    }
+
+    /**
+     * Reports log to Error Log view.
+     *
+     * @param statusErrorID plugin related error ID
+     * @param message error message
+     */
+    public static void log(int statusErrorID, String message) {
+        log(new Status(statusErrorID, PLUGIN_ID, message));
+    }
+
+    /**
+     * Reports log to Error Log view.
+     *
+     * @param status status
+     */
+    public static void log(IStatus status) {
+        getDefault().getLog().log(status);
+    }
+
+    /**
+     * Reports exception to Error Log view.
+     *
+     * @param e exception
+     */
+    public static void log(Throwable e) {
+        log(new Status(IStatus.ERROR, PLUGIN_ID, e.getMessage(), e));
+    }
+
+    /**
+     * @param project project to check
+     * @return <code>true</code> if project is Yang project
+     */
+    public static boolean isYangProject(IProject project) {
+        try {
+            return project.isAccessible()
+                    && (project.hasNature("org.eclipse.jdt.core.javanature") || project
+                            .hasNature("org.eclipse.m2e.core.maven2Nature"));
+        } catch (CoreException e) {
+            log(e);
+            return false;
+        }
+    }
+
+    public static YangJarEntry createJarEntry(IPath path, String entry) {
+        return new YangJarEntry(new Path(entry), createJarFile(path));
+    }
+
+    public static YangJarFile createJarFile(IPath path) {
+        return new YangJarFile(path, getYangModel());
+    }
+
+    /**
+     * @param deltaRes
+     * @return
+     */
+    public static YangElement create(IResource resource) {
+        switch (resource.getType()) {
+        case IResource.PROJECT:
+            return new YangProject((IProject) resource, getYangModel());
+        case IResource.FOLDER:
+            return new YangFolder(resource, create(resource.getProject()));
+        }
+        return new YangFile((IFile) resource, create(resource.getParent()));
+    }
+
+    /**
+     * Returns a parsed model of the yang file that resides at the given {@code path}.
+     * @return a {@link YangFile} object
+     */
+    public static YangFile createYangFile(String path) {
+        IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(path));
+        return createYangFile(file);
+    }
+    
+    /**
+     * @param resource
+     */
+    public static YangFile createYangFile(IResource resource) {
+        return new YangFile((IFile) resource, create(resource.getParent()));
+    }
+
+    public static IFile getIFileFromFile(File file) {
+        IFile[] files = ResourcesPlugin.getWorkspace().getRoot()
+                .findFilesForLocationURI(URIUtil.toURI(file.getAbsolutePath()));
+        if (files != null && files.length > 0) {
+            return files[0];
+        }
+        return null;
+    }
+
+    /**
+     * Creates YANG problem marker for resource.
+     *
+     * @param path workspace relative path
+     * @param message text message
+     * @param lineNumber optional line number or <code>-1</code> if no line number
+     */
+    public static void createProblemMarker(String path, String message, int lineNumber) {
+        IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(path));
+        if (file.exists()) {
+            createProblemMarker(file, message, lineNumber);
+        }
+    }
+
+    /**
+     * Creates YANG problem marker for resource.
+     *
+     * @param resource resource
+     * @param message text message
+     * @param lineNumber optional line number or <code>-1</code> if no line number
+     */
+    public static void createProblemMarker(IResource resource, String message, int lineNumber) {
+        try {
+            IMarker marker = resource.createMarker(YANGIDE_PROBLEM_MARKER);
+            marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR);
+            marker.setAttribute(IMarker.PRIORITY, IMarker.PRIORITY_HIGH);
+            marker.setAttribute(IMarker.MESSAGE, message);
+            if (lineNumber >= 0) {
+                marker.setAttribute(IMarker.LINE_NUMBER, lineNumber);
+            }
+        } catch (CoreException e) {
+            log(e);
+        }
+    }
+
+    /**
+     * Creates YANG problem marker for resource.
+     *
+     * @param resource resource
+     * @param message text message
+     * @param lineNumber optional line number or <code>-1</code> if no line number
+     */
+    public static void createProblemMarker(IResource resource, String message, int lineNumber, int charStart,
+            int charEnd) {
+        try {
+            IMarker marker = resource.createMarker(YANGIDE_PROBLEM_MARKER);// "com.cisco.yangide.core.syntaxproblem");
+            marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR);
+            marker.setAttribute(IMarker.PRIORITY, IMarker.PRIORITY_HIGH);
+            marker.setAttribute(IMarker.MESSAGE, message.trim());
+            marker.setAttribute(IMarker.LINE_NUMBER, lineNumber);
+            marker.setAttribute(IMarker.CHAR_START, charStart);
+            marker.setAttribute(IMarker.CHAR_END, charEnd);
+        } catch (CoreException e) {
+            log(e);
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/YangJarFileEntryResource.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/YangJarFileEntryResource.java
new file mode 100644 (file)
index 0000000..72ed176
--- /dev/null
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.jar.JarFile;
+
+import org.eclipse.core.resources.IStorage;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.PlatformObject;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.core.IJarEntryResource;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+
+/**
+ * Custom implementation of {@link IJarEntryResource} to open correct jar file from JDT perspective.
+ *
+ * @author Konstantin Zaitsev
+ * date: Jul 7, 2014
+ */
+public class YangJarFileEntryResource extends PlatformObject implements IJarEntryResource, IStorage {
+
+    private IPath path;
+    private String entry;
+    private IJavaProject project;
+
+    public YangJarFileEntryResource(IJavaProject project, IPath path, String entry) {
+        this.project = project;
+        this.path = path;
+        this.entry = entry;
+    }
+
+    @Override
+    public InputStream getContents() throws CoreException {
+        try (JarFile file = new JarFile(path.toFile())) {
+            InputStream in = file.getInputStream(file.getEntry(entry));
+            byte[] buff = new byte[1024];
+            int len = 0;
+            ByteArrayOutputStream out = new ByteArrayOutputStream();
+            while ((len = in.read(buff)) > 0) {
+                out.write(buff, 0, len);
+            }
+
+            return new ByteArrayInputStream(out.toByteArray());
+        } catch (IOException e) {
+            throw new CoreException(new Status(IStatus.ERROR, YangCorePlugin.PLUGIN_ID, e.getMessage(), e));
+        }
+    }
+
+    @Override
+    public IPath getFullPath() {
+        return new Path(entry);
+    }
+
+    @Override
+    public String getName() {
+        return new Path(entry).lastSegment();
+    }
+
+    @Override
+    public boolean isReadOnly() {
+        return true;
+    }
+
+    @Override
+    public IJarEntryResource[] getChildren() {
+        return new IJarEntryResource[0];
+    }
+
+    @Override
+    public Object getParent() {
+        IPackageFragmentRoot root = getPackageFragmentRoot();
+        Path p = new Path(entry);
+        return resolveParent(root, p);
+    }
+
+    private Object resolveParent(IPackageFragmentRoot parent, IPath path) {
+        if (path.segmentCount() > 0) {
+            try {
+                for (Object element : parent.getNonJavaResources()) {
+                    if (element instanceof IJarEntryResource) {
+                        IJarEntryResource res = (IJarEntryResource) element;
+                        if (path.segment(0).equals(res.getName())) {
+                            return resolveParent(res, path.removeFirstSegments(1));
+                        }
+                    }
+                }
+            } catch (Exception e) {
+                YangCorePlugin.log(e);
+            }
+        }
+        return parent;
+    }
+
+    private Object resolveParent(IJarEntryResource parent, IPath path) {
+        if (path.segmentCount() > 0) {
+            for (IJarEntryResource element : parent.getChildren()) {
+                if (path.segment(0).equals(element.getName())) {
+                    return resolveParent(element, path.removeFirstSegments(1));
+                }
+            }
+        }
+        return parent.getParent();
+    }
+
+    @Override
+    public IPackageFragmentRoot getPackageFragmentRoot() {
+        return project.getPackageFragmentRoot(path.toString());
+    }
+
+    @Override
+    public boolean isFile() {
+        return true; 
+    }
+
+    /**
+     * @return the entry
+     */
+    public String getEntry() {
+        return entry;
+    }
+
+    /**
+     * @return the path
+     */
+    public IPath getPath() {
+        return path;
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/YangModelException.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/YangModelException.java
new file mode 100644 (file)
index 0000000..eceb52c
--- /dev/null
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 24, 2014
+ */
+public class YangModelException extends CoreException {
+
+    private static final long serialVersionUID = -1110448694670326045L;
+
+    private CoreException nestedCoreException;
+
+    public YangModelException(String message) {
+        super(new Status(IStatus.ERROR, YangCorePlugin.PLUGIN_ID, message));
+    }
+
+    public YangModelException(Throwable e, int code) {
+        super(new Status(code, YangCorePlugin.PLUGIN_ID, e.getMessage(), e));
+    }
+
+    public YangModelException(CoreException exception) {
+        super(exception.getStatus());
+        this.nestedCoreException = exception;
+    }
+
+    public Throwable getException() {
+        if (this.nestedCoreException == null) {
+            return getStatus().getException();
+        } else {
+            return this.nestedCoreException;
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/YangTypeUtil.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/YangTypeUtil.java
new file mode 100644 (file)
index 0000000..a77840d
--- /dev/null
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * Different utility to work with YANG types system.
+ *
+ * @author Konstantin Zaitsev
+ * date: Jul 15, 2014
+ */
+public final class YangTypeUtil {
+
+    /** Set of built-in YANG types. */
+    private static Set<String> BUILTIN_TYPES = new HashSet<>(Arrays.asList("binary", "bits", "boolean", "decimal64",
+            "empty", "enumeration", "identityref", "instance-identifier", "int8", "int16", "int32", "int64", "leafref",
+            "string", "uint8", "uint16", "uint32", "uint64", "union"));
+
+    /**
+     * Protect from initialization.
+     */
+    private YangTypeUtil() {
+        // empty block
+    }
+
+    /**
+     * @param type type name to check
+     * @return <code>true</code> it type is YANG built-in type
+     */
+    public static boolean isBuiltInType(String type) {
+        return BUILTIN_TYPES.contains(type);
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/Buffer.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/Buffer.java
new file mode 100644 (file)
index 0000000..9639d9c
--- /dev/null
@@ -0,0 +1,521 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.buffer;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceStatus;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.ISafeRunnable;
+import org.eclipse.core.runtime.SafeRunner;
+import org.eclipse.core.runtime.content.IContentDescription;
+
+import com.cisco.yangide.core.IOpenable;
+import com.cisco.yangide.core.YangCorePlugin;
+import com.cisco.yangide.core.YangModelException;
+import com.cisco.yangide.core.model.YangFile;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 24, 2014
+ */
+@SuppressWarnings({ "rawtypes" })
+public class Buffer implements IBuffer {
+    protected IFile file;
+    protected int flags;
+    protected char[] contents;
+    protected ArrayList changeListeners;
+    protected IOpenable owner;
+    protected int gapStart = -1;
+    protected int gapEnd = -1;
+
+    protected Object lock = new Object();
+
+    protected static final int F_HAS_UNSAVED_CHANGES = 1;
+    protected static final int F_IS_READ_ONLY = 2;
+    protected static final int F_IS_CLOSED = 4;
+
+    /**
+     * Creates a new buffer on an underlying resource.
+     *
+     * @param file File to create buffer for
+     * @param owner Owner of buffer
+     * @param readOnly true to make read-only
+     */
+    protected Buffer(IFile file, IOpenable owner, boolean readOnly) {
+        this.file = file;
+        this.owner = owner;
+        if (file == null) {
+            setReadOnly(readOnly);
+        }
+    }
+
+    /**
+     * @see IBuffer
+     */
+    @SuppressWarnings("unchecked")
+    public synchronized void addBufferChangedListener(IBufferChangedListener listener) {
+        if (this.changeListeners == null) {
+            this.changeListeners = new ArrayList(5);
+        }
+        if (!this.changeListeners.contains(listener)) {
+            this.changeListeners.add(listener);
+        }
+    }
+
+    /**
+     * Append the <code>text</code> to the actual content, the gap is moved to the end of the
+     * <code>text</code>.
+     */
+    public void append(char[] text) {
+        if (!isReadOnly()) {
+            if (text == null || text.length == 0) {
+                return;
+            }
+            int length = getLength();
+            synchronized (this.lock) {
+                if (this.contents == null)
+                    return;
+                moveAndResizeGap(length, text.length);
+                System.arraycopy(text, 0, this.contents, length, text.length);
+                this.gapStart += text.length;
+                this.flags |= F_HAS_UNSAVED_CHANGES;
+            }
+            notifyChanged(new BufferChangedEvent(this, length, 0, new String(text)));
+        }
+    }
+
+    /**
+     * Append the <code>text</code> to the actual content, the gap is moved to the end of the
+     * <code>text</code>.
+     */
+    public void append(String text) {
+        if (text == null) {
+            return;
+        }
+        this.append(text.toCharArray());
+    }
+
+    /**
+     * @see IBuffer
+     */
+    public void close() {
+        BufferChangedEvent event = null;
+        synchronized (this.lock) {
+            if (isClosed())
+                return;
+            event = new BufferChangedEvent(this, 0, 0, null);
+            this.contents = null;
+            this.flags |= F_IS_CLOSED;
+        }
+        notifyChanged(event); // notify outside of synchronized block
+        synchronized (this) { // ensure that no other thread is adding/removing a listener at the
+                              // same time (https://bugs.eclipse.org/bugs/show_bug.cgi?id=126673)
+            this.changeListeners = null;
+        }
+    }
+
+    /**
+     * @see IBuffer
+     */
+    public char getChar(int position) {
+        synchronized (this.lock) {
+            if (this.contents == null)
+                return Character.MIN_VALUE;
+            if (position < this.gapStart) {
+                return this.contents[position];
+            }
+            int gapLength = this.gapEnd - this.gapStart;
+            return this.contents[position + gapLength];
+        }
+    }
+
+    /**
+     * @see IBuffer
+     */
+    public char[] getCharacters() {
+        synchronized (this.lock) {
+            if (this.contents == null)
+                return null;
+            if (this.gapStart < 0) {
+                return this.contents;
+            }
+            int length = this.contents.length;
+            char[] newContents = new char[length - this.gapEnd + this.gapStart];
+            System.arraycopy(this.contents, 0, newContents, 0, this.gapStart);
+            System.arraycopy(this.contents, this.gapEnd, newContents, this.gapStart, length - this.gapEnd);
+            return newContents;
+        }
+    }
+
+    /**
+     * @see IBuffer
+     */
+    public String getContents() {
+        char[] chars = getCharacters();
+        if (chars == null)
+            return null;
+        return new String(chars);
+    }
+
+    /**
+     * @see IBuffer
+     */
+    public int getLength() {
+        synchronized (this.lock) {
+            if (this.contents == null)
+                return -1;
+            int length = this.gapEnd - this.gapStart;
+            return (this.contents.length - length);
+        }
+    }
+
+    /**
+     * @see IBuffer
+     */
+    public IOpenable getOwner() {
+        return this.owner;
+    }
+
+    /**
+     * @see IBuffer
+     */
+    public String getText(int offset, int length) {
+        synchronized (this.lock) {
+            if (this.contents == null)
+                return ""; //$NON-NLS-1$
+            if (offset + length < this.gapStart)
+                return new String(this.contents, offset, length);
+            if (this.gapStart < offset) {
+                int gapLength = this.gapEnd - this.gapStart;
+                return new String(this.contents, offset + gapLength, length);
+            }
+            StringBuffer buf = new StringBuffer();
+            buf.append(this.contents, offset, this.gapStart - offset);
+            buf.append(this.contents, this.gapEnd, offset + length - this.gapStart);
+            return buf.toString();
+        }
+    }
+
+    /**
+     * @see IBuffer
+     */
+    public IResource getUnderlyingResource() {
+        return this.file;
+    }
+
+    /**
+     * @see IBuffer
+     */
+    public boolean hasUnsavedChanges() {
+        return (this.flags & F_HAS_UNSAVED_CHANGES) != 0;
+    }
+
+    /**
+     * @see IBuffer
+     */
+    public boolean isClosed() {
+        return (this.flags & F_IS_CLOSED) != 0;
+    }
+
+    /**
+     * @see IBuffer
+     */
+    public boolean isReadOnly() {
+        return (this.flags & F_IS_READ_ONLY) != 0;
+    }
+
+    /**
+     * Moves the gap to location and adjust its size to the anticipated change size. The size
+     * represents the expected range of the gap that will be filled after the gap has been moved.
+     * Thus the gap is resized to actual size + the specified size and moved to the given position.
+     *
+     * @param position location to move to
+     * @param size expected range of gap after gap has been moved
+     */
+    protected void moveAndResizeGap(int position, int size) {
+        char[] content = null;
+        int oldSize = this.gapEnd - this.gapStart;
+        if (size < 0) {
+            if (oldSize > 0) {
+                content = new char[this.contents.length - oldSize];
+                System.arraycopy(this.contents, 0, content, 0, this.gapStart);
+                System.arraycopy(this.contents, this.gapEnd, content, this.gapStart, content.length - this.gapStart);
+                this.contents = content;
+            }
+            this.gapStart = this.gapEnd = position;
+            return;
+        }
+        content = new char[this.contents.length + (size - oldSize)];
+        int newGapStart = position;
+        int newGapEnd = newGapStart + size;
+        if (oldSize == 0) {
+            System.arraycopy(this.contents, 0, content, 0, newGapStart);
+            System.arraycopy(this.contents, newGapStart, content, newGapEnd, content.length - newGapEnd);
+        } else if (newGapStart < this.gapStart) {
+            int delta = this.gapStart - newGapStart;
+            System.arraycopy(this.contents, 0, content, 0, newGapStart);
+            System.arraycopy(this.contents, newGapStart, content, newGapEnd, delta);
+            System.arraycopy(this.contents, this.gapEnd, content, newGapEnd + delta, this.contents.length - this.gapEnd);
+        } else {
+            int delta = newGapStart - this.gapStart;
+            System.arraycopy(this.contents, 0, content, 0, this.gapStart);
+            System.arraycopy(this.contents, this.gapEnd, content, this.gapStart, delta);
+            System.arraycopy(this.contents, this.gapEnd + delta, content, newGapEnd, content.length - newGapEnd);
+        }
+        this.contents = content;
+        this.gapStart = newGapStart;
+        this.gapEnd = newGapEnd;
+    }
+
+    /**
+     * Notify the listeners that this buffer has changed. To avoid deadlock, this should not be
+     * called in a synchronized block.
+     *
+     * @param event BufferChangedEvent detail
+     */
+    protected void notifyChanged(final BufferChangedEvent event) {
+        ArrayList listeners = this.changeListeners;
+        if (listeners != null) {
+            for (int i = 0, size = listeners.size(); i < size; ++i) {
+                final IBufferChangedListener listener = (IBufferChangedListener) listeners.get(i);
+                SafeRunner.run(new ISafeRunnable() {
+                    public void handleException(Throwable exception) {
+                        YangCorePlugin.log(exception, "Exception occurred in listener of buffer change notification");
+                    }
+
+                    public void run() throws Exception {
+                        listener.bufferChanged(event);
+                    }
+                });
+
+            }
+        }
+    }
+
+    /**
+     * @see IBuffer
+     */
+    public synchronized void removeBufferChangedListener(IBufferChangedListener listener) {
+        if (this.changeListeners != null) {
+            this.changeListeners.remove(listener);
+            if (this.changeListeners.size() == 0) {
+                this.changeListeners = null;
+            }
+        }
+    }
+
+    /**
+     * Replaces <code>length</code> characters starting from <code>position</code> with
+     * <code>text</code>.
+     * After that operation, the gap is placed at the end of the
+     * inserted <code>text</code>.
+     */
+    public void replace(int position, int length, char[] text) {
+        if (!isReadOnly()) {
+            int textLength = text == null ? 0 : text.length;
+            synchronized (this.lock) {
+                if (this.contents == null)
+                    return;
+
+                // move gap
+                moveAndResizeGap(position + length, textLength - length);
+
+                // overwrite
+                int min = Math.min(textLength, length);
+                if (min > 0) {
+                    System.arraycopy(text, 0, this.contents, position, min);
+                }
+                if (length > textLength) {
+                    // enlarge the gap
+                    this.gapStart -= length - textLength;
+                } else if (textLength > length) {
+                    // shrink gap
+                    this.gapStart += textLength - length;
+                    System.arraycopy(text, 0, this.contents, position, textLength);
+                }
+                this.flags |= F_HAS_UNSAVED_CHANGES;
+            }
+            String string = null;
+            if (textLength > 0) {
+                string = new String(text);
+            }
+            notifyChanged(new BufferChangedEvent(this, position, length, string));
+        }
+    }
+
+    /**
+     * Replaces <code>length</code> characters starting from <code>position</code> with
+     * <code>text</code>.
+     * After that operation, the gap is placed at the end of the
+     * inserted <code>text</code>.
+     */
+    public void replace(int position, int length, String text) {
+        this.replace(position, length, text == null ? null : text.toCharArray());
+    }
+
+    /**
+     * @see IBuffer
+     */
+    public void save(IProgressMonitor progress, boolean force) throws YangModelException {
+
+        // determine if saving is required
+        if (isReadOnly() || this.file == null) {
+            return;
+        }
+        if (!hasUnsavedChanges())
+            return;
+
+        // use a platform operation to update the resource contents
+        try {
+            String stringContents = getContents();
+            if (stringContents == null)
+                return;
+
+            // Get encoding
+            String encoding = null;
+            try {
+                encoding = this.file.getCharset();
+            } catch (CoreException ce) {
+                // use no encoding
+            }
+
+            // Create bytes array
+            byte[] bytes = encoding == null ? stringContents.getBytes() : stringContents.getBytes(encoding);
+
+            // Special case for UTF-8 BOM files
+            if (encoding != null && encoding.equals("UTF-8")) {
+                IContentDescription description;
+                try {
+                    description = this.file.getContentDescription();
+                } catch (CoreException e) {
+                    if (e.getStatus().getCode() != IResourceStatus.RESOURCE_NOT_FOUND)
+                        throw e;
+                    // file no longer exist (see
+                    // https://bugs.eclipse.org/bugs/show_bug.cgi?id=234307 )
+                    description = null;
+                }
+                if (description != null && description.getProperty(IContentDescription.BYTE_ORDER_MARK) != null) {
+                    int bomLength = IContentDescription.BOM_UTF_8.length;
+                    byte[] bytesWithBOM = new byte[bytes.length + bomLength];
+                    System.arraycopy(IContentDescription.BOM_UTF_8, 0, bytesWithBOM, 0, bomLength);
+                    System.arraycopy(bytes, 0, bytesWithBOM, bomLength, bytes.length);
+                    bytes = bytesWithBOM;
+                }
+            }
+
+            // Set file contents
+            ByteArrayInputStream stream = new ByteArrayInputStream(bytes);
+            if (this.file.exists()) {
+                this.file.setContents(stream,
+                        force ? IResource.FORCE | IResource.KEEP_HISTORY : IResource.KEEP_HISTORY, null);
+            } else {
+                this.file.create(stream, force, null);
+            }
+        } catch (IOException e) {
+            throw new YangModelException(e, 1);
+        } catch (CoreException e) {
+            throw new YangModelException(e);
+        }
+
+        // the resource no longer has unsaved changes
+        this.flags &= ~(F_HAS_UNSAVED_CHANGES);
+    }
+
+    /**
+     * @see IBuffer
+     */
+    public void setContents(char[] newContents) {
+        // allow special case for first initialization
+        // after creation by buffer factory
+        if (this.contents == null) {
+            synchronized (this.lock) {
+                this.contents = newContents;
+                this.flags &= ~(F_HAS_UNSAVED_CHANGES);
+            }
+            return;
+        }
+
+        if (!isReadOnly()) {
+            String string = null;
+            if (newContents != null) {
+                string = new String(newContents);
+            }
+            synchronized (this.lock) {
+                if (this.contents == null)
+                    return; // ignore if buffer is closed (as per spec)
+                this.contents = newContents;
+                this.flags |= F_HAS_UNSAVED_CHANGES;
+                this.gapStart = -1;
+                this.gapEnd = -1;
+            }
+            BufferChangedEvent event = new BufferChangedEvent(this, 0, getLength(), string);
+            notifyChanged(event);
+        }
+    }
+
+    /**
+     * @see IBuffer
+     */
+    public void setContents(String newContents) {
+        this.setContents(newContents.toCharArray());
+    }
+
+    /**
+     * Sets this <code>Buffer</code> to be read only.
+     *
+     * @param readOnly true to set buffer to read-only
+     */
+    protected void setReadOnly(boolean readOnly) {
+        if (readOnly) {
+            this.flags |= F_IS_READ_ONLY;
+        } else {
+            this.flags &= ~(F_IS_READ_ONLY);
+        }
+    }
+
+    public String toString() {
+        StringBuffer buffer = new StringBuffer();
+        buffer.append("Owner: " + ((YangFile) this.owner).toStringWithAncestors()); //$NON-NLS-1$
+        buffer.append("\nHas unsaved changes: " + hasUnsavedChanges()); //$NON-NLS-1$
+        buffer.append("\nIs readonly: " + isReadOnly()); //$NON-NLS-1$
+        buffer.append("\nIs closed: " + isClosed()); //$NON-NLS-1$
+        buffer.append("\nContents:\n"); //$NON-NLS-1$
+        char[] charContents = getCharacters();
+        if (charContents == null) {
+            buffer.append("<null>"); //$NON-NLS-1$
+        } else {
+            int length = charContents.length;
+            for (int i = 0; i < length; i++) {
+                char c = charContents[i];
+                switch (c) {
+                case '\n':
+                    buffer.append("\\n\n"); //$NON-NLS-1$
+                    break;
+                case '\r':
+                    if (i < length - 1 && this.contents[i + 1] == '\n') {
+                        buffer.append("\\r\\n\n"); //$NON-NLS-1$
+                        i++;
+                    } else {
+                        buffer.append("\\r\n"); //$NON-NLS-1$
+                    }
+                    break;
+                default:
+                    buffer.append(c);
+                    break;
+                }
+            }
+        }
+        return buffer.toString();
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/BufferCache.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/BufferCache.java
new file mode 100644 (file)
index 0000000..6192276
--- /dev/null
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.buffer;
+
+import java.util.ArrayList;
+
+import com.cisco.yangide.core.model.YangElement;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 24, 2014
+ */
+@SuppressWarnings({ "rawtypes", "unchecked" })
+public class BufferCache extends OverflowingLRUCache {
+
+    private ThreadLocal buffersToClose = new ThreadLocal();
+
+    /**
+     * Constructs a new buffer cache of the given size.
+     */
+    public BufferCache(int size) {
+        super(size);
+    }
+
+    /**
+     * Constructs a new buffer cache of the given size.
+     */
+    public BufferCache(int size, int overflow) {
+        super(size, overflow);
+    }
+
+    /**
+     * Returns true if the buffer is successfully closed and removed from the cache, otherwise
+     * false.
+     * <p>
+     * NOTE: this triggers an external removal of this buffer by closing the buffer.
+     */
+    protected boolean close(LRUCacheEntry entry) {
+        IBuffer buffer = (IBuffer) entry.value;
+
+        // prevent buffer that have unsaved changes or working copy buffer to be removed
+        // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=39311
+        if (!((YangElement) buffer.getOwner()).canBufferBeRemovedFromCache(buffer)) {
+            return false;
+        } else {
+            ArrayList buffers = (ArrayList) this.buffersToClose.get();
+            if (buffers == null) {
+                buffers = new ArrayList();
+                this.buffersToClose.set(buffers);
+            }
+            buffers.add(buffer);
+            return true;
+        }
+    }
+
+    void closeBuffers() {
+        ArrayList buffers = (ArrayList) this.buffersToClose.get();
+        if (buffers == null)
+            return;
+        this.buffersToClose.set(null);
+        for (int i = 0, length = buffers.size(); i < length; i++) {
+            ((IBuffer) buffers.get(i)).close();
+        }
+    }
+
+    /**
+     * Returns a new instance of the reciever.
+     */
+    protected LRUCache newInstance(int size, int newOverflow) {
+        return new BufferCache(size, newOverflow);
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/BufferChangedEvent.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/BufferChangedEvent.java
new file mode 100644 (file)
index 0000000..107d38c
--- /dev/null
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.buffer;
+
+import java.util.EventObject;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 24, 2014
+ */
+public class BufferChangedEvent extends EventObject {
+
+    /**
+     * The length of text that has been modified in the buffer.
+     */
+    private int length;
+
+    /**
+     * The offset into the buffer where the modification took place.
+     */
+    private int offset;
+
+    /**
+     * The text that was modified.
+     */
+    private String text;
+
+    private static final long serialVersionUID = 655379473891745999L; // backward compatible
+
+    /**
+     * Creates a new buffer changed event indicating that the given buffer has changed.
+     *
+     * @param buffer the given buffer
+     * @param offset the given offset
+     * @param length the given length
+     * @param text the given text
+     */
+    public BufferChangedEvent(IBuffer buffer, int offset, int length, String text) {
+        super(buffer);
+        this.offset = offset;
+        this.length = length;
+        this.text = text;
+    }
+
+    /**
+     * Returns the buffer which has changed.
+     *
+     * @return the buffer affected by the change
+     */
+    public IBuffer getBuffer() {
+        return (IBuffer) this.source;
+    }
+
+    /**
+     * Returns the length of text removed or replaced in the buffer, or 0 if text has been inserted
+     * into the buffer.
+     *
+     * @return the length of the original text fragment modified by the buffer change (
+     * <code> 0 </code> in case of insertion).
+     */
+    public int getLength() {
+        return this.length;
+    }
+
+    /**
+     * Returns the index of the first character inserted, removed, or replaced in the buffer.
+     *
+     * @return the source offset of the textual manipulation in the buffer
+     */
+    public int getOffset() {
+        return this.offset;
+    }
+
+    /**
+     * Returns the text that was inserted, the replacement text, or <code>null</code> if text has
+     * been removed.
+     *
+     * @return the text corresponding to the buffer change (<code> null </code> in case of
+     * deletion).
+     */
+    public String getText() {
+        return this.text;
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/BufferManager.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/BufferManager.java
new file mode 100644 (file)
index 0000000..46c70c8
--- /dev/null
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.buffer;
+
+import java.text.NumberFormat;
+import java.util.Enumeration;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+
+import com.cisco.yangide.core.IOpenable;
+import com.cisco.yangide.core.model.YangElement;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 24, 2014
+ */
+public class BufferManager {
+
+    protected static BufferManager DEFAULT_BUFFER_MANAGER;
+    protected static boolean VERBOSE;
+
+    /**
+     * LRU cache of buffers. The key and value for an entry in the table is the identical buffer.
+     */
+    private BufferCache openBuffers = new BufferCache(60);
+
+    /**
+     * Adds a buffer to the table of open buffers.
+     */
+    public void addBuffer(IBuffer buffer) {
+        if (VERBOSE) {
+            String owner = ((YangElement) buffer.getOwner()).toStringWithAncestors();
+            System.out.println("Adding buffer for " + owner); //$NON-NLS-1$
+        }
+        synchronized (this.openBuffers) {
+            this.openBuffers.put(buffer.getOwner(), buffer);
+        }
+        // close buffers that were removed from the cache if space was needed
+        this.openBuffers.closeBuffers();
+        if (VERBOSE) {
+            System.out
+                    .println("-> Buffer cache filling ratio = " + NumberFormat.getInstance().format(this.openBuffers.fillingRatio()) + "%"); //$NON-NLS-1$//$NON-NLS-2$
+        }
+    }
+
+    public static IBuffer createBuffer(IOpenable owner) {
+        IResource resource = owner.getResource();
+        return new Buffer(resource instanceof IFile ? (IFile) resource : null, owner, owner.isReadOnly());
+    }
+
+    public static IBuffer createNullBuffer(IOpenable owner) {
+        IResource resource = owner.getResource();
+        return new NullBuffer(resource instanceof IFile ? (IFile) resource : null, owner, owner.isReadOnly());
+    }
+
+    /**
+     * Returns the open buffer associated with the given owner, or <code>null</code> if the owner
+     * does not have an open buffer associated with it.
+     */
+    public IBuffer getBuffer(IOpenable owner) {
+        synchronized (this.openBuffers) {
+            return (IBuffer) this.openBuffers.get(owner);
+        }
+    }
+
+    /**
+     * Returns the default buffer manager.
+     */
+    public synchronized static BufferManager getDefaultBufferManager() {
+        if (DEFAULT_BUFFER_MANAGER == null) {
+            DEFAULT_BUFFER_MANAGER = new BufferManager();
+        }
+        return DEFAULT_BUFFER_MANAGER;
+    }
+
+    /**
+     * Returns an enumeration of all open buffers.
+     * <p>
+     * The <code>Enumeration</code> answered is thread safe.
+     *
+     * @see OverflowingLRUCache
+     * @return Enumeration of IBuffer
+     */
+    public Enumeration<?> getOpenBuffers() {
+        Enumeration<?> result;
+        synchronized (this.openBuffers) {
+            this.openBuffers.shrink();
+            result = this.openBuffers.elements();
+        }
+        // close buffers that were removed from the cache if space was needed
+        this.openBuffers.closeBuffers();
+        return result;
+    }
+
+    /**
+     * Removes a buffer from the table of open buffers.
+     */
+    public void removeBuffer(IBuffer buffer) {
+        synchronized (this.openBuffers) {
+            this.openBuffers.remove(buffer.getOwner());
+        }
+        // close buffers that were removed from the cache (should be only one)
+        this.openBuffers.closeBuffers();
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/IBuffer.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/IBuffer.java
new file mode 100644 (file)
index 0000000..891d95d
--- /dev/null
@@ -0,0 +1,276 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.buffer;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.text.edits.TextEdit;
+import org.eclipse.text.edits.UndoEdit;
+
+import com.cisco.yangide.core.IOpenable;
+import com.cisco.yangide.core.YangModelException;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 24, 2014
+ */
+public interface IBuffer {
+
+    /**
+     * Implementors of {@link IBuffer} can additionally implement
+     * {@link IBuffer.ITextEditCapability}. This adds the capability to apply text edits to the
+     * buffer and will be used by {@link ICompilationUnit#applyTextEdit(TextEdit, IProgressMonitor)}
+     * .
+     * <p>
+     * This interface may be implemented by clients.
+     * </p>
+     */
+    public interface ITextEditCapability {
+        /**
+         * Applies a text edit to this underlying buffer.
+         *
+         * @param edit the edit to apply
+         * @param monitor the progress monitor to use or <code>null</code> if no progress should be
+         * reported
+         * @return the undo edit
+         * @throws YangModelException if this edit can not be applied to the buffer.
+         */
+        public UndoEdit applyTextEdit(TextEdit edit, IProgressMonitor monitor) throws YangModelException;
+    }
+
+    /**
+     * Adds the given listener for changes to this buffer. Has no effect if an identical listener is
+     * already registered or if the buffer is closed.
+     *
+     * @param listener the listener of buffer changes
+     */
+    public void addBufferChangedListener(IBufferChangedListener listener);
+
+    /**
+     * Appends the given character array to the contents of the buffer. This buffer will now have
+     * unsaved changes. Any client can append to the contents of the buffer, not just the owner of
+     * the buffer. Reports a buffer changed event.
+     * <p>
+     * Has no effect if this buffer is read-only or if the buffer is closed.
+     *
+     * @param text the given character array to append to contents of the buffer
+     */
+    public void append(char[] text);
+
+    /**
+     * Appends the given string to the contents of the buffer. This buffer will now have unsaved
+     * changes. Any client can append to the contents of the buffer, not just the owner of the
+     * buffer. Reports a buffer changed event.
+     * <p>
+     * Has no effect if this buffer is read-only or if the buffer is closed.
+     *
+     * @param text the <code>String</code> to append to the contents of the buffer
+     */
+    public void append(String text);
+
+    /**
+     * Closes the buffer. Any unsaved changes are lost. Reports a buffer changed event with a 0
+     * offset and a 0 length. When this event is fired, the buffer should already be closed.
+     * <p>
+     * Further operations on the buffer are not allowed, except for close. If an attempt is made to
+     * close an already closed buffer, the second attempt has no effect.
+     */
+    public void close();
+
+    /**
+     * Returns the character at the given position in this buffer.
+     * <p>
+     * The returned value is undefined if the buffer is closed.
+     *
+     * @param position a zero-based source offset in this buffer
+     * @return the character at the given position in this buffer
+     */
+    public char getChar(int position);
+
+    /**
+     * Returns the contents of this buffer as a character array, or <code>null</code> if the buffer
+     * has not been initialized.
+     * <p>
+     * Callers should make no assumption about whether the returned character array is or is not the
+     * genuine article or a copy. In other words, if the client wishes to change this array, they
+     * should make a copy. Likewise, if the client wishes to hang on to the array in its current
+     * state, they should make a copy.
+     * </p>
+     * <p>
+     * The returned value is undefined if the buffer is closed.
+     *
+     * @return the characters contained in this buffer
+     */
+    public char[] getCharacters();
+
+    /**
+     * Returns the contents of this buffer as a <code>String</code>. Like all strings, the result is
+     * an immutable value object., It can also answer <code>null</code> if the buffer has not been
+     * initialized.
+     * <p>
+     * The returned value is undefined if the buffer is closed.
+     *
+     * @return the contents of this buffer as a <code>String</code>
+     */
+    public String getContents();
+
+    /**
+     * Returns number of characters stored in this buffer.
+     * <p>
+     * The returned value is undefined if the buffer is closed.
+     *
+     * @return the number of characters in this buffer
+     */
+    public int getLength();
+
+    /**
+     * Returns the Java openable element owning of this buffer.
+     *
+     * @return the openable element owning this buffer
+     */
+    public IOpenable getOwner();
+
+    /**
+     * Returns the given range of text in this buffer.
+     * <p>
+     * The returned value is undefined if the buffer is closed.
+     * </p>
+     *
+     * @param offset the zero-based starting offset
+     * @param length the number of characters to retrieve
+     * @return the given range of text in this buffer
+     * @exception IndexOutOfBoundsException when buffer is out of synch
+     */
+    public String getText(int offset, int length) throws IndexOutOfBoundsException;
+
+    /**
+     * Returns the underlying resource for which this buffer was opened, or <code>null</code> if
+     * this buffer was not opened on a resource.
+     *
+     * @return the underlying resource for this buffer, or <code>null</code> if none.
+     */
+    public IResource getUnderlyingResource();
+
+    /**
+     * Returns whether this buffer has been modified since it was opened or since it was last saved.
+     * If a buffer does not have an underlying resource, this method always returns
+     * <code>true</code>.
+     * <p>
+     * NOTE: when a buffer does not have unsaved changes, the model may decide to close it to claim
+     * some memory back. If the associated element needs to be reopened later on, its buffer factory
+     * will be requested to create a new buffer.
+     * </p>
+     *
+     * @return a <code>boolean</code> indicating presence of unsaved changes (in the absence of any
+     * underlying resource, it will always return <code>true</code>).
+     */
+    public boolean hasUnsavedChanges();
+
+    /**
+     * Returns whether this buffer has been closed.
+     *
+     * @return a <code>boolean</code> indicating whether this buffer is closed.
+     */
+    public boolean isClosed();
+
+    /**
+     * Returns whether this buffer is read-only.
+     *
+     * @return a <code>boolean</code> indicating whether this buffer is read-only
+     */
+    public boolean isReadOnly();
+
+    /**
+     * Removes the given listener from this buffer. Has no effect if an identical listener is not
+     * registered or if the buffer is closed.
+     *
+     * @param listener the listener
+     */
+    public void removeBufferChangedListener(IBufferChangedListener listener);
+
+    /**
+     * Replaces the given range of characters in this buffer with the given text.
+     * <code>position</code> and <code>position + length</code> must be in the range [0,
+     * getLength()]. <code>length</code> must not be negative.
+     * <p>
+     * Has no effect if this buffer is read-only or if the buffer is closed.
+     *
+     * @param position the zero-based starting position of the affected text range in this buffer
+     * @param length the length of the affected text range in this buffer
+     * @param text the replacing text as a character array
+     */
+    public void replace(int position, int length, char[] text);
+
+    /**
+     * Replaces the given range of characters in this buffer with the given text.
+     * <code>position</code> and <code>position + length</code> must be in the range [0,
+     * getLength()]. <code>length</code> must not be negative.
+     * <p>
+     * Has no effect if this buffer is read-only or if the buffer is closed.
+     *
+     * @param position the zero-based starting position of the affected text range in this buffer
+     * @param length the length of the affected text range in this buffer
+     * @param text the replacing text as a <code>String</code>
+     */
+    public void replace(int position, int length, String text);
+
+    /**
+     * Saves the contents of this buffer to its underlying resource. If successful, this buffer will
+     * have no unsaved changes. The buffer is left open. Saving a buffer with no unsaved changes has
+     * no effect - the underlying resource is not changed. If the buffer does not have an underlying
+     * resource or is read-only, this has no effect.
+     * <p>
+     * The <code>force</code> parameter controls how this method deals with cases where the
+     * workbench is not completely in sync with the local file system. If <code>false</code> is
+     * specified, this method will only attempt to overwrite a corresponding file in the local file
+     * system provided it is in sync with the workbench. This option ensures there is no unintended
+     * data loss; it is the recommended setting. However, if <code>true</code> is specified, an
+     * attempt will be made to write a corresponding file in the local file system, overwriting any
+     * existing one if need be. In either case, if this method succeeds, the resource will be marked
+     * as being local (even if it wasn't before).
+     * <p>
+     * Has no effect if this buffer is read-only or if the buffer is closed.
+     *
+     * @param progress the progress monitor to notify
+     * @param force a <code> boolean </code> flag indicating how to deal with resource
+     * inconsistencies.
+     * @exception YangModelException if an error occurs writing the buffer to the underlying
+     * resource
+     * @see org.eclipse.core.resources.IFile#setContents(java.io.InputStream, boolean, boolean,
+     * org.eclipse.core.runtime.IProgressMonitor)
+     */
+    public void save(IProgressMonitor progress, boolean force) throws YangModelException;
+
+    /**
+     * Sets the contents of this buffer to the given character array. This buffer will now have
+     * unsaved changes. Any client can set the contents of the buffer, not just the owner of the
+     * buffer. Reports a buffer changed event.
+     * <p>
+     * Equivalent to <code>replace(0,getLength(),contents)</code>.
+     * </p>
+     * <p>
+     * Has no effect if this buffer is read-only or if the buffer is closed.
+     *
+     * @param contents the new contents of this buffer as a character array
+     */
+    public void setContents(char[] contents);
+
+    /**
+     * Sets the contents of this buffer to the given <code>String</code>. This buffer will now have
+     * unsaved changes. Any client can set the contents of the buffer, not just the owner of the
+     * buffer. Reports a buffer changed event.
+     * <p>
+     * Equivalent to <code>replace(0,getLength(),contents)</code>.
+     * </p>
+     * <p>
+     * Has no effect if this buffer is read-only or if the buffer is closed.
+     *
+     * @param contents the new contents of this buffer as a <code>String</code>
+     */
+    public void setContents(String contents);
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/IBufferChangedListener.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/IBufferChangedListener.java
new file mode 100644 (file)
index 0000000..e13c319
--- /dev/null
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.buffer;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 24, 2014
+ */
+public interface IBufferChangedListener {
+    /**
+     * Notifies that the given event has occurred.
+     *
+     * @param event the change event
+     */
+    public void bufferChanged(BufferChangedEvent event);
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/ICacheEnumeration.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/ICacheEnumeration.java
new file mode 100644 (file)
index 0000000..844c6ef
--- /dev/null
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.buffer;
+
+import java.util.Enumeration;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 24, 2014
+ */
+@SuppressWarnings({ "rawtypes" })
+public interface ICacheEnumeration extends Enumeration {
+    /**
+     * Returns the value of the previously accessed key in the enumeration. Must be called after a
+     * call to nextElement().
+     *
+     * @return Value of current cache entry
+     */
+    public Object getValue();
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/ILRUCacheable.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/ILRUCacheable.java
new file mode 100644 (file)
index 0000000..942d30c
--- /dev/null
@@ -0,0 +1,21 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.buffer;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 24, 2014
+ */
+public interface ILRUCacheable {
+    /**
+     * Returns the space the receiver consumes in an LRU Cache. The default space value is 1.
+     *
+     * @return int Amount of cache space taken by the receiver
+     */
+    public int getCacheFootprint();
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/LRUCache.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/LRUCache.java
new file mode 100644 (file)
index 0000000..d0eed06
--- /dev/null
@@ -0,0 +1,718 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.buffer;
+
+import java.text.NumberFormat;
+import java.util.Enumeration;
+import java.util.Hashtable;
+
+import com.cisco.yangide.core.model.YangElement;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 24, 2014
+ */
+@SuppressWarnings({ "rawtypes", "unchecked" })
+public class LRUCache implements Cloneable {
+
+    /**
+     * This type is used internally by the LRUCache to represent entries stored in the cache. It is
+     * static because it does not require a pointer to the cache which contains it.
+     *
+     * @see LRUCache
+     */
+    protected static class LRUCacheEntry {
+
+        /**
+         * Hash table key
+         */
+        public Object key;
+
+        /**
+         * Hash table value (an LRUCacheEntry object)
+         */
+        public Object value;
+
+        /**
+         * Time value for queue sorting
+         */
+        public int timestamp;
+
+        /**
+         * Cache footprint of this entry
+         */
+        public int space;
+
+        /**
+         * Previous entry in queue
+         */
+        public LRUCacheEntry previous;
+
+        /**
+         * Next entry in queue
+         */
+        public LRUCacheEntry next;
+
+        /**
+         * Creates a new instance of the receiver with the provided values for key, value, and
+         * space.
+         */
+        public LRUCacheEntry(Object key, Object value, int space) {
+            this.key = key;
+            this.value = value;
+            this.space = space;
+        }
+
+        /**
+         * Returns a String that represents the value of this object.
+         */
+        @Override
+        public String toString() {
+
+            return "LRUCacheEntry [" + this.key + "-->" + this.value + "]"; //$NON-NLS-3$ //$NON-NLS-1$ //$NON-NLS-2$
+        }
+    }
+
+    public class Stats {
+        private int[] counters = new int[20];
+        private long[] timestamps = new long[20];
+        private int counterIndex = -1;
+
+        private void add(int counter) {
+            for (int i = 0; i <= this.counterIndex; i++) {
+                if (this.counters[i] == counter) {
+                    return;
+                }
+            }
+            int length = this.counters.length;
+            if (++this.counterIndex == length) {
+                int newLength = this.counters.length * 2;
+                System.arraycopy(this.counters, 0, this.counters = new int[newLength], 0, length);
+                System.arraycopy(this.timestamps, 0, this.timestamps = new long[newLength], 0, length);
+            }
+            this.counters[this.counterIndex] = counter;
+            this.timestamps[this.counterIndex] = System.currentTimeMillis();
+        }
+
+        private String getAverageAge(long totalTime, int numberOfElements, long currentTime) {
+            if (numberOfElements == 0) {
+                return "N/A"; //$NON-NLS-1$
+            }
+            long time = totalTime / numberOfElements;
+            long age = currentTime - time;
+            long ageInSeconds = age / 1000;
+            int seconds = 0;
+            int minutes = 0;
+            int hours = 0;
+            int days = 0;
+            if (ageInSeconds > 60) {
+                long ageInMin = ageInSeconds / 60;
+                seconds = (int) (ageInSeconds - (60 * ageInMin));
+                if (ageInMin > 60) {
+                    long ageInHours = ageInMin / 60;
+                    minutes = (int) (ageInMin - (60 * ageInHours));
+                    if (ageInHours > 24) {
+                        long ageInDays = ageInHours / 24;
+                        hours = (int) (ageInHours - (24 * ageInDays));
+                        days = (int) ageInDays;
+                    } else {
+                        hours = (int) ageInHours;
+                    }
+                } else {
+                    minutes = (int) ageInMin;
+                }
+            } else {
+                seconds = (int) ageInSeconds;
+            }
+            StringBuffer buffer = new StringBuffer();
+            if (days > 0) {
+                buffer.append(days);
+                buffer.append(" days "); //$NON-NLS-1$
+            }
+            if (hours > 0) {
+                buffer.append(hours);
+                buffer.append(" hours "); //$NON-NLS-1$
+            }
+            if (minutes > 0) {
+                buffer.append(minutes);
+                buffer.append(" minutes "); //$NON-NLS-1$
+            }
+            buffer.append(seconds);
+            buffer.append(" seconds"); //$NON-NLS-1$
+            return buffer.toString();
+        }
+
+        private long getTimestamps(int counter) {
+            for (int i = 0; i <= this.counterIndex; i++) {
+                if (this.counters[i] >= counter) {
+                    return this.timestamps[i];
+                }
+            }
+            return -1;
+        }
+
+        public synchronized String printStats() {
+            int numberOfElements = LRUCache.this.currentSpace;
+            if (numberOfElements == 0) {
+                return "No elements in cache"; //$NON-NLS-1$
+            }
+            StringBuffer buffer = new StringBuffer();
+
+            buffer.append("Number of elements in cache: "); //$NON-NLS-1$
+            buffer.append(numberOfElements);
+
+            final int numberOfGroups = 5;
+            int numberOfElementsPerGroup = numberOfElements / numberOfGroups;
+            buffer.append("\n("); //$NON-NLS-1$
+            buffer.append(numberOfGroups);
+            buffer.append(" groups of "); //$NON-NLS-1$
+            buffer.append(numberOfElementsPerGroup);
+            buffer.append(" elements)"); //$NON-NLS-1$
+            buffer.append("\n\nAverage age:"); //$NON-NLS-1$
+            int groupNumber = 1;
+            int elementCounter = 0;
+            LRUCacheEntry entry = LRUCache.this.entryQueueTail;
+            long currentTime = System.currentTimeMillis();
+            long accumulatedTime = 0;
+            while (entry != null) {
+                long timeStamps = getTimestamps(entry.timestamp);
+                if (timeStamps > 0) {
+                    accumulatedTime += timeStamps;
+                    elementCounter++;
+                }
+                if (elementCounter >= numberOfElementsPerGroup && (groupNumber < numberOfGroups)) {
+                    buffer.append("\nGroup "); //$NON-NLS-1$
+                    buffer.append(groupNumber);
+                    if (groupNumber == 1) {
+                        buffer.append(" (oldest)\t: "); //$NON-NLS-1$
+                    } else {
+                        buffer.append("\t\t: "); //$NON-NLS-1$
+                    }
+                    groupNumber++;
+                    buffer.append(getAverageAge(accumulatedTime, elementCounter, currentTime));
+                    elementCounter = 0;
+                    accumulatedTime = 0;
+                }
+                entry = entry.previous;
+            }
+            buffer.append("\nGroup "); //$NON-NLS-1$
+            buffer.append(numberOfGroups);
+            buffer.append(" (youngest)\t: "); //$NON-NLS-1$
+            buffer.append(getAverageAge(accumulatedTime, elementCounter, currentTime));
+
+            return buffer.toString();
+        }
+
+        private void removeCountersOlderThan(int counter) {
+            for (int i = 0; i <= this.counterIndex; i++) {
+                if (this.counters[i] >= counter) {
+                    if (i > 0) {
+                        int length = this.counterIndex - i + 1;
+                        System.arraycopy(this.counters, i, this.counters, 0, length);
+                        System.arraycopy(this.timestamps, i, this.timestamps, 0, length);
+                        this.counterIndex = length;
+                    }
+                    return;
+                }
+            }
+        }
+
+        public Object getOldestElement() {
+            return LRUCache.this.getOldestElement();
+        }
+
+        public long getOldestTimestamps() {
+            return getTimestamps(getOldestTimestampCounter());
+        }
+
+        public synchronized void snapshot() {
+            removeCountersOlderThan(getOldestTimestampCounter());
+            add(getNewestTimestampCounter());
+        }
+    }
+
+    /**
+     * Amount of cache space used so far
+     */
+    protected int currentSpace;
+
+    /**
+     * Maximum space allowed in cache
+     */
+    protected int spaceLimit;
+
+    /**
+     * Counter for handing out sequential timestamps
+     */
+    protected int timestampCounter;
+
+    /**
+     * Hash table for fast random access to cache entries
+     */
+    protected Hashtable entryTable;
+
+    /**
+     * Start of queue (most recently used entry)
+     */
+    protected LRUCacheEntry entryQueue;
+
+    /**
+     * End of queue (least recently used entry)
+     */
+    protected LRUCacheEntry entryQueueTail;
+
+    /**
+     * Default amount of space in the cache
+     */
+    protected static final int DEFAULT_SPACELIMIT = 100;
+
+    /**
+     * Creates a new cache. Size of cache is defined by <code>DEFAULT_SPACELIMIT</code>.
+     */
+    public LRUCache() {
+
+        this(DEFAULT_SPACELIMIT);
+    }
+
+    /**
+     * Creates a new cache.
+     *
+     * @param size Size of Cache
+     */
+    public LRUCache(int size) {
+
+        this.timestampCounter = this.currentSpace = 0;
+        this.entryQueue = this.entryQueueTail = null;
+        this.entryTable = new Hashtable(size);
+        this.spaceLimit = size;
+    }
+
+    /**
+     * Returns a new cache containing the same contents.
+     *
+     * @return New copy of object.
+     */
+    @Override
+    public Object clone() {
+
+        LRUCache newCache = newInstance(this.spaceLimit);
+        LRUCacheEntry qEntry;
+
+        /* Preserve order of entries by copying from oldest to newest */
+        qEntry = this.entryQueueTail;
+        while (qEntry != null) {
+            newCache.privateAdd(qEntry.key, qEntry.value, qEntry.space);
+            qEntry = qEntry.previous;
+        }
+        return newCache;
+    }
+
+    public double fillingRatio() {
+        return (this.currentSpace) * 100.0 / this.spaceLimit;
+    }
+
+    /**
+     * Flushes all entries from the cache.
+     */
+    public void flush() {
+
+        this.currentSpace = 0;
+        LRUCacheEntry entry = this.entryQueueTail; // Remember last entry
+        this.entryTable = new Hashtable(); // Clear it out
+        this.entryQueue = this.entryQueueTail = null;
+        while (entry != null) { // send deletion notifications in LRU order
+            entry = entry.previous;
+        }
+    }
+
+    /**
+     * Flushes the given entry from the cache. Does nothing if entry does not exist in cache.
+     *
+     * @param key Key of object to flush
+     */
+    public void flush(Object key) {
+
+        LRUCacheEntry entry;
+
+        entry = (LRUCacheEntry) this.entryTable.get(key);
+
+        /* If entry does not exist, return */
+        if (entry == null) {
+            return;
+        }
+
+        privateRemoveEntry(entry, false);
+    }
+
+    /*
+     * Answers the existing key that is equals to the given key. If the key is not in the cache,
+     * returns the given key
+     */
+    public Object getKey(Object key) {
+        LRUCacheEntry entry = (LRUCacheEntry) this.entryTable.get(key);
+        if (entry == null) {
+            return key;
+        }
+        return entry.key;
+    }
+
+    /**
+     * Answers the value in the cache at the given key. If the value is not in the cache, returns
+     * null
+     *
+     * @param key Hash table key of object to retrieve
+     * @return Retreived object, or null if object does not exist
+     */
+    public Object get(Object key) {
+
+        LRUCacheEntry entry = (LRUCacheEntry) this.entryTable.get(key);
+        if (entry == null) {
+            return null;
+        }
+
+        updateTimestamp(entry);
+        return entry.value;
+    }
+
+    /**
+     * Returns the amount of space that is current used in the cache.
+     */
+    public int getCurrentSpace() {
+        return this.currentSpace;
+    }
+
+    /**
+     * Returns the timestamps of the most recently used element in the cache.
+     */
+    public int getNewestTimestampCounter() {
+        return this.entryQueue == null ? 0 : this.entryQueue.timestamp;
+    }
+
+    /**
+     * Returns the timestamps of the least recently used element in the cache.
+     */
+    public int getOldestTimestampCounter() {
+        return this.entryQueueTail == null ? 0 : this.entryQueueTail.timestamp;
+    }
+
+    /**
+     * Returns the lest recently used element in the cache
+     */
+    public Object getOldestElement() {
+        return this.entryQueueTail == null ? null : this.entryQueueTail.key;
+    }
+
+    /**
+     * Returns the maximum amount of space available in the cache.
+     */
+    public int getSpaceLimit() {
+        return this.spaceLimit;
+    }
+
+    /**
+     * Returns an Enumeration of the keys currently in the cache.
+     */
+    public Enumeration keys() {
+
+        return this.entryTable.keys();
+    }
+
+    /**
+     * Returns an enumeration that iterates over all the keys and values currently in the cache.
+     */
+    public ICacheEnumeration keysAndValues() {
+        return new ICacheEnumeration() {
+
+            Enumeration values = LRUCache.this.entryTable.elements();
+            LRUCacheEntry entry;
+
+            @Override
+            public boolean hasMoreElements() {
+                return this.values.hasMoreElements();
+            }
+
+            @Override
+            public Object nextElement() {
+                this.entry = (LRUCacheEntry) this.values.nextElement();
+                return this.entry.key;
+            }
+
+            @Override
+            public Object getValue() {
+                if (this.entry == null) {
+                    throw new java.util.NoSuchElementException();
+                }
+                return this.entry.value;
+            }
+        };
+    }
+
+    /**
+     * Ensures there is the specified amount of free space in the receiver, by removing old entries
+     * if necessary. Returns true if the requested space was made available, false otherwise.
+     *
+     * @param space Amount of space to free up
+     */
+    protected boolean makeSpace(int space) {
+
+        int limit;
+
+        limit = getSpaceLimit();
+
+        /* if space is already available */
+        if (this.currentSpace + space <= limit) {
+            return true;
+        }
+
+        /* if entry is too big for cache */
+        if (space > limit) {
+            return false;
+        }
+
+        /* Free up space by removing oldest entries */
+        while (this.currentSpace + space > limit && this.entryQueueTail != null) {
+            privateRemoveEntry(this.entryQueueTail, false);
+        }
+        return true;
+    }
+
+    /**
+     * Returns a new LRUCache instance
+     */
+    protected LRUCache newInstance(int size) {
+        return new LRUCache(size);
+    }
+
+    /**
+     * Answers the value in the cache at the given key. If the value is not in the cache, returns
+     * null This function does not modify timestamps.
+     */
+    public Object peek(Object key) {
+
+        LRUCacheEntry entry = (LRUCacheEntry) this.entryTable.get(key);
+        if (entry == null) {
+            return null;
+        }
+        return entry.value;
+    }
+
+    /**
+     * Adds an entry for the given key/value/space.
+     */
+    protected void privateAdd(Object key, Object value, int space) {
+
+        LRUCacheEntry entry;
+
+        entry = new LRUCacheEntry(key, value, space);
+        privateAddEntry(entry, false);
+    }
+
+    /**
+     * Adds the given entry from the receiver.
+     *
+     * @param shuffle Indicates whether we are just shuffling the queue (in which case, the entry
+     * table is not modified).
+     */
+    protected void privateAddEntry(LRUCacheEntry entry, boolean shuffle) {
+
+        if (!shuffle) {
+            this.entryTable.put(entry.key, entry);
+            this.currentSpace += entry.space;
+        }
+
+        entry.timestamp = this.timestampCounter++;
+        entry.next = this.entryQueue;
+        entry.previous = null;
+
+        if (this.entryQueue == null) {
+            /* this is the first and last entry */
+            this.entryQueueTail = entry;
+        } else {
+            this.entryQueue.previous = entry;
+        }
+
+        this.entryQueue = entry;
+    }
+
+    /**
+     * Removes the entry from the entry queue.
+     *
+     * @param shuffle indicates whether we are just shuffling the queue (in which case, the entry
+     * table is not modified).
+     */
+    protected void privateRemoveEntry(LRUCacheEntry entry, boolean shuffle) {
+
+        LRUCacheEntry previous, next;
+
+        previous = entry.previous;
+        next = entry.next;
+
+        if (!shuffle) {
+            this.entryTable.remove(entry.key);
+            this.currentSpace -= entry.space;
+        }
+
+        /* if this was the first entry */
+        if (previous == null) {
+            this.entryQueue = next;
+        } else {
+            previous.next = next;
+        }
+
+        /* if this was the last entry */
+        if (next == null) {
+            this.entryQueueTail = previous;
+        } else {
+            next.previous = previous;
+        }
+    }
+
+    /**
+     * Sets the value in the cache at the given key. Returns the value.
+     *
+     * @param key Key of object to add.
+     * @param value Value of object to add.
+     * @return added value.
+     */
+    public Object put(Object key, Object value) {
+
+        int newSpace, oldSpace, newTotal;
+        LRUCacheEntry entry;
+
+        /* Check whether there's an entry in the cache */
+        newSpace = spaceFor(value);
+        entry = (LRUCacheEntry) this.entryTable.get(key);
+
+        if (entry != null) {
+
+            /**
+             * Replace the entry in the cache if it would not overflow the cache. Otherwise flush
+             * the entry and re-add it so as to keep cache within budget
+             */
+            oldSpace = entry.space;
+            newTotal = getCurrentSpace() - oldSpace + newSpace;
+            if (newTotal <= getSpaceLimit()) {
+                updateTimestamp(entry);
+                entry.value = value;
+                entry.space = newSpace;
+                this.currentSpace = newTotal;
+                return value;
+            } else {
+                privateRemoveEntry(entry, false);
+            }
+        }
+        if (makeSpace(newSpace)) {
+            privateAdd(key, value, newSpace);
+        }
+        return value;
+    }
+
+    /**
+     * Removes and returns the value in the cache for the given key. If the key is not in the cache,
+     * returns null.
+     *
+     * @param key Key of object to remove from cache.
+     * @return Value removed from cache.
+     */
+    public Object removeKey(Object key) {
+
+        LRUCacheEntry entry = (LRUCacheEntry) this.entryTable.get(key);
+        if (entry == null) {
+            return null;
+        }
+        Object value = entry.value;
+        privateRemoveEntry(entry, false);
+        return value;
+    }
+
+    /**
+     * Sets the maximum amount of space that the cache can store
+     *
+     * @param limit Number of units of cache space
+     */
+    public void setSpaceLimit(int limit) {
+        if (limit < this.spaceLimit) {
+            makeSpace(this.spaceLimit - limit);
+        }
+        this.spaceLimit = limit;
+    }
+
+    /**
+     * Returns the space taken by the given value.
+     */
+    protected int spaceFor(Object value) {
+
+        if (value instanceof ILRUCacheable) {
+            return ((ILRUCacheable) value).getCacheFootprint();
+        } else {
+            return 1;
+        }
+    }
+
+    /**
+     * Returns a String that represents the value of this object. This method is for debugging
+     * purposes only.
+     */
+    @Override
+    public String toString() {
+        return toStringFillingRation("LRUCache") + //$NON-NLS-1$
+                toStringContents();
+    }
+
+    /**
+     * Returns a String that represents the contents of this object. This method is for debugging
+     * purposes only.
+     */
+    protected String toStringContents() {
+        StringBuffer result = new StringBuffer();
+        int length = this.entryTable.size();
+        Object[] unsortedKeys = new Object[length];
+        String[] unsortedToStrings = new String[length];
+        Enumeration e = keys();
+        for (int i = 0; i < length; i++) {
+            Object key = e.nextElement();
+            unsortedKeys[i] = key;
+            unsortedToStrings[i] = (key instanceof YangElement) ? ((YangElement) key).getName() : key.toString();
+        }
+        ToStringSorter sorter = new ToStringSorter();
+        sorter.sort(unsortedKeys, unsortedToStrings);
+        for (int i = 0; i < length; i++) {
+            String toString = sorter.sortedStrings[i];
+            Object value = get(sorter.sortedObjects[i]);
+            result.append(toString);
+            result.append(" -> "); //$NON-NLS-1$
+            result.append(value);
+            result.append("\n"); //$NON-NLS-1$
+        }
+        return result.toString();
+    }
+
+    public String toStringFillingRation(String cacheName) {
+        StringBuffer buffer = new StringBuffer(cacheName);
+        buffer.append('[');
+        buffer.append(getSpaceLimit());
+        buffer.append("]: "); //$NON-NLS-1$
+        buffer.append(NumberFormat.getInstance().format(fillingRatio()));
+        buffer.append("% full"); //$NON-NLS-1$
+        return buffer.toString();
+    }
+
+    /**
+     * Updates the timestamp for the given entry, ensuring that the queue is kept in correct order.
+     * The entry must exist
+     */
+    protected void updateTimestamp(LRUCacheEntry entry) {
+
+        entry.timestamp = this.timestampCounter++;
+        if (this.entryQueue != entry) {
+            privateRemoveEntry(entry, true);
+            privateAddEntry(entry, true);
+        }
+        return;
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/LRUCacheEnumerator.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/LRUCacheEnumerator.java
new file mode 100644 (file)
index 0000000..7fe352c
--- /dev/null
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.buffer;
+
+import java.util.Enumeration;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 24, 2014
+ */
+@SuppressWarnings({ "rawtypes" })
+public class LRUCacheEnumerator implements Enumeration {
+    /**
+     * Current element;
+     */
+    protected LRUEnumeratorElement elementQueue;
+
+    public static class LRUEnumeratorElement {
+        /**
+         * Value returned by <code>nextElement()</code>;
+         */
+        public Object value;
+
+        /**
+         * Next element
+         */
+        public LRUEnumeratorElement next;
+
+        /**
+         * Constructor
+         */
+        public LRUEnumeratorElement(Object value) {
+            this.value = value;
+        }
+    }
+
+    /**
+     * Creates a CacheEnumerator on the list of <code>LRUEnumeratorElements</code>.
+     */
+    public LRUCacheEnumerator(LRUEnumeratorElement firstElement) {
+        this.elementQueue = firstElement;
+    }
+
+    /**
+     * Returns true if more elements exist.
+     */
+    public boolean hasMoreElements() {
+        return this.elementQueue != null;
+    }
+
+    /**
+     * Returns the next element.
+     */
+    public Object nextElement() {
+        Object temp = this.elementQueue.value;
+        this.elementQueue = this.elementQueue.next;
+        return temp;
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/NullBuffer.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/NullBuffer.java
new file mode 100644 (file)
index 0000000..2d110a3
--- /dev/null
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.buffer;
+
+import org.eclipse.core.resources.IFile;
+
+import com.cisco.yangide.core.IOpenable;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 24, 2014
+ */
+public class NullBuffer extends Buffer {
+
+    /**
+     * Creates a new null buffer on an underlying resource.
+     */
+    public NullBuffer(IFile file, IOpenable owner, boolean readOnly) {
+        super(file, owner, readOnly);
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/OverflowingLRUCache.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/OverflowingLRUCache.java
new file mode 100644 (file)
index 0000000..2879100
--- /dev/null
@@ -0,0 +1,421 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.buffer;
+
+import java.util.Enumeration;
+import java.util.Iterator;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 24, 2014
+ */
+@SuppressWarnings({ "rawtypes", "unchecked" })
+public abstract class OverflowingLRUCache extends LRUCache {
+    /**
+     * Indicates if the cache has been over filled and by how much.
+     */
+    protected int overflow = 0;
+    /**
+     * Indicates whether or not timestamps should be updated
+     */
+    protected boolean timestampsOn = true;
+    /**
+     * Indicates how much space should be reclaimed when the cache overflows. Inital load factor of
+     * one third.
+     */
+    protected double loadFactor = 0.333;
+
+    /**
+     * Creates a OverflowingLRUCache.
+     *
+     * @param size Size limit of cache.
+     */
+    public OverflowingLRUCache(int size) {
+        this(size, 0);
+    }
+
+    /**
+     * Creates a OverflowingLRUCache.
+     *
+     * @param size Size limit of cache.
+     * @param overflow Size of the overflow.
+     */
+    public OverflowingLRUCache(int size, int overflow) {
+        super(size);
+        this.overflow = overflow;
+    }
+
+    /**
+     * Returns a new cache containing the same contents.
+     *
+     * @return New copy of this object.
+     */
+    @Override
+    public Object clone() {
+
+        OverflowingLRUCache newCache = (OverflowingLRUCache) newInstance(this.spaceLimit, this.overflow);
+        LRUCacheEntry qEntry;
+
+        /* Preserve order of entries by copying from oldest to newest */
+        qEntry = this.entryQueueTail;
+        while (qEntry != null) {
+            newCache.privateAdd(qEntry.key, qEntry.value, qEntry.space);
+            qEntry = qEntry.previous;
+        }
+        return newCache;
+    }
+
+    /**
+     * Returns true if the element is successfully closed and removed from the cache, otherwise
+     * false.
+     * <p>
+     * NOTE: this triggers an external remove from the cache by closing the obejct.
+     *
+     * @param entry entry to close
+     * @return true if element is successfully closed and removed from the cache
+     */
+    protected abstract boolean close(LRUCacheEntry entry);
+
+    /**
+     * Returns an enumerator of the values in the cache with the most recently used first.
+     */
+    public Enumeration<?> elements() {
+        if (this.entryQueue == null) {
+            return new LRUCacheEnumerator(null);
+        }
+        LRUCacheEnumerator.LRUEnumeratorElement head = new LRUCacheEnumerator.LRUEnumeratorElement(
+                this.entryQueue.value);
+        LRUCacheEntry currentEntry = this.entryQueue.next;
+        LRUCacheEnumerator.LRUEnumeratorElement currentElement = head;
+        while (currentEntry != null) {
+            currentElement.next = new LRUCacheEnumerator.LRUEnumeratorElement(currentEntry.value);
+            currentElement = currentElement.next;
+
+            currentEntry = currentEntry.next;
+        }
+        return new LRUCacheEnumerator(head);
+    }
+
+    @Override
+    public double fillingRatio() {
+        return (this.currentSpace + this.overflow) * 100.0 / this.spaceLimit;
+    }
+
+    /**
+     * For internal testing only. This method exposed only for testing purposes!
+     *
+     * @return Hashtable of entries
+     */
+    public java.util.Hashtable getEntryTable() {
+        return this.entryTable;
+    }
+
+    /**
+     * Returns the load factor for the cache. The load factor determines how much space is reclaimed
+     * when the cache exceeds its space limit.
+     *
+     * @return double
+     */
+    public double getLoadFactor() {
+        return this.loadFactor;
+    }
+
+    /**
+     * @return The space by which the cache has overflown.
+     */
+    public int getOverflow() {
+        return this.overflow;
+    }
+
+    /**
+     * Ensures there is the specified amount of free space in the receiver, by removing old entries
+     * if necessary. Returns true if the requested space was made available, false otherwise. May
+     * not be able to free enough space since some elements cannot be removed until they are saved.
+     *
+     * @param space Amount of space to free up
+     */
+    @Override
+    protected boolean makeSpace(int space) {
+
+        int limit = this.spaceLimit;
+        if (this.overflow == 0 && this.currentSpace + space <= limit) {
+            /* if space is already available */
+            return true;
+        }
+
+        /* Free up space by removing oldest entries */
+        int spaceNeeded = (int) ((1 - this.loadFactor) * limit);
+        spaceNeeded = (spaceNeeded > space) ? spaceNeeded : space;
+        LRUCacheEntry entry = this.entryQueueTail;
+
+        try {
+            // disable timestamps update while making space so that the previous and next links are
+            // not changed
+            // (by a call to get(Object) for example)
+            this.timestampsOn = false;
+
+            while (this.currentSpace + spaceNeeded > limit && entry != null) {
+                this.privateRemoveEntry(entry, false, false);
+                entry = entry.previous;
+            }
+        } finally {
+            this.timestampsOn = true;
+        }
+
+        /* check again, since we may have aquired enough space */
+        if (this.currentSpace + space <= limit) {
+            this.overflow = 0;
+            return true;
+        }
+
+        /* update fOverflow */
+        this.overflow = this.currentSpace + space - limit;
+        return false;
+    }
+
+    /**
+     * Returns a new instance of the reciever.
+     */
+    protected abstract LRUCache newInstance(int size, int newOverflow);
+
+    /**
+     * For testing purposes only
+     */
+    public void printStats() {
+        int forwardListLength = 0;
+        LRUCacheEntry entry = this.entryQueue;
+        while (entry != null) {
+            forwardListLength++;
+            entry = entry.next;
+        }
+        System.out.println("Forward length: " + forwardListLength); //$NON-NLS-1$
+
+        int backwardListLength = 0;
+        entry = this.entryQueueTail;
+        while (entry != null) {
+            backwardListLength++;
+            entry = entry.previous;
+        }
+        System.out.println("Backward length: " + backwardListLength); //$NON-NLS-1$
+
+        Enumeration keys = this.entryTable.keys();
+        class Temp {
+            public Class clazz;
+            public int count;
+
+            public Temp(Class aClass) {
+                this.clazz = aClass;
+                this.count = 1;
+            }
+
+            @Override
+            public String toString() {
+                return "Class: " + this.clazz + " has " + this.count + " entries."; //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-1$
+            }
+        }
+        java.util.HashMap h = new java.util.HashMap();
+        while (keys.hasMoreElements()) {
+            entry = (LRUCacheEntry) this.entryTable.get(keys.nextElement());
+            Class key = entry.value.getClass();
+            Temp t = (Temp) h.get(key);
+            if (t == null) {
+                h.put(key, new Temp(key));
+            } else {
+                t.count++;
+            }
+        }
+
+        for (Iterator iter = h.values().iterator(); iter.hasNext();) {
+            System.out.println(iter.next());
+        }
+    }
+
+    /**
+     * Removes the entry from the entry queue. Calls <code>privateRemoveEntry</code> with the
+     * external functionality enabled.
+     *
+     * @param shuffle indicates whether we are just shuffling the queue (in which case, the entry
+     * table is not modified).
+     */
+    @Override
+    protected void privateRemoveEntry(LRUCacheEntry entry, boolean shuffle) {
+        privateRemoveEntry(entry, shuffle, true);
+    }
+
+    /**
+     * Removes the entry from the entry queue. If <i>external</i> is true, the entry is removed
+     * without checking if it can be removed. It is assumed that the client has already closed the
+     * element it is trying to remove (or will close it promptly). If <i>external</i> is false, and
+     * the entry could not be closed, it is not removed and the pointers are not changed.
+     *
+     * @param shuffle indicates whether we are just shuffling the queue (in which case, the entry
+     * table is not modified).
+     */
+    protected void privateRemoveEntry(LRUCacheEntry entry, boolean shuffle, boolean external) {
+
+        if (!shuffle) {
+            if (external) {
+                this.entryTable.remove(entry.key);
+                this.currentSpace -= entry.space;
+            } else {
+                if (!close(entry)) {
+                    return;
+                }
+                // buffer close will recursively call #privateRemoveEntry with external==true
+                // thus entry will already be removed if reaching this point.
+                if (this.entryTable.get(entry.key) == null) {
+                    return;
+                } else {
+                    // basic removal
+                    this.entryTable.remove(entry.key);
+                    this.currentSpace -= entry.space;
+                }
+            }
+        }
+        LRUCacheEntry previous = entry.previous;
+        LRUCacheEntry next = entry.next;
+
+        /* if this was the first entry */
+        if (previous == null) {
+            this.entryQueue = next;
+        } else {
+            previous.next = next;
+        }
+        /* if this was the last entry */
+        if (next == null) {
+            this.entryQueueTail = previous;
+        } else {
+            next.previous = previous;
+        }
+    }
+
+    /**
+     * Sets the value in the cache at the given key. Returns the value.
+     *
+     * @param key Key of object to add.
+     * @param value Value of object to add.
+     * @return added value.
+     */
+    @Override
+    public Object put(Object key, Object value) {
+        /* attempt to rid ourselves of the overflow, if there is any */
+        if (this.overflow > 0) {
+            shrink();
+        }
+
+        /* Check whether there's an entry in the cache */
+        int newSpace = spaceFor(value);
+        LRUCacheEntry entry = (LRUCacheEntry) this.entryTable.get(key);
+
+        if (entry != null) {
+
+            /**
+             * Replace the entry in the cache if it would not overflow the cache. Otherwise flush
+             * the entry and re-add it so as to keep cache within budget
+             */
+            int oldSpace = entry.space;
+            int newTotal = this.currentSpace - oldSpace + newSpace;
+            if (newTotal <= this.spaceLimit) {
+                updateTimestamp(entry);
+                entry.value = value;
+                entry.space = newSpace;
+                this.currentSpace = newTotal;
+                this.overflow = 0;
+                return value;
+            } else {
+                privateRemoveEntry(entry, false, false);
+            }
+        }
+
+        // attempt to make new space
+        makeSpace(newSpace);
+
+        // add without worring about space, it will
+        // be handled later in a makeSpace call
+        privateAdd(key, value, newSpace);
+
+        return value;
+    }
+
+    /**
+     * Removes and returns the value in the cache for the given key. If the key is not in the cache,
+     * returns null.
+     *
+     * @param key Key of object to remove from cache.
+     * @return Value removed from cache.
+     */
+    public Object remove(Object key) {
+        return removeKey(key);
+    }
+
+    /**
+     * Sets the load factor for the cache. The load factor determines how much space is reclaimed
+     * when the cache exceeds its space limit.
+     *
+     * @param newLoadFactor double
+     * @throws IllegalArgumentException when the new load factor is not in (0.0, 1.0]
+     */
+    public void setLoadFactor(double newLoadFactor) throws IllegalArgumentException {
+        if (newLoadFactor <= 1.0 && newLoadFactor > 0.0) {
+            this.loadFactor = newLoadFactor;
+        } else {
+            throw new IllegalArgumentException("Invalid load factor");
+        }
+    }
+
+    /**
+     * Sets the maximum amount of space that the cache can store
+     *
+     * @param limit Number of units of cache space
+     */
+    @Override
+    public void setSpaceLimit(int limit) {
+        if (limit < this.spaceLimit) {
+            makeSpace(this.spaceLimit - limit);
+        }
+        this.spaceLimit = limit;
+    }
+
+    /**
+     * Attempts to shrink the cache if it has overflown. Returns true if the cache shrinks to less
+     * than or equal to <code>fSpaceLimit</code>.
+     */
+    public boolean shrink() {
+        if (this.overflow > 0) {
+            return makeSpace(0);
+        }
+        return true;
+    }
+
+    /**
+     * Returns a String that represents the value of this object. This method is for debugging
+     * purposes only.
+     */
+    @Override
+    public String toString() {
+        return toStringFillingRation("OverflowingLRUCache ") + //$NON-NLS-1$
+                toStringContents();
+    }
+
+    /**
+     * Updates the timestamp for the given entry, ensuring that the queue is kept in correct order.
+     * The entry must exist.
+     * <p>
+     * This method will do nothing if timestamps have been disabled.
+     */
+    @Override
+    protected void updateTimestamp(LRUCacheEntry entry) {
+        if (this.timestampsOn) {
+            entry.timestamp = this.timestampCounter++;
+            if (this.entryQueue != entry) {
+                this.privateRemoveEntry(entry, true);
+                privateAddEntry(entry, true);
+            }
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/ToStringSorter.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/buffer/ToStringSorter.java
new file mode 100644 (file)
index 0000000..dca8cae
--- /dev/null
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.buffer;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 24, 2014
+ */
+public class ToStringSorter {
+    Object[] sortedObjects;
+    String[] sortedStrings;
+
+    /**
+     * Returns true if stringTwo is 'greater than' stringOne This is the 'ordering' method of the
+     * sort operation.
+     */
+    public boolean compare(String stringOne, String stringTwo) {
+        return stringOne.compareTo(stringTwo) < 0;
+    }
+
+    /**
+     * Sort the objects in sorted collection and return that collection.
+     */
+    private void quickSort(int left, int right) {
+        int originalLeft = left;
+        int originalRight = right;
+        int midIndex = left + (right - left) / 2;
+        String midToString = this.sortedStrings[midIndex];
+
+        do {
+            while (compare(this.sortedStrings[left], midToString))
+                left++;
+            while (compare(midToString, this.sortedStrings[right]))
+                right--;
+            if (left <= right) {
+                Object tmp = this.sortedObjects[left];
+                this.sortedObjects[left] = this.sortedObjects[right];
+                this.sortedObjects[right] = tmp;
+                String tmpToString = this.sortedStrings[left];
+                this.sortedStrings[left] = this.sortedStrings[right];
+                this.sortedStrings[right] = tmpToString;
+                left++;
+                right--;
+            }
+        } while (left <= right);
+
+        if (originalLeft < right)
+            quickSort(originalLeft, right);
+        if (left < originalRight)
+            quickSort(left, originalRight);
+    }
+
+    /**
+     * Return a new sorted collection from this unsorted collection. Sort using quick sort.
+     */
+    public void sort(Object[] unSortedObjects, String[] unsortedStrings) {
+        int size = unSortedObjects.length;
+        this.sortedObjects = new Object[size];
+        this.sortedStrings = new String[size];
+
+        // copy the array so can return a new sorted collection
+        System.arraycopy(unSortedObjects, 0, this.sortedObjects, 0, size);
+        System.arraycopy(unsortedStrings, 0, this.sortedStrings, 0, size);
+        if (size > 1)
+            quickSort(0, size - 1);
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/ASTCompositeNode.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/ASTCompositeNode.java
new file mode 100644 (file)
index 0000000..7d80db9
--- /dev/null
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 8, 2014
+ */
+public abstract class ASTCompositeNode extends ASTNamedNode {
+    private List<ASTNode> children;
+
+    /**
+     * @param parent
+     */
+    public ASTCompositeNode(ASTNode parent) {
+        super(parent);
+        children = new ArrayList<>();
+    }
+
+    /**
+     * @return the children
+     */
+    public List<ASTNode> getChildren() {
+        return children;
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/ASTNamedNode.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/ASTNamedNode.java
new file mode 100644 (file)
index 0000000..53225e2
--- /dev/null
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 26, 2014
+ */
+public abstract class ASTNamedNode extends ASTNode {
+
+    private String name;
+
+    private int nameStartPosition = -1;
+    private int nameLength = 0;
+
+    public ASTNamedNode(ASTNode parent) {
+        this(parent, null);
+    }
+
+    public ASTNamedNode(ASTNode parent, String name) {
+        super(parent);
+        this.name = name;
+    }
+
+    /**
+     * @return the name
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * @param name the name to set
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * @return the nameStartPosition
+     */
+    public int getNameStartPosition() {
+        return nameStartPosition;
+    }
+
+    /**
+     * @param nameStartPosition the nameStartPosition to set
+     */
+    public void setNameStartPosition(int nameStartPosition) {
+        this.nameStartPosition = nameStartPosition;
+    }
+
+    /**
+     * @return the nameLength
+     */
+    public int getNameLength() {
+        return nameLength;
+    }
+
+    /**
+     * @param nameLength the nameLength to set
+     */
+    public void setNameLength(int nameLength) {
+        this.nameLength = nameLength;
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/ASTNode.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/ASTNode.java
new file mode 100644 (file)
index 0000000..5ab58bf
--- /dev/null
@@ -0,0 +1,303 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+import java.util.Collection;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 26, 2014
+ */
+public abstract class ASTNode {
+
+    /** Common field "description" for Yang statement. */
+    private SimpleNode<String> descriptionNode;
+
+    /** Common field "reference" for Yang statement. */
+    private SimpleNode<String> referenceNode;
+
+    /** Common field "status" for Yang statement. */
+    private SimpleNode<String> statusNode;
+
+    /**
+     * A character index into the original source string, or <code>-1</code> if no source position
+     * information is available for this node; <code>-1</code> by default.
+     */
+    private int startPosition = -1;
+
+    /**
+     * A character length, or <code>0</code> if no source position information is recorded for this
+     * node; <code>0</code> by default.
+     */
+    private int length = 0;
+
+    /** Line number. */
+    private int lineNumber = -1;
+
+    /** Start position of AST node body '{' or '"'. */
+    private int bodyStartPosition = -1;
+
+    /** Parent AST node. */
+    private ASTNode parent = null;
+
+    /**
+     * Flag constant (bit mask, value 1) indicating that there is something not quite right with
+     * this AST node.
+     * <p>
+     * The standard parser (<code>ASTParser</code>) SHOULD set this flag on a node to indicate a
+     * syntax error detected in the vicinity.
+     * </p>
+     */
+    public static final int MALFORMED = 1;
+
+    public static final int VALID = 0;
+
+    /**
+     * int containing the node type in the top 16 bits and flags in the bottom 16 bits; none set by
+     * default.
+     * <p>
+     * N.B. This is a private field, but declared as package-visible for more efficient access from
+     * inner classes.
+     * </p>
+     *
+     * @see #MALFORMED
+     */
+    int typeAndFlags = 0;
+
+    /**
+     * Returns the flags associated with this node.
+     * <p>
+     * No flags are associated with newly created nodes.
+     * </p>
+     * <p>
+     * The flags are the bitwise-or of individual flags. The following flags are currently defined:
+     * <ul>
+     * <li>{@link #MALFORMED} - indicates node is syntactically malformed</li>
+     * </ul>
+     * Other bit positions are reserved for future use.
+     * </p>
+     *
+     * @return the bitwise-or of individual flags
+     * @see #setFlags(int)
+     */
+    public final int getFlags() {
+        return this.typeAndFlags & 0xFFFF;
+    }
+
+    /**
+     * Sets the flags associated with this node to the given value.
+     * <p>
+     * The flags are the bitwise-or of individual flags. The following flags are currently defined:
+     * <ul>
+     * <li>{@link #MALFORMED} - indicates node is syntactically malformed</li>
+     * </ul>
+     * Other bit positions are reserved for future use.
+     * </p>
+     * <p>
+     * Note that the flags are <em>not</em> considered a structural property of the node, and can be
+     * changed even if the node is marked as protected.
+     * </p>
+     *
+     * @param flags the bitwise-or of individual flags
+     * @see #getFlags()
+     */
+    public final void setFlags(int flags) {
+        int old = this.typeAndFlags & 0xFFFF0000;
+        this.typeAndFlags = old | (flags & 0xFFFF);
+    }
+
+    public ASTNode(ASTNode parent) {
+        this.parent = parent;
+        if (parent instanceof ASTCompositeNode) {
+            ((ASTCompositeNode) parent).getChildren().add(this);
+        }
+    }
+
+    /**
+     * @return the startPosition
+     */
+    public int getStartPosition() {
+        return startPosition;
+    }
+
+    /**
+     * @param startPosition the startPosition to set
+     */
+    public void setStartPosition(int startPosition) {
+        this.startPosition = startPosition;
+    }
+
+    /**
+     * @return the length
+     */
+    public int getLength() {
+        return length;
+    }
+
+    /**
+     * @param length the length to set
+     */
+    public void setLength(int length) {
+        this.length = length;
+    }
+
+    public int getEndPosition() {
+        return this.startPosition + this.length;
+    }
+
+    /**
+     * @return the parent
+     */
+    public ASTNode getParent() {
+        return parent;
+    }
+
+    /**
+     * @return the parent module of this node
+     */
+    public ASTNode getModule() {
+        ASTNode module = this;
+        while (module.getParent() != null) {
+            module = module.getParent();
+        }
+        if (module instanceof Module) {
+            return module;
+        }
+
+        return null;
+    }
+
+    /**
+     * @return the description
+     */
+    public String getDescription() {
+        return descriptionNode != null ? descriptionNode.getValue() : null;
+    }
+
+    /**
+     * @return the reference
+     */
+    public String getReference() {
+        return referenceNode != null ? referenceNode.getValue() : null;
+    }
+
+    /**
+     * @return the status
+     */
+    public String getStatus() {
+        return statusNode != null ? statusNode.getValue() : null;
+    }
+
+    /**
+     * @return the lineNumber
+     */
+    public int getLineNumber() {
+        return lineNumber;
+    }
+
+    /**
+     * @param lineNumber the lineNumber to set
+     */
+    public void setLineNumber(int lineNumber) {
+        this.lineNumber = lineNumber;
+    }
+
+    /**
+     * @return the bodyStartPosition
+     */
+    public int getBodyStartPosition() {
+        return bodyStartPosition;
+    }
+
+    /**
+     * @param bodyStartPosition the bodyStartPosition to set
+     */
+    public void setBodyStartPosition(int bodyStartPosition) {
+        this.bodyStartPosition = bodyStartPosition;
+    }
+
+    /**
+     * @return the bodyLenght
+     */
+    public int getBodyLength() {
+        return (bodyStartPosition >= 0 && startPosition >= 0) ? (length - (bodyStartPosition - startPosition) + 1) : 0;
+    }
+
+    /**
+     * @return the bodyEndPosition
+     */
+    public int getBodyEndPosition() {
+        return bodyStartPosition + getBodyLength();
+    }
+
+    /**
+     * @return the name
+     */
+    public abstract String getNodeName();
+
+    public abstract void accept(ASTVisitor visitor);
+
+    final void acceptChild(ASTVisitor visitor, ASTNode child) {
+        if (child == null) {
+            return;
+        }
+        child.accept(visitor);
+    }
+
+    final void acceptChildren(ASTVisitor visitor, Collection<? extends ASTNode> children) {
+        for (ASTNode child : children) {
+            child.accept(visitor);
+        }
+    }
+
+    public boolean isShowedInOutline() {
+        return true;
+    }
+
+    /**
+     * @return the descriptionNode
+     */
+    public SimpleNode<String> getDescriptionNode() {
+        return descriptionNode;
+    }
+
+    /**
+     * @param descriptionNode the descriptionNode to set
+     */
+    public void setDescriptionNode(SimpleNode<String> descriptionNode) {
+        this.descriptionNode = descriptionNode;
+    }
+
+    /**
+     * @return the referenceNode
+     */
+    public SimpleNode<String> getReferenceNode() {
+        return referenceNode;
+    }
+
+    /**
+     * @param referenceNode the referenceNode to set
+     */
+    public void setReferenceNode(SimpleNode<String> referenceNode) {
+        this.referenceNode = referenceNode;
+    }
+
+    /**
+     * @return the statusNode
+     */
+    public SimpleNode<String> getStatusNode() {
+        return statusNode;
+    }
+
+    /**
+     * @param statusNode the statusNode to set
+     */
+    public void setStatusNode(SimpleNode<String> statusNode) {
+        this.statusNode = statusNode;
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/ASTVisitor.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/ASTVisitor.java
new file mode 100644 (file)
index 0000000..55bf782
--- /dev/null
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 2, 2014
+ */
+public abstract class ASTVisitor {
+
+    public boolean visit(Module module) {
+        return true;
+    }
+
+    public boolean visit(SubModule module) {
+        return true;
+    }
+
+    public boolean visit(ModuleImport moduleImport) {
+        return true;
+    }
+
+    public boolean visit(SubModuleInclude subModuleInclude) {
+        return true;
+    }
+
+    public boolean visit(TypeDefinition typeDefinition) {
+        return true;
+    }
+
+    public boolean visit(SimpleNode<?> simpleNode) {
+        return true;
+    }
+
+    public boolean visit(ContrainerSchemaNode container) {
+        return true;
+    }
+
+    public boolean visit(GroupingDefinition grouping) {
+        return true;
+    }
+
+    public boolean visit(LeafSchemaNode leaf) {
+        return true;
+    }
+
+    public boolean visit(UsesNode uses) {
+        return true;
+    }
+
+    public boolean visit(TypeReference typeRef) {
+        return true;
+    }
+
+    public boolean visit(NotificationDefinition notification) {
+        return true;
+    }
+
+    public boolean visit(RpcDefinition rpc) {
+        return true;
+    }
+
+    public boolean visit(FeatureDefinition feature) {
+        return true;
+    }
+
+    public boolean visit(AugmentationSchema augmentation) {
+        return true;
+    }
+
+    public boolean visit(Deviation deviation) {
+        return true;
+    }
+
+    public boolean visit(ExtensionDefinition extension) {
+        return true;
+    }
+
+    public boolean visit(IdentitySchemaNode identity) {
+        return true;
+    }
+
+    public boolean visit(RpcInputNode input) {
+        return true;
+    }
+
+    public boolean visit(RpcOutputNode output) {
+        return true;
+    }
+
+    public boolean visit(BaseReference base) {
+        return true;
+    }
+
+    public boolean visit(LeafListSchemaNode leafListSchemaNode) {
+        return true;
+    }
+
+    public boolean visit(ListSchemaNode listSchemaNode) {
+        return true;
+    }
+
+    public boolean visit(SimpleNamedNode simpleNamedNode) {
+        return true;
+    }
+
+    public boolean visit(ChoiceNode choiceNode) {
+        return true;
+    }
+
+    public boolean visit(ChoiceCaseNode choiceCaseNode) {
+        return true;
+    }
+
+    public boolean visit(AnyXmlSchemaNode anyXmlSchemaNode) {
+        return true;
+    }
+
+    public void preVisit(ASTNode node) {
+
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/AnyXmlSchemaNode.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/AnyXmlSchemaNode.java
new file mode 100644 (file)
index 0000000..445fb9f
--- /dev/null
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 20, 2014
+ */
+public class AnyXmlSchemaNode extends ASTCompositeNode {
+
+    public AnyXmlSchemaNode(ASTNode parent) {
+        super(parent);
+    }
+
+    @Override
+    public String getNodeName() {
+        return "anyxml";
+    }
+
+    @Override
+    public void accept(ASTVisitor visitor) {
+        visitor.preVisit(this);
+        boolean visitChildren = visitor.visit(this);
+        if (visitChildren) {
+            acceptChildren(visitor, getChildren());
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/AugmentationSchema.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/AugmentationSchema.java
new file mode 100644 (file)
index 0000000..1b6d5db
--- /dev/null
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 23, 2014
+ */
+public class AugmentationSchema extends ASTCompositeNode {
+
+    public AugmentationSchema(ASTNode parent) {
+        super(parent);
+    }
+
+    @Override
+    public String getNodeName() {
+        return "augment";
+    }
+
+    @Override
+    public void accept(ASTVisitor visitor) {
+        visitor.preVisit(this);
+        boolean visitChildren = visitor.visit(this);
+        if (visitChildren) {
+            acceptChildren(visitor, getChildren());
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/BaseReference.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/BaseReference.java
new file mode 100644 (file)
index 0000000..1474d6a
--- /dev/null
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 24, 2014
+ */
+public class BaseReference extends ASTNamedNode {
+    private QName type;
+
+    public BaseReference(ASTNode parent) {
+        super(parent);
+    }
+
+    @Override
+    public String getNodeName() {
+        return "base";
+    }
+
+    /**
+     * @param type the type to set
+     */
+    public void setType(QName type) {
+        this.type = type;
+    }
+
+    /**
+     * @return the type
+     */
+    public QName getType() {
+        return type;
+    }
+
+    @Override
+    public void accept(ASTVisitor visitor) {
+        visitor.preVisit(this);
+        visitor.visit(this);
+    }
+
+    @Override
+    public boolean isShowedInOutline() {
+        return false;
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/ChoiceCaseNode.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/ChoiceCaseNode.java
new file mode 100644 (file)
index 0000000..82a55cf
--- /dev/null
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 20, 2014
+ */
+public class ChoiceCaseNode extends ASTCompositeNode {
+
+    public ChoiceCaseNode(ASTNode parent) {
+        super(parent);
+    }
+
+    @Override
+    public String getNodeName() {
+        return "case";
+    }
+
+    @Override
+    public void accept(ASTVisitor visitor) {
+        visitor.preVisit(this);
+        boolean visitChildren = visitor.visit(this);
+        if (visitChildren) {
+            acceptChildren(visitor, getChildren());
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/ChoiceNode.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/ChoiceNode.java
new file mode 100644 (file)
index 0000000..ad46984
--- /dev/null
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 20, 2014
+ */
+public class ChoiceNode extends ASTCompositeNode {
+
+    public ChoiceNode(ASTNode parent) {
+        super(parent);
+    }
+
+    @Override
+    public String getNodeName() {
+        return "choice";
+    }
+
+    @Override
+    public void accept(ASTVisitor visitor) {
+        visitor.preVisit(this);
+        boolean visitChildren = visitor.visit(this);
+        if (visitChildren) {
+            acceptChildren(visitor, getChildren());
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/ContrainerSchemaNode.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/ContrainerSchemaNode.java
new file mode 100644 (file)
index 0000000..73a6d4d
--- /dev/null
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 4, 2014
+ */
+public class ContrainerSchemaNode extends ASTCompositeNode {
+
+    public ContrainerSchemaNode(ASTNode parent) {
+        super(parent);
+    }
+
+    @Override
+    public String getNodeName() {
+        return "container";
+    }
+
+    @Override
+    public void accept(ASTVisitor visitor) {
+        visitor.preVisit(this);
+        boolean visitChildren = visitor.visit(this);
+        if (visitChildren) {
+            acceptChildren(visitor, getChildren());
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/Deviation.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/Deviation.java
new file mode 100644 (file)
index 0000000..e412070
--- /dev/null
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 23, 2014
+ */
+public class Deviation extends ASTCompositeNode {
+
+    public Deviation(ASTNode parent) {
+        super(parent);
+    }
+
+    @Override
+    public String getNodeName() {
+        return "deviation";
+    }
+
+    @Override
+    public void accept(ASTVisitor visitor) {
+        visitor.preVisit(this);
+        boolean visitChildren = visitor.visit(this);
+        if (visitChildren) {
+            acceptChildren(visitor, getChildren());
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/ExtensionDefinition.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/ExtensionDefinition.java
new file mode 100644 (file)
index 0000000..ccb492d
--- /dev/null
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 23, 2014
+ */
+public class ExtensionDefinition extends ASTCompositeNode {
+
+    public ExtensionDefinition(ASTNode parent) {
+        super(parent);
+    }
+
+    @Override
+    public String getNodeName() {
+        return "extension";
+    }
+
+    @Override
+    public void accept(ASTVisitor visitor) {
+        visitor.preVisit(this);
+        boolean visitChildren = visitor.visit(this);
+        if (visitChildren) {
+            acceptChildren(visitor, getChildren());
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/FeatureDefinition.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/FeatureDefinition.java
new file mode 100644 (file)
index 0000000..ce40984
--- /dev/null
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 23, 2014
+ */
+public class FeatureDefinition extends ASTCompositeNode {
+
+    public FeatureDefinition(ASTNode parent) {
+        super(parent);
+    }
+
+    @Override
+    public String getNodeName() {
+        return "feature";
+    }
+
+    @Override
+    public void accept(ASTVisitor visitor) {
+        visitor.preVisit(this);
+        boolean visitChildren = visitor.visit(this);
+        if (visitChildren) {
+            acceptChildren(visitor, getChildren());
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/GroupingDefinition.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/GroupingDefinition.java
new file mode 100644 (file)
index 0000000..f7a2be1
--- /dev/null
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 4, 2014
+ */
+public class GroupingDefinition extends ASTCompositeNode {
+
+    public GroupingDefinition(ASTNode parent) {
+        super(parent);
+    }
+
+    @Override
+    public String getNodeName() {
+        return "grouping";
+    }
+
+    @Override
+    public void accept(ASTVisitor visitor) {
+        visitor.preVisit(this);
+        boolean visitChildren = visitor.visit(this);
+        if (visitChildren) {
+            acceptChildren(visitor, getChildren());
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/IdentitySchemaNode.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/IdentitySchemaNode.java
new file mode 100644 (file)
index 0000000..a695e90
--- /dev/null
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 23, 2014
+ */
+public class IdentitySchemaNode extends ASTNamedNode {
+    private BaseReference base;
+
+    public IdentitySchemaNode(ASTNode parent) {
+        super(parent);
+    }
+
+    @Override
+    public String getNodeName() {
+        return "identity";
+    }
+
+    /**
+     * @return the base
+     */
+    public BaseReference getBase() {
+        return base;
+    }
+
+    /**
+     * @param base the base to set
+     */
+    public void setBase(BaseReference base) {
+        this.base = base;
+    }
+
+    @Override
+    public void accept(ASTVisitor visitor) {
+        visitor.preVisit(this);
+        visitor.visit(this);
+        if (base != null) {
+            base.accept(visitor);
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/LeafListSchemaNode.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/LeafListSchemaNode.java
new file mode 100644 (file)
index 0000000..3f07ad3
--- /dev/null
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 20, 2014
+ */
+public class LeafListSchemaNode extends ASTCompositeNode {
+
+    public LeafListSchemaNode(ASTNode parent) {
+        super(parent);
+    }
+
+    @Override
+    public String getNodeName() {
+        return "leaf-list";
+    }
+
+    @Override
+    public void accept(ASTVisitor visitor) {
+        visitor.preVisit(this);
+        boolean visitChildren = visitor.visit(this);
+        if (visitChildren) {
+            acceptChildren(visitor, getChildren());
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/LeafSchemaNode.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/LeafSchemaNode.java
new file mode 100644 (file)
index 0000000..a350e80
--- /dev/null
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 4, 2014
+ */
+public class LeafSchemaNode extends ASTCompositeNode {
+
+    public LeafSchemaNode(ASTNode parent) {
+        super(parent);
+    }
+
+    @Override
+    public String getNodeName() {
+        return "leaf";
+    }
+
+    @Override
+    public void accept(ASTVisitor visitor) {
+        visitor.preVisit(this);
+        boolean visitChildren = visitor.visit(this);
+        if (visitChildren) {
+            acceptChildren(visitor, getChildren());
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/ListSchemaNode.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/ListSchemaNode.java
new file mode 100644 (file)
index 0000000..1babc2f
--- /dev/null
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 20, 2014
+ */
+public class ListSchemaNode extends ASTCompositeNode {
+    private SimpleNamedNode key;
+
+    public ListSchemaNode(ASTNode parent) {
+        super(parent);
+    }
+
+    @Override
+    public String getNodeName() {
+        return "list";
+    }
+
+    @Override
+    public void accept(ASTVisitor visitor) {
+        visitor.preVisit(this);
+        boolean visitChildren = visitor.visit(this);
+        if (visitChildren) {
+            acceptChildren(visitor, getChildren());
+        }
+    }
+
+    /**
+     * @return the key
+     */
+    public SimpleNamedNode getKey() {
+        return key;
+    }
+
+    /**
+     * @param key the key to set
+     */
+    public void setKey(SimpleNamedNode key) {
+        this.key = key;
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/Module.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/Module.java
new file mode 100644 (file)
index 0000000..bffbc8e
--- /dev/null
@@ -0,0 +1,328 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 26, 2014
+ */
+public class Module extends ASTCompositeNode {
+    private String namespace;
+    private String revision;
+
+    private SimpleNode<String> namespaceNode;
+    private ASTNamedNode revisionNode;
+    private SimpleNode<String> sourcePath;
+    protected SimpleNode<String> prefix;
+    private SimpleNode<String> yangVersion;
+    private SimpleNode<String> organization;
+    private SimpleNode<String> contact;
+
+    /** Name to Import map. */
+    private Map<String, ModuleImport> imports = new HashMap<>();
+    /** Prefix to Import map. */
+    private Map<String, ModuleImport> importPrefixes = new HashMap<>();
+    /** Duplicate import declaration, used for validation purpose. */
+    private Set<ModuleImport> duplicateImports = new HashSet<>();
+
+    /** Contains name and submodule. */
+    private Map<String, SubModuleInclude> includes = new HashMap<>();
+
+    // private final Set<FeatureDefinition> features = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
+    private ArrayList<TypeDefinition> typeDefinitions = new ArrayList<TypeDefinition>();
+
+    // private final Set<NotificationDefinition> notifications = new
+    // TreeSet<>(Comparators.SCHEMA_NODE_COMP);
+    // private final Set<AugmentationSchema> augmentations = new HashSet<>();
+    // private final Set<RpcDefinition> rpcs = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
+    // private final Set<Deviation> deviations = new HashSet<>();
+    // private final Set<DataSchemaNode> childNodes = new TreeSet<>(Comparators.SCHEMA_NODE_COMP);
+
+    private ArrayList<GroupingDefinition> groupings = new ArrayList<>();
+
+    // private final Set<UsesNode> uses = new HashSet<>();
+    // private final List<ExtensionDefinition> extensionNodes = new ArrayList<>();
+    // private final Set<IdentitySchemaNode> identities = new
+    // TreeSet<>(Comparators.SCHEMA_NODE_COMP);
+    // private final List<UnknownSchemaNode> unknownNodes = new ArrayList<>();
+    // private String source;
+    //
+
+    public Module() {
+        super(null);
+    }
+
+    @Override
+    public String getNodeName() {
+        return "module";
+    }
+
+    /**
+     * @return the namespace
+     */
+    public String getNamespace() {
+        return namespace;
+    }
+
+    /**
+     * @param namespace the namespace to set
+     */
+    public void setNamespace(String namespace) {
+        this.namespace = namespace;
+    }
+
+    /**
+     * @return the revision
+     */
+    public String getRevision() {
+        return revision;
+    }
+
+    /**
+     * @param revision the revision to set
+     */
+    public void setRevision(String revision) {
+        this.revision = revision;
+    }
+
+    /**
+     * @return the namespaceNode
+     */
+    public SimpleNode<String> getNamespaceNode() {
+        return namespaceNode;
+    }
+
+    /**
+     * @param namespace the namespace to set
+     */
+    public void setNamespaceNode(SimpleNode<String> namespaceNode) {
+        this.namespaceNode = namespaceNode;
+        this.namespace = namespaceNode.getValue();
+    }
+
+    /**
+     * @return the sourcePath
+     */
+    public SimpleNode<String> getSourcePath() {
+        return sourcePath;
+    }
+
+    /**
+     * @param sourcePath the sourcePath to set
+     */
+    public void setSourcePath(SimpleNode<String> sourcePath) {
+        this.sourcePath = sourcePath;
+    }
+
+    /**
+     * @return the revision
+     */
+    public ASTNamedNode getRevisionNode() {
+        return revisionNode;
+    }
+
+    /**
+     * @param revision the revision to set
+     */
+    public void setRevisionNode(ASTNamedNode revisionNode) {
+        this.revisionNode = revisionNode;
+        this.revision = revisionNode.getName();
+    }
+
+    /**
+     * @return the prefix
+     */
+    public SimpleNode<String> getPrefix() {
+        return prefix;
+    }
+
+    /**
+     * @param prefix the prefix to set
+     */
+    public void setPrefix(SimpleNode<String> prefix) {
+        this.prefix = prefix;
+    }
+
+    /**
+     * @return the yangVersion
+     */
+    public SimpleNode<String> getYangVersion() {
+        return yangVersion;
+    }
+
+    /**
+     * @param yangVersion the yangVersion to set
+     */
+    public void setYangVersion(SimpleNode<String> yangVersion) {
+        this.yangVersion = yangVersion;
+    }
+
+    /**
+     * @return the organization
+     */
+    public SimpleNode<String> getOrganization() {
+        return organization;
+    }
+
+    /**
+     * @param organization the organization to set
+     */
+    public void setOrganization(SimpleNode<String> organization) {
+        this.organization = organization;
+    }
+
+    /**
+     * @return the contact
+     */
+    public SimpleNode<String> getContact() {
+        return contact;
+    }
+
+    /**
+     * @param contact the contact to set
+     */
+    public void setContact(SimpleNode<String> contact) {
+        this.contact = contact;
+    }
+
+    /**
+     * @return the imports
+     */
+    public Map<String, ModuleImport> getImports() {
+        return imports;
+    }
+
+    /**
+     * @return the includes
+     */
+    public Map<String, SubModuleInclude> getIncludes() {
+        return includes;
+    }
+
+    /**
+     * @return the typeDefinitions
+     */
+    public ArrayList<TypeDefinition> getTypeDefinitions() {
+        return typeDefinitions;
+    }
+
+    /**
+     * @return the groupings
+     */
+    public ArrayList<GroupingDefinition> getGroupings() {
+        return groupings;
+    }
+
+    /**
+     * Add module import statement.
+     *
+     * @param moduleImport statement
+     */
+    public void addImport(ModuleImport moduleImport) {
+        if (this.imports.containsKey(moduleImport.getName())) {
+            duplicateImports.add(moduleImport);
+        } else {
+            this.imports.put(moduleImport.getName(), moduleImport);
+            if (moduleImport.getPrefix() != null) {
+                this.importPrefixes.put(moduleImport.getPrefix(), moduleImport);
+            }
+        }
+    }
+
+    /**
+     * @return the duplicateImports
+     */
+    public Set<ModuleImport> getDuplicateImports() {
+        return duplicateImports;
+    }
+
+    @Override
+    public void accept(ASTVisitor visitor) {
+        visitor.preVisit(this);
+        boolean visitChildren = visitor.visit(this);
+        if (visitChildren) {
+            visitChildren(visitor);
+        }
+    }
+
+    /**
+     * @param position absolute offset position in the file content
+     * @return ASTNode at specified position or <code>null</code> if position out of any of nodes
+     */
+    public ASTNode getNodeAtPosition(final int position) {
+        final AtomicReference<ASTNode> result = new AtomicReference<ASTNode>(null);
+        this.accept(new ASTVisitor() {
+            @Override
+            public void preVisit(ASTNode node) {
+                if (node.getStartPosition() <= position && node.getEndPosition() >= position) {
+                    result.set(node);
+                }
+            }
+        });
+        return result.get();
+    }
+
+    /**
+     * @param prefix namespace prefix
+     * @return module import by prefix or <code>null</code> if no import found
+     */
+    public ModuleImport getImportByPrefix(String prefix) {
+        if (importPrefixes.containsKey(prefix)) {
+            return importPrefixes.get(prefix);
+        }
+        return null;
+    }
+
+    /**
+     * @param name module name
+     * @return import statement by name or <code>null</code> if import not found
+     */
+    public ModuleImport getImportByName(String name) {
+        if (imports.containsKey(name)) {
+            return imports.get(name);
+        }
+        return null;
+    }
+
+    /**
+     * @param name submodule name
+     * @return submodule or <code>null</code> if this submodule not included
+     */
+    public SubModuleInclude getIncludeByName(String name) {
+        if (includes.containsKey(name)) {
+            return includes.get(name);
+        }
+        return null;
+    }
+
+    protected void visitChildren(ASTVisitor visitor) {
+        acceptChild(visitor, namespaceNode);
+        acceptChild(visitor, sourcePath);
+        acceptChild(visitor, revisionNode);
+        acceptChild(visitor, prefix);
+        acceptChild(visitor, yangVersion);
+        acceptChild(visitor, organization);
+        acceptChild(visitor, contact);
+
+        acceptChildren(visitor, getChildren());
+    }
+
+    /**
+     * @return
+     */
+    public boolean isSyntaxValid() {
+        return getFlags() == ASTNode.VALID;
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/ModuleImport.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/ModuleImport.java
new file mode 100644 (file)
index 0000000..855530a
--- /dev/null
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 26, 2014
+ */
+public class ModuleImport extends ASTNamedNode {
+
+    /** Module revision in date format. */
+    private String revision;
+
+    /** Module namespace prefix. */
+    private String prefix;
+
+    public ModuleImport(ASTNode parent, String revision, String prefix) {
+        super(parent);
+        this.revision = revision;
+        this.prefix = prefix;
+    }
+
+    @Override
+    public String getNodeName() {
+        return "import";
+    }
+
+    /**
+     * @return the revision
+     */
+    public String getRevision() {
+        return revision;
+    }
+
+    /**
+     * @return the prefix
+     */
+    public String getPrefix() {
+        return prefix;
+    }
+
+    @Override
+    public void accept(ASTVisitor visitor) {
+        visitor.preVisit(this);
+        visitor.visit(this);
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/NotificationDefinition.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/NotificationDefinition.java
new file mode 100644 (file)
index 0000000..832b858
--- /dev/null
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 23, 2014
+ */
+public class NotificationDefinition extends ASTCompositeNode {
+
+    public NotificationDefinition(ASTNode parent) {
+        super(parent);
+    }
+
+    @Override
+    public String getNodeName() {
+        return "notification";
+    }
+
+    @Override
+    public void accept(ASTVisitor visitor) {
+        visitor.preVisit(this);
+        boolean visitChildren = visitor.visit(this);
+        if (visitChildren) {
+            acceptChildren(visitor, getChildren());
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/QName.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/QName.java
new file mode 100644 (file)
index 0000000..44f6fa0
--- /dev/null
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+import java.io.Serializable;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 4, 2014
+ */
+public class QName implements Serializable, Comparable<QName> {
+
+    /** Serial version UID. */
+    private static final long serialVersionUID = 8322735104475690634L;
+
+    private String module;
+    private String prefix;
+    private String name;
+    private String revision;
+
+    /**
+     * @param namespace
+     * @param prefix
+     * @param name
+     * @param revision
+     */
+    public QName(String module, String prefix, String name, String revision) {
+        this.module = module;
+        this.prefix = prefix;
+        this.name = name;
+        this.revision = revision;
+    }
+
+    /**
+     * @return the module
+     */
+    public String getModule() {
+        return module;
+    }
+
+    /**
+     * @param module the module to set
+     */
+    public void setModule(String module) {
+        this.module = module;
+    }
+
+    /**
+     * @return the prefix
+     */
+    public String getPrefix() {
+        return prefix;
+    }
+
+    /**
+     * @param prefix the prefix to set
+     */
+    public void setPrefix(String prefix) {
+        this.prefix = prefix;
+    }
+
+    /**
+     * @return the name
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * @param name the name to set
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * @return the revision
+     */
+    public String getRevision() {
+        return revision;
+    }
+
+    /**
+     * @param revision the revision to set
+     */
+    public void setRevision(String revision) {
+        this.revision = revision;
+    }
+
+    @Override
+    public String toString() {
+        return "QName [module=" + module + ", prefix=" + prefix + ", name=" + name + ", revision=" + revision + "]";
+    }
+
+    @Override
+    public int compareTo(QName o) {
+        return toString().compareTo(o.toString());
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/RevisionNode.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/RevisionNode.java
new file mode 100644 (file)
index 0000000..c1caa91
--- /dev/null
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 19, 2014
+ */
+public class RevisionNode extends ASTNamedNode {
+
+    public RevisionNode(ASTNode parent) {
+        super(parent, null);
+    }
+
+    @Override
+    public String getNodeName() {
+        return "revision";
+    }
+
+    @Override
+    public void accept(ASTVisitor visitor) {
+        visitor.preVisit(this);
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/RpcDefinition.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/RpcDefinition.java
new file mode 100644 (file)
index 0000000..63aa792
--- /dev/null
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 23, 2014
+ */
+public class RpcDefinition extends ASTCompositeNode {
+
+    public RpcDefinition(ASTNode parent) {
+        super(parent);
+    }
+
+    @Override
+    public String getNodeName() {
+        return "rpc";
+    }
+
+    @Override
+    public void accept(ASTVisitor visitor) {
+        visitor.preVisit(this);
+        boolean visitChildren = visitor.visit(this);
+        if (visitChildren) {
+            acceptChildren(visitor, getChildren());
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/RpcInputNode.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/RpcInputNode.java
new file mode 100644 (file)
index 0000000..1d099e0
--- /dev/null
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 23, 2014
+ */
+public class RpcInputNode extends ASTCompositeNode {
+
+    /**
+     * @param parent
+     */
+    public RpcInputNode(ASTNode parent) {
+        super(parent);
+    }
+
+    @Override
+    public String getNodeName() {
+        return "input";
+    }
+
+    @Override
+    public void accept(ASTVisitor visitor) {
+        visitor.preVisit(this);
+        boolean visitChildren = visitor.visit(this);
+        if (visitChildren) {
+            acceptChildren(visitor, getChildren());
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/RpcOutputNode.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/RpcOutputNode.java
new file mode 100644 (file)
index 0000000..6e5f5e1
--- /dev/null
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 23, 2014
+ */
+public class RpcOutputNode extends ASTCompositeNode {
+
+    /**
+     * @param parent
+     */
+    public RpcOutputNode(ASTNode parent) {
+        super(parent);
+    }
+
+    @Override
+    public String getNodeName() {
+        return "output";
+    }
+
+    @Override
+    public void accept(ASTVisitor visitor) {
+        visitor.preVisit(this);
+        boolean visitChildren = visitor.visit(this);
+        if (visitChildren) {
+            acceptChildren(visitor, getChildren());
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/SimpleNamedNode.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/SimpleNamedNode.java
new file mode 100644 (file)
index 0000000..89d9d8c
--- /dev/null
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 20, 2014
+ */
+public class SimpleNamedNode extends ASTNamedNode {
+
+    private String nodeName;
+
+    /**
+     * @param parent
+     */
+    public SimpleNamedNode(ASTNode parent, String nodeName) {
+        super(parent, null);
+        this.nodeName = nodeName;
+    }
+
+    @Override
+    public String getNodeName() {
+        return nodeName;
+    }
+
+    @Override
+    public void accept(ASTVisitor visitor) {
+        visitor.visit(this);
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/SimpleNode.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/SimpleNode.java
new file mode 100644 (file)
index 0000000..a205762
--- /dev/null
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+/**
+ * Simple named node with typed value.
+ *
+ * @author Konstantin Zaitsev
+ * date: Jun 26, 2014
+ */
+public class SimpleNode<T> extends ASTNode {
+
+    /** Name. */
+    private String nodeName;
+
+    /** Node value. */
+    private T value;
+
+    public SimpleNode(ASTNode parent, String nodeName, T value) {
+        super(parent);
+        this.nodeName = nodeName;
+        this.value = value;
+    }
+
+    /**
+     * @return the value
+     */
+    public T getValue() {
+        return value;
+    }
+
+    /**
+     * @param value the value to set
+     */
+    public void setValue(T value) {
+        this.value = value;
+    }
+
+    @Override
+    public String getNodeName() {
+        return nodeName;
+    }
+
+    @Override
+    public void accept(ASTVisitor visitor) {
+        visitor.preVisit(this);
+        visitor.visit(this);
+    }
+
+    @Override
+    public boolean isShowedInOutline() {
+        return false;
+    }  
+    
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/SubModule.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/SubModule.java
new file mode 100644 (file)
index 0000000..08297b3
--- /dev/null
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 4, 2014
+ */
+public class SubModule extends Module {
+    private SimpleNode<String> parentModule;
+    private String parentPrefix;
+
+    @Override
+    public String getNodeName() {
+        return "submodule";
+    }
+
+    /**
+     * @return the parentModule
+     */
+    public SimpleNode<String> getParentModule() {
+        return parentModule;
+    }
+
+    /**
+     * @param parentModule the parentModule to set
+     */
+    public void setParentModule(SimpleNode<String> parentModule) {
+        this.parentModule = parentModule;
+    }
+
+    /**
+     * @return the parentPrefix
+     */
+    public String getParentPrefix() {
+        if (parentPrefix == null) {
+            parentPrefix = prefix != null ? prefix.getValue() : null;
+        }
+        return parentPrefix;
+    }
+
+    /**
+     * @param parentPrefix the parentPrefix to set
+     */
+    public void setParentPrefix(String parentPrefix) {
+        this.parentPrefix = parentPrefix;
+    }
+
+    @Override
+    public void accept(ASTVisitor visitor) {
+        visitor.preVisit(this);
+        boolean visitChildren = visitor.visit(this);
+        if (visitChildren) {
+            visitChildren(visitor);
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/SubModuleInclude.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/SubModuleInclude.java
new file mode 100644 (file)
index 0000000..bd23ab4
--- /dev/null
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 11, 2014
+ */
+public class SubModuleInclude extends ASTNamedNode {
+
+    /** SubModule revision in date format. */
+    private String revision;
+
+    public SubModuleInclude(ASTNode parent, String revision) {
+        super(parent);
+        this.revision = revision;
+    }
+
+    @Override
+    public String getNodeName() {
+        return "include";
+    }
+
+    /**
+     * @return the revision
+     */
+    public String getRevision() {
+        return revision;
+    }
+
+    @Override
+    public void accept(ASTVisitor visitor) {
+        visitor.preVisit(this);
+        visitor.visit(this);
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/TypeDefinition.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/TypeDefinition.java
new file mode 100644 (file)
index 0000000..ad985f0
--- /dev/null
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 2, 2014
+ */
+public class TypeDefinition extends ASTCompositeNode {
+
+    public TypeDefinition(ASTNode parent) {
+        super(parent);
+    }
+
+    @Override
+    public String getNodeName() {
+        return "typedef";
+    }
+
+    @Override
+    public void accept(ASTVisitor visitor) {
+        visitor.preVisit(this);
+        boolean visitChildren = visitor.visit(this);
+        if (visitChildren) {
+            acceptChildren(visitor, getChildren());
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/TypeReference.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/TypeReference.java
new file mode 100644 (file)
index 0000000..5fd175e
--- /dev/null
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 8, 2014
+ */
+public class TypeReference extends ASTNamedNode {
+    private QName type;
+
+    public TypeReference(ASTNode parent) {
+        super(parent);
+    }
+
+    @Override
+    public String getNodeName() {
+        return "type";
+    }
+
+    /**
+     * @param type the type to set
+     */
+    public void setType(QName type) {
+        this.type = type;
+    }
+
+    /**
+     * @return the type
+     */
+    public QName getType() {
+        return type;
+    }
+
+    @Override
+    public void accept(ASTVisitor visitor) {
+        visitor.preVisit(this);
+        visitor.visit(this);
+    }
+
+    @Override
+    public boolean isShowedInOutline() {
+        return false;
+    }  
+    
+
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/UsesNode.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/dom/UsesNode.java
new file mode 100644 (file)
index 0000000..ee9996a
--- /dev/null
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.dom;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 8, 2014
+ */
+public class UsesNode extends ASTNamedNode {
+    private QName grouping;
+
+    public UsesNode(ASTNode parent) {
+        super(parent);
+    }
+
+    @Override
+    public String getNodeName() {
+        return "uses";
+    }
+
+    /**
+     * @return the grouping
+     */
+    public QName getGrouping() {
+        return grouping;
+    }
+
+    /**
+     * @param grouping the grouping to set
+     */
+    public void setGrouping(QName grouping) {
+        this.grouping = grouping;
+    }
+
+    @Override
+    public void accept(ASTVisitor visitor) {
+        visitor.preVisit(this);
+        visitor.visit(this);
+    }
+
+    @Override
+    public boolean isShowedInOutline() {
+        return false;
+    }
+    
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/DeltaProcessor.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/DeltaProcessor.java
new file mode 100644 (file)
index 0000000..766dd22
--- /dev/null
@@ -0,0 +1,709 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.indexing;
+
+import java.util.ArrayList;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceDeltaVisitor;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.ISafeRunnable;
+import org.eclipse.core.runtime.SafeRunner;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IElementChangedListener;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaElementDelta;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.core.JavaProject;
+
+import com.cisco.yangide.core.CoreUtil;
+import com.cisco.yangide.core.ElementChangedEvent;
+import com.cisco.yangide.core.IYangElementChangedListener;
+import com.cisco.yangide.core.IYangElementDelta;
+import com.cisco.yangide.core.OpenableElementInfo;
+import com.cisco.yangide.core.YangCorePlugin;
+import com.cisco.yangide.core.YangModelException;
+import com.cisco.yangide.core.model.YangElement;
+import com.cisco.yangide.core.model.YangElementType;
+import com.cisco.yangide.core.model.YangModel;
+import com.cisco.yangide.core.model.YangModelManager;
+import com.cisco.yangide.core.model.YangProject;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 25, 2014
+ */
+@SuppressWarnings("restriction")
+public class DeltaProcessor implements IResourceChangeListener, IElementChangedListener {
+    static class OutputsInfo {
+        int outputCount;
+        IPath[] paths;
+        int[] traverseModes;
+
+        OutputsInfo(IPath[] paths, int[] traverseModes, int outputCount) {
+            this.paths = paths;
+            this.traverseModes = traverseModes;
+            this.outputCount = outputCount;
+        }
+    }
+
+    /*
+     * Collection of listeners for Java element deltas
+     */
+    public IYangElementChangedListener[] elementChangedListeners = new IYangElementChangedListener[5];
+    public int[] elementChangedListenerMasks = new int[5];
+    public int elementChangedListenerCount = 0;
+
+    public int overridenEventType = -1;
+    private YangModelManager manager;
+    private boolean isFiring;
+    public ArrayList<IYangElementDelta> yangModelDeltas = new ArrayList<IYangElementDelta>();
+    private YangElementDelta currentDelta;
+
+    private final static int IGNORE = 0;
+    private final static int SOURCE = 1;
+    private final static int BINARY = 2;
+
+    /**
+     * @param yangModelManager
+     */
+    public DeltaProcessor(YangModelManager manager) {
+        this.manager = manager;
+    }
+
+    /*
+     * Need to clone defensively the listener information, in case some listener is reacting to some
+     * notification iteration by adding/changing/removing any of the other (for example, if it
+     * deregisters itself).
+     */
+    public synchronized void addElementChangedListener(IYangElementChangedListener listener, int eventMask) {
+        for (int i = 0; i < this.elementChangedListenerCount; i++) {
+            if (this.elementChangedListeners[i] == listener) {
+
+                // only clone the masks, since we could be in the middle of notifications and one
+                // listener decide to change
+                // any event mask of another listeners (yet not notified).
+                int cloneLength = this.elementChangedListenerMasks.length;
+                System.arraycopy(this.elementChangedListenerMasks, 0,
+                        this.elementChangedListenerMasks = new int[cloneLength], 0, cloneLength);
+                this.elementChangedListenerMasks[i] |= eventMask; // could be different
+                return;
+            }
+        }
+        // may need to grow, no need to clone, since iterators will have cached original arrays and
+        // max boundary and we only add to the end.
+        int length;
+        if ((length = this.elementChangedListeners.length) == this.elementChangedListenerCount) {
+            System.arraycopy(this.elementChangedListeners, 0,
+                    this.elementChangedListeners = new IYangElementChangedListener[length * 2], 0, length);
+            System.arraycopy(this.elementChangedListenerMasks, 0,
+                    this.elementChangedListenerMasks = new int[length * 2], 0, length);
+        }
+        this.elementChangedListeners[this.elementChangedListenerCount] = listener;
+        this.elementChangedListenerMasks[this.elementChangedListenerCount] = eventMask;
+        this.elementChangedListenerCount++;
+    }
+
+    public synchronized void removeElementChangedListener(IYangElementChangedListener listener) {
+
+        for (int i = 0; i < this.elementChangedListenerCount; i++) {
+
+            if (this.elementChangedListeners[i] == listener) {
+
+                // need to clone defensively since we might be in the middle of listener
+                // notifications (#fire)
+                int length = this.elementChangedListeners.length;
+                IYangElementChangedListener[] newListeners = new IYangElementChangedListener[length];
+                System.arraycopy(this.elementChangedListeners, 0, newListeners, 0, i);
+                int[] newMasks = new int[length];
+                System.arraycopy(this.elementChangedListenerMasks, 0, newMasks, 0, i);
+
+                // copy trailing listeners
+                int trailingLength = this.elementChangedListenerCount - i - 1;
+                if (trailingLength > 0) {
+                    System.arraycopy(this.elementChangedListeners, i + 1, newListeners, i, trailingLength);
+                    System.arraycopy(this.elementChangedListenerMasks, i + 1, newMasks, i, trailingLength);
+                }
+
+                // update manager listener state (#fire need to iterate over original listeners
+                // through a local variable to hold onto
+                // the original ones)
+                this.elementChangedListeners = newListeners;
+                this.elementChangedListenerMasks = newMasks;
+                this.elementChangedListenerCount--;
+                return;
+            }
+        }
+    }
+
+    @Override
+    public void resourceChanged(IResourceChangeEvent event) {
+        try {
+            int eventType = this.overridenEventType == -1 ? event.getType() : this.overridenEventType;
+            IResource resource = event.getResource();
+            IResourceDelta delta = event.getDelta();
+
+            switch (eventType) {
+            case IResourceChangeEvent.PRE_DELETE:
+                if (resource.getType() == IResource.PROJECT && YangCorePlugin.isYangProject((IProject) resource)) {
+                    deleting((IProject) resource);
+                }
+                return;
+
+            case IResourceChangeEvent.PRE_REFRESH:
+                // nothing to do on refresh
+                return;
+
+            case IResourceChangeEvent.POST_CHANGE:
+                if (isAffectedBy(delta)) {
+                    try {
+                        stopDeltas();
+
+                        // generate Yang deltas from resource changes
+                        IYangElementDelta translatedDelta = processResourceDelta(delta);
+                        if (translatedDelta != null) {
+                            this.yangModelDeltas.add(translatedDelta);
+                        }
+                    } finally {
+                        // necessary
+                        startDeltas();
+                    }
+                    // TODO KOS: need implement notification for type hierarchy
+                    fire(null, ElementChangedEvent.POST_CHANGE);
+                }
+                return;
+
+            case IResourceChangeEvent.PRE_BUILD:
+                // nothing to do on pre-build
+                return;
+
+            case IResourceChangeEvent.POST_BUILD:
+                // nothing to do on post build
+                return;
+            }
+        } finally {
+            overridenEventType = -1;
+        }
+    }
+
+    private void deleting(IProject project) {
+
+        try {
+            // discard indexing jobs that belong to this project so that the project can be
+            // deleted without interferences from the index manager
+            this.manager.indexManager.discardJobs(project.getName());
+
+            YangProject yangProject = (YangProject) YangCorePlugin.create(project);
+            yangProject.close();
+
+            removeFromParentInfo(yangProject);
+        } catch (YangModelException e) {
+            // yang project doesn't exist: ignore
+        }
+    }
+
+    /*
+     * Turns the firing mode to on. That is, deltas that are/have been registered will be fired.
+     */
+    private void startDeltas() {
+        this.isFiring = true;
+    }
+
+    /*
+     * Turns the firing mode to off. That is, deltas that are/have been registered will not be fired
+     * until deltas are started again.
+     */
+    private void stopDeltas() {
+        this.isFiring = false;
+    }
+
+    /*
+     * Converts a <code>IResourceDelta</code> rooted in a <code>Workspace</code> into the
+     * corresponding set of <code>IJavaElementDelta</code>, rooted in the relevant
+     * <code>JavaModel</code>s.
+     */
+    private IYangElementDelta processResourceDelta(IResourceDelta changes) {
+
+        try {
+            YangModel model = this.manager.getYangModel();
+            if (!model.isOpen()) {
+                // force opening of yang model so that java element delta are reported
+                try {
+                    model.open(null);
+                } catch (YangModelException e) {
+                    return null;
+                }
+            }
+            // this.currentElement = null;
+
+            // get the workspace delta, and start processing there.
+            IResourceDelta[] deltas = changes.getAffectedChildren(IResourceDelta.ADDED | IResourceDelta.REMOVED
+                    | IResourceDelta.CHANGED, IContainer.INCLUDE_HIDDEN);
+            for (int i = 0; i < deltas.length; i++) {
+                traverseDelta(deltas[i], null);
+            }
+            return this.currentDelta;
+        } finally {
+            this.currentDelta = null;
+        }
+    }
+
+    private void removeFromParentInfo(YangElement child) {
+
+        YangElement parent = (YangElement) child.getParent();
+        if (parent != null && parent.isOpen()) {
+            try {
+                OpenableElementInfo info = (OpenableElementInfo) parent.getElementInfo(null);
+                info.removeChild(child);
+            } catch (YangModelException e) {
+                // do nothing - we already checked if open
+            }
+        }
+    }
+
+    /*
+     * Fire Java Model delta, flushing them after the fact after post_change notification. If the
+     * firing mode has been turned off, this has no effect.
+     */
+    public void fire(IYangElementDelta customDelta, int eventType) {
+        if (!this.isFiring) {
+            return;
+        }
+
+        IYangElementDelta deltaToNotify;
+        if (customDelta == null) {
+            deltaToNotify = null; // TODO KOS: need merge delta for notify
+            // mergeDeltas(this.yangModelDeltas);
+        } else {
+            deltaToNotify = customDelta;
+        }
+
+        // Notification
+        // Important: if any listener reacts to notification by updating the listeners list or mask,
+        // these lists will
+        // be duplicated, so it is necessary to remember original lists in a variable (since field
+        // values may change under us)
+        IYangElementChangedListener[] listeners;
+        int[] listenerMask;
+        int listenerCount;
+        synchronized (this) {
+            listeners = this.elementChangedListeners;
+            listenerMask = this.elementChangedListenerMasks;
+            listenerCount = this.elementChangedListenerCount;
+        }
+
+        switch (eventType) {
+        case ElementChangedEvent.POST_CHANGE:
+            firePostChangeDelta(deltaToNotify, listeners, listenerMask, listenerCount);
+            // fireReconcileDelta(listeners, listenerMask, listenerCount);
+            break;
+        }
+    }
+
+    private void firePostChangeDelta(IYangElementDelta deltaToNotify, IYangElementChangedListener[] listeners,
+            int[] listenerMask, int listenerCount) {
+
+        // post change deltas
+        if (deltaToNotify != null) {
+            // flush now so as to keep listener reactions to post their own deltas for subsequent
+            // iteration
+            this.yangModelDeltas = new ArrayList<IYangElementDelta>();
+
+            notifyListeners(deltaToNotify, ElementChangedEvent.POST_CHANGE, listeners, listenerMask, listenerCount);
+        }
+    }
+
+    private void notifyListeners(IYangElementDelta deltaToNotify, int eventType,
+            IYangElementChangedListener[] listeners, int[] listenerMask, int listenerCount) {
+        final ElementChangedEvent extraEvent = new ElementChangedEvent(deltaToNotify, eventType);
+        for (int i = 0; i < listenerCount; i++) {
+            if ((listenerMask[i] & eventType) != 0) {
+                final IYangElementChangedListener listener = listeners[i];
+                // wrap callbacks with Safe runnable for subsequent listeners to be called when some
+                // are causing grief
+                SafeRunner.run(new ISafeRunnable() {
+                    @Override
+                    public void handleException(Throwable exception) {
+                        YangCorePlugin.log(exception,
+                                "Exception occurred in listener of Java element change notification");
+                    }
+
+                    @Override
+                    public void run() throws Exception {
+                        listener.elementChanged(extraEvent);
+                    }
+                });
+            }
+        }
+    }
+
+    /*
+     * Converts an <code>IResourceDelta</code> and its children into the corresponding
+     * <code>IYangElementDelta</code>s.
+     */
+    private void traverseDelta(IResourceDelta delta, OutputsInfo outputsInfo) {
+        // process current delta
+        boolean processChildren = true;
+        if (delta.getResource().getType() == IResource.PROJECT) {
+            processChildren = updateCurrentDeltaAndIndex(delta);
+        } else if (delta.getResource().getType() == IResource.FILE) {
+            // skip non YANG files
+            if (!CoreUtil.isYangLikeFileName(delta.getResource().getFullPath().toString())) {
+                return;
+            }
+            processChildren = updateCurrentDeltaAndIndex(delta);
+        }
+
+        // process children if needed
+        if (processChildren) {
+
+            // get the project's output locations and traverse mode
+            if (outputsInfo == null) {
+                outputsInfo = outputsInfo(delta.getResource());
+            }
+
+            IResourceDelta[] children = delta.getAffectedChildren();
+            int length = children.length;
+            for (int i = 0; i < length; i++) {
+                IResourceDelta child = children[i];
+                IResource childRes = child.getResource();
+
+                // is childRes in the output folder and is it filtered out ?
+                boolean isResFilteredFromOutput = isResFilteredFromOutput(outputsInfo, childRes);
+
+                if (!isResFilteredFromOutput) {
+                    traverseDelta(child, outputsInfo);
+                }
+            }
+        } // else resource delta will be added by parent
+
+    }
+
+    /*
+     * Update the current delta (i.e. add/remove/change the given element) and update the
+     * correponding index. Returns whether the children of the given delta must be processed.
+     */
+    public boolean updateCurrentDeltaAndIndex(IResourceDelta delta) {
+        YangElement element;
+        switch (delta.getKind()) {
+        case IResourceDelta.ADDED:
+            element = YangCorePlugin.create(delta.getResource());
+            updateIndex(element, delta);
+            elementAdded(element, delta);
+            return false;
+        case IResourceDelta.REMOVED:
+            element = YangCorePlugin.create(delta.getResource());
+            updateIndex(element, delta);
+            elementRemoved(element, delta);
+            return false;
+        case IResourceDelta.CHANGED:
+            int flags = delta.getFlags();
+            if ((flags & IResourceDelta.CONTENT) != 0 || (flags & IResourceDelta.ENCODING) != 0) {
+                // content or encoding has changed
+                element = YangCorePlugin.create(delta.getResource());
+                if (element == null) {
+                    return false;
+                }
+                updateIndex(element, delta);
+                contentChanged(element);
+            } else if (delta.getResource().getType() == IResource.PROJECT) {
+                if ((flags & IResourceDelta.OPEN) != 0) {
+                    // project has been opened or closed
+                    IProject res = (IProject) delta.getResource();
+                    element = YangCorePlugin.create(res);
+
+                    if (res.isOpen()) {
+                        addToParentInfo(element);
+                        this.manager.indexManager.indexAll(res);
+                    } else {
+                        close(element);
+                        removeFromParentInfo(element);
+                        this.manager.indexManager.discardJobs(element.getName());
+                        this.manager.indexManager.removeIndexFamily(res);
+
+                    }
+                    return false; // when a project is open/closed don't process children
+                }
+            }
+            return true;
+        }
+        return true;
+    }
+
+    @SuppressWarnings("incomplete-switch")
+    private void updateIndex(YangElement element, IResourceDelta delta) {
+
+        IndexManager indexManager = this.manager.indexManager;
+        if (indexManager == null) {
+            return;
+        }
+
+        switch (element.getElementType()) {
+        case YANG_PROJECT:
+            switch (delta.getKind()) {
+            case IResourceDelta.ADDED:
+                indexManager.indexAll(element.getResource().getProject());
+                break;
+            case IResourceDelta.REMOVED:
+                indexManager.removeIndexFamily(element.getResource().getProject());
+                break;
+            }
+            break;
+        case YANG_FILE:
+            IFile file = (IFile) delta.getResource();
+            switch (delta.getKind()) {
+            case IResourceDelta.CHANGED:
+                // no need to index if the content has not changed
+                int flags = delta.getFlags();
+                if ((flags & IResourceDelta.CONTENT) == 0 && (flags & IResourceDelta.ENCODING) == 0) {
+                    break;
+                }
+            case IResourceDelta.ADDED:
+                indexManager.addSource(file);
+                break;
+            case IResourceDelta.REMOVED:
+                indexManager.remove(file);
+                break;
+            }
+        }
+    }
+
+    /*
+     * Processing for an element that has been added:<ul> <li>If the element is a project, do
+     * nothing, and do not process children, as when a project is created it does not yet have any
+     * natures - specifically a java nature. <li>If the elemet is not a project, process it as added
+     * (see <code>basicElementAdded</code>. </ul> Delta argument could be null if processing an
+     * external JAR change
+     */
+    private void elementAdded(YangElement element, IResourceDelta delta) {
+        YangElementType elementType = element.getElementType();
+
+        if (elementType == YangElementType.YANG_PROJECT) {
+            // project add is handled by JavaProject.configure() because
+            // when a project is created, it does not yet have a java nature
+            if (delta != null) {
+                IProject project = (IProject) delta.getResource();
+                if (YangCorePlugin.isYangProject(project)) {
+                    addToParentInfo(element);
+                    close(element);
+                    currentDelta().added(element);
+                }
+            }
+        } else {
+            if (delta == null || (delta.getFlags() & IResourceDelta.MOVED_FROM) == 0) {
+                // regular element addition
+                addToParentInfo(element);
+                close(element);
+                currentDelta().added(element);
+            } else {
+                // element is moved
+                addToParentInfo(element);
+                close(element);
+                currentDelta().added(element);
+            }
+        }
+    }
+
+    /*
+     * Generic processing for a removed element:<ul> <li>Close the element, removing its structure
+     * from the cache <li>Remove the element from its parent's cache of children <li>Add a REMOVED
+     * entry in the delta </ul> Delta argument could be null if processing an external JAR change
+     */
+    private void elementRemoved(YangElement element, IResourceDelta delta) {
+
+        if (delta == null || (delta.getFlags() & IResourceDelta.MOVED_TO) == 0) {
+            close(element);
+            removeFromParentInfo(element);
+            currentDelta().removed(element);
+        } else {
+            // element is moved
+            close(element);
+            removeFromParentInfo(element);
+            currentDelta().removed(element);
+        }
+        if (element.getElementType() == YangElementType.YANG_MODEL) {
+            this.manager.indexManager.reset();
+        }
+    }
+
+    private void contentChanged(YangElement element) {
+        close(element);
+        currentDelta().changed(element, IYangElementDelta.F_CONTENT);
+    }
+
+    private void addToParentInfo(YangElement child) {
+        YangElement parent = (YangElement) child.getParent();
+        if (parent != null && parent.isOpen()) {
+            try {
+                OpenableElementInfo info = (OpenableElementInfo) parent.getElementInfo(null);
+                info.addChild(child);
+            } catch (YangModelException e) {
+                // do nothing - we already checked if open
+            }
+        }
+    }
+
+    /*
+     * Closes the given element, which removes it from the cache of open elements.
+     */
+    private void close(YangElement element) {
+        try {
+            element.close();
+        } catch (YangModelException e) {
+            // do nothing
+        }
+    }
+
+    private YangElementDelta currentDelta() {
+        if (this.currentDelta == null) {
+            this.currentDelta = new YangElementDelta(this.manager.getYangModel());
+        }
+        return this.currentDelta;
+    }
+
+    /*
+     * Returns whether a given delta contains some information relevant to the JavaModel, in
+     * particular it will not consider SYNC or MARKER only deltas.
+     */
+    private boolean isAffectedBy(IResourceDelta rootDelta) {
+        if (rootDelta != null) {
+            // use local exception to quickly escape from delta traversal
+            class FoundRelevantDeltaException extends RuntimeException {
+                private static final long serialVersionUID = 7137113252936111023L;
+            }
+            try {
+                rootDelta.accept(new IResourceDeltaVisitor() {
+                    @Override
+                    public boolean visit(IResourceDelta delta) /* throws CoreException */{
+                        switch (delta.getKind()) {
+                        case IResourceDelta.ADDED:
+                        case IResourceDelta.REMOVED:
+                            throw new FoundRelevantDeltaException();
+                        case IResourceDelta.CHANGED:
+                            // if any flag is set but SYNC or MARKER, this delta should be
+                            // considered
+                            if (delta.getAffectedChildren().length == 0 // only check leaf delta
+                            // nodes
+                            && (delta.getFlags() & ~(IResourceDelta.SYNC | IResourceDelta.MARKERS)) != 0) {
+                                throw new FoundRelevantDeltaException();
+                            }
+                        }
+                        return true;
+                    }
+                }, IContainer.INCLUDE_HIDDEN);
+            } catch (FoundRelevantDeltaException e) {
+                return true;
+            } catch (CoreException e) { // ignore delta if not able to traverse
+            }
+        }
+        return false;
+    }
+
+    private OutputsInfo outputsInfo(IResource res) {
+        try {
+            JavaProject proj = (JavaProject) JavaCore.create(res.getProject());
+            if (proj != null) {
+                IPath projectOutput = proj.getOutputLocation();
+                int traverseMode = IGNORE;
+                if (proj.getProject().getFullPath().equals(projectOutput)) { // case of
+                    // proj==bin==src
+                    return new OutputsInfo(new IPath[] { projectOutput }, new int[] { SOURCE }, 1);
+                }
+                IClasspathEntry[] classpath = proj.getResolvedClasspath();
+                IPath[] outputs = new IPath[classpath.length + 1];
+                int[] traverseModes = new int[classpath.length + 1];
+                int outputCount = 1;
+                outputs[0] = projectOutput;
+                traverseModes[0] = traverseMode;
+                for (int i = 0, length = classpath.length; i < length; i++) {
+                    IClasspathEntry entry = classpath[i];
+                    IPath entryPath = entry.getPath();
+                    IPath output = entry.getOutputLocation();
+                    if (output != null) {
+                        outputs[outputCount] = output;
+                        // check case of src==bin
+                        if (entryPath.equals(output)) {
+                            traverseModes[outputCount++] = (entry.getEntryKind() == IClasspathEntry.CPE_SOURCE) ? SOURCE
+                                    : BINARY;
+                        } else {
+                            traverseModes[outputCount++] = IGNORE;
+                        }
+                    }
+
+                    // check case of src==bin
+                    if (entryPath.equals(projectOutput)) {
+                        traverseModes[0] = (entry.getEntryKind() == IClasspathEntry.CPE_SOURCE) ? SOURCE : BINARY;
+                    }
+                }
+                return new OutputsInfo(outputs, traverseModes, outputCount);
+            }
+        } catch (JavaModelException e) {
+            // java project doesn't exist: ignore
+        }
+        return null;
+    }
+
+    /*
+     * Returns whether the given resource is in one of the given output folders and if it is
+     * filtered out from this output folder.
+     */
+    private boolean isResFilteredFromOutput(OutputsInfo info, IResource res) {
+        if (info != null) {
+            IPath resPath = res.getFullPath();
+            for (int i = 0; i < info.outputCount; i++) {
+                if (info.paths[i].isPrefixOf(resPath)
+                        && (info.traverseModes[i] == IGNORE || info.traverseModes[i] == BINARY)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public void elementChanged(org.eclipse.jdt.core.ElementChangedEvent event) {
+        IJavaElementDelta delta = event.getDelta();
+        processJavaDeltas(delta.getAffectedChildren());
+    }
+
+    private boolean processJavaDeltas(IJavaElementDelta[] affectedChildren) {
+
+        for (IJavaElementDelta d : affectedChildren) {
+            IJavaElement element = d.getElement();
+            if (element instanceof IPackageFragmentRoot) {
+                IPath path = ((IPackageFragmentRoot) element).getPath();
+
+                if (path != null && path.toFile().exists() && path.lastSegment().toLowerCase().endsWith(".jar")) {
+
+                    switch (d.getKind()) {
+                    case IJavaElementDelta.ADDED:
+                    case IJavaElementDelta.CHANGED:
+                        this.manager.indexManager.addJarFile(element.getJavaProject().getProject(), path);
+                        break;
+                    case IJavaElementDelta.REMOVED:
+                        this.manager.indexManager.indexAll(element.getJavaProject().getProject());
+                        return false;
+                    }
+                }
+            }
+            if (!processJavaDeltas(d.getAffectedChildren())) {
+                return false;
+            }
+        }
+        return true;
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/ElementIndexInfo.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/ElementIndexInfo.java
new file mode 100644 (file)
index 0000000..a3a20f6
--- /dev/null
@@ -0,0 +1,290 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.indexing;
+
+import java.io.Serializable;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IPath;
+
+import com.cisco.yangide.core.dom.ASTNamedNode;
+import com.cisco.yangide.core.dom.Module;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 8, 2014
+ */
+public class ElementIndexInfo implements Serializable, Comparable<ElementIndexInfo> {
+
+    /** Serial version UID. */
+    private static final long serialVersionUID = -7971951214450877471L;
+
+    private String module;
+    private String revision;
+    private String name;
+    private ElementIndexType type;
+    private int startPosition = -1;
+    private int length = 0;
+    private String project;
+    private String path;
+    private String description;
+    private String reference;
+    private String status;
+    // module fields
+    private String namespace;
+    private String organization;
+    private String contact;
+
+    /** Optional entry in case of Jar Entry. */
+    private String entry;
+
+    public ElementIndexInfo(ASTNamedNode node, String module, String revision, ElementIndexType type, IProject project,
+            IPath path, String entry) {
+        this.module = module;
+        this.revision = revision;
+        this.name = node.getName();
+        this.type = type;
+        this.startPosition = node.getNameStartPosition();
+        this.length = node.getNameLength();
+        this.description = node.getDescription();
+        this.reference = node.getReference();
+        this.status = node.getStatus();
+        if (node instanceof Module) {
+            Module m = (Module) node;
+            this.namespace = m.getNamespace() != null ? m.getNamespace() : null;
+            this.organization = m.getOrganization() != null ? m.getOrganization().getValue() : null;
+            this.contact = m.getContact() != null ? m.getContact().getValue() : null;
+        }
+        this.project = project.getName();
+        this.path = path.toString();
+        this.entry = entry;
+    }
+
+    /**
+     * @return the module
+     */
+    public String getModule() {
+        return module;
+    }
+
+    /**
+     * @param module the module to set
+     */
+    public void setModule(String module) {
+        this.module = module;
+    }
+
+    /**
+     * @return the name
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * @param name the name to set
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    /**
+     * @return the type
+     */
+    public ElementIndexType getType() {
+        return type;
+    }
+
+    /**
+     * @param type the type to set
+     */
+    public void setType(ElementIndexType type) {
+        this.type = type;
+    }
+
+    /**
+     * @return the startPosition
+     */
+    public int getStartPosition() {
+        return startPosition;
+    }
+
+    /**
+     * @param startPosition the startPosition to set
+     */
+    public void setStartPosition(int startPosition) {
+        this.startPosition = startPosition;
+    }
+
+    /**
+     * @return the length
+     */
+    public int getLength() {
+        return length;
+    }
+
+    /**
+     * @param length the length to set
+     */
+    public void setLength(int length) {
+        this.length = length;
+    }
+
+    /**
+     * @return the path
+     */
+    public String getPath() {
+        return path;
+    }
+
+    /**
+     * @param path the path to set
+     */
+    public void setPath(String path) {
+        this.path = path;
+    }
+
+    /**
+     * @return the description
+     */
+    public String getDescription() {
+        return description;
+    }
+
+    /**
+     * @param description the description to set
+     */
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    /**
+     * @return the reference
+     */
+    public String getReference() {
+        return reference;
+    }
+
+    /**
+     * @param reference the reference to set
+     */
+    public void setReference(String reference) {
+        this.reference = reference;
+    }
+
+    /**
+     * @return the entry
+     */
+    public String getEntry() {
+        return entry;
+    }
+
+    /**
+     * @param entry the entry to set
+     */
+    public void setEntry(String entry) {
+        this.entry = entry;
+    }
+
+    /**
+     * @return the project
+     */
+    public String getProject() {
+        return project;
+    }
+
+    /**
+     * @param project the project to set
+     */
+    public void setProject(String project) {
+        this.project = project;
+    }
+
+    /**
+     * @return the revision
+     */
+    public String getRevision() {
+        return revision;
+    }
+
+    /**
+     * @param revision the revision to set
+     */
+    public void setRevision(String revision) {
+        this.revision = revision;
+    }
+
+    /**
+     * @return the status
+     */
+    public String getStatus() {
+        return status;
+    }
+
+    /**
+     * @param status the status to set
+     */
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    /**
+     * @return the organization
+     */
+    public String getOrganization() {
+        return organization;
+    }
+
+    /**
+     * @param organization the organization to set
+     */
+    public void setOrganization(String organization) {
+        this.organization = organization;
+    }
+
+    /**
+     * @return the contact
+     */
+    public String getContact() {
+        return contact;
+    }
+
+    /**
+     * @param contact the contact to set
+     */
+    public void setContact(String contact) {
+        this.contact = contact;
+    }
+
+    /**
+     * @return the namespace
+     */
+    public String getNamespace() {
+        return namespace;
+    }
+
+    /**
+     * @param namespace the namespace to set
+     */
+    public void setNamespace(String namespace) {
+        this.namespace = namespace;
+    }
+
+    @Override
+    public int compareTo(ElementIndexInfo o) {
+        return o.toString().compareTo(this.toString());
+    }
+
+    @Override
+    public String toString() {
+        return "ElementIndexInfo [module=" + module + ", revision=" + revision + ", name=" + name + ", type=" + type
+                + ", startPosition=" + startPosition + ", length=" + length + ", project=" + project + ", path=" + path
+                + ", description=" + description + ", reference=" + reference + ", status=" + status + ", namespace="
+                + namespace + ", organization=" + organization + ", contact=" + contact + ", entry=" + entry + "]";
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/ElementIndexReferenceInfo.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/ElementIndexReferenceInfo.java
new file mode 100644 (file)
index 0000000..a738c13
--- /dev/null
@@ -0,0 +1,168 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.indexing;
+
+import java.io.Serializable;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IPath;
+
+import com.cisco.yangide.core.dom.ASTNamedNode;
+import com.cisco.yangide.core.dom.QName;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 31, 2014
+ */
+public class ElementIndexReferenceInfo implements Serializable, Comparable<ElementIndexReferenceInfo> {
+
+    /** Serial version UID. */
+    private static final long serialVersionUID = 8090385352032844152L;
+
+    private ElementIndexReferenceType type;
+    private String name;
+    private int startPosition = -1;
+    private int length = 0;
+    private String project;
+    private String path;
+    private QName reference;
+
+    public ElementIndexReferenceInfo(ASTNamedNode node, QName reference, ElementIndexReferenceType type,
+            IProject project, IPath path) {
+        this.reference = reference;
+        this.type = type;
+        this.name = node.getName();
+        this.startPosition = node.getNameStartPosition();
+        this.length = node.getNameLength();
+        this.project = project.getName();
+        this.path = path.toString();
+    }
+
+    /**
+     * @return the type
+     */
+    public ElementIndexReferenceType getType() {
+        return type;
+    }
+
+    /**
+     * @param type the type to set
+     */
+    public void setType(ElementIndexReferenceType type) {
+        this.type = type;
+    }
+
+    /**
+     * @return the startPosition
+     */
+    public int getStartPosition() {
+        return startPosition;
+    }
+
+    /**
+     * @param startPosition the startPosition to set
+     */
+    public void setStartPosition(int startPosition) {
+        this.startPosition = startPosition;
+    }
+
+    /**
+     * @return the length
+     */
+    public int getLength() {
+        return length;
+    }
+
+    /**
+     * @param length the length to set
+     */
+    public void setLength(int length) {
+        this.length = length;
+    }
+
+    /**
+     * @return the path
+     */
+    public String getPath() {
+        return path;
+    }
+
+    /**
+     * @param path the path to set
+     */
+    public void setPath(String path) {
+        this.path = path;
+    }
+
+    /**
+     * @return the project
+     */
+    public String getProject() {
+        return project;
+    }
+
+    /**
+     * @param project the project to set
+     */
+    public void setProject(String project) {
+        this.project = project;
+    }
+
+    /**
+     * @return the reference
+     */
+    public QName getReference() {
+        return reference;
+    }
+
+    /**
+     * @param reference the reference to set
+     */
+    public void setReference(QName reference) {
+        this.reference = reference;
+    }
+
+    /**
+     * @return the name
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * @param name the name to set
+     */
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    @Override
+    public int compareTo(ElementIndexReferenceInfo o) {
+        return o.toString().compareTo(this.toString());
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (!(obj instanceof ElementIndexReferenceInfo)) {
+            return false;
+        }
+        ElementIndexReferenceInfo i = (ElementIndexReferenceInfo) obj;
+        return this.project.equals(i.project) && this.path.equals(i.path) && this.startPosition == i.startPosition
+                && this.length == i.length && this.type == i.type;
+    }
+
+    @Override
+    public int hashCode() {
+        return 31 * this.toString().hashCode();
+    }
+
+    @Override
+    public String toString() {
+        return project + " - " + path + " - " + name + " - " + startPosition + " - " + length + " - " + type;
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/ElementIndexReferenceType.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/ElementIndexReferenceType.java
new file mode 100644 (file)
index 0000000..e306efc
--- /dev/null
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.indexing;
+
+import com.cisco.yangide.core.model.YangModelManager;
+
+/**
+ * Enumeration of available indexed types of Yang reference elements.
+ *
+ * @see YangModelManager#search(String, String, String, ElementIndexReferenceType,
+ * org.eclipse.core.resources.IProject, org.eclipse.core.runtime.IPath)
+ * @author Konstantin Zaitsev
+ * date: Jul 31, 2014
+ */
+public enum ElementIndexReferenceType {
+    /** Uses declaration with grouping references. */
+    USES,
+
+    /** Import statement with reference to module. */
+    IMPORT,
+
+    /** Identity reference statement. */
+    IDENTITY_REF,
+
+    /** Type references statement. */
+    TYPE_REF,
+
+    /** Include statement with references to submodule. */
+    INCLUDE;
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/ElementIndexType.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/ElementIndexType.java
new file mode 100644 (file)
index 0000000..35a882c
--- /dev/null
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.indexing;
+
+import com.cisco.yangide.core.model.YangModelManager;
+
+/**
+ * Enumeration of available indexed types of Yang elements.
+ *
+ * @see YangModelManager#search(String, String, String, ElementIndexType,
+ * org.eclipse.core.resources.IProject, org.eclipse.core.runtime.IPath)
+ * @author Konstantin Zaitsev
+ * date: Jul 1, 2014
+ */
+public enum ElementIndexType {
+
+    /** Yang Module <code>module</code> */
+    MODULE,
+
+    /** Yang SubModule <code>submodule</code> */
+    SUBMODULE,
+
+    /** Custom defined type declaration <code>typedef</code> */
+    TYPE,
+
+    /** Yang Grouping <code>grouping</code> */
+    GROUPING,
+
+    /** Identity declaration <code>identity</code> */
+    IDENTITY;
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/IJob.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/IJob.java
new file mode 100644 (file)
index 0000000..b6be572
--- /dev/null
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.indexing;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 1, 2014
+ */
+public interface IJob {
+
+    /* Waiting policies */
+    int ForceImmediate = 1;
+    int CancelIfNotReady = 2;
+    int WaitUntilReady = 3;
+
+    /* Job's result */
+    boolean FAILED = false;
+    boolean COMPLETE = true;
+
+    /**
+     * Answer true if the job belongs to a given family (tag)
+     */
+    public boolean belongsTo(String jobFamily);
+
+    /**
+     * Asks this job to cancel its execution. The cancellation can take an undertermined amount of
+     * time.
+     */
+    public void cancel();
+
+    /**
+     * Ensures that this job is ready to run.
+     */
+    public void ensureReadyToRun();
+
+    /**
+     * Execute the current job, answer whether it was successful.
+     */
+    public boolean execute(IProgressMonitor progress);
+
+    /**
+     * Returns this job's family
+     */
+    public String getJobFamily();
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/IndexAllProject.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/IndexAllProject.java
new file mode 100644 (file)
index 0000000..e7ab7bb
--- /dev/null
@@ -0,0 +1,176 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.indexing;
+
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.jar.JarFile;
+import java.util.zip.ZipEntry;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceProxy;
+import org.eclipse.core.resources.IResourceProxyVisitor;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.core.JavaProject;
+
+import com.cisco.yangide.core.CoreUtil;
+import com.cisco.yangide.core.YangCorePlugin;
+import com.cisco.yangide.core.YangModelException;
+import com.cisco.yangide.core.model.YangProjectInfo;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 1, 2014
+ */
+@SuppressWarnings("restriction")
+public class IndexAllProject extends IndexRequest {
+
+    private IProject project;
+
+    public IndexAllProject(IProject project, IndexManager manager) {
+        super(project.getFullPath(), manager);
+        this.project = project;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (o instanceof IndexAllProject) {
+            return this.project.equals(((IndexAllProject) o).project);
+        }
+        return false;
+    }
+
+    @Override
+    public boolean execute(IProgressMonitor progressMonitor) {
+        System.err.println("[I] Project: " + project.getName());
+
+        if (this.isCancelled || progressMonitor != null && progressMonitor.isCanceled()) {
+            return true;
+        }
+
+        if (!this.project.isAccessible()) {
+            return true;
+        }
+        final HashSet<IPath> ignoredPath = new HashSet<IPath>();
+        final HashSet<IPath> externalJarsPath = new HashSet<IPath>();
+        try {
+            JavaProject proj = (JavaProject) JavaCore.create(project);
+            final HashSet<String> projectScope = new HashSet<>();
+            projectScope.add(project.getName());
+
+            if (proj != null) {
+                IClasspathEntry[] classpath = proj.getResolvedClasspath();
+                for (int i = 0, length = classpath.length; i < length; i++) {
+                    IClasspathEntry entry = classpath[i];
+                    IPath entryPath = entry.getPath();
+                    IPath output = entry.getOutputLocation();
+                    if (output != null && !entryPath.equals(output)) {
+                        ignoredPath.add(output);
+                    }
+
+                    // index dependencies projects
+                    if (entry.getEntryKind() == IClasspathEntry.CPE_PROJECT) {
+                        IProject prj = ResourcesPlugin.getWorkspace().getRoot()
+                                .getProject(entry.getPath().lastSegment());
+                        if (prj != null && prj.exists()) {
+                            this.manager.indexAll(prj);
+                            projectScope.add(prj.getName());
+                        }
+                    }
+                }
+                IPackageFragmentRoot[] roots = proj.getAllPackageFragmentRoots();
+                for (int i = 0, length = roots.length; i < length; i++) {
+                    IPath entryPath = roots[i].getPath();
+                    if (entryPath != null && entryPath.toFile().exists()
+                            && entryPath.lastSegment().toLowerCase().endsWith(".jar")) {
+                        externalJarsPath.add(entryPath);
+                    }
+                }
+                // Update project information with set of project dependencies
+                YangProjectInfo yangProjectInfo = (YangProjectInfo) YangCorePlugin.create(project).getElementInfo(null);
+                yangProjectInfo.setProjectScope(projectScope);
+                // fill indirect scope
+                HashSet<String> indirectScope = new HashSet<String>();
+                indirectScope.add(project.getName());
+                for (IJavaProject jproj : JavaCore.create(ResourcesPlugin.getWorkspace().getRoot()).getJavaProjects()) {
+                    if (jproj != proj) {
+                        for (String name : jproj.getRequiredProjectNames()) {
+                            if (name.equals(project.getName())) {
+                                indirectScope.add(jproj.getProject().getName());
+                            }
+                        }
+                    }
+                }
+                yangProjectInfo.setIndirectScope(indirectScope);
+            }
+        } catch (JavaModelException | YangModelException e) {
+            // java project doesn't exist: ignore
+        }
+
+        for (IPath iPath : externalJarsPath) {
+            try (JarFile jarFile = new JarFile(iPath.toFile())) {
+                ZipEntry entry = jarFile.getEntry("META-INF/yang/");
+                if (entry != null) {
+                    this.manager.addJarFile(project, iPath);
+                }
+            } catch (IOException e) {
+                YangCorePlugin.log(e);
+            }
+        }
+        try {
+            final HashSet<IFile> indexedFiles = new HashSet<IFile>();
+            project.accept(new IResourceProxyVisitor() {
+                @Override
+                public boolean visit(IResourceProxy proxy) {
+                    if (IndexAllProject.this.isCancelled) {
+                        return false;
+                    }
+                    if (!ignoredPath.isEmpty() && ignoredPath.contains(proxy.requestFullPath())) {
+                        return false;
+                    }
+                    if (proxy.getType() == IResource.FILE) {
+                        if (CoreUtil.isYangLikeFileName(proxy.getName())) {
+                            IFile file = (IFile) proxy.requestResource();
+                            indexedFiles.add(file);
+                        }
+                        return false;
+                    }
+                    return true;
+                }
+            }, IResource.NONE);
+
+            for (IFile iFile : indexedFiles) {
+                this.manager.addSource(iFile);
+            }
+        } catch (CoreException e) {
+            this.manager.removeIndexFamily(project);
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        return this.project.hashCode();
+    }
+
+    @Override
+    public String toString() {
+        return "indexing project " + this.project.getFullPath(); //$NON-NLS-1$
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/IndexFileRequest.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/IndexFileRequest.java
new file mode 100644 (file)
index 0000000..236251e
--- /dev/null
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.indexing;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+import com.cisco.yangide.core.YangCorePlugin;
+import com.cisco.yangide.core.YangModelException;
+import com.cisco.yangide.core.model.YangFileInfo;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 1, 2014
+ */
+public class IndexFileRequest extends IndexRequest {
+
+    private IFile file;
+
+    public IndexFileRequest(IFile file, IndexManager manager) {
+        super(file.getFullPath(), manager);
+        this.file = file;
+    }
+
+    @Override
+    public boolean execute(IProgressMonitor progressMonitor) {
+        if (this.isCancelled || progressMonitor != null && progressMonitor.isCanceled()) {
+            return true;
+        }
+        try {
+            // remove previously indexed file
+            manager.remove(file);
+
+            YangFileInfo info = (YangFileInfo) YangCorePlugin.createYangFile(file).getElementInfo(progressMonitor);
+            manager.addModule(info.getModule(), file.getProject(), file.getFullPath(), "");
+            manager.fileAddedToIndex(file.getProject(), file.getFullPath(), file.getModificationStamp());
+        } catch (YangModelException e) {
+            // ignore exception
+        }
+        return true;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        return obj instanceof IndexFileRequest && file.equals(((IndexFileRequest) obj).file);
+    }
+
+    @Override
+    public int hashCode() {
+        return file.hashCode();
+    }
+
+    @Override
+    public String toString() {
+        return "indexing " + file.getFullPath();
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/IndexJarFileRequest.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/IndexJarFileRequest.java
new file mode 100644 (file)
index 0000000..65a8f98
--- /dev/null
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.indexing;
+
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+import com.cisco.yangide.core.CoreUtil;
+import com.cisco.yangide.core.YangCorePlugin;
+import com.cisco.yangide.core.YangModelException;
+import com.cisco.yangide.core.model.YangFileInfo;
+import com.cisco.yangide.core.model.YangJarEntry;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 1, 2014
+ */
+public class IndexJarFileRequest extends IndexRequest {
+
+    private IPath path;
+    private IProject project;
+
+    public IndexJarFileRequest(IProject project, IPath path, IndexManager manager) {
+        super(path, manager);
+        this.project = project;
+        this.path = path;
+    }
+
+    @Override
+    public boolean execute(IProgressMonitor progressMonitor) {
+        if (this.isCancelled || progressMonitor != null && progressMonitor.isCanceled()) {
+            return true;
+        }
+
+        try (JarFile jarFile = new JarFile(path.toFile())) {
+            Enumeration<JarEntry> entries = jarFile.entries();
+            while (entries.hasMoreElements()) {
+                JarEntry entry = entries.nextElement();
+                if (entry.getName().startsWith("META-INF/yang/") && CoreUtil.isYangLikeFileName(entry.getName())) {
+                    IPath jarEntryPath = path.append(entry.getName());
+                    manager.removeIndex(project, jarEntryPath);
+                    YangJarEntry element = YangCorePlugin.createJarEntry(path, entry.getName());
+                    YangFileInfo info = (YangFileInfo) element.getElementInfo(progressMonitor);
+                    manager.addModule(info.getModule(), project, path, entry.getName());
+                }
+            }
+            manager.fileAddedToIndex(project, path, path.toFile().lastModified());
+        } catch (IOException e) {
+            YangCorePlugin.log(e);
+        } catch (YangModelException e) {
+            YangCorePlugin.log(e);
+        }
+        return true;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (obj instanceof IndexJarFileRequest) {
+            IndexJarFileRequest req = (IndexJarFileRequest) obj;
+            return project.equals(req.project) && path.equals(req.path);
+        }
+        return false;
+    }
+
+    @Override
+    public int hashCode() {
+        return 31 * project.hashCode() + path.hashCode();
+    }
+
+    @Override
+    public String toString() {
+        return "indexing " + path;
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/IndexManager.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/IndexManager.java
new file mode 100644 (file)
index 0000000..fec8e04
--- /dev/null
@@ -0,0 +1,495 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.indexing;
+
+import java.io.File;
+import java.io.FilenameFilter;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.NavigableSet;
+import java.util.Set;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.mapdb.DB;
+import org.mapdb.DBMaker;
+import org.mapdb.Fun;
+import org.mapdb.Fun.Tuple3;
+import org.mapdb.Fun.Tuple4;
+import org.mapdb.Fun.Tuple6;
+
+import com.cisco.yangide.core.YangCorePlugin;
+import com.cisco.yangide.core.YangModelException;
+import com.cisco.yangide.core.dom.ASTVisitor;
+import com.cisco.yangide.core.dom.BaseReference;
+import com.cisco.yangide.core.dom.GroupingDefinition;
+import com.cisco.yangide.core.dom.IdentitySchemaNode;
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.core.dom.ModuleImport;
+import com.cisco.yangide.core.dom.QName;
+import com.cisco.yangide.core.dom.SubModule;
+import com.cisco.yangide.core.dom.SubModuleInclude;
+import com.cisco.yangide.core.dom.TypeDefinition;
+import com.cisco.yangide.core.dom.TypeReference;
+import com.cisco.yangide.core.dom.UsesNode;
+import com.cisco.yangide.core.model.YangProjectInfo;
+
+/**
+ * Provides functionality to index AST nodes and search item in index.
+ *
+ * @author Konstantin Zaitsev
+ * date: Jun 25, 2014
+ */
+public class IndexManager extends JobManager {
+
+    /**
+     * Stores index version, it is required increment version on each major changes of indexing
+     * algorithm or indexed data.
+     */
+    private static final int INDEX_VERSION = 9;
+
+    /**
+     * Index DB file path.
+     */
+    private static final String INDEX_PATH = "index_" + INDEX_VERSION + ".db";
+
+    /**
+     * Empty result array.
+     */
+    private static final ElementIndexInfo[] NO_ELEMENTS = new ElementIndexInfo[0];
+
+    /**
+     * Empty result array.
+     */
+    private static final ElementIndexReferenceInfo[] NO_REF_ELEMENTS = new ElementIndexReferenceInfo[0];
+
+    /**
+     * Index database.
+     */
+    private DB db;
+
+    /**
+     * Keywords index contains the following values:
+     * <ul>
+     * <li>module</li>
+     * <li>revision</li>
+     * <li>name</li>
+     * <li>type</li>
+     * <li>file path (scope, for JAR entries path to project)</li>
+     * <li>ast info</li>
+     * </ul>
+     */
+    private NavigableSet<Fun.Tuple6<String, String, String, ElementIndexType, String, ElementIndexInfo>> idxKeywords;
+
+    /**
+     * References index contains the following values:
+     * <ul>
+     * <li>qname</li>
+     * <li>type</li>
+     * <li>file path (scope, for JAR entries path to project)</li>
+     * <li>ast info</li>
+     * </ul>
+     */
+    private NavigableSet<Fun.Tuple4<QName, ElementIndexReferenceType, String, ElementIndexReferenceInfo>> idxReferences;
+
+    /**
+     * Resources index that contains relation of indexed resource and modification stamp of resource
+     * when indexed was performed.
+     */
+    private NavigableSet<Fun.Tuple3<String, String, Long>> idxResources;
+
+    public IndexManager() {
+        File indexFile = YangCorePlugin.getDefault().getStateLocation().append(INDEX_PATH).toFile();
+        try {
+            initDB(indexFile, false);
+
+            if (!idxKeywords.isEmpty() && !(idxKeywords.first() instanceof Fun.Tuple6)) {
+                initDB(indexFile, true);
+            }
+        } catch (Throwable e) {
+            initDB(indexFile, true);
+        }
+    }
+
+    /**
+     * Inits database by cleans old version of DB and recreate current index file if necessary.
+     *
+     * @param indexFile index file
+     * @param cleanAll if <code>true</code> remove old version and current index also otherwise
+     * remove only old version of index DB.
+     */
+    private void initDB(File indexFile, final boolean cleanAll) {
+        // delete index db in case if index is broken and reopen with clean state
+        if (this.db != null) {
+            this.db.close();
+        }
+        File[] files = indexFile.getParentFile().listFiles(new FilenameFilter() {
+
+            @Override
+            public boolean accept(File dir, String name) {
+                return name.startsWith("index") && (cleanAll || !name.startsWith("index_" + INDEX_VERSION));
+            }
+        });
+        if (files != null) {
+            for (File file : files) {
+                file.delete();
+            }
+        }
+        this.db = DBMaker.newFileDB(indexFile).closeOnJvmShutdown().make();
+        this.idxKeywords = db.getTreeSet("keywords");
+        this.idxReferences = db.getTreeSet("references");
+        this.idxResources = db.getTreeSet("resources");
+        indexAllProjects();
+    }
+
+    @Override
+    public String processName() {
+        return "Yang indexer";
+    }
+
+    /**
+     * Indexes project only on project open event.
+     *
+     * @param project project to index
+     */
+    public void indexAll(IProject project) {
+        request(new IndexAllProject(project, this));
+    }
+
+    public void addSource(IFile file) {
+        // this workaround need in case of old project that has target copied yang file but this
+        // files not ignored by JDT yet.
+        String path = file.getProjectRelativePath().toString();
+        if (path.contains("target/") || path.contains("target-ide/")) {
+            return;
+        }
+        // in case of file not change, skip indexing
+        Iterable<Long> it = Fun.filter(idxResources, file.getProject().getName(), file.getFullPath().toString());
+        for (Long modStamp : it) {
+            if (modStamp == file.getModificationStamp()) {
+                System.err.println("[x] " + file);
+                return;
+            }
+        }
+        request(new IndexFileRequest(file, this));
+    }
+
+    public void addWorkingCopy(IFile file) {
+        request(new IndexFileRequest(file, this));
+    }
+
+    public void addJarFile(IProject project, IPath file) {
+        // in case of file not change, skip indexing
+        Iterable<Long> it = Fun.filter(idxResources, project.getName(), file.toString());
+        for (Long modStamp : it) {
+            if (modStamp == file.toFile().lastModified()) {
+                System.err.println("[x] " + file);
+                return;
+            }
+        }
+        request(new IndexJarFileRequest(project, file, this));
+    }
+
+    @Override
+    public void shutdown() {
+        super.shutdown();
+        db.commit();
+        db.compact();
+        db.close();
+    }
+
+    public synchronized void removeIndexFamily(IProject project) {
+        Iterator<Tuple6<String, String, String, ElementIndexType, String, ElementIndexInfo>> iterator = idxKeywords
+                .iterator();
+        while (iterator.hasNext()) {
+            Tuple6<String, String, String, ElementIndexType, String, ElementIndexInfo> entry = iterator.next();
+            if (project.getName().equals(entry.f.getProject())) {
+                iterator.remove();
+            }
+        }
+
+        Iterator<Tuple4<QName, ElementIndexReferenceType, String, ElementIndexReferenceInfo>> itRef = idxReferences
+                .iterator();
+        while (itRef.hasNext()) {
+            Tuple4<QName, ElementIndexReferenceType, String, ElementIndexReferenceInfo> entry = itRef.next();
+            if (project.getName().equals(entry.d.getProject())) {
+                itRef.remove();
+            }
+        }
+
+        Iterator<Long> it = Fun.filter(idxResources, project.getName(), null).iterator();
+        while (it.hasNext()) {
+            it.next();
+            it.remove();
+        }
+    }
+
+    public synchronized void remove(IFile file) {
+        removeIndex(file.getProject(), file.getFullPath());
+    }
+
+    public synchronized void jobWasCancelled(IPath containerPath) {
+    }
+
+    public synchronized void removeIndex(IProject project, IPath containerPath) {
+        Iterator<Tuple6<String, String, String, ElementIndexType, String, ElementIndexInfo>> iterator = idxKeywords
+                .iterator();
+        while (iterator.hasNext()) {
+            Tuple6<String, String, String, ElementIndexType, String, ElementIndexInfo> entry = iterator.next();
+            if (project.getName().equals(entry.f.getProject()) && containerPath.isPrefixOf(new Path(entry.e))) {
+                iterator.remove();
+            }
+        }
+
+        Iterator<Tuple4<QName, ElementIndexReferenceType, String, ElementIndexReferenceInfo>> itRef = idxReferences
+                .iterator();
+        while (itRef.hasNext()) {
+            Tuple4<QName, ElementIndexReferenceType, String, ElementIndexReferenceInfo> entry = itRef.next();
+            if (project.getName().equals(entry.d.getProject()) && containerPath.isPrefixOf(new Path(entry.c))) {
+                itRef.remove();
+            }
+        }
+
+        Iterator<Tuple3<String, String, Long>> it = idxResources.iterator();
+        while (it.hasNext()) {
+            Tuple3<String, String, Long> idxr = it.next();
+            if (project.getName().equals(idxr.a) && containerPath.isPrefixOf(new Path(idxr.b))) {
+                it.remove();
+            }
+        }
+    }
+
+    public synchronized void addElementIndexInfo(ElementIndexInfo info) {
+        System.err.println("[I] " + info.getModule() + "@" + info.getRevision() + " - " + info.getName() + " - "
+                + info.getType());
+        idxKeywords.add(Fun.t6(info.getModule(), info.getRevision(), info.getName(), info.getType(), info.getPath(),
+                info));
+    }
+
+    public synchronized void addElementIndexReferenceInfo(ElementIndexReferenceInfo info) {
+        System.err.println("[IR] " + info.getReference() + " : " + info.getType() + " - " + info.getProject() + "@"
+                + info.getPath());
+        idxReferences.add(Fun.t4(info.getReference(), info.getType(), info.getPath(), info));
+    }
+
+    public void addModule(Module module, final IProject project, final IPath path, final String entry) {
+        if (module != null && module.getRevision() != null && module.getRevision() != null) {
+            final String revision = module.getRevision();
+            final String moduleName = module.getName();
+            module.accept(new ASTVisitor() {
+                @Override
+                public boolean visit(Module module) {
+                    addElementIndexInfo(new ElementIndexInfo(module, moduleName, revision, ElementIndexType.MODULE,
+                            project, path, entry));
+                    return true;
+                }
+
+                @Override
+                public boolean visit(SubModule module) {
+                    addElementIndexInfo(new ElementIndexInfo(module, moduleName, revision, ElementIndexType.SUBMODULE,
+                            project, path, entry));
+                    return true;
+                }
+
+                @Override
+                public boolean visit(TypeDefinition typeDefinition) {
+                    addElementIndexInfo(new ElementIndexInfo(typeDefinition, moduleName, revision,
+                            ElementIndexType.TYPE, project, path, entry));
+                    return true;
+                }
+
+                @Override
+                public boolean visit(GroupingDefinition groupingDefinition) {
+                    addElementIndexInfo(new ElementIndexInfo(groupingDefinition, moduleName, revision,
+                            ElementIndexType.GROUPING, project, path, entry));
+                    return true;
+                }
+
+                @Override
+                public boolean visit(IdentitySchemaNode identity) {
+                    addElementIndexInfo(new ElementIndexInfo(identity, moduleName, revision, ElementIndexType.IDENTITY,
+                            project, path, entry));
+                    return true;
+                }
+
+                @Override
+                public boolean visit(UsesNode uses) {
+                    // index in case if not JAR
+                    if (entry == null || entry.isEmpty()) {
+                        addElementIndexReferenceInfo(new ElementIndexReferenceInfo(uses, uses.getGrouping(),
+                                ElementIndexReferenceType.USES, project, path));
+                    }
+                    return true;
+                }
+
+                @Override
+                public boolean visit(TypeReference ref) {
+                    // index in case if not JAR
+                    if (entry == null || entry.isEmpty()) {
+                        addElementIndexReferenceInfo(new ElementIndexReferenceInfo(ref, ref.getType(),
+                                ElementIndexReferenceType.TYPE_REF, project, path));
+                    }
+                    return true;
+                }
+
+                @Override
+                public boolean visit(BaseReference ref) {
+                    // index in case if not JAR
+                    if (entry == null || entry.isEmpty()) {
+                        addElementIndexReferenceInfo(new ElementIndexReferenceInfo(ref, ref.getType(),
+                                ElementIndexReferenceType.IDENTITY_REF, project, path));
+                    }
+                    return true;
+                }
+
+                @Override
+                public boolean visit(ModuleImport moduleImport) {
+                    // index in case if not JAR
+                    if (entry == null || entry.isEmpty()) {
+                        QName qname = new QName(moduleImport.getName(), moduleImport.getPrefix(), moduleImport
+                                .getName(), moduleImport.getRevision());
+                        addElementIndexReferenceInfo(new ElementIndexReferenceInfo(moduleImport, qname,
+                                ElementIndexReferenceType.IMPORT, project, path));
+                    }
+                    return true;
+                }
+
+                @Override
+                public boolean visit(SubModuleInclude subModuleInclude) {
+                    // index in case if not JAR
+                    if (entry == null || entry.isEmpty()) {
+                        QName qname = new QName(subModuleInclude.getName(), null, subModuleInclude.getName(),
+                                subModuleInclude.getRevision());
+                        addElementIndexReferenceInfo(new ElementIndexReferenceInfo(subModuleInclude, qname,
+                                ElementIndexReferenceType.INCLUDE, project, path));
+                    }
+                    return true;
+                }
+            });
+            db.commit();
+        }
+    }
+
+    public synchronized ElementIndexInfo[] search(String module, String revision, String name, ElementIndexType type,
+            IProject project, IPath scope) {
+        ArrayList<ElementIndexInfo> infos = null;
+        Set<String> projectScope = null;
+
+        if (project != null) {
+            try {
+                projectScope = ((YangProjectInfo) YangCorePlugin.create(project).getElementInfo(null))
+                        .getProjectScope();
+            } catch (YangModelException e) {
+                // ignore
+            }
+        }
+
+        for (Tuple6<String, String, String, ElementIndexType, String, ElementIndexInfo> entry : idxKeywords) {
+            if (module != null && module.length() > 0 && !module.equals(entry.a)) {
+                continue;
+            }
+
+            if (revision != null && revision.length() > 0 && !revision.equals(entry.b)) {
+                continue;
+            }
+
+            if (type != null && type != entry.d) {
+                continue;
+            }
+
+            if (name != null && name.length() > 0 && !entry.c.equals(name)) {
+                continue;
+            }
+
+            if (projectScope != null && !projectScope.contains(entry.f.getProject())) {
+                continue;
+            }
+
+            if (scope != null && !scope.isPrefixOf(new Path(entry.e))) {
+                continue;
+            }
+
+            if (infos == null) {
+                infos = new ArrayList<ElementIndexInfo>();
+            }
+            infos.add(entry.f);
+        }
+
+        if (infos != null) {
+            return infos.toArray(new ElementIndexInfo[infos.size()]);
+        }
+        return NO_ELEMENTS;
+    }
+
+    public synchronized ElementIndexReferenceInfo[] searchReference(QName reference, ElementIndexReferenceType type,
+            IProject project) {
+        ArrayList<ElementIndexReferenceInfo> infos = null;
+        Set<String> indirectScope = null;
+
+        if (project != null) {
+            try {
+                indirectScope = ((YangProjectInfo) YangCorePlugin.create(project).getElementInfo(null))
+                        .getIndirectScope();
+            } catch (YangModelException e) {
+                // ignore
+            }
+        }
+
+        for (Tuple4<QName, ElementIndexReferenceType, String, ElementIndexReferenceInfo> entry : idxReferences) {
+            if (type != null && type != entry.b) {
+                continue;
+            }
+
+            if (indirectScope != null && !indirectScope.contains(entry.d.getProject())) {
+                continue;
+            }
+
+            if (reference.getModule() != null && !reference.getModule().equals(entry.a.getModule())) {
+                continue;
+            }
+
+            if (reference.getRevision() != null && entry.a.getRevision() != null
+                    && !reference.getRevision().equals(entry.a.getRevision())) {
+                continue;
+            }
+
+            if (reference.getName() != null && !reference.getName().equals(entry.a.getName())) {
+                continue;
+            }
+
+            if (infos == null) {
+                infos = new ArrayList<ElementIndexReferenceInfo>();
+            }
+
+            if (!infos.contains(entry.d)) {
+                infos.add(entry.d);
+            }
+        }
+
+        if (infos != null) {
+            return infos.toArray(new ElementIndexReferenceInfo[infos.size()]);
+        }
+        return NO_REF_ELEMENTS;
+    }
+
+    private void indexAllProjects() {
+        // reindex all projects
+        for (IProject project : ResourcesPlugin.getWorkspace().getRoot().getProjects()) {
+            if (YangCorePlugin.isYangProject(project)) {
+                indexAll(project);
+            }
+        }
+    }
+
+    protected void fileAddedToIndex(IProject project, IPath path, long modificationStamp) {
+        idxResources.add(Fun.t3(project.getName(), path.toString(), modificationStamp));
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/IndexRequest.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/IndexRequest.java
new file mode 100644 (file)
index 0000000..80755aa
--- /dev/null
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.indexing;
+
+import org.eclipse.core.runtime.IPath;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 1, 2014
+ */
+public abstract class IndexRequest implements IJob {
+    protected boolean isCancelled = false;
+    protected IPath containerPath;
+    protected IndexManager manager;
+
+    public IndexRequest(IPath containerPath, IndexManager manager) {
+        this.containerPath = containerPath;
+        this.manager = manager;
+    }
+
+    public boolean belongsTo(String projectNameOrJarPath) {
+        // used to remove pending jobs because the project was deleted... not to delete index files
+        // can be found either by project name or JAR path name
+        return projectNameOrJarPath.equals(this.containerPath.segment(0))
+                || projectNameOrJarPath.equals(this.containerPath.toString());
+    }
+
+    public void cancel() {
+        this.manager.jobWasCancelled(this.containerPath);
+        this.isCancelled = true;
+    }
+
+    public void ensureReadyToRun() {
+    }
+
+    public String getJobFamily() {
+        return this.containerPath.toString();
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/JobAdapter.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/JobAdapter.java
new file mode 100644 (file)
index 0000000..57fb30b
--- /dev/null
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.indexing;
+
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 4, 2014
+ */
+public abstract class JobAdapter implements IJob {
+
+    @Override
+    public boolean belongsTo(String jobFamily) {
+        return false;
+    }
+
+    @Override
+    public void cancel() {
+    }
+
+    @Override
+    public void ensureReadyToRun() {
+    }
+
+    @Override
+    public String getJobFamily() {
+        return "yang_generic";
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/JobManager.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/JobManager.java
new file mode 100644 (file)
index 0000000..45b668d
--- /dev/null
@@ -0,0 +1,492 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.indexing;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.osgi.util.NLS;
+
+import com.cisco.yangide.core.YangCorePlugin;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 1, 2014
+ */
+public abstract class JobManager implements Runnable {
+
+    /* queue of jobs to execute */
+    protected IJob[] awaitingJobs = new IJob[10];
+    protected int jobStart = 0;
+    protected int jobEnd = -1;
+    protected boolean executing = false;
+
+    /* background processing */
+    protected Thread processingThread;
+    protected Job progressJob;
+
+    /*
+     * counter indicating whether job execution is enabled or not, disabled if <= 0 it cannot go
+     * beyond 1
+     */
+    private int enableCount = 1;
+
+    /* flag indicating that the activation has completed */
+    public boolean activated = false;
+
+    private int awaitingClients = 0;
+
+    /**
+     * Invoked exactly once, in background, before starting processing any job
+     */
+    public void activateProcessing() {
+        this.activated = true;
+    }
+
+    /**
+     * Answer the amount of awaiting jobs.
+     */
+    public synchronized int awaitingJobsCount() {
+        // pretend busy in case concurrent job attempts performing before activated
+        return this.activated ? this.jobEnd - this.jobStart + 1 : 1;
+    }
+
+    /**
+     * Answers the first job in the queue, or null if there is no job available Until the job has
+     * completed, the job manager will keep answering the same job.
+     */
+    public synchronized IJob currentJob() {
+        if (this.enableCount > 0 && this.jobStart <= this.jobEnd) {
+            return this.awaitingJobs[this.jobStart];
+        }
+        return null;
+    }
+
+    public synchronized void disable() {
+        this.enableCount--;
+    }
+
+    /**
+     * Remove the index from cache for a given project. Passing null as a job family discards them
+     * all.
+     */
+    public void discardJobs(String jobFamily) {
+
+        try {
+            IJob currentJob;
+            // cancel current job if it belongs to the given family
+            synchronized (this) {
+                currentJob = currentJob();
+                disable();
+            }
+            if (currentJob != null && (jobFamily == null || currentJob.belongsTo(jobFamily))) {
+                currentJob.cancel();
+
+                // wait until current active job has finished
+                while (this.processingThread != null && this.executing) {
+                    try {
+                        Thread.sleep(50);
+                    } catch (InterruptedException e) {
+                        // ignore
+                    }
+                }
+            }
+
+            // flush and compact awaiting jobs
+            int loc = -1;
+            synchronized (this) {
+                for (int i = this.jobStart; i <= this.jobEnd; i++) {
+                    currentJob = this.awaitingJobs[i];
+                    if (currentJob != null) { // sanity check
+                        this.awaitingJobs[i] = null;
+                        if (!(jobFamily == null || currentJob.belongsTo(jobFamily))) { // copy down,
+                            // compacting
+                            this.awaitingJobs[++loc] = currentJob;
+                        } else {
+                            currentJob.cancel();
+                        }
+                    }
+                }
+                this.jobStart = 0;
+                this.jobEnd = loc;
+            }
+        } finally {
+            enable();
+        }
+    }
+
+    public synchronized void enable() {
+        this.enableCount++;
+        notifyAll(); // wake up the background thread if it is waiting (context must be
+        // synchronized)
+    }
+
+    protected synchronized boolean isJobWaiting(IJob request) {
+        for (int i = this.jobEnd; i > this.jobStart; i--) {
+            // don't check job at jobStart, as it may have already started
+            if (request.equals(this.awaitingJobs[i])) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Advance to the next available job, once the current one has been completed. Note: clients
+     * awaiting until the job count is zero are still waiting at this point.
+     */
+    protected synchronized void moveToNextJob() {
+        // if (!enabled) return;
+
+        if (this.jobStart <= this.jobEnd) {
+            this.awaitingJobs[this.jobStart++] = null;
+            if (this.jobStart > this.jobEnd) {
+                this.jobStart = 0;
+                this.jobEnd = -1;
+            }
+        }
+    }
+
+    /**
+     * When idle, give chance to do something
+     */
+    protected void notifyIdle(long idlingTime) {
+        // do nothing
+    }
+
+    /**
+     * This API is allowing to run one job in concurrence with background processing. Indeed since
+     * other jobs are performed in background, resource sharing might be an issue.Therefore, this
+     * functionality allows a given job to be run without colliding with background ones. Note:
+     * multiple thread might attempt to perform concurrent jobs at the same time, and should
+     * synchronize (it is deliberately left to clients to decide whether concurrent jobs might
+     * interfere or not. In general, multiple read jobs are ok). Waiting policy can be:
+     * IJobConstants.ForceImmediateSearch IJobConstants.CancelIfNotReadyToSearch
+     * IJobConstants.WaitUntilReadyToSearch
+     */
+    public boolean performConcurrentJob(IJob searchJob, int waitingPolicy, IProgressMonitor progress) {
+        searchJob.ensureReadyToRun();
+
+        boolean status = IJob.FAILED;
+        try {
+            int concurrentJobWork = 100;
+            if (progress != null) {
+                progress.beginTask("", concurrentJobWork); //$NON-NLS-1$
+            }
+            if (awaitingJobsCount() > 0) {
+                switch (waitingPolicy) {
+
+                case IJob.ForceImmediate:
+                    try {
+                        disable(); // pause indexing
+                        status = searchJob.execute(progress == null ? null : new SubProgressMonitor(progress,
+                                concurrentJobWork));
+                    } finally {
+                        enable();
+                    }
+                    return status;
+
+                case IJob.CancelIfNotReady:
+                    throw new OperationCanceledException();
+
+                case IJob.WaitUntilReady:
+                    IProgressMonitor subProgress = null;
+                    try {
+                        int totalWork = 1000;
+                        if (progress != null) {
+                            subProgress = new SubProgressMonitor(progress, concurrentJobWork * 8 / 10);
+                            subProgress.beginTask("", totalWork); //$NON-NLS-1$
+                            concurrentJobWork = concurrentJobWork * 2 / 10;
+                        }
+                        // use local variable to avoid potential NPE (see bug 20435 NPE when
+                        // searching java method
+                        // and bug 42760 NullPointerException in JobManager when searching)
+                        Thread t = this.processingThread;
+                        int originalPriority = t == null ? -1 : t.getPriority();
+                        try {
+                            if (t != null) {
+                                t.setPriority(Thread.currentThread().getPriority());
+                            }
+                            synchronized (this) {
+                                this.awaitingClients++;
+                            }
+                            IJob previousJob = null;
+                            int awaitingJobsCount;
+                            int lastJobsCount = totalWork;
+                            float lastWorked = 0;
+                            float totalWorked = 0;
+                            while ((awaitingJobsCount = awaitingJobsCount()) > 0) {
+                                if ((subProgress != null && subProgress.isCanceled()) || this.processingThread == null) {
+                                    throw new OperationCanceledException();
+                                }
+                                IJob currentJob = currentJob();
+                                // currentJob can be null when jobs have been added to the queue but
+                                // job manager is not enabled
+                                if (currentJob != null && currentJob != previousJob) {
+                                    if (subProgress != null) {
+                                        String indexing = NLS.bind("{1} files to index ({0})",
+                                                currentJob.getJobFamily(), Integer.toString(awaitingJobsCount));
+                                        subProgress.subTask(indexing);
+                                        // ratio of the amount of work relative to the total work
+                                        float ratio = awaitingJobsCount < totalWork ? 1 : ((float) totalWork)
+                                                / awaitingJobsCount;
+                                        if (lastJobsCount > awaitingJobsCount) {
+                                            totalWorked += (lastJobsCount - awaitingJobsCount) * ratio;
+                                        } else {
+                                            // more jobs were added, just increment by the ratio
+                                            totalWorked += ratio;
+                                        }
+                                        if (totalWorked - lastWorked >= 1) {
+                                            subProgress.worked((int) (totalWorked - lastWorked));
+                                            lastWorked = totalWorked;
+                                        }
+                                        lastJobsCount = awaitingJobsCount;
+                                    }
+                                    previousJob = currentJob;
+                                }
+                                try {
+                                    Thread.sleep(50);
+                                } catch (InterruptedException e) {
+                                    // ignore
+                                }
+                            }
+                        } finally {
+                            synchronized (this) {
+                                this.awaitingClients--;
+                            }
+                            if (t != null && originalPriority > -1 && t.isAlive()) {
+                                t.setPriority(originalPriority);
+                            }
+                        }
+                    } finally {
+                        if (subProgress != null) {
+                            subProgress.done();
+                        }
+                    }
+                }
+            }
+            status = searchJob.execute(progress == null ? null : new SubProgressMonitor(progress, concurrentJobWork));
+        } finally {
+            if (progress != null) {
+                progress.done();
+            }
+        }
+        return status;
+    }
+
+    public abstract String processName();
+
+    public synchronized void request(IJob job) {
+
+        job.ensureReadyToRun();
+
+        // skip job if it already in manager
+        for (int i = this.jobEnd; i > this.jobStart; i--) {
+            if (job.equals(this.awaitingJobs[i])) {
+                return;
+            }
+        }
+
+        // append the job to the list of ones to process later on
+        int size = this.awaitingJobs.length;
+        if (++this.jobEnd == size) { // when growing, relocate jobs starting at position 0
+            this.jobEnd -= this.jobStart; // jobEnd now equals the number of jobs
+            if (this.jobEnd < 50 && this.jobEnd < this.jobStart) {
+                // plenty of free space in the queue so shift the remaining jobs to the beginning
+                // instead of growing it
+                System.arraycopy(this.awaitingJobs, this.jobStart, this.awaitingJobs, 0, this.jobEnd);
+                for (int i = this.jobStart; i < size; i++) {
+                    this.awaitingJobs[i] = null;
+                }
+            } else {
+                System.arraycopy(this.awaitingJobs, this.jobStart, this.awaitingJobs = new IJob[size * 2], 0,
+                        this.jobEnd);
+            }
+            this.jobStart = 0;
+        }
+        this.awaitingJobs[this.jobEnd] = job;
+        notifyAll(); // wake up the background thread if it is waiting
+    }
+
+    /**
+     * Flush current state
+     */
+    public synchronized void reset() {
+
+        if (this.processingThread != null) {
+            discardJobs(null); // discard all jobs
+        } else {
+            /* initiate background processing */
+            this.processingThread = new Thread(this, processName());
+            this.processingThread.setDaemon(true);
+            // less prioritary by default, priority is raised if clients are actively waiting on it
+            this.processingThread.setPriority(Thread.NORM_PRIORITY - 1);
+            // https://bugs.eclipse.org/bugs/show_bug.cgi?id=296343
+            // set the context loader to avoid leaking the current context loader
+            this.processingThread.setContextClassLoader(this.getClass().getClassLoader());
+            this.processingThread.start();
+        }
+    }
+
+    /**
+     * Infinite loop performing resource indexing
+     */
+    @Override
+    public void run() {
+
+        long idlingStart = -1;
+        activateProcessing();
+        try {
+            class ProgressJob extends Job {
+                ProgressJob(String name) {
+                    super(name);
+                }
+
+                @Override
+                protected IStatus run(IProgressMonitor monitor) {
+                    IJob job = currentJob();
+                    while (!monitor.isCanceled() && job != null) {
+                        String taskName = new StringBuffer("YANG indexing...").append(
+                                NLS.bind("{1} files to index ({0})", job.getJobFamily(),
+                                        Integer.toString(awaitingJobsCount()))).toString();
+                        monitor.subTask(taskName);
+                        setName(taskName);
+                        try {
+                            Thread.sleep(500);
+                        } catch (InterruptedException e) {
+                            // ignore
+                        }
+                        job = currentJob();
+                    }
+                    return Status.OK_STATUS;
+                }
+            }
+            this.progressJob = null;
+            while (this.processingThread != null) {
+                try {
+                    IJob job;
+                    synchronized (this) {
+                        // handle shutdown case when notifyAll came before the wait but after the
+                        // while loop was entered
+                        if (this.processingThread == null) {
+                            continue;
+                        }
+
+                        // must check for new job inside this sync block to avoid timing hole
+                        if ((job = currentJob()) == null) {
+                            if (this.progressJob != null) {
+                                this.progressJob.cancel();
+                                this.progressJob = null;
+                            }
+                            if (idlingStart < 0) {
+                                idlingStart = System.currentTimeMillis();
+                            } else {
+                                notifyIdle(System.currentTimeMillis() - idlingStart);
+                            }
+                            this.wait(); // wait until a new job is posted (or reenabled:38901)
+                        } else {
+                            idlingStart = -1;
+                        }
+                    }
+                    if (job == null) {
+                        notifyIdle(System.currentTimeMillis() - idlingStart);
+                        // just woke up, delay before processing any new jobs, allow some time for
+                        // the active thread to finish
+                        Thread.sleep(500);
+                        continue;
+                    }
+                    try {
+                        this.executing = true;
+                        if (this.progressJob == null) {
+                            this.progressJob = new ProgressJob("YANG indexing...");
+                            this.progressJob.setPriority(Job.LONG);
+                            this.progressJob.setSystem(true);
+                            this.progressJob.schedule();
+                        }
+                        /* boolean status = */job.execute(null);
+                        // if (status == FAILED) request(job);
+                    } finally {
+                        this.executing = false;
+                        moveToNextJob();
+                        if (this.awaitingClients == 0) {
+                            Thread.sleep(50);
+                        }
+                    }
+                } catch (InterruptedException e) { // background indexing was interrupted
+                }
+            }
+        } catch (RuntimeException e) {
+            if (this.processingThread != null) { // if not shutting down
+                // log exception
+                YangCorePlugin.log(e, "Background Indexer Crash Recovery"); //$NON-NLS-1$
+
+                // keep job manager alive
+                discardJobs(null);
+                this.processingThread = null;
+                reset(); // this will fork a new thread with no waiting jobs, some indexes will be
+                // inconsistent
+            }
+            throw e;
+        } catch (Error e) {
+            if (this.processingThread != null && !(e instanceof ThreadDeath)) {
+                // log exception
+                YangCorePlugin.log(e, "Background Indexer Crash Recovery"); //$NON-NLS-1$
+
+                // keep job manager alive
+                discardJobs(null);
+                this.processingThread = null;
+                reset(); // this will fork a new thread with no waiting jobs, some indexes will be
+                // inconsistent
+            }
+            throw e;
+        }
+    }
+
+    /**
+     * Stop background processing, and wait until the current job is completed before returning
+     */
+    public void shutdown() {
+
+        disable();
+        discardJobs(null); // will wait until current executing job has completed
+        Thread thread = this.processingThread;
+        try {
+            if (thread != null) { // see http://bugs.eclipse.org/bugs/show_bug.cgi?id=31858
+                synchronized (this) {
+                    this.processingThread = null; // mark the job manager as shutting down so that
+                    // the thread will stop by itself
+                    notifyAll(); // ensure its awake so it can be shutdown
+                }
+                // in case processing thread is handling a job
+                thread.join();
+            }
+            Job job = this.progressJob;
+            if (job != null) {
+                job.cancel();
+                job.join();
+            }
+        } catch (InterruptedException e) {
+            // ignore
+        }
+    }
+
+    @Override
+    public String toString() {
+        StringBuffer buffer = new StringBuffer(10);
+        buffer.append("Enable count:").append(this.enableCount).append('\n'); //$NON-NLS-1$
+        int numJobs = this.jobEnd - this.jobStart + 1;
+        buffer.append("Jobs in queue:").append(numJobs).append('\n'); //$NON-NLS-1$
+        for (int i = 0; i < numJobs && i < 15; i++) {
+            buffer.append(i).append(" - job[" + i + "]: ").append(this.awaitingJobs[this.jobStart + i]).append('\n'); //$NON-NLS-1$ //$NON-NLS-2$
+        }
+        return buffer.toString();
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/YangElementDelta.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/indexing/YangElementDelta.java
new file mode 100644 (file)
index 0000000..bc3e417
--- /dev/null
@@ -0,0 +1,294 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.indexing;
+
+import java.util.ArrayList;
+
+import com.cisco.yangide.core.IOpenable;
+import com.cisco.yangide.core.IYangElementDelta;
+import com.cisco.yangide.core.model.YangElement;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 30, 2014
+ */
+public class YangElementDelta implements IYangElementDelta {
+    static IYangElementDelta[] EMPTY_DELTA = new IYangElementDelta[0];
+
+    private YangElement changedElement;
+    private int kind = 0;
+    private int flags = 0;
+    private IYangElementDelta[] affectedChildren = EMPTY_DELTA;
+
+    private int changeFlags;
+
+    public YangElementDelta(YangElement element) {
+        this.changedElement = element;
+    }
+
+    @Override
+    public YangElement getElement() {
+        return changedElement;
+    }
+
+    @Override
+    public int getKind() {
+        return kind;
+    }
+
+    @Override
+    public int getFlags() {
+        return flags;
+    }
+
+    @Override
+    public IYangElementDelta[] getAffectedChildren() {
+        return affectedChildren;
+    }
+
+    public void added(YangElement element) {
+        YangElementDelta addedDelta = new YangElementDelta(element);
+        addedDelta.kind = IYangElementDelta.ADDED;
+        insertDeltaTree(element, addedDelta);
+    }
+
+    public YangElementDelta changed(YangElement element, int changeFlag) {
+        YangElementDelta changedDelta = new YangElementDelta(element);
+        changedDelta.kind = IYangElementDelta.CHANGED;
+        changedDelta.changeFlags |= flags;
+        insertDeltaTree(element, changedDelta);
+        return changedDelta;
+    }
+
+    public void removed(YangElement element) {
+        YangElementDelta removedDelta = new YangElementDelta(element);
+        insertDeltaTree(element, removedDelta);
+        YangElementDelta actualDelta = getDeltaFor(element);
+        if (actualDelta != null) {
+            actualDelta.kind = IYangElementDelta.REMOVED;
+            actualDelta.affectedChildren = EMPTY_DELTA;
+        }
+    }
+
+    protected void insertDeltaTree(YangElement element, YangElementDelta delta) {
+        YangElementDelta childDelta = createDeltaTree(element, delta);
+        if (!equalsAndSameParent(element, getElement())) { // handle case of two jars that can be
+                                                           // equals but not in the same project
+            addAffectedChild(childDelta);
+        }
+    }
+
+    /**
+     * Creates the nested delta deltas based on the affected element its delta, and the root of this
+     * delta tree. Returns the root of the created delta tree.
+     */
+    protected YangElementDelta createDeltaTree(YangElement element, YangElementDelta delta) {
+        YangElementDelta childDelta = delta;
+        ArrayList<IOpenable> ancestors = getAncestors(element);
+        if (ancestors == null) {
+            if (equalsAndSameParent(delta.getElement(), getElement())) {
+                this.kind = delta.kind;
+            }
+        } else {
+            for (int i = 0, size = ancestors.size(); i < size; i++) {
+                YangElement ancestor = (YangElement) ancestors.get(i);
+                YangElementDelta ancestorDelta = new YangElementDelta(ancestor);
+                ancestorDelta.addAffectedChild(childDelta);
+                childDelta = ancestorDelta;
+            }
+        }
+        return childDelta;
+    }
+
+    /**
+     * Adds the child delta to the collection of affected children. If the child is already in the
+     * collection, walk down the hierarchy.
+     */
+    protected void addAffectedChild(YangElementDelta child) {
+        switch (this.kind) {
+        case ADDED:
+        case REMOVED:
+            // no need to add a child if this parent is added or removed
+            return;
+        case CHANGED:
+            this.changeFlags |= F_CHILDREN;
+            break;
+        default:
+            this.kind = CHANGED;
+            this.changeFlags |= F_CHILDREN;
+        }
+
+        if (this.affectedChildren == null || this.affectedChildren.length == 0) {
+            this.affectedChildren = new IYangElementDelta[] { child };
+            return;
+        }
+
+        YangElementDelta existingChild = null;
+        int existingChildIndex = -1;
+        for (int i = 0; i < this.affectedChildren.length; i++) {
+            if (equalsAndSameParent(this.affectedChildren[i].getElement(), child.getElement())) {
+                existingChild = (YangElementDelta) this.affectedChildren[i];
+                existingChildIndex = i;
+                break;
+            }
+        }
+        if (existingChild == null) { // new affected child
+            this.affectedChildren = growAndAddToArray(this.affectedChildren, child);
+        } else {
+            switch (existingChild.getKind()) {
+            case ADDED:
+                switch (child.getKind()) {
+                case ADDED: // child was added then added -> it is added
+                case CHANGED: // child was added then changed -> it is added
+                    return;
+                case REMOVED: // child was added then removed -> noop
+                    this.affectedChildren = removeAndShrinkArray(this.affectedChildren, existingChildIndex);
+                    return;
+                }
+                break;
+            case REMOVED:
+                switch (child.getKind()) {
+                case ADDED: // child was removed then added -> it is changed
+                    child.kind = CHANGED;
+                    this.affectedChildren[existingChildIndex] = child;
+                    return;
+                case CHANGED: // child was removed then changed -> it is removed
+                case REMOVED: // child was removed then removed -> it is removed
+                    return;
+                }
+                break;
+            case CHANGED:
+                switch (child.getKind()) {
+                case ADDED: // child was changed then added -> it is added
+                case REMOVED: // child was changed then removed -> it is removed
+                    this.affectedChildren[existingChildIndex] = child;
+                    return;
+                case CHANGED: // child was changed then changed -> it is changed
+                    IYangElementDelta[] children = child.getAffectedChildren();
+                    for (int i = 0; i < children.length; i++) {
+                        YangElementDelta childsChild = (YangElementDelta) children[i];
+                        existingChild.addAffectedChild(childsChild);
+                    }
+
+                    // update flags
+                    boolean childHadContentFlag = (child.changeFlags & F_CONTENT) != 0;
+                    boolean existingChildHadChildrenFlag = (existingChild.changeFlags & F_CHILDREN) != 0;
+                    existingChild.changeFlags |= child.changeFlags;
+
+                    // remove F_CONTENT flag if existing child had F_CHILDREN flag set
+                    // (case of fine grained delta (existing child) and delta coming from
+                    // DeltaProcessor (child))
+                    if (childHadContentFlag && existingChildHadChildrenFlag) {
+                        existingChild.changeFlags &= ~F_CONTENT;
+                    }
+
+                    return;
+                }
+                break;
+            default:
+                // unknown -> existing child becomes the child with the existing child's flags
+                int flags = existingChild.getFlags();
+                this.affectedChildren[existingChildIndex] = child;
+                child.changeFlags |= flags;
+            }
+        }
+    }
+
+    /**
+     * Returns whether the two yang elements are equals and have the same parent.
+     */
+    protected boolean equalsAndSameParent(YangElement e1, YangElement e2) {
+        IOpenable parent1;
+        return e1.equals(e2) && ((parent1 = e1.getParent()) != null) && parent1.equals(e2.getParent());
+    }
+
+    private ArrayList<IOpenable> getAncestors(YangElement element) {
+        IOpenable parent = element.getParent();
+        if (parent == null) {
+            return null;
+        }
+        ArrayList<IOpenable> parents = new ArrayList<IOpenable>();
+        while (!parent.equals(this.changedElement)) {
+            parents.add(parent);
+            parent = parent.getParent();
+            if (parent == null) {
+                return null;
+            }
+        }
+        parents.trimToSize();
+        return parents;
+    }
+
+    /**
+     * Adds the new element to a new array that contains all of the elements of the old array.
+     * Returns the new array.
+     */
+    protected IYangElementDelta[] growAndAddToArray(IYangElementDelta[] array, IYangElementDelta addition) {
+        IYangElementDelta[] old = array;
+        array = new IYangElementDelta[old.length + 1];
+        System.arraycopy(old, 0, array, 0, old.length);
+        array[old.length] = addition;
+        return array;
+    }
+
+    /**
+     * Removes the child delta from the collection of affected children.
+     */
+    protected void removeAffectedChild(YangElementDelta child) {
+        int index = -1;
+        if (this.affectedChildren != null) {
+            for (int i = 0; i < this.affectedChildren.length; i++) {
+                if (equalsAndSameParent(this.affectedChildren[i].getElement(), child.getElement())) {
+                    index = i;
+                    break;
+                }
+            }
+        }
+        if (index >= 0) {
+            this.affectedChildren = removeAndShrinkArray(this.affectedChildren, index);
+        }
+    }
+
+    /**
+     * Returns the delta for a given element. Only looks below this delta.
+     */
+    protected YangElementDelta getDeltaFor(YangElement element) {
+        if (equalsAndSameParent(getElement(), element)) {
+            return this;
+        }
+
+        if (this.affectedChildren.length == 0) {
+            return null;
+        }
+        int childrenCount = this.affectedChildren.length;
+        for (int i = 0; i < childrenCount; i++) {
+            YangElementDelta delta = (YangElementDelta) this.affectedChildren[i];
+            if (equalsAndSameParent(delta.getElement(), element)) {
+                return delta;
+            } else {
+                delta = delta.getDeltaFor(element);
+                if (delta != null)
+                    return delta;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Removes the element from the array. Returns the a new array which has shrunk.
+     */
+    protected IYangElementDelta[] removeAndShrinkArray(IYangElementDelta[] old, int index) {
+        IYangElementDelta[] array = new IYangElementDelta[old.length - 1];
+        if (index > 0)
+            System.arraycopy(old, 0, array, 0, index);
+        int rest = old.length - index - 1;
+        if (rest > 0)
+            System.arraycopy(old, index + 1, array, index, rest);
+        return array;
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangElement.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangElement.java
new file mode 100644 (file)
index 0000000..21f354e
--- /dev/null
@@ -0,0 +1,308 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.model;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+
+import com.cisco.yangide.core.CoreUtil;
+import com.cisco.yangide.core.IOpenable;
+import com.cisco.yangide.core.OpenableElementInfo;
+import com.cisco.yangide.core.YangModelException;
+import com.cisco.yangide.core.buffer.BufferChangedEvent;
+import com.cisco.yangide.core.buffer.BufferManager;
+import com.cisco.yangide.core.buffer.IBuffer;
+import com.cisco.yangide.core.buffer.IBufferChangedListener;
+import com.cisco.yangide.core.buffer.NullBuffer;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 24, 2014
+ */
+public abstract class YangElement implements IOpenable, IBufferChangedListener {
+    public static final IOpenable[] NO_ELEMENTS = new IOpenable[0];
+
+    private final IOpenable parent;
+
+    public YangElement(IOpenable parent) {
+        this.parent = parent;
+    }
+
+    @Override
+    public void bufferChanged(BufferChangedEvent event) {
+        if (event.getBuffer().isClosed()) {
+            YangModelManager.getYangModelManager().getElementsOutOfSynchWithBuffers().remove(this);
+            getBufferManager().removeBuffer(event.getBuffer());
+        } else {
+            YangModelManager.getYangModelManager().getElementsOutOfSynchWithBuffers().add(this);
+        }
+    }
+
+    @Override
+    public IBuffer getBuffer() throws YangModelException {
+        if (hasBuffer()) {
+            // ensure element is open
+            Object info = getElementInfo(null);
+            IBuffer buffer = getBufferManager().getBuffer(this);
+            if (buffer == null) {
+                // try to (re)open a buffer
+                buffer = openBuffer(null, info);
+            }
+            if (buffer instanceof NullBuffer) {
+                return null;
+            }
+            return buffer;
+        } else {
+            return null;
+        }
+    }
+
+    public boolean canBeRemovedFromCache() {
+        try {
+            return !hasUnsavedChanges();
+        } catch (YangModelException e) {
+            return false;
+        }
+    }
+
+    @Override
+    public boolean exists() {
+        try {
+            getElementInfo(null);
+            return true;
+        } catch (YangModelException e) {
+            // element doesn't exist: return false
+        }
+        return false;
+    }
+
+    @Override
+    public String toStringWithAncestors() {
+        StringBuffer sb = new StringBuffer(getName());
+        IOpenable p = getParent();
+        if (p != null) {
+            sb.append("[").append(p.toStringWithAncestors()).append("]");
+        }
+        return sb.toString();
+    }
+
+    @Override
+    public IOpenable getParent() {
+        return this.parent;
+    }
+
+    @Override
+    public IPath getPath() {
+        return null;
+    }
+
+    @Override
+    public IResource getResource() {
+        return null;
+    }
+
+    @Override
+    public boolean isReadOnly() {
+        return false;
+    }
+
+    /**
+     * @param buffer
+     * @return
+     */
+    public boolean canBufferBeRemovedFromCache(IBuffer buffer) {
+        return !buffer.hasUnsavedChanges();
+    }
+    
+    @Override
+    public void close() throws YangModelException {
+        if (hasBuffer()) {
+            IBuffer buffer = getBufferManager().getBuffer(this);
+            if (buffer != null) {
+                buffer.close();
+                buffer.removeBufferChangedListener(this);
+            }
+        }
+        YangModelManager.getYangModelManager().removeInfoAndChildren(this);
+
+    }
+
+    public boolean hasUnsavedChanges() throws YangModelException {
+        return false;
+    }
+    
+    @Override
+    public boolean isOpen() {
+        return YangModelManager.getYangModelManager().getInfo(this) != null;
+    }
+
+    @Override
+    public void open(IProgressMonitor progress) throws YangModelException {
+        getElementInfo(progress);
+    }
+
+    public Object getElementInfo(IProgressMonitor monitor) throws YangModelException {
+        YangModelManager manager = YangModelManager.getYangModelManager();
+        Object info = manager.getInfo(this);
+        if (info != null) {
+            return info;
+        }
+        return openWhenClosed(createElementInfo(), monitor);
+    }
+
+    public IOpenable[] getChildren() throws YangModelException {
+        Object elementInfo = getElementInfo(null);
+        if (elementInfo instanceof OpenableElementInfo) {
+            return ((OpenableElementInfo) elementInfo).getChildren();
+        } else {
+            return NO_ELEMENTS;
+        }
+    }
+
+    @Override
+    public String getName() {
+        return getPath().toString();
+    }
+
+    @Override
+    public int hashCode() {
+        if (this.parent == null) {
+            return super.hashCode();
+        }
+        return CoreUtil.combineHashCodes(getName().hashCode(), this.parent.hashCode());
+    }
+
+    @Override
+    public boolean equals(Object o) {
+
+        if (this == o) {
+            return true;
+        }
+
+        // Yang model parent is null
+        if (this.parent == null) {
+            return super.equals(o);
+        }
+
+        // assume instanceof check is done in subclass
+        YangElement other = (YangElement) o;
+        return getName().equals(other.getName()) && this.parent.equals(other.parent);
+    }
+
+    protected void generateInfos(OpenableElementInfo info, HashMap<IOpenable, OpenableElementInfo> newElements,
+            IProgressMonitor monitor) throws YangModelException {
+
+        // open its ancestors if needed
+        openAncestors(newElements, monitor);
+
+        // validate existence
+        IResource underlResource = getResource();
+        IStatus status = validateExistence(underlResource);
+        if (!status.isOK()) {
+            if (status.getException() != null) {
+                throw new YangModelException(status.getException(), status.getCode());
+            } else {
+                throw new YangModelException(status.getMessage());
+            }
+        }
+
+        if (monitor != null && monitor.isCanceled()) {
+            throw new OperationCanceledException();
+        }
+
+        // puts the info before building the structure so that questions to the handle behave as if
+        // the element existed
+        // (case of compilation units becoming working copies)
+        newElements.put(this, info);
+
+        // build the structure of the openable (this will open the buffer if needed)
+        try {
+            OpenableElementInfo openableElementInfo = info;
+            boolean isStructureKnown = buildStructure(openableElementInfo, monitor, newElements, underlResource);
+            openableElementInfo.setIsStructureKnown(isStructureKnown);
+        } catch (YangModelException e) {
+            newElements.remove(this);
+            throw e;
+        }
+
+        // remove out of sync buffer for this element
+        YangModelManager.getYangModelManager().getElementsOutOfSynchWithBuffers().remove(this);
+    }
+
+    protected void openAncestors(HashMap<IOpenable, OpenableElementInfo> newElements, IProgressMonitor monitor)
+            throws YangModelException {
+        YangElement openableParent = (YangElement) getParent();
+        if (openableParent != null && !openableParent.isOpen()) {
+            openableParent.generateInfos(openableParent.createElementInfo(), newElements, monitor);
+        }
+    }
+
+    /**
+     * Opens a buffer on the contents of this element, and returns the buffer, or returns
+     * <code>null</code> if opening fails. By default, do nothing - subclasses that have buffers
+     * must override as required.
+     */
+    protected IBuffer openBuffer(IProgressMonitor pm, Object info) throws YangModelException {
+        return null;
+    }
+
+    protected OpenableElementInfo createElementInfo() {
+        return new OpenableElementInfo();
+    }
+
+    protected boolean hasBuffer() {
+        return false;
+    }
+
+    /*
+     * Opens an <code>Openable</code> that is known to be closed (no check for
+     * <code>isOpen()</code>). Returns the created element info.
+     */
+    protected OpenableElementInfo openWhenClosed(OpenableElementInfo info, IProgressMonitor monitor)
+            throws YangModelException {
+        YangModelManager manager = YangModelManager.getYangModelManager();
+        HashMap<IOpenable, OpenableElementInfo> newElements = new HashMap<IOpenable, OpenableElementInfo>();
+        generateInfos(info, newElements, monitor);
+        if (info == null) {
+            info = newElements.get(this);
+        }
+        manager.putInfos(this, newElements);
+        return info;
+    }
+
+    protected BufferManager getBufferManager() {
+        return BufferManager.getDefaultBufferManager();
+    }
+
+    /**
+     * Builds this element's structure and properties in the given info object, based on this
+     * element's current contents (reuse buffer contents if this element has an open buffer, or
+     * resource contents if this element does not have an open buffer). Children are placed in the
+     * given newElements table (note, this element has already been placed in the newElements
+     * table). Returns true if successful, or false if an error is encountered while determining the
+     * structure of this element.
+     */
+    protected abstract boolean buildStructure(OpenableElementInfo info, IProgressMonitor pm,
+            Map<IOpenable, OpenableElementInfo> newElements, IResource underlyingResource) throws YangModelException;
+
+    /*
+     * Validates the existence of this openable. Returns a non ok status if it doesn't exist.
+     */
+    abstract protected IStatus validateExistence(IResource underlyingResource);
+
+    /**
+     * @return element type.
+     */
+    public abstract YangElementType getElementType();
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangElementType.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangElementType.java
new file mode 100644 (file)
index 0000000..da9ebbe
--- /dev/null
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.model;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 30, 2014
+ */
+public enum YangElementType {
+
+    /** YangModel type. */
+    YANG_MODEL,
+
+    /** YangProject type. */
+    YANG_PROJECT,
+
+    /** YangFolder type. */
+    YANG_FOLDER,
+
+    /** Yang File type. */
+    YANG_FILE,
+
+    /** Yang Jar File type. */
+    YANG_JAR_FILE,
+
+    /** Yang Jar Entry. */
+    YANG_JAR_ENTRY;
+
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangFile.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangFile.java
new file mode 100644 (file)
index 0000000..9e37284
--- /dev/null
@@ -0,0 +1,159 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.model;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Map;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+
+import com.cisco.yangide.core.IOpenable;
+import com.cisco.yangide.core.OpenableElementInfo;
+import com.cisco.yangide.core.YangCorePlugin;
+import com.cisco.yangide.core.YangModelException;
+import com.cisco.yangide.core.buffer.BufferManager;
+import com.cisco.yangide.core.buffer.IBuffer;
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.core.parser.YangParserUtil;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 24, 2014
+ */
+public class YangFile extends YangElement {
+    private IFile resource;
+
+    /**
+     * @param resource
+     * @param parent
+     */
+    public YangFile(IFile resource, IOpenable parent) {
+        super(parent);
+        this.resource = resource;
+    }
+
+    public char[] getContents() throws YangModelException {
+        IBuffer buffer = getBuffer();
+        return buffer.getCharacters();
+    }
+
+    @Override
+    protected boolean buildStructure(OpenableElementInfo info, IProgressMonitor pm,
+            Map<IOpenable, OpenableElementInfo> newElements, IResource underlyingResource) throws YangModelException {
+        // ensure buffer is opened
+        IBuffer buffer = getBufferManager().getBuffer(this);
+        if (buffer == null) {
+            buffer = openBuffer(pm, info);
+        }
+
+        Module module = YangParserUtil.parseYangFile(buffer.getCharacters());
+        ((YangFileInfo) info).setModule(module);
+        info.setIsStructureKnown(true);
+        return true;
+    }
+
+    @Override
+    protected IStatus validateExistence(IResource underlyingResource) {
+        return underlyingResource.exists() && underlyingResource.isAccessible() ? Status.OK_STATUS : new Status(
+                Status.ERROR, YangCorePlugin.PLUGIN_ID, "Does not exist");
+    }
+
+    @Override
+    protected boolean hasBuffer() {
+        return true;
+    }
+
+    @Override
+    protected OpenableElementInfo createElementInfo() {
+        return new YangFileInfo();
+    }
+
+    @Override
+    protected IBuffer openBuffer(IProgressMonitor pm, Object info) throws YangModelException {
+        BufferManager bufManager = getBufferManager();
+        IBuffer buffer = BufferManager.createBuffer(this);
+        if (buffer == null) {
+            return null;
+        }
+
+        synchronized (bufManager) {
+            IBuffer existingBuffer = bufManager.getBuffer(this);
+            if (existingBuffer != null) {
+                return existingBuffer;
+            }
+
+            // set the buffer source
+            if (buffer.getCharacters() == null) {
+                IFile file = (IFile) getResource();
+                if (file == null || !file.exists()) {
+                    throw new YangModelException("File not found");
+                }
+                InputStreamReader contents = null;
+                try {
+                    contents = new InputStreamReader(file.getContents(true), "utf-8");
+                    char[] buf = new char[8096];
+                    StringBuilder builder = new StringBuilder();
+                    while (true) {
+                        int r = contents.read(buf);
+                        if (r == -1) {
+                            break;
+                        }
+                        builder.append(buf, 0, r);
+                    }
+                    buffer.setContents(builder.toString());
+                } catch (Exception e) {
+                    throw new YangModelException(e, 0);
+                } finally {
+                    if (contents != null) {
+                        try {
+                            contents.close();
+                        } catch (IOException e) {
+                            // Ingore
+                        }
+                    }
+                }
+            }
+
+            // add buffer to buffer cache
+            // note this may cause existing buffers to be removed from the buffer cache, but only
+            // primary compilation unit's buffer
+            // can be closed, thus no call to a client's IBuffer#close() can be done in this
+            // synchronized block.
+            bufManager.addBuffer(buffer);
+
+            // listen to buffer changes
+            buffer.addBufferChangedListener(this);
+        }
+        return buffer;
+    }
+
+    @Override
+    public IResource getResource() {
+        return resource;
+    }
+
+    @Override
+    public IPath getPath() {
+        return resource.getFullPath().makeRelativeTo(getParent().getResource().getFullPath());
+    }
+
+    public Module getModule() throws YangModelException {
+        return ((YangFileInfo) getElementInfo(null)).getModule();
+    }
+
+    @Override
+    public YangElementType getElementType() {
+        return YangElementType.YANG_FILE;
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangFileInfo.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangFileInfo.java
new file mode 100644 (file)
index 0000000..16c0eaf
--- /dev/null
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.model;
+
+import com.cisco.yangide.core.OpenableElementInfo;
+import com.cisco.yangide.core.dom.Module;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 26, 2014
+ */
+public class YangFileInfo extends OpenableElementInfo {
+    private Module module;
+
+    /**
+     * @return the module
+     */
+    public Module getModule() {
+        return module;
+    }
+
+    /**
+     * @param module the module to set
+     */
+    public void setModule(Module module) {
+        this.module = module;
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangFolder.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangFolder.java
new file mode 100644 (file)
index 0000000..c45cb20
--- /dev/null
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.model;
+
+import java.util.ArrayList;
+import java.util.Map;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceVisitor;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+
+import com.cisco.yangide.core.IOpenable;
+import com.cisco.yangide.core.OpenableElementInfo;
+import com.cisco.yangide.core.YangCorePlugin;
+import com.cisco.yangide.core.YangModelException;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 24, 2014
+ */
+public class YangFolder extends YangElement {
+
+    public static final String YANG_EXTENSION = "yang";
+    private IResource resource;
+
+    /**
+     * @param resource
+     * @param parent
+     */
+    public YangFolder(IResource resource, IOpenable parent) {
+        super(parent);
+        this.resource = resource;
+    }
+
+    @Override
+    public IResource getResource() {
+        return resource;
+    }
+
+    @Override
+    public IPath getPath() {
+        return resource.getFullPath().makeRelativeTo(getParent().getPath());
+    }
+
+    @Override
+    protected boolean buildStructure(OpenableElementInfo info, IProgressMonitor pm,
+            Map<IOpenable, OpenableElementInfo> newElements, IResource underlyingResource) throws YangModelException {
+        final ArrayList<IOpenable> result = new ArrayList<IOpenable>();
+        try {
+            resource.accept(new IResourceVisitor() {
+                public boolean visit(IResource res) throws CoreException {
+                    if (res.getType() == IResource.FILE
+                            && YANG_EXTENSION.equalsIgnoreCase(res.getFullPath().getFileExtension())) {
+                        result.add(new YangFile((IFile) res, YangFolder.this));
+                    }
+                    return true;
+                }
+            }, IResource.DEPTH_ONE, false);
+        } catch (CoreException e) {
+            throw new YangModelException(e);
+        }
+        info.setChildren((IOpenable[]) result.toArray(new IOpenable[result.size()]));
+        return true;
+    }
+
+    @Override
+    protected IStatus validateExistence(IResource underlyingResource) {
+        return underlyingResource.exists() && underlyingResource.isAccessible() ? Status.OK_STATUS : new Status(
+                Status.ERROR, YangCorePlugin.PLUGIN_ID, "Does not exist");
+    }
+
+    @Override
+    public YangElementType getElementType() {
+        return YangElementType.YANG_FOLDER;
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangJarEntry.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangJarEntry.java
new file mode 100644 (file)
index 0000000..dd3d39a
--- /dev/null
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.model;
+
+import java.io.CharArrayWriter;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Map;
+import java.util.jar.JarFile;
+import java.util.zip.ZipEntry;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+
+import com.cisco.yangide.core.IOpenable;
+import com.cisco.yangide.core.OpenableElementInfo;
+import com.cisco.yangide.core.YangModelException;
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.core.parser.YangParserUtil;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 07, 2014
+ */
+public class YangJarEntry extends YangElement {
+    private IPath path;
+
+    public YangJarEntry(IPath path, IOpenable parent) {
+        super(parent);
+        this.path = path;
+    }
+
+    @Override
+    protected boolean buildStructure(OpenableElementInfo info, IProgressMonitor pm,
+            Map<IOpenable, OpenableElementInfo> newElements, IResource underlyingResource) throws YangModelException {
+        char[] content = getContent();
+        Module module = YangParserUtil.parseYangFile(content);
+        ((YangFileInfo) info).setModule(module);
+        info.setIsStructureKnown(true);
+        return true;
+    }
+
+    @Override
+    protected IStatus validateExistence(IResource underlyingResource) {
+        return Status.OK_STATUS;
+    }
+
+    @Override
+    protected OpenableElementInfo createElementInfo() {
+        return new YangFileInfo();
+    }
+
+    @Override
+    public IPath getPath() {
+        return path;
+    }
+
+    public Module getModule() throws YangModelException {
+        return ((YangFileInfo) getElementInfo(null)).getModule();
+    }
+
+    @Override
+    public YangElementType getElementType() {
+        return YangElementType.YANG_JAR_ENTRY;
+    }
+
+    private char[] getContent() throws YangModelException {
+        try (JarFile file = new JarFile(getParent().getPath().toFile())) {
+            ZipEntry entry = file.getEntry(path.toString());
+            InputStreamReader in = new InputStreamReader(file.getInputStream(entry), "UTF-8");
+            CharArrayWriter out = new CharArrayWriter();
+            char[] buff = new char[1024];
+            int len = 0;
+            while ((len = in.read(buff)) > 0) {
+                out.write(buff, 0, len);
+            }
+            return out.toCharArray();
+        } catch (IOException e) {
+            throw new YangModelException(e, 0);
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangJarFile.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangJarFile.java
new file mode 100644 (file)
index 0000000..d577d6c
--- /dev/null
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.model;
+
+import java.util.Map;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+
+import com.cisco.yangide.core.IOpenable;
+import com.cisco.yangide.core.OpenableElementInfo;
+import com.cisco.yangide.core.YangModelException;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 07, 2014
+ */
+public class YangJarFile extends YangElement {
+    private IPath path;
+
+    /**
+     * @param resource
+     * @param parent
+     */
+    public YangJarFile(IPath path, IOpenable parent) {
+        super(parent);
+        this.path = path;
+    }
+
+    @Override
+    protected boolean buildStructure(OpenableElementInfo info, IProgressMonitor pm,
+            Map<IOpenable, OpenableElementInfo> newElements, IResource underlyingResource) throws YangModelException {
+        return true;
+    }
+
+    @Override
+    protected IStatus validateExistence(IResource underlyingResource) {
+        return Status.OK_STATUS;
+    }
+
+    @Override
+    public IPath getPath() {
+        return path;
+    }
+
+    @Override
+    public YangElementType getElementType() {
+        return YangElementType.YANG_JAR_FILE;
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangModel.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangModel.java
new file mode 100644 (file)
index 0000000..d7e6ec1
--- /dev/null
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.model;
+
+import java.util.Map;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+
+import com.cisco.yangide.core.IOpenable;
+import com.cisco.yangide.core.OpenableElementInfo;
+import com.cisco.yangide.core.YangCorePlugin;
+import com.cisco.yangide.core.YangModelException;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 25, 2014
+ */
+public class YangModel extends YangElement {
+
+    public YangModel() {
+        super(null);
+    }
+
+    @Override
+    protected boolean buildStructure(OpenableElementInfo info, IProgressMonitor pm,
+            Map<IOpenable, OpenableElementInfo> newElements, IResource underlyingResource) throws YangModelException {
+
+        IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
+        int length = projects.length;
+        IOpenable[] children = new IOpenable[length];
+        int index = 0;
+        for (int i = 0; i < length; i++) {
+            IProject project = projects[i];
+            if (project.isAccessible() && YangCorePlugin.isYangProject(project)) {
+                children[index++] = new YangProject(project, this);
+            }
+        }
+        if (index < length) {
+            System.arraycopy(children, 0, children = new IOpenable[index], 0, index);
+        }
+
+        info.setChildren(children);
+
+        newElements.put(this, info);
+
+        return true;
+    }
+
+    public YangProject[] getYangProjects() throws YangModelException {
+        IOpenable[] children = getChildren();
+        YangProject[] projects = new YangProject[children.length];
+        for (int i = 0; i < projects.length; i++) {
+            projects[i] = (YangProject) children[i];
+        }
+        return projects;
+    }
+
+    @Override
+    protected IStatus validateExistence(IResource underlyingResource) {
+        return Status.OK_STATUS;
+    }
+
+    @Override
+    public IPath getPath() {
+        return Path.ROOT;
+    }
+
+    @Override
+    public YangElementType getElementType() {
+        return YangElementType.YANG_MODEL;
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangModelManager.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangModelManager.java
new file mode 100644 (file)
index 0000000..0e9f9f7
--- /dev/null
@@ -0,0 +1,253 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.model;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.ISaveContext;
+import org.eclipse.core.resources.ISaveParticipant;
+import org.eclipse.core.resources.ISavedState;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jdt.core.JavaCore;
+
+import com.cisco.yangide.core.IOpenable;
+import com.cisco.yangide.core.OpenableElementCache;
+import com.cisco.yangide.core.OpenableElementInfo;
+import com.cisco.yangide.core.YangCorePlugin;
+import com.cisco.yangide.core.YangModelException;
+import com.cisco.yangide.core.indexing.DeltaProcessor;
+import com.cisco.yangide.core.indexing.ElementIndexInfo;
+import com.cisco.yangide.core.indexing.ElementIndexType;
+import com.cisco.yangide.core.indexing.IJob;
+import com.cisco.yangide.core.indexing.IndexManager;
+import com.cisco.yangide.core.indexing.JobAdapter;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 24, 2014
+ */
+public final class YangModelManager implements ISaveParticipant {
+
+    /** Singleton instance. */
+    private static final YangModelManager MANAGER = new YangModelManager();
+
+    /**
+     * Infos cache.
+     */
+    private OpenableElementCache cache;
+    private YangModel yangModel = new YangModel();
+
+    public IndexManager indexManager = null;
+
+    public DeltaProcessor deltaProcessor = null;
+
+    protected HashSet<IOpenable> elementsOutOfSynchWithBuffers = new HashSet<IOpenable>(11);
+
+    /**
+     * @return singleton instance
+     */
+    public static YangModelManager getYangModelManager() {
+        return MANAGER;
+    }
+
+    public void startup() throws CoreException {
+        try {
+            // initialize Yang model cache, 5000 is default value for JDT openable cache
+            this.cache = new OpenableElementCache(5000);
+            this.indexManager = new IndexManager();
+            this.deltaProcessor = new DeltaProcessor(this);
+            final IWorkspace workspace = ResourcesPlugin.getWorkspace();
+            workspace.addResourceChangeListener(deltaProcessor,
+            /*
+             * update spec in JavaCore#addPreProcessingResourceChangedListener(...) if adding more
+             * event types
+             */
+            IResourceChangeEvent.PRE_BUILD | IResourceChangeEvent.POST_BUILD | IResourceChangeEvent.POST_CHANGE
+                    | IResourceChangeEvent.PRE_DELETE | IResourceChangeEvent.PRE_CLOSE
+                    | IResourceChangeEvent.PRE_REFRESH);
+
+            // Register for JDT Class path changes.
+            JavaCore.addElementChangedListener(deltaProcessor);
+
+            // start indexing
+            if (this.indexManager != null) {
+                this.indexManager.reset();
+            }
+
+            // init projects
+            yangModel.getYangProjects();
+
+            Job processSavedState = new Job("Processing Yang changes since last activation") {
+                @Override
+                protected IStatus run(IProgressMonitor monitor) {
+                    try {
+                        workspace.run(new IWorkspaceRunnable() {
+                            @Override
+                            public void run(IProgressMonitor progress) throws CoreException {
+                                ISavedState savedState = workspace.addSaveParticipant(YangCorePlugin.PLUGIN_ID,
+                                        YangModelManager.this);
+                                if (savedState != null) {
+                                    // the event type coming from the saved state is always
+                                    // POST_AUTO_BUILD
+                                    // force it to be POST_CHANGE so that the delta processor can
+                                    // handle it
+                                    YangModelManager.this.deltaProcessor.overridenEventType = IResourceChangeEvent.POST_CHANGE;
+                                    savedState.processResourceChangeEvents(YangModelManager.this.deltaProcessor);
+                                }
+                            }
+                        }, monitor);
+                    } catch (CoreException e) {
+                        return e.getStatus();
+                    }
+                    return Status.OK_STATUS;
+                }
+            };
+            processSavedState.setSystem(true);
+            processSavedState.setPriority(Job.SHORT); // process asap
+            processSavedState.schedule();
+        } catch (RuntimeException e) {
+            e.printStackTrace();
+            shutdown();
+            throw e;
+        }
+    }
+
+    public void shutdown() {
+        IWorkspace workspace = ResourcesPlugin.getWorkspace();
+        workspace.removeResourceChangeListener(this.deltaProcessor);
+        workspace.removeSaveParticipant(YangCorePlugin.PLUGIN_ID);
+
+        // Stop indexing
+        if (this.indexManager != null) {
+            this.indexManager.shutdown();
+        }
+
+        // wait for the initialization job to finish
+        try {
+            Job.getJobManager().join(YangCorePlugin.PLUGIN_ID, null);
+        } catch (InterruptedException e) {
+            // ignore
+        }
+    }
+
+    /**
+     * @param element
+     * @return
+     */
+    public synchronized Object getInfo(IOpenable element) {
+        return cache.get(element);
+    }
+
+    /*
+     * Puts the infos in the given map (keys are IJavaElements and values are JavaElementInfos) in
+     * the Java model cache in an atomic way.
+     */
+    protected synchronized void putInfos(IOpenable openedElement, Map<IOpenable, OpenableElementInfo> newElements) {
+        Object existingInfo = this.cache.get(openedElement);
+        closeChildren(existingInfo);
+
+        Iterator<Entry<IOpenable, OpenableElementInfo>> iterator = newElements.entrySet().iterator();
+        while (iterator.hasNext()) {
+            Entry<IOpenable, OpenableElementInfo> entry = iterator.next();
+            this.cache.put(entry.getKey(), entry.getValue());
+        }
+    }
+
+    private void closeChildren(Object info) {
+        // if (info instanceof JavaElementInfo) {
+        // IJavaElement[] children = ((JavaElementInfo)info).getChildren();
+        // for (int i = 0, size = children.length; i < size; ++i) {
+        // JavaElement child = (JavaElement) children[i];
+        // try {
+        // child.close();
+        // } catch (JavaModelException e) {
+        // // ignore
+        // }
+        // }
+        // }
+    }
+
+    /*
+     * Removes all cached info for the given element (including all children) from the cache.
+     * Returns the info for the given element, or null if it was closed.
+     */
+    public synchronized Object removeInfoAndChildren(IOpenable element) throws YangModelException {
+        Object info = this.cache.get(element);
+        if (info != null) {
+            closeChildren(info);
+            this.cache.remove(element);
+            return info;
+        }
+        return null;
+    }
+
+    /**
+     * @return the yangModel
+     */
+    public YangModel getYangModel() {
+        return yangModel;
+    }
+
+    /**
+     * @return index manager
+     */
+    public static IndexManager getIndexManager() {
+        return MANAGER.indexManager;
+    }
+
+    public static ElementIndexInfo[] search(final String module, final String revision, final String name,
+            final ElementIndexType type, final IProject project, final IPath scope) {
+        final AtomicReference<ElementIndexInfo[]> search = new AtomicReference<>();
+        YangModelManager.getIndexManager().performConcurrentJob(new JobAdapter() {
+            @Override
+            public boolean execute(IProgressMonitor progress) {
+                search.set(MANAGER.indexManager.search(module, revision, name, type, project, scope));
+                return false;
+            }
+        }, IJob.WaitUntilReady, null);
+        return search.get();
+    }
+
+    protected HashSet<IOpenable> getElementsOutOfSynchWithBuffers() {
+        return this.elementsOutOfSynchWithBuffers;
+    }
+
+    // / methods from ISaveParticipant
+    @Override
+    public void doneSaving(ISaveContext context) {
+    }
+
+    @Override
+    public void prepareToSave(ISaveContext context) throws CoreException {
+    }
+
+    @Override
+    public void rollback(ISaveContext context) {
+    }
+
+    @Override
+    public void saving(ISaveContext context) throws CoreException {
+    }
+
+    // / end of methods from ISaveParticipant
+
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangModelUtil.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangModelUtil.java
new file mode 100644 (file)
index 0000000..a176d4b
--- /dev/null
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.model;
+
+import com.cisco.yangide.core.YangCorePlugin;
+import com.cisco.yangide.core.YangModelException;
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.core.dom.SimpleNode;
+import com.cisco.yangide.core.indexing.ElementIndexInfo;
+
+/**
+ * General utilities for working with different parts of the core plug-in.
+ * <br>
+ * One may think of this class as a library of business-layer utilities.
+ *
+ * @author Kirill Karmakulov
+ * date:   Oct 13, 2014
+ */
+public class YangModelUtil {
+
+    /**
+     * Retrieves value of "prefix" node of the YANG module, which is identified 
+     * by the given {@code info}.
+     *
+     * @param info  {@link ElementIndexInfo}, which identifies the quested module
+     * @return  value of "prefix" node, if it existed; an empty string otherwise. 
+     */
+    public static String retrieveModulePrefix(ElementIndexInfo info) {
+        String defaultPrefix = "";
+        try {
+            Module importedModule = YangCorePlugin.createYangFile(info.getPath())
+                    .getModule();
+            SimpleNode<String> prefixNode = importedModule.getPrefix();
+            if (prefixNode != null) {
+                defaultPrefix = prefixNode.getValue();
+            }
+        } catch (YangModelException ex) {
+            YangCorePlugin.log(ex, "Yang source file could not be loaded.");
+        }
+        return defaultPrefix;
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangProject.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangProject.java
new file mode 100644 (file)
index 0000000..38d8433
--- /dev/null
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.model;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.jar.JarFile;
+import java.util.zip.ZipEntry;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceVisitor;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+
+import com.cisco.yangide.core.CoreUtil;
+import com.cisco.yangide.core.IOpenable;
+import com.cisco.yangide.core.OpenableElementInfo;
+import com.cisco.yangide.core.YangCorePlugin;
+import com.cisco.yangide.core.YangModelException;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 24, 2014
+ */
+public class YangProject extends YangElement {
+
+    private IProject project;
+
+    /**
+     * @param parent
+     */
+    public YangProject(IProject project, IOpenable parent) {
+        super(parent);
+        this.project = project;
+    }
+
+    @Override
+    protected boolean buildStructure(OpenableElementInfo info, IProgressMonitor pm,
+            Map<IOpenable, OpenableElementInfo> newElements, IResource underlyingResource) throws YangModelException {
+        final HashSet<IResource> resources = new HashSet<IResource>();
+        final HashSet<IPath> externalJarsPath = new HashSet<IPath>();
+
+        IJavaProject javaProject = JavaCore.create(project);
+        try {
+            project.accept(new IResourceVisitor() {
+                @Override
+                public boolean visit(IResource resource) throws CoreException {
+                    if (CoreUtil.isYangLikeFileName(resource.getName())) {
+                        resources.add(resource.getParent());
+                    }
+                    return true;
+                }
+            });
+
+            if (javaProject.isOpen()) {
+                IClasspathEntry[] classpath = javaProject.getResolvedClasspath(true);
+                for (int i = 0, length = classpath.length; i < length; i++) {
+                    IClasspathEntry entry = classpath[i];
+                    IPath entryPath = entry.getPath();
+                    if (entry.getEntryKind() == IClasspathEntry.CPE_LIBRARY) {
+                        externalJarsPath.add(entryPath);
+                    }
+                }
+            }
+        } catch (CoreException e) {
+            throw new YangModelException(e);
+        }
+        ArrayList<IOpenable> result = new ArrayList<IOpenable>();
+        for (IResource resource : resources) {
+            if (resource.getType() == IResource.FOLDER) {
+                result.add(new YangFolder(resource, this));
+            }
+        }
+
+        for (IPath iPath : externalJarsPath) {
+            try (JarFile jarFile = new JarFile(iPath.toFile())) {
+                ZipEntry entry = jarFile.getEntry("META-INF/yang/");
+                if (entry != null) {
+                    result.add(new YangJarFile(iPath, this));
+                }
+            } catch (IOException e) {
+                YangCorePlugin.log(e);
+            }
+        }
+        info.setChildren(result.toArray(new IOpenable[result.size()]));
+        return javaProject.isOpen();
+    }
+
+    @Override
+    public IResource getResource() {
+        return project;
+    }
+
+    @Override
+    public IPath getPath() {
+        return project.getFullPath();
+    }
+
+    @Override
+    protected OpenableElementInfo createElementInfo() {
+        return new YangProjectInfo();
+    }
+
+    @Override
+    public YangElementType getElementType() {
+        return YangElementType.YANG_PROJECT;
+    }
+
+    public void clearInfo() throws YangModelException {
+        YangModelManager.getYangModelManager().removeInfoAndChildren(this);
+    }
+
+    @Override
+    protected IStatus validateExistence(IResource underlyingResource) {
+        // check whether the java project can be opened
+        if (!YangCorePlugin.isYangProject((IProject) underlyingResource)) {
+            return new Status(Status.ERROR, YangCorePlugin.PLUGIN_ID, "Does not exist");
+        }
+        return Status.OK_STATUS;
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangProjectInfo.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/model/YangProjectInfo.java
new file mode 100644 (file)
index 0000000..191e359
--- /dev/null
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.model;
+
+import java.util.Set;
+
+import com.cisco.yangide.core.OpenableElementInfo;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 30, 2014
+ */
+public class YangProjectInfo extends OpenableElementInfo {
+    /** Contains list of project names that uses by this project. */
+    private Set<String> projectScope;
+
+    /** Contains list of project names that uses this project. */
+    private Set<String> indirectScope;
+
+    /**
+     * @return the projectScope
+     */
+    public Set<String> getProjectScope() {
+        return projectScope;
+    }
+
+    /**
+     * @param projectScope the projectScope to set
+     */
+    public void setProjectScope(Set<String> projectScope) {
+        this.projectScope = projectScope;
+    }
+
+    /**
+     * @return the indirectScope
+     */
+    public Set<String> getIndirectScope() {
+        return indirectScope;
+    }
+
+    /**
+     * @param indirectScope the indirectScope to set
+     */
+    public void setIndirectScope(Set<String> indirectScope) {
+        this.indirectScope = indirectScope;
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/BasicValidations.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/BasicValidations.java
new file mode 100644 (file)
index 0000000..bf48c39
--- /dev/null
@@ -0,0 +1,277 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.parser;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.antlr.v4.runtime.ParserRuleContext;
+import org.antlr.v4.runtime.tree.ParseTree;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Yang_version_stmtContext;
+
+/**
+ * Reusable checks of basic constraints on yang statements
+ *
+ * @author Konstantin Zaitsev
+ * date: Jul 9, 2014
+ */
+public class BasicValidations {
+
+    static final String SUPPORTED_YANG_VERSION = "1";
+
+    /**
+     * It isn't desirable to create instance of this class.
+     */
+    private BasicValidations() {
+    }
+
+    static void checkNotPresentBoth(ParseTree parent, Class<? extends ParseTree> childType1,
+            Class<? extends ParseTree> childType2) {
+        if (BasicValidations.checkPresentChildOfTypeSafe(parent, childType1, true)
+                && BasicValidations.checkPresentChildOfTypeSafe(parent, childType2, false)) {
+            ValidationUtil.ex(parent, ValidationUtil.f("(In (sub)module:%s) Both %s and %s statement present in %s:%s",
+                    ValidationUtil.getRootParentName(parent), ValidationUtil.getSimpleStatementName(childType1),
+                    ValidationUtil.getSimpleStatementName(childType2),
+                    ValidationUtil.getSimpleStatementName(parent.getClass()), ValidationUtil.getName(parent)));
+        }
+    }
+
+    static void checkOnlyPermittedValues(ParseTree ctx, Set<String> permittedValues) {
+        String mandatory = ValidationUtil.getName(ctx);
+        String rootParentName = ValidationUtil.getRootParentName(ctx);
+
+        if (!permittedValues.contains(mandatory)) {
+            ValidationUtil.ex(ctx, ValidationUtil.f(
+                    "(In (sub)module:%s) %s:%s, illegal value for %s statement, only permitted:%s", rootParentName,
+                    ValidationUtil.getSimpleStatementName(ctx.getClass()), mandatory,
+                    ValidationUtil.getSimpleStatementName(ctx.getClass()), permittedValues));
+        }
+    }
+
+    static void checkUniquenessInNamespace(ParseTree stmt, Set<String> uniques) {
+        String name = ValidationUtil.getName(stmt);
+        String rootParentName = ValidationUtil.getRootParentName(stmt);
+
+        if (uniques.contains(name)) {
+            ValidationUtil.ex(stmt, ValidationUtil.f("(In (sub)module:%s) %s:%s not unique in (sub)module",
+                    rootParentName, ValidationUtil.getSimpleStatementName(stmt.getClass()), name));
+        }
+        uniques.add(name);
+    }
+
+    /**
+     * Check if only one module or submodule is present in session(one yang file)
+     */
+    static void checkOnlyOneModulePresent(ParseTree ctx, String moduleName, String globalId) {
+        if (globalId != null) {
+            ValidationUtil.ex(ctx, ValidationUtil.f("Multiple (sub)modules per file"));
+        }
+    }
+
+    static void checkPresentYangVersion(ParseTree ctx, String moduleName) {
+        if (!checkPresentChildOfTypeSafe(ctx, Yang_version_stmtContext.class, true)) {
+            ValidationUtil.ex(ctx, ValidationUtil.f(
+                    "Yang version statement not present in module:%s, Validating as yang version:%s", moduleName,
+                    SUPPORTED_YANG_VERSION));
+        }
+    }
+
+    static void checkDateFormat(ParseTree stmt, DateFormat format) {
+        try {
+            format.parse(ValidationUtil.getName(stmt));
+        } catch (ParseException e) {
+            String exceptionMessage = ValidationUtil.f(
+                    "(In (sub)module:%s) %s:%s, invalid date format expected date format is:%s",
+                    ValidationUtil.getRootParentName(stmt), ValidationUtil.getSimpleStatementName(stmt.getClass()),
+                    ValidationUtil.getName(stmt), new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
+            ValidationUtil.ex(stmt, exceptionMessage);
+        }
+    }
+
+    private static Pattern identifierPattern = Pattern.compile("[a-zA-Z_][a-zA-Z0-9_.-]*");
+
+    static void checkIdentifier(ParseTree statement) {
+        checkIdentifierInternal(statement, ValidationUtil.getName(statement));
+    }
+
+    static void checkIdentifierInternal(ParseTree statement, String name) {
+        if (!identifierPattern.matcher(name).matches()) {
+
+            String message = ValidationUtil.f("%s statement identifier:%s is not in required format:%s",
+                    ValidationUtil.getSimpleStatementName(statement.getClass()), name, identifierPattern.toString());
+            String parent = ValidationUtil.getRootParentName(statement);
+            message = parent.equals(name) ? message : ValidationUtil.f("(In (sub)module:%s) %s", parent, message);
+
+            if (statement instanceof ParserRuleContext) {
+                message = "Error on line " + ((ParserRuleContext) statement).getStart().getLine() + ": " + message;
+            }
+
+            ValidationUtil.ex(statement, message);
+        }
+    }
+
+    private static Pattern prefixedIdentifierPattern = Pattern.compile("(.+):(.+)");
+
+    static void checkPrefixedIdentifier(ParseTree statement) {
+        checkPrefixedIdentifierInternal(statement, ValidationUtil.getName(statement));
+    }
+
+    private static void checkPrefixedIdentifierInternal(ParseTree statement, String id) {
+        Matcher matcher = prefixedIdentifierPattern.matcher(id);
+
+        if (matcher.matches()) {
+            try {
+                // check prefix
+                checkIdentifierInternal(statement, matcher.group(1));
+                // check ID
+                checkIdentifierInternal(statement, matcher.group(2));
+            } catch (YangValidationException e) {
+                ValidationUtil.ex(statement,
+                        ValidationUtil.f("Prefixed id:%s not in required format, details:%s", id, e.getMessage()));
+            }
+        } else {
+            checkIdentifierInternal(statement, id);
+        }
+    }
+
+    static void checkSchemaNodeIdentifier(ParseTree statement) {
+        String id = ValidationUtil.getName(statement);
+
+        try {
+            for (String oneOfId : id.split("/")) {
+                if (oneOfId.isEmpty()) {
+                    continue;
+                }
+                checkPrefixedIdentifierInternal(statement, oneOfId);
+            }
+        } catch (YangValidationException e) {
+            ValidationUtil.ex(statement,
+                    ValidationUtil.f("Schema node id:%s not in required format, details:%s", id, e.getMessage()));
+        }
+    }
+
+    private interface MessageProvider {
+        String getMessage();
+    }
+
+    static void checkPresentChildOfTypeInternal(ParseTree parent, Set<Class<? extends ParseTree>> expectedChildType,
+            MessageProvider message, boolean atMostOne) {
+        if (!checkPresentChildOfTypeSafe(parent, expectedChildType, atMostOne)) {
+            String str = atMostOne ? "(Expected exactly one statement) " + message.getMessage() : message.getMessage();
+            ValidationUtil.ex(parent, str);
+        }
+    }
+
+    static void checkPresentChildOfType(final ParseTree parent, final Class<? extends ParseTree> expectedChildType,
+            boolean atMostOne) {
+
+        // Construct message in checkPresentChildOfTypeInternal only if
+        // validaiton fails, not in advance
+        MessageProvider message = new MessageProvider() {
+
+            @Override
+            public String getMessage() {
+                String message = ValidationUtil.f("Missing %s statement in %s:%s",
+                        ValidationUtil.getSimpleStatementName(expectedChildType),
+                        ValidationUtil.getSimpleStatementName(parent.getClass()), ValidationUtil.getName(parent));
+
+                String root = ValidationUtil.getRootParentName(parent);
+                message = ValidationUtil.getName(parent).equals(root) ? message : ValidationUtil.f(
+                        "(In (sub)module:%s) %s", root, message);
+                return message;
+            }
+        };
+
+        Set<Class<? extends ParseTree>> expectedChildTypeSet = new HashSet<>();
+        expectedChildTypeSet.add(expectedChildType);
+
+        checkPresentChildOfTypeInternal(parent, expectedChildTypeSet, message, atMostOne);
+    }
+
+    /**
+     * Implementation of interface <code>MessageProvider</code> for method
+     * {@link BasicValidations#checkPresentChildOfTypeSafe(ParseTree, Set, boolean)
+     * checkPresentChildOfTypeSafe(ParseTree, Set, boolean) * }
+     */
+    private static class MessageProviderForSetOfChildTypes implements MessageProvider {
+
+        private Set<Class<? extends ParseTree>> expectedChildTypes;
+        private ParseTree parent;
+
+        public MessageProviderForSetOfChildTypes(Set<Class<? extends ParseTree>> expectedChildTypes, ParseTree parent) {
+            this.expectedChildTypes = expectedChildTypes;
+            this.parent = parent;
+        }
+
+        @Override
+        public String getMessage() {
+            StringBuilder childTypes = new StringBuilder();
+            String orStr = " OR ";
+            for (Class<? extends ParseTree> type : expectedChildTypes) {
+                childTypes.append(ValidationUtil.getSimpleStatementName(type));
+                childTypes.append(orStr);
+            }
+            String message = ValidationUtil.f("Missing %s statement in %s:%s", childTypes.toString(),
+                    ValidationUtil.getSimpleStatementName(parent.getClass()), ValidationUtil.getName(parent));
+
+            String root = ValidationUtil.getRootParentName(parent);
+            message = ValidationUtil.getName(parent).equals(root) ? message : ValidationUtil.f(
+                    "(In (sub)module:%s) %s", root, message);
+            return message;
+        }
+    };
+
+    static void checkPresentChildOfTypes(final ParseTree parent,
+            final Set<Class<? extends ParseTree>> expectedChildTypes, boolean atMostOne) {
+
+        // Construct message in checkPresentChildOfTypeInternal only if
+        // validaiton fails, not in advance
+        MessageProvider message = new MessageProviderForSetOfChildTypes(expectedChildTypes, parent);
+        checkPresentChildOfTypeInternal(parent, expectedChildTypes, message, atMostOne);
+    }
+
+    static boolean checkPresentChildOfTypeSafe(ParseTree parent, Set<Class<? extends ParseTree>> expectedChildType,
+            boolean atMostOne) {
+
+        int foundChildrenOfType = ValidationUtil.countPresentChildrenOfType(parent, expectedChildType);
+
+        return atMostOne ? foundChildrenOfType == 1 ? true : false : foundChildrenOfType != 0 ? true : false;
+    }
+
+    static boolean checkPresentChildOfTypeSafe(ParseTree parent, Class<? extends ParseTree> expectedChildType,
+            boolean atMostOne) {
+
+        int foundChildrenOfType = ValidationUtil.countPresentChildrenOfType(parent, expectedChildType);
+
+        return atMostOne ? foundChildrenOfType == 1 ? true : false : foundChildrenOfType != 0 ? true : false;
+    }
+
+    static List<String> getAndCheckUniqueKeys(ParseTree ctx) {
+        String key = ValidationUtil.getName(ctx);
+        ParseTree parent = ctx.getParent();
+        String rootParentName = ValidationUtil.getRootParentName(ctx);
+
+        List<String> keyList = ValidationUtil.listKeysFromId(key);
+        Set<String> duplicates = ValidationUtil.getDuplicates(keyList);
+
+        if (duplicates.size() != 0) {
+            ValidationUtil.ex(ctx, ValidationUtil.f("(In (sub)module:%s) %s:%s, %s:%s contains duplicates:%s",
+                    rootParentName, ValidationUtil.getSimpleStatementName(parent.getClass()),
+                    ValidationUtil.getName(parent), ValidationUtil.getSimpleStatementName(ctx.getClass()), key,
+                    duplicates));
+        }
+        return keyList;
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/ITokenFormatter.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/ITokenFormatter.java
new file mode 100644 (file)
index 0000000..eedc3bb
--- /dev/null
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.parser;
+
+import org.antlr.v4.runtime.Token;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 22, 2014
+ */
+public interface ITokenFormatter {
+    void process(Token token);
+
+    String getFormattedContent();
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/IYangValidationListener.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/IYangValidationListener.java
new file mode 100644 (file)
index 0000000..c6e77f6
--- /dev/null
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.parser;
+
+/**
+ * Validation listener interface to detect all syntax and validation errors during parsing a YANG
+ * file.
+ *
+ * @author Konstantin Zaitsev
+ * date: Jul 10, 2014
+ */
+public interface IYangValidationListener {
+
+    /**
+     * Invokes on ANTLR syntax error.
+     *
+     * @param msg error message
+     * @param lineNumber line number where errors occurred
+     * @param charStart absolute char start position
+     * @param charEnd absolute char end position
+     */
+    void syntaxError(String msg, int lineNumber, int charStart, int charEnd);
+
+    /**
+     * Invokes on post-parsing validation error (name conventions, import existence).
+     *
+     * @param msg error message
+     * @param lineNumber line number where errors occurred
+     * @param charStart absolute char start position
+     * @param charEnd absolute char end position
+     */
+    void validationError(String msg, int lineNumber, int charStart, int charEnd);
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/SemanticValidations.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/SemanticValidations.java
new file mode 100644 (file)
index 0000000..db11ed5
--- /dev/null
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.parser;
+
+import static com.cisco.yangide.core.model.YangModelManager.search;
+
+import org.eclipse.core.resources.IProject;
+
+import com.cisco.yangide.core.YangTypeUtil;
+import com.cisco.yangide.core.dom.ASTNamedNode;
+import com.cisco.yangide.core.dom.ASTVisitor;
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.core.dom.ModuleImport;
+import com.cisco.yangide.core.dom.QName;
+import com.cisco.yangide.core.dom.SimpleNode;
+import com.cisco.yangide.core.dom.SubModule;
+import com.cisco.yangide.core.dom.SubModuleInclude;
+import com.cisco.yangide.core.dom.TypeReference;
+import com.cisco.yangide.core.dom.UsesNode;
+import com.cisco.yangide.core.indexing.ElementIndexInfo;
+import com.cisco.yangide.core.indexing.ElementIndexType;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 14, 2014
+ */
+public class SemanticValidations {
+
+    private IYangValidationListener listener;
+    private Module module;
+    private IProject project;
+
+    public SemanticValidations(IYangValidationListener validationListener, IProject project, Module module) {
+        this.listener = validationListener;
+        this.project = project;
+        this.module = module;
+    }
+
+    /**
+     * Validates model for semantics rules.
+     */
+    public void validate() {
+        validateImports();
+        validateSubModule();
+        validatesGrouping();
+        validateTypes();
+    }
+
+    /**
+     * Validates for correct submodule relationship.
+     */
+    private void validateSubModule() {
+        if (module instanceof SubModule) {
+            SubModule subModule = (SubModule) module;
+            SimpleNode<String> pmNode = subModule.getParentModule();
+            if (pmNode != null) {
+                ElementIndexInfo[] infos = search(null, null, pmNode.getValue(), ElementIndexType.MODULE, project, null);
+                if (infos.length == 0) {
+                    String msg = String.format("Parent module '%s' not found", pmNode.getValue());
+                    reportError(msg, subModule);
+                }
+            }
+        }
+        for (SubModuleInclude include : module.getIncludes().values()) {
+            ElementIndexInfo[] infos = search(null, include.getRevision(), include.getName(),
+                    ElementIndexType.SUBMODULE, project, null);
+            if (infos.length == 0) {
+                String msg = String.format("Not existing submodule included: %s:%s by: %s:%s", include.getName(),
+                        include.getRevision(), module.getName(), module.getRevision());
+                reportError(msg, include);
+            }
+        }
+    }
+
+    /**
+     * Validates for import existence.
+     */
+    private void validateImports() {
+        for (ModuleImport moduleImport : module.getImports().values()) {
+            ElementIndexInfo[] infos = search(null, moduleImport.getRevision(), moduleImport.getName(),
+                    ElementIndexType.MODULE, project, null);
+            if (infos.length == 0) {
+                String msg = String.format("Not existing module imported: %s:%s by: %s:%s", moduleImport.getName(),
+                        moduleImport.getRevision(), module.getName(), module.getRevision());
+                reportError(msg, moduleImport);
+            }
+        }
+    }
+
+    /**
+     * Validates grouping existence in <code>uses</code> statement.
+     */
+    private void validatesGrouping() {
+        module.accept(new ASTVisitor() {
+            @Override
+            public boolean visit(UsesNode uses) {
+                String name = uses.getName();
+                QName grouping = uses.getGrouping();
+
+                if (search(grouping.getModule(), grouping.getRevision(), grouping.getName(), ElementIndexType.GROUPING,
+                        project, null).length == 0) {
+                    reportError(String.format("Grouping '%s' not found", name), uses);
+                }
+                return true;
+            }
+        });
+    }
+
+    /**
+     * Validates types existence in <code>type</code> statement.
+     */
+    private void validateTypes() {
+        module.accept(new ASTVisitor() {
+            @Override
+            public boolean visit(TypeReference typeRef) {
+                String name = typeRef.getName();
+                QName type = typeRef.getType();
+                if (YangTypeUtil.isBuiltInType(name)) {
+                    return true;
+                }
+                if (search(type.getModule(), type.getRevision(), type.getName(), ElementIndexType.TYPE, project, null).length == 0) {
+                    reportError(String.format("Type '%s' not found", name), typeRef);
+                }
+                return true;
+            }
+        });
+    }
+
+    /**
+     * Reports error message to listener.
+     *
+     * @param msg message
+     * @param node related AST node
+     */
+    private void reportError(String msg, ASTNamedNode node) {
+        listener.validationError(msg, node.getLineNumber(), node.getNameStartPosition(), node.getNameStartPosition()
+                + node.getNameLength());
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/ValidationUtil.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/ValidationUtil.java
new file mode 100644 (file)
index 0000000..a766eb2
--- /dev/null
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.parser;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.antlr.v4.runtime.tree.ParseTree;
+import org.antlr.v4.runtime.tree.TerminalNode;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Module_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.StringContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Submodule_stmtContext;
+
+/**
+ * Validation utilities.
+ *
+ * @author Konstantin Zaitsev
+ * date: Jul 9, 2014
+ */
+public class ValidationUtil {
+
+    /**
+     * It isn't desirable to create instance of this class
+     */
+    private ValidationUtil() {
+    }
+
+    static void ex(ParseTree ctx, String message) {
+        throw new YangValidationException(ctx, message);
+    }
+
+    static Set<String> getDuplicates(Collection<String> keyList) {
+        Set<String> all = new HashSet<String>();
+        Set<String> duplicates = new HashSet<String>();
+
+        for (String key : keyList) {
+            if (!all.add(key)) {
+                duplicates.add(key);
+            }
+        }
+        return duplicates;
+    }
+
+    static List<String> listKeysFromId(String keys) {
+        return Arrays.asList(keys.split(" "));
+    }
+
+    static String getRootParentName(ParseTree ctx) {
+        ParseTree root = getRootParent(ctx);
+        return ValidationUtil.getName(root);
+    }
+
+    private static ParseTree getRootParent(ParseTree ctx) {
+        ParseTree root = ctx;
+        while (root.getParent() != null) {
+            if (root.getClass().equals(Module_stmtContext.class) || root.getClass().equals(Submodule_stmtContext.class)) {
+                break;
+            }
+            root = root.getParent();
+        }
+        return root;
+    }
+
+    static String getName(ParseTree child) {
+        String result = "";
+        for (int i = 0; i < child.getChildCount(); ++i) {
+            if (child.getChild(i) instanceof StringContext) {
+                final StringContext context = (StringContext) child.getChild(i);
+                if (context != null) {
+                    return stringFromStringContext(context);
+
+                }
+            }
+        }
+        return result;
+    }
+
+    static String f(String base, Object... args) {
+        return String.format(base, args);
+    }
+
+    public static String stringFromStringContext(final StringContext context) {
+        StringBuilder str = new StringBuilder();
+        for (TerminalNode stringNode : context.STRING()) {
+            String result = stringNode.getText();
+            if (!result.contains("\"")) {
+                str.append(result);
+            } else {
+                str.append(result.replace("\"", ""));
+            }
+        }
+        return str.toString();
+    }
+
+    /**
+     * Get simple name from statement class e.g. Module from Module_stmt_context
+     */
+    static String getSimpleStatementName(Class<? extends ParseTree> typeOfStatement) {
+
+        String className = typeOfStatement.getSimpleName();
+        int lastIndexOf = className.indexOf('$');
+        className = lastIndexOf == -1 ? className : className.substring(lastIndexOf + 1);
+        int indexOfStmt = className.indexOf("_stmt");
+        int index = indexOfStmt == -1 ? className.indexOf("_arg") : indexOfStmt;
+        return className.substring(0, index).replace('_', '-');
+    }
+
+    static int countPresentChildrenOfType(ParseTree parent, Set<Class<? extends ParseTree>> expectedChildTypes) {
+        int foundChildrenOfType = 0;
+
+        for (Class<? extends ParseTree> type : expectedChildTypes) {
+            foundChildrenOfType += countPresentChildrenOfType(parent, type);
+        }
+        return foundChildrenOfType;
+    }
+
+    static int countPresentChildrenOfType(ParseTree parent, Class<? extends ParseTree> expectedChildType) {
+        int foundChildrenOfType = 0;
+
+        for (int i = 0; i < parent.getChildCount(); i++) {
+            ParseTree child = parent.getChild(i);
+            if (expectedChildType.isInstance(child)) {
+                foundChildrenOfType++;
+            }
+        }
+        return foundChildrenOfType;
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/YangFormattingPreferences.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/YangFormattingPreferences.java
new file mode 100644 (file)
index 0000000..70732f6
--- /dev/null
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.parser;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 22, 2014
+ */
+public class YangFormattingPreferences {
+
+    /** Indent size. */
+    private int indentSize = 4;
+
+    /** Use space characters instead tabs. */
+    private boolean spaceForTabs = true;
+
+    /** Max line length. Used in case of {@link #formatComment} or {@link #formatStrings} enabled. */
+    private int maxLineLength = 80;
+
+    /** Reformat block comments. */
+    private boolean formatComment = false;
+
+    /** Reformat strings. */
+    private boolean formatStrings = true;
+
+    /** Make import one line statement. */
+    private boolean compactImport = true;
+
+    /**
+     * @return the indentSize
+     */
+    public int getIndentSize() {
+        return indentSize;
+    }
+
+    /**
+     * @param indentSize the indentSize to set
+     */
+    public void setIndentSize(int indentSize) {
+        this.indentSize = indentSize;
+    }
+
+    /**
+     * @return the spaceForTabs
+     */
+    public boolean isSpaceForTabs() {
+        return spaceForTabs;
+    }
+
+    /**
+     * @param spaceForTabs the spaceForTabs to set
+     */
+    public void setSpaceForTabs(boolean spaceForTabs) {
+        this.spaceForTabs = spaceForTabs;
+    }
+
+    /**
+     * @return the maxLineLength
+     */
+    public int getMaxLineLength() {
+        return maxLineLength;
+    }
+
+    /**
+     * @param maxLineLength the maxLineLength to set
+     */
+    public void setMaxLineLength(int maxLineLength) {
+        this.maxLineLength = maxLineLength;
+    }
+
+    /**
+     * @return the formatComment
+     */
+    public boolean isFormatComment() {
+        return formatComment;
+    }
+
+    /**
+     * @param formatComment the formatComment to set
+     */
+    public void setFormatComment(boolean formatComment) {
+        this.formatComment = formatComment;
+    }
+
+    /**
+     * @return the formatStrings
+     */
+    public boolean isFormatStrings() {
+        return formatStrings;
+    }
+
+    /**
+     * @param formatStrings the formatStrings to set
+     */
+    public void setFormatStrings(boolean formatStrings) {
+        this.formatStrings = formatStrings;
+    }
+
+    /**
+     * @return the compactImport
+     */
+    public boolean isCompactImport() {
+        return compactImport;
+    }
+
+    /**
+     * @param compactImport the compactImport to set
+     */
+    public void setCompactImport(boolean compactImport) {
+        this.compactImport = compactImport;
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/YangModelBasicValidationListener.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/YangModelBasicValidationListener.java
new file mode 100644 (file)
index 0000000..166d1da
--- /dev/null
@@ -0,0 +1,646 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.parser;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.antlr.v4.runtime.tree.ParseTree;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Anyxml_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Argument_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Augment_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Base_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Belongs_to_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Case_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Choice_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Config_argContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Container_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Default_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Deviate_add_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Deviation_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Extension_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Feature_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Grouping_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Identity_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.If_feature_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Import_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Include_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Key_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Leaf_list_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Leaf_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.List_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Mandatory_argContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Mandatory_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Module_header_stmtsContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Module_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Namespace_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Notification_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Ordered_by_argContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Prefix_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Refine_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Revision_date_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Revision_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Rpc_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Status_argContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Submodule_header_stmtsContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Submodule_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Type_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Typedef_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Unique_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Uses_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Yin_element_argContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParserBaseListener;
+
+/**
+ * Validation listener that validates yang statements according to RFC-6020. This validator expects
+ * only one module or submodule per file and performs only basic validation where context from all
+ * yang models is not present.
+ *
+ * @author Konstantin Zaitsev
+ * date: Jul 9, 2014
+ */
+public class YangModelBasicValidationListener extends YangParserBaseListener {
+    private final DateFormat SIMPLE_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
+
+    private final Set<String> uniquePrefixes;
+    private final Set<String> uniqueImports;
+    private final Set<String> uniqueIncludes;
+
+    private String globalModuleId;
+
+    public YangModelBasicValidationListener() {
+        super();
+        uniquePrefixes = new HashSet<>();
+        uniqueImports = new HashSet<>();
+        uniqueIncludes = new HashSet<>();
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Identifier is in required format</li>
+     * <li>Header statements present(mandatory prefix and namespace statements are in header)</li>
+     * <li>Only one module or submodule per file</li>
+     * </ol>
+     */
+    @Override
+    public void enterModule_stmt(Module_stmtContext ctx) {
+
+        BasicValidations.checkIdentifier(ctx);
+
+        BasicValidations.checkPresentChildOfType(ctx, Module_header_stmtsContext.class, true);
+
+        String moduleName = ValidationUtil.getName(ctx);
+        BasicValidations.checkOnlyOneModulePresent(ctx, moduleName, globalModuleId);
+        globalModuleId = moduleName;
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Identifier is in required format</li>
+     * <li>Header statements present(mandatory belongs-to statement is in header)</li>
+     * <li>Only one module or submodule per file</li>
+     * </ol>
+     */
+    @Override
+    public void enterSubmodule_stmt(Submodule_stmtContext ctx) {
+
+        BasicValidations.checkIdentifier(ctx);
+
+        BasicValidations.checkPresentChildOfType(ctx, Submodule_header_stmtsContext.class, true);
+
+        String submoduleName = ValidationUtil.getName(ctx);
+        BasicValidations.checkOnlyOneModulePresent(ctx, submoduleName, globalModuleId);
+        globalModuleId = submoduleName;
+
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>One Belongs-to statement present</li>
+     * </ol>
+     */
+    @Override
+    public void enterSubmodule_header_stmts(Submodule_header_stmtsContext ctx) {
+        BasicValidations.checkPresentChildOfType(ctx, Belongs_to_stmtContext.class, true);
+
+        // check Yang version present, if not log
+        try {
+            BasicValidations.checkPresentYangVersion(ctx, ValidationUtil.getRootParentName(ctx));
+        } catch (Exception e) {
+            // ignore
+        }
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>One Namespace statement present</li>
+     * <li>One Prefix statement present</li>
+     * </ol>
+     */
+    @Override
+    public void enterModule_header_stmts(Module_header_stmtsContext ctx) {
+        String moduleName = ValidationUtil.getRootParentName(ctx);
+
+        BasicValidations.checkPresentChildOfType(ctx, Namespace_stmtContext.class, true);
+        BasicValidations.checkPresentChildOfType(ctx, Prefix_stmtContext.class, true);
+
+        // check Yang version present, if not log
+        try {
+            BasicValidations.checkPresentYangVersion(ctx, moduleName);
+        } catch (Exception e) {
+            // ignore
+        }
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Date is in valid format</li>
+     * </ol>
+     */
+    @Override
+    public void enterRevision_stmt(Revision_stmtContext ctx) {
+        BasicValidations.checkDateFormat(ctx, SIMPLE_DATE_FORMAT);
+
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Identifier is in required format</li>
+     * <li>One Prefix statement child</li>
+     * </ol>
+     */
+    @Override
+    public void enterBelongs_to_stmt(Belongs_to_stmtContext ctx) {
+        BasicValidations.checkIdentifier(ctx);
+
+        BasicValidations.checkPresentChildOfType(ctx, Prefix_stmtContext.class, true);
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Namespace string can be parsed as URI</li>
+     * </ol>
+     */
+    @Override
+    public void enterNamespace_stmt(Namespace_stmtContext ctx) {
+        String namespaceName = ValidationUtil.getName(ctx);
+        String rootParentName = ValidationUtil.getRootParentName(ctx);
+
+        try {
+            new URI(namespaceName);
+        } catch (URISyntaxException e) {
+            ValidationUtil.ex(ctx, ValidationUtil.f("(In module:%s) Namespace:%s cannot be parsed as URI",
+                    rootParentName, namespaceName));
+        }
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Identifier is in required format</li>
+     * <li>Every import(identified by identifier) within a module/submodule is present only once</li>
+     * <li>One prefix statement child</li>
+     * </ol>
+     */
+    @Override
+    public void enterImport_stmt(Import_stmtContext ctx) {
+
+        BasicValidations.checkIdentifier(ctx);
+
+        BasicValidations.checkUniquenessInNamespace(ctx, uniqueImports);
+
+        BasicValidations.checkPresentChildOfType(ctx, Prefix_stmtContext.class, true);
+
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Date is in valid format</li>
+     * </ol>
+     */
+    @Override
+    public void enterRevision_date_stmt(Revision_date_stmtContext ctx) {
+        BasicValidations.checkDateFormat(ctx, SIMPLE_DATE_FORMAT);
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Identifier is in required format</li>
+     * <li>Every include(identified by identifier) within a module/submodule is present only once</li>
+     * </ol>
+     */
+    @Override
+    public void enterInclude_stmt(Include_stmtContext ctx) {
+
+        BasicValidations.checkIdentifier(ctx);
+
+        BasicValidations.checkUniquenessInNamespace(ctx, uniqueIncludes);
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Yang-version is specified as 1</li>
+     * </ol>
+     */
+    @Override
+    public void enterYang_version_stmt(YangParser.Yang_version_stmtContext ctx) {
+        String version = ValidationUtil.getName(ctx);
+        String rootParentName = ValidationUtil.getRootParentName(ctx);
+        if (!version.equals(BasicValidations.SUPPORTED_YANG_VERSION)) {
+            ValidationUtil.ex(ctx, ValidationUtil.f(
+                    "(In (sub)module:%s) Unsupported yang version:%s, supported version:%s", rootParentName, version,
+                    BasicValidations.SUPPORTED_YANG_VERSION));
+        }
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Identifier is in required format</li>
+     * <li>Every prefix(identified by identifier) within a module/submodule is presented only once</li>
+     * </ol>
+     */
+    @Override
+    public void enterPrefix_stmt(Prefix_stmtContext ctx) {
+
+        BasicValidations.checkIdentifier(ctx);
+
+        BasicValidations.checkUniquenessInNamespace(ctx, uniquePrefixes);
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Identifier is in required format</li>
+     * <li>One type statement child</li>
+     * </ol>
+     */
+    @Override
+    public void enterTypedef_stmt(Typedef_stmtContext ctx) {
+
+        BasicValidations.checkIdentifier(ctx);
+
+        BasicValidations.checkPresentChildOfType(ctx, Type_stmtContext.class, true);
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>(Prefix):Identifier is in required format</li>
+     * </ol>
+     */
+    @Override
+    public void enterType_stmt(Type_stmtContext ctx) {
+        BasicValidations.checkPrefixedIdentifier(ctx);
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Identifier is in required format</li>
+     * </ol>
+     */
+    @Override
+    public void enterContainer_stmt(Container_stmtContext ctx) {
+        BasicValidations.checkIdentifier(ctx);
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Identifier is in required format</li>
+     * <li>One type statement child</li>
+     * <li>Default statement must not be present if mandatory statement is</li>
+     * </ol>
+     */
+    @Override
+    public void enterLeaf_stmt(Leaf_stmtContext ctx) {
+        BasicValidations.checkIdentifier(ctx);
+
+        BasicValidations.checkPresentChildOfType(ctx, Type_stmtContext.class, true);
+
+        BasicValidations.checkNotPresentBoth(ctx, Mandatory_stmtContext.class, Default_stmtContext.class);
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Identifier is in required format</li>
+     * <li>One type statement child</li>
+     * </ol>
+     */
+    @Override
+    public void enterLeaf_list_stmt(Leaf_list_stmtContext ctx) {
+
+        BasicValidations.checkIdentifier(ctx);
+
+        BasicValidations.checkPresentChildOfType(ctx, Type_stmtContext.class, true);
+    }
+
+    private static final Set<String> PERMITTED_ORDER_BY_ARGS = new HashSet<>(Arrays.asList("system", "user"));
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Value must be one of: system, user</li>
+     * </ol>
+     */
+    @Override
+    public void enterOrdered_by_arg(Ordered_by_argContext ctx) {
+        BasicValidations.checkOnlyPermittedValues(ctx, PERMITTED_ORDER_BY_ARGS);
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Identifier is in required format</li>
+     * </ol>
+     */
+    @Override
+    public void enterList_stmt(List_stmtContext ctx) {
+        BasicValidations.checkIdentifier(ctx);
+        // TODO check: "if config==true then key must be present" could be
+        // performed
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>No duplicate keys</li>
+     * </ol>
+     */
+    @Override
+    public void enterKey_stmt(Key_stmtContext ctx) {
+        BasicValidations.getAndCheckUniqueKeys(ctx);
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <liNo duplicate uniques</li>
+     * </ol>
+     */
+    @Override
+    public void enterUnique_stmt(Unique_stmtContext ctx) {
+        BasicValidations.getAndCheckUniqueKeys(ctx);
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Identifier is in required format</li>
+     * <li>Default statement must not be present if mandatory statement is</li>
+     * </ol>
+     */
+    @Override
+    public void enterChoice_stmt(Choice_stmtContext ctx) {
+        BasicValidations.checkIdentifier(ctx);
+
+        BasicValidations.checkNotPresentBoth(ctx, Mandatory_stmtContext.class, Default_stmtContext.class);
+
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Identifier is in required format</li>
+     * </ol>
+     */
+    @Override
+    public void enterCase_stmt(Case_stmtContext ctx) {
+        BasicValidations.checkIdentifier(ctx);
+    }
+
+    private static final Set<String> PERMITTED_BOOLEAN_ARGS = new HashSet<>(Arrays.asList("true", "false"));
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Value must be one of: true, false</li>
+     * </ol>
+     */
+    @Override
+    public void enterMandatory_arg(Mandatory_argContext ctx) {
+        BasicValidations.checkOnlyPermittedValues(ctx, PERMITTED_BOOLEAN_ARGS);
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Identifier is in required format</li>
+     * </ol>
+     */
+    @Override
+    public void enterAnyxml_stmt(Anyxml_stmtContext ctx) {
+        BasicValidations.checkIdentifier(ctx);
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Identifier is in required format</li>
+     * </ol>
+     */
+    @Override
+    public void enterGrouping_stmt(Grouping_stmtContext ctx) {
+        BasicValidations.checkIdentifier(ctx);
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>(Prefix):Identifier is in required format</li>
+     * </ol>
+     */
+    @Override
+    public void enterUses_stmt(Uses_stmtContext ctx) {
+        BasicValidations.checkPrefixedIdentifier(ctx);
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Identifier is in required format</li>
+     * </ol>
+     */
+    @Override
+    public void enterRefine_stmt(Refine_stmtContext ctx) {
+        BasicValidations.checkSchemaNodeIdentifier(ctx);
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Identifier is in required format</li>
+     * </ol>
+     */
+    @Override
+    public void enterRpc_stmt(Rpc_stmtContext ctx) {
+        BasicValidations.checkIdentifier(ctx);
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Identifier is in required format</li>
+     * </ol>
+     */
+    @Override
+    public void enterNotification_stmt(Notification_stmtContext ctx) {
+        BasicValidations.checkIdentifier(ctx);
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Schema Node Identifier is in required format</li>
+     * </ol>
+     */
+    @Override
+    public void enterAugment_stmt(Augment_stmtContext ctx) {
+        BasicValidations.checkSchemaNodeIdentifier(ctx);
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Identifier is in required format</li>
+     * </ol>
+     */
+    @Override
+    public void enterIdentity_stmt(Identity_stmtContext ctx) {
+        BasicValidations.checkIdentifier(ctx);
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>(Prefix):Identifier is in required format</li>
+     * </ol>
+     */
+    @Override
+    public void enterBase_stmt(Base_stmtContext ctx) {
+        BasicValidations.checkPrefixedIdentifier(ctx);
+
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Value must be one of: true, false</li>
+     * </ol>
+     */
+    @Override
+    public void enterYin_element_arg(Yin_element_argContext ctx) {
+        BasicValidations.checkOnlyPermittedValues(ctx, PERMITTED_BOOLEAN_ARGS);
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Identifier is in required format</li>
+     * </ol>
+     */
+    @Override
+    public void enterExtension_stmt(Extension_stmtContext ctx) {
+        BasicValidations.checkIdentifier(ctx);
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Identifier is in required format</li>
+     * </ol>
+     */
+    @Override
+    public void enterArgument_stmt(Argument_stmtContext ctx) {
+        BasicValidations.checkIdentifier(ctx);
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Identifier is in required format</li>
+     * </ol>
+     */
+    @Override
+    public void enterFeature_stmt(Feature_stmtContext ctx) {
+        BasicValidations.checkIdentifier(ctx);
+
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>(Prefix):Identifier is in required format</li>
+     * </ol>
+     */
+    @Override
+    public void enterIf_feature_stmt(If_feature_stmtContext ctx) {
+        BasicValidations.checkPrefixedIdentifier(ctx);
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Schema Node Identifier is in required format</li>
+     * <li>At least one deviate-* statement child</li>
+     * </ol>
+     */
+    @Override
+    public void enterDeviation_stmt(Deviation_stmtContext ctx) {
+        BasicValidations.checkSchemaNodeIdentifier(ctx);
+
+        Set<Class<? extends ParseTree>> types = new HashSet<>();
+        types.add(Deviate_add_stmtContext.class);
+        types.add(Deviate_add_stmtContext.class);
+        BasicValidations.checkPresentChildOfTypes(ctx, types, false);
+    }
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Value must be one of: true, false</li>
+     * </ol>
+     */
+    @Override
+    public void enterConfig_arg(Config_argContext ctx) {
+        BasicValidations.checkOnlyPermittedValues(ctx, PERMITTED_BOOLEAN_ARGS);
+    }
+
+    private static final Set<String> PERMITTED_STATUS_ARGS = new HashSet<>(Arrays.asList("current", "deprecated",
+            "obsolete"));
+
+    /**
+     * Constraints:
+     * <ol>
+     * <li>Value must be one of: "current", "deprecated", "obsolete"</li>
+     * </ol>
+     */
+    @Override
+    public void enterStatus_arg(Status_argContext ctx) {
+        BasicValidations.checkOnlyPermittedValues(ctx, PERMITTED_STATUS_ARGS);
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/YangParserModelListener.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/YangParserModelListener.java
new file mode 100644 (file)
index 0000000..19147f2
--- /dev/null
@@ -0,0 +1,743 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.parser;
+
+import java.util.Stack;
+
+import org.antlr.v4.runtime.ParserRuleContext;
+import org.antlr.v4.runtime.Token;
+import org.antlr.v4.runtime.tree.ErrorNode;
+import org.antlr.v4.runtime.tree.ParseTree;
+import org.antlr.v4.runtime.tree.TerminalNode;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangLexer;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Anyxml_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Augment_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Base_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Belongs_to_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Case_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Choice_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Config_argContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Config_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Contact_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Container_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Default_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Description_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Deviation_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Extension_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Feature_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Grouping_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Identity_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Import_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Include_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Input_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Key_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Leaf_list_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Leaf_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.List_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Mandatory_argContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Mandatory_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Max_elements_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Min_elements_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Module_header_stmtsContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Module_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Namespace_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Notification_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Ordered_by_argContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Ordered_by_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Organization_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Output_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Prefix_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Presence_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Reference_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Revision_date_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Revision_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Revision_stmtsContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Rpc_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Status_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.StringContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Submodule_header_stmtsContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Submodule_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Type_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Typedef_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Units_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Uses_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.Yang_version_stmtContext;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParserBaseListener;
+
+import com.cisco.yangide.core.dom.ASTNamedNode;
+import com.cisco.yangide.core.dom.ASTNode;
+import com.cisco.yangide.core.dom.AnyXmlSchemaNode;
+import com.cisco.yangide.core.dom.AugmentationSchema;
+import com.cisco.yangide.core.dom.BaseReference;
+import com.cisco.yangide.core.dom.ChoiceCaseNode;
+import com.cisco.yangide.core.dom.ChoiceNode;
+import com.cisco.yangide.core.dom.ContrainerSchemaNode;
+import com.cisco.yangide.core.dom.Deviation;
+import com.cisco.yangide.core.dom.ExtensionDefinition;
+import com.cisco.yangide.core.dom.FeatureDefinition;
+import com.cisco.yangide.core.dom.GroupingDefinition;
+import com.cisco.yangide.core.dom.IdentitySchemaNode;
+import com.cisco.yangide.core.dom.LeafListSchemaNode;
+import com.cisco.yangide.core.dom.LeafSchemaNode;
+import com.cisco.yangide.core.dom.ListSchemaNode;
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.core.dom.ModuleImport;
+import com.cisco.yangide.core.dom.NotificationDefinition;
+import com.cisco.yangide.core.dom.QName;
+import com.cisco.yangide.core.dom.RevisionNode;
+import com.cisco.yangide.core.dom.RpcDefinition;
+import com.cisco.yangide.core.dom.RpcInputNode;
+import com.cisco.yangide.core.dom.RpcOutputNode;
+import com.cisco.yangide.core.dom.SimpleNamedNode;
+import com.cisco.yangide.core.dom.SimpleNode;
+import com.cisco.yangide.core.dom.SubModule;
+import com.cisco.yangide.core.dom.SubModuleInclude;
+import com.cisco.yangide.core.dom.TypeDefinition;
+import com.cisco.yangide.core.dom.TypeReference;
+import com.cisco.yangide.core.dom.UsesNode;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 26, 2014
+ */
+public class YangParserModelListener extends YangParserBaseListener {
+
+    private Module module;
+    private String yangModelPrefix;
+    private String revision = "1970-01-01"; // default revision Date(0L)
+    private Stack<ASTNode> stack = new Stack<>();
+
+    @Override
+    public void enterModule_stmt(Module_stmtContext ctx) {
+        module = new Module();
+        module.setNamespace("");
+        module.setRevision(revision);
+        stack.push(module);
+        updateNamedNode(module, ctx);
+    }
+
+    @Override
+    public void visitErrorNode(ErrorNode node) {
+        if (!stack.isEmpty()) {
+            stack.peek().setFlags(ASTNode.MALFORMED);
+        }
+        if (module != null) {
+            module.setFlags(ASTNode.MALFORMED);
+        }
+        super.visitErrorNode(node);
+    }
+
+    @Override
+    public void enterSubmodule_stmt(Submodule_stmtContext ctx) {
+        module = new SubModule();
+        module.setNamespace("");
+        module.setRevision(revision);
+        stack.push(module);
+        updateNamedNode(module, ctx);
+    }
+
+    @Override
+    public void enterBelongs_to_stmt(Belongs_to_stmtContext ctx) {
+        if (module instanceof SubModule) {
+            String parentModuleName = stringFromNode(ctx);
+            String parentPrefix = null;
+            for (int i = 0; i < ctx.getChildCount(); ++i) {
+                final ParseTree treeNode = ctx.getChild(i);
+                if (treeNode instanceof Prefix_stmtContext) {
+                    parentPrefix = stringFromNode(treeNode);
+                    ((SubModule) module).setParentPrefix(parentPrefix);
+                }
+            }
+            SimpleNode<String> astNode = new SimpleNode<String>(module, ctx.BELONGS_TO_KEYWORD().getText(), parentModuleName);
+            updateNodePosition(astNode, ctx);
+            ((SubModule) module).setParentModule(astNode);
+        }
+    }
+
+    @Override
+    public void exitModule_stmt(Module_stmtContext ctx) {
+        module.setLength(ctx.stop.getStopIndex() - module.getStartPosition());
+    }
+
+    @Override
+    public void enterModule_header_stmts(Module_header_stmtsContext ctx) {
+        for (int i = 0; i < ctx.getChildCount(); ++i) {
+            final ParseTree treeNode = ctx.getChild(i);
+            if (treeNode instanceof Namespace_stmtContext) {
+                final String namespaceStr = stringFromNode(treeNode);
+                SimpleNode<String> astNode = new SimpleNode<String>(module, ((Namespace_stmtContext) treeNode)
+                        .NAMESPACE_KEYWORD().getText(), namespaceStr);
+                updateNodePosition(astNode, treeNode);
+                module.setNamespaceNode(astNode);
+            } else if (treeNode instanceof Prefix_stmtContext) {
+                yangModelPrefix = stringFromNode(treeNode);
+                SimpleNode<String> astNode = new SimpleNode<String>(module, ((Prefix_stmtContext) treeNode)
+                        .PREFIX_KEYWORD().getText(), yangModelPrefix);
+                updateNodePosition(astNode, treeNode);
+                module.setPrefix(astNode);
+            } else if (treeNode instanceof Yang_version_stmtContext) {
+                SimpleNode<String> astNode = new SimpleNode<String>(module, ((Yang_version_stmtContext) treeNode)
+                        .YANG_VERSION_KEYWORD().getText(), stringFromNode(treeNode));
+                updateNodePosition(astNode, treeNode);
+                module.setYangVersion(astNode);
+            }
+        }
+    }
+
+    @Override
+    public void enterSubmodule_header_stmts(Submodule_header_stmtsContext ctx) {
+        for (int i = 0; i < ctx.getChildCount(); ++i) {
+            final ParseTree treeNode = ctx.getChild(i);
+            if (treeNode instanceof Namespace_stmtContext) {
+                final String namespaceStr = stringFromNode(treeNode);
+                SimpleNode<String> astNode = new SimpleNode<String>(module, ((Namespace_stmtContext) treeNode)
+                        .NAMESPACE_KEYWORD().getText(), namespaceStr);
+                updateNodePosition(astNode, treeNode);
+                module.setNamespaceNode(astNode);
+            } else if (treeNode instanceof Prefix_stmtContext) {
+                yangModelPrefix = stringFromNode(treeNode);
+                SimpleNode<String> astNode = new SimpleNode<String>(module, ((Prefix_stmtContext) treeNode)
+                        .PREFIX_KEYWORD().getText(), yangModelPrefix);
+                updateNodePosition(astNode, treeNode);
+                module.setPrefix(astNode);
+            } else if (treeNode instanceof Yang_version_stmtContext) {
+                SimpleNode<String> astNode = new SimpleNode<String>(module, ((Yang_version_stmtContext) treeNode)
+                        .YANG_VERSION_KEYWORD().getText(), stringFromNode(treeNode));
+                updateNodePosition(astNode, treeNode);
+                module.setYangVersion(astNode);
+            }
+        }
+    }
+
+    @Override
+    public void enterMeta_stmts(YangParser.Meta_stmtsContext ctx) {
+        for (int i = 0; i < ctx.getChildCount(); i++) {
+            ParseTree treeNode = ctx.getChild(i);
+            if (treeNode instanceof Organization_stmtContext) {
+                SimpleNode<String> astNode = new SimpleNode<String>(module, ((Organization_stmtContext) treeNode)
+                        .ORGANIZATION_KEYWORD().getText(), stringFromNode(treeNode));
+                updateNodePosition(astNode, treeNode);
+                module.setOrganization(astNode);
+            } else if (treeNode instanceof Contact_stmtContext) {
+                SimpleNode<String> astNode = new SimpleNode<String>(module, ((Contact_stmtContext) treeNode)
+                        .CONTACT_KEYWORD().getText(), stringFromNode(treeNode));
+                updateNodePosition(astNode, treeNode);
+                module.setContact(astNode);
+            } else if (treeNode instanceof Description_stmtContext) {
+                SimpleNode<String> astNode = new SimpleNode<String>(module, ((Description_stmtContext) treeNode)
+                        .DESCRIPTION_KEYWORD().getText(), stringFromNode(treeNode));
+                updateNodePosition(astNode, treeNode);
+                module.setDescriptionNode(astNode);
+            } else if (treeNode instanceof Reference_stmtContext) {
+                SimpleNode<String> astNode = new SimpleNode<String>(module, ((Reference_stmtContext) treeNode)
+                        .REFERENCE_KEYWORD().getText(), stringFromNode(treeNode));
+                updateNodePosition(astNode, treeNode);
+                module.setReferenceNode(astNode);
+            }
+        }
+    }
+
+    @Override
+    public void enterRevision_stmts(Revision_stmtsContext ctx) {
+        for (int i = 0; i < ctx.getChildCount(); ++i) {
+            final ParseTree treeNode = ctx.getChild(i);
+            if (treeNode instanceof Revision_stmtContext) {
+                updateRevisionForRevisionStatement(treeNode);
+            }
+        }
+    }
+
+    @Override
+    public void enterImport_stmt(Import_stmtContext ctx) {
+        String importPrefix = null;
+        String importRevision = null;
+
+        for (int i = 0; i < ctx.getChildCount(); ++i) {
+            final ParseTree treeNode = ctx.getChild(i);
+            if (treeNode instanceof Prefix_stmtContext) {
+                importPrefix = stringFromNode(treeNode);
+            }
+            if (treeNode instanceof Revision_date_stmtContext) {
+                importRevision = stringFromNode(treeNode);
+            }
+        }
+        ModuleImport moduleImport = new ModuleImport(module, importRevision, importPrefix);
+        updateNamedNode(moduleImport, ctx);
+        module.addImport(moduleImport);
+    }
+
+    @Override
+    public void enterInclude_stmt(Include_stmtContext ctx) {
+        String includeRevision = null;
+
+        for (int i = 0; i < ctx.getChildCount(); ++i) {
+            final ParseTree treeNode = ctx.getChild(i);
+            if (treeNode instanceof Revision_date_stmtContext) {
+                includeRevision = stringFromNode(treeNode);
+            }
+        }
+        SubModuleInclude subModuleInclude = new SubModuleInclude(module, includeRevision);
+        updateNamedNode(subModuleInclude, ctx);
+        module.getIncludes().put(subModuleInclude.getName(), subModuleInclude);
+    }
+
+    @Override
+    public void enterTypedef_stmt(Typedef_stmtContext ctx) {
+        ASTNode parent = stack.peek();
+        TypeDefinition typeDefinition = new TypeDefinition(parent);
+        updateNamedNode(typeDefinition, ctx);
+        if (parent instanceof Module) {
+            module.getTypeDefinitions().add(typeDefinition);
+        }
+        stack.push(typeDefinition);
+    }
+
+    @Override
+    public void exitTypedef_stmt(Typedef_stmtContext ctx) {
+        stack.pop();
+    }
+
+    @Override
+    public void enterGrouping_stmt(Grouping_stmtContext ctx) {
+        GroupingDefinition grouping = new GroupingDefinition(stack.peek());
+        stack.push(grouping);
+        module.getGroupings().add(grouping);
+        updateNamedNode(grouping, ctx);
+    }
+
+    @Override
+    public void exitGrouping_stmt(Grouping_stmtContext ctx) {
+        stack.pop();
+    }
+
+    @Override
+    public void enterContainer_stmt(Container_stmtContext ctx) {
+        ContrainerSchemaNode container = new ContrainerSchemaNode(stack.peek());
+        stack.push(container);
+        updateNamedNode(container, ctx);
+    }
+
+    @Override
+    public void exitContainer_stmt(Container_stmtContext ctx) {
+        stack.pop();
+    }
+
+    @Override
+    public void enterLeaf_stmt(Leaf_stmtContext ctx) {
+        LeafSchemaNode leaf = new LeafSchemaNode(stack.peek());
+        stack.push(leaf);
+        updateNamedNode(leaf, ctx);
+    }
+
+    @Override
+    public void exitLeaf_stmt(Leaf_stmtContext ctx) {
+        stack.pop();
+    }
+
+    @Override
+    public void enterType_stmt(Type_stmtContext ctx) {
+        final String typeName = stringFromNode(ctx);
+        final QName typeQName = parseQName(typeName);
+        TypeReference typeRef = new TypeReference(stack.peek());
+        updateNamedNode(typeRef, ctx);
+        typeRef.setType(typeQName);
+    }
+
+    @Override
+    public void enterUses_stmt(Uses_stmtContext ctx) {
+        final String groupingPath = stringFromNode(ctx);
+        UsesNode usesNode = new UsesNode(stack.peek());
+        updateNamedNode(usesNode, ctx);
+        usesNode.setGrouping(parseQName(groupingPath));
+    }
+
+    @Override
+    public void enterAugment_stmt(Augment_stmtContext ctx) {
+        AugmentationSchema augmentation = new AugmentationSchema(stack.peek());
+        updateNamedNode(augmentation, ctx);
+        stack.push(augmentation);
+    }
+
+    @Override
+    public void exitAugment_stmt(Augment_stmtContext ctx) {
+        stack.pop();
+    }
+
+    @Override
+    public void enterDeviation_stmt(Deviation_stmtContext ctx) {
+        Deviation deviation = new Deviation(stack.peek());
+        updateNamedNode(deviation, ctx);
+        stack.push(deviation);
+    }
+
+    @Override
+    public void exitDeviation_stmt(Deviation_stmtContext ctx) {
+        stack.pop();
+    }
+
+    @Override
+    public void enterExtension_stmt(Extension_stmtContext ctx) {
+        ExtensionDefinition extension = new ExtensionDefinition(stack.peek());
+        updateNamedNode(extension, ctx);
+        stack.push(extension);
+    }
+
+    @Override
+    public void exitExtension_stmt(Extension_stmtContext ctx) {
+        stack.pop();
+    }
+
+    @Override
+    public void enterFeature_stmt(Feature_stmtContext ctx) {
+        FeatureDefinition feature = new FeatureDefinition(stack.peek());
+        updateNamedNode(feature, ctx);
+        stack.push(feature);
+    }
+
+    @Override
+    public void exitFeature_stmt(Feature_stmtContext ctx) {
+        stack.pop();
+    }
+
+    @Override
+    public void enterNotification_stmt(Notification_stmtContext ctx) {
+        NotificationDefinition notification = new NotificationDefinition(stack.peek());
+        updateNamedNode(notification, ctx);
+        stack.push(notification);
+    }
+
+    @Override
+    public void exitNotification_stmt(Notification_stmtContext ctx) {
+        stack.pop();
+    }
+
+    @Override
+    public void enterRpc_stmt(Rpc_stmtContext ctx) {
+        RpcDefinition rpc = new RpcDefinition(stack.peek());
+        updateNamedNode(rpc, ctx);
+        stack.push(rpc);
+    }
+
+    @Override
+    public void exitRpc_stmt(Rpc_stmtContext ctx) {
+        stack.pop();
+    }
+
+    @Override
+    public void enterInput_stmt(Input_stmtContext ctx) {
+        RpcInputNode input = new RpcInputNode(stack.peek());
+        updateNodePosition(input, ctx);
+        input.setName("input");
+        input.setNameStartPosition(input.getStartPosition());
+        input.setNameLength(input.getName().length());
+        stack.push(input);
+    }
+
+    @Override
+    public void exitInput_stmt(Input_stmtContext ctx) {
+        stack.pop();
+    }
+
+    @Override
+    public void enterOutput_stmt(Output_stmtContext ctx) {
+        RpcOutputNode output = new RpcOutputNode(stack.peek());
+        updateNodePosition(output, ctx);
+        output.setName("output");
+        output.setNameStartPosition(output.getStartPosition());
+        output.setNameLength(output.getName().length());
+        stack.push(output);
+    }
+
+    @Override
+    public void exitOutput_stmt(Output_stmtContext ctx) {
+        stack.pop();
+    }
+
+    @Override
+    public void enterIdentity_stmt(Identity_stmtContext ctx) {
+        IdentitySchemaNode identity = new IdentitySchemaNode(stack.peek());
+        updateNamedNode(identity, ctx);
+        Base_stmtContext base = getChildNode(ctx, Base_stmtContext.class);
+        if (base != null) {
+            BaseReference baseRef = new BaseReference(identity);
+            baseRef.setType(parseQName(stringFromNode(base)));
+            updateNamedNode(baseRef, base);
+            identity.setBase(baseRef);
+        }
+    }
+
+    @Override
+    public void enterLeaf_list_stmt(Leaf_list_stmtContext ctx) {
+        LeafListSchemaNode leafList = new LeafListSchemaNode(stack.peek());
+        stack.push(leafList);
+        updateNamedNode(leafList, ctx);
+    }
+
+    @Override
+    public void exitLeaf_list_stmt(Leaf_list_stmtContext ctx) {
+        stack.pop();
+    }
+
+    @Override
+    public void enterList_stmt(List_stmtContext ctx) {
+        ListSchemaNode list = new ListSchemaNode(stack.peek());
+        stack.push(list);
+        updateNamedNode(list, ctx);
+    }
+
+    @Override
+    public void enterKey_stmt(Key_stmtContext ctx) {
+        ASTNode node = stack.peek();
+        if (node instanceof ListSchemaNode) {
+            SimpleNamedNode keyNode = new SimpleNamedNode(node, "key");
+            updateNamedNode(keyNode, ctx);
+            ((ListSchemaNode) node).setKey(keyNode);
+        }
+    }
+
+    @Override
+    public void exitList_stmt(List_stmtContext ctx) {
+        stack.pop();
+    }
+
+    @Override
+    public void enterAnyxml_stmt(Anyxml_stmtContext ctx) {
+        AnyXmlSchemaNode xml = new AnyXmlSchemaNode(stack.peek());
+        stack.push(xml);
+        updateNamedNode(xml, ctx);
+    }
+
+    @Override
+    public void exitAnyxml_stmt(Anyxml_stmtContext ctx) {
+        stack.pop();
+    }
+
+    @Override
+    public void enterChoice_stmt(Choice_stmtContext ctx) {
+        ChoiceNode choice = new ChoiceNode(stack.peek());
+        stack.push(choice);
+        updateNamedNode(choice, ctx);
+    }
+
+    @Override
+    public void exitChoice_stmt(Choice_stmtContext ctx) {
+        stack.pop();
+    }
+
+    @Override
+    public void enterCase_stmt(Case_stmtContext ctx) {
+        ChoiceCaseNode choiceCase = new ChoiceCaseNode(stack.peek());
+        stack.push(choiceCase);
+        updateNamedNode(choiceCase, ctx);
+    }
+
+    @Override
+    public void exitCase_stmt(Case_stmtContext ctx) {
+        stack.pop();
+    }
+
+    @Override
+    public void enterConfig_stmt(Config_stmtContext ctx) {
+        Config_argContext val = getChildNode(ctx, Config_argContext.class);
+        SimpleNode<String> node = new SimpleNode<String>(stack.peek(), "config", stringFromNode(val));
+        updateNodePosition(node, ctx);
+    }
+
+    @Override
+    public void enterPresence_stmt(Presence_stmtContext ctx) {
+        SimpleNode<String> node = new SimpleNode<String>(stack.peek(), "presence", stringFromNode(ctx));
+        updateNodePosition(node, ctx);
+    }
+
+    @Override
+    public void enterMax_elements_stmt(Max_elements_stmtContext ctx) {
+        SimpleNode<String> node = new SimpleNode<String>(stack.peek(), "max-elements", stringFromNode(ctx));
+        updateNodePosition(node, ctx);
+    }
+
+    @Override
+    public void enterMin_elements_stmt(Min_elements_stmtContext ctx) {
+        SimpleNode<String> node = new SimpleNode<String>(stack.peek(), "min-elements", stringFromNode(ctx));
+        updateNodePosition(node, ctx);
+    }
+
+    @Override
+    public void enterOrdered_by_stmt(Ordered_by_stmtContext ctx) {
+        Ordered_by_argContext val = getChildNode(ctx, Ordered_by_argContext.class);
+        SimpleNode<String> node = new SimpleNode<String>(stack.peek(), "ordered-by", stringFromNode(val));
+        updateNodePosition(node, ctx);
+    }
+
+    @Override
+    public void enterUnits_stmt(Units_stmtContext ctx) {
+        SimpleNode<String> node = new SimpleNode<String>(stack.peek(), "units", stringFromNode(ctx));
+        updateNodePosition(node, ctx);
+    }
+
+    @Override
+    public void enterMandatory_stmt(Mandatory_stmtContext ctx) {
+        Mandatory_argContext val = getChildNode(ctx, Mandatory_argContext.class);
+        SimpleNode<String> node = new SimpleNode<String>(stack.peek(), "mandatory", stringFromNode(val));
+        updateNodePosition(node, ctx);
+    }
+
+    @Override
+    public void enterDefault_stmt(Default_stmtContext ctx) {
+        SimpleNode<String> node = new SimpleNode<String>(stack.peek(), "default", stringFromNode(ctx));
+        updateNodePosition(node, ctx);
+    }
+
+    /**
+     * @return
+     */
+    public Module getModule() {
+        return module;
+    }
+
+    /**
+     * @param typeName
+     * @return
+     */
+    private QName parseQName(String typeName) {
+        String[] parts = typeName.split(":");
+        if (parts.length == 2) {
+            ModuleImport moduleImport = module.getImportByPrefix(parts[0]);
+            if (moduleImport != null) {
+                return new QName(moduleImport.getName(), moduleImport.getPrefix(), parts[1], moduleImport.getRevision());
+            }
+
+            if (module instanceof SubModule) {
+                SubModule subModule = (SubModule) module;
+                if (parts[0].equals(subModule.getParentPrefix())) {
+                    return new QName(subModule.getParentModule().getValue(), parts[0], parts[1], null);
+                }
+            }
+        }
+
+        String prefix = module.getPrefix() != null ? module.getPrefix().getValue() : null;
+        return new QName(module.getName(), prefix, typeName, revision);
+    }
+
+    private void updateRevisionForRevisionStatement(final ParseTree treeNode) {
+        final String revisionDate = stringFromNode(treeNode);
+        if ((revisionDate != null) && (this.revision.compareTo(revisionDate) < 0)) {
+            this.revision = revisionDate;
+            RevisionNode revisionNode = new RevisionNode(module);
+            updateNodePosition(revisionNode, treeNode);
+            updateNamedNode(revisionNode, treeNode);
+            module.setRevisionNode(revisionNode);
+        }
+    }
+
+    private void updateNodePosition(ASTNode astNode, ParseTree treeNode) {
+        if (astNode != null && treeNode instanceof ParserRuleContext) {
+            astNode.setStartPosition(((ParserRuleContext) treeNode).start.getStartIndex());
+            astNode.setLineNumber(((ParserRuleContext) treeNode).start.getLine());
+            astNode.setLength(((ParserRuleContext) treeNode).stop.getStopIndex() - astNode.getStartPosition());
+
+            Token bodyToken = null;
+            for (int i = 0; i < treeNode.getChildCount(); ++i) {
+                if (treeNode.getChild(i) instanceof TerminalNode) {
+                    final TerminalNode term = (TerminalNode) treeNode.getChild(i);
+                    if (term != null && term.getSymbol() != null && term.getSymbol().getType() == YangLexer.LEFT_BRACE) {
+                        bodyToken = term.getSymbol();
+                    }
+                }
+            }
+
+            if (bodyToken != null) {
+                astNode.setBodyStartPosition(bodyToken.getStartIndex());
+            }
+
+            setNodeDescription(astNode, treeNode);
+        }
+    }
+
+    private void setNodeDescription(ASTNode astNode, ParseTree treeNode) {
+        for (int i = 0; i < treeNode.getChildCount(); i++) {
+            ParseTree child = treeNode.getChild(i);
+            if (child instanceof Description_stmtContext) {
+                SimpleNode<String> astChild = new SimpleNode<String>(module, ((Description_stmtContext) child)
+                        .DESCRIPTION_KEYWORD().getText(), stringFromNode(child));
+                updateNodePosition(astChild, child);
+                astNode.setDescriptionNode(astChild);
+            } else if (child instanceof Reference_stmtContext) {
+                SimpleNode<String> astChild = new SimpleNode<String>(module, ((Reference_stmtContext) child)
+                        .REFERENCE_KEYWORD().getText(), stringFromNode(child));
+                updateNodePosition(astChild, child);
+                astNode.setReferenceNode(astChild);
+            } else if (child instanceof Status_stmtContext) {
+                SimpleNode<String> astChild = new SimpleNode<String>(module, ((Status_stmtContext) child)
+                        .STATUS_KEYWORD().getText(), stringFromNode(child));
+                updateNodePosition(astChild, child);
+                astNode.setStatusNode(astChild);
+            }
+        }
+    }
+
+    private void updateNamedNode(ASTNamedNode astNode, ParseTree treeNode) {
+        updateNodePosition(astNode, treeNode);
+        for (int i = 0; i < treeNode.getChildCount(); ++i) {
+            if (treeNode.getChild(i) instanceof StringContext) {
+                final StringContext context = (StringContext) treeNode.getChild(i);
+                if (context != null) {
+                    Token token = context.getStart();
+                    astNode.setNameStartPosition(token.getStartIndex());
+                    astNode.setNameLength(token.getStopIndex() - token.getStartIndex() + 1);
+                    astNode.setLineNumber(token.getLine());
+                    astNode.setName(stringFromStringContext(context));
+                }
+            }
+        }
+    }
+
+    /**
+     * Parse given tree and get first string value.
+     *
+     * @param treeNode tree to parse
+     * @return first string value from given tree
+     */
+    private static String stringFromNode(final ParseTree treeNode) {
+        String result = "";
+        for (int i = 0; i < treeNode.getChildCount(); ++i) {
+            if (treeNode.getChild(i) instanceof StringContext) {
+                final StringContext context = (StringContext) treeNode.getChild(i);
+                if (context != null) {
+                    return stringFromStringContext(context);
+
+                }
+            }
+        }
+        return result;
+    }
+
+    private static String stringFromStringContext(final StringContext context) {
+        StringBuilder str = new StringBuilder();
+        for (TerminalNode stringNode : context.STRING()) {
+            String result = stringNode.getText();
+            if (!result.contains("\"")) {
+                str.append(result);
+            } else {
+                str.append(result.replace("\"", ""));
+            }
+        }
+        return str.toString();
+    }
+
+    @SuppressWarnings("unchecked")
+    private <T> T getChildNode(ParseTree ctx, Class<T> clazz) {
+        for (int i = 0; i < ctx.getChildCount(); ++i) {
+            final ParseTree treeNode = ctx.getChild(i);
+            if (treeNode.getClass().equals(clazz)) {
+                return (T) treeNode;
+            }
+        }
+        return null;
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/YangParserUtil.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/YangParserUtil.java
new file mode 100644 (file)
index 0000000..6b43378
--- /dev/null
@@ -0,0 +1,174 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.parser;
+
+import java.util.BitSet;
+
+import org.antlr.v4.runtime.ANTLRInputStream;
+import org.antlr.v4.runtime.BaseErrorListener;
+import org.antlr.v4.runtime.BufferedTokenStream;
+import org.antlr.v4.runtime.CommonTokenStream;
+import org.antlr.v4.runtime.IntStream;
+import org.antlr.v4.runtime.Parser;
+import org.antlr.v4.runtime.ParserRuleContext;
+import org.antlr.v4.runtime.RecognitionException;
+import org.antlr.v4.runtime.Recognizer;
+import org.antlr.v4.runtime.Token;
+import org.antlr.v4.runtime.atn.ATNConfigSet;
+import org.antlr.v4.runtime.dfa.DFA;
+import org.antlr.v4.runtime.tree.ParseTreeWalker;
+import org.eclipse.core.resources.IProject;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangLexer;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangParser.YangContext;
+
+import com.cisco.yangide.core.dom.Module;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 9, 2014
+ */
+public class YangParserUtil {
+
+    // protect from initializaiton
+    private YangParserUtil() {
+        // empty block
+    }
+
+    /**
+     * Parses YANG file contents and returns AST tree as {@link Module}
+     *
+     * @param chars file contents
+     * @return AST Tree
+     */
+    public static Module parseYangFile(char[] chars) {
+        YangContext yangContext = parseYangSource(chars, null);
+        YangParserModelListener modelListener = new YangParserModelListener();
+        ParseTreeWalker.DEFAULT.walk(modelListener, yangContext);
+        return modelListener.getModule();
+    }
+
+    /**
+     * @param chars
+     * @param project
+     * @param validationListener
+     * @return
+     */
+    public static Module parseYangFile(char[] chars, IProject project, IYangValidationListener validationListener) {
+        YangContext yangContext = parseYangSource(chars, validationListener);
+        if (validationListener != null) {
+            validateYangContext(yangContext, validationListener);
+        }
+        YangParserModelListener modelListener = new YangParserModelListener();
+        ParseTreeWalker.DEFAULT.walk(modelListener, yangContext);
+        Module module = modelListener.getModule();
+        if (validationListener != null) {
+            new SemanticValidations(validationListener, project, module).validate();
+        }
+        return module;
+    }
+
+    public static void validateYangContext(YangContext context, IYangValidationListener validationListener) {
+        final ParseTreeWalker walker = new ParseTreeWalker();
+        final YangModelBasicValidationListener yangModelParser = new YangModelBasicValidationListener();
+        try {
+            walker.walk(yangModelParser, context);
+        } catch (YangValidationException e) {
+            if (validationListener != null) {
+                int lineNumber = -1;
+                int charStart = 0;
+                int charEnd = 0;
+                if (e.getContext() instanceof ParserRuleContext) {
+                    Token token = ((ParserRuleContext) e.getContext()).getStart();
+                    lineNumber = token.getLine();
+                    charStart = token.getStartIndex();
+                    charEnd = token.getStopIndex() + 1;
+                }
+                validationListener.validationError(e.getMessage(), lineNumber, charStart, charEnd);
+            }
+        }
+    }
+
+    public static void validateYangFile(char[] content, IProject project, IYangValidationListener validationListener) {
+        YangContext parseTree = parseYangSource(content, validationListener);
+        validateYangContext(parseTree, validationListener);
+
+        YangParserModelListener modelListener = new YangParserModelListener();
+        ParseTreeWalker.DEFAULT.walk(modelListener, parseTree);
+        new SemanticValidations(validationListener, project, modelListener.getModule()).validate();
+    }
+
+    public static YangContext parseYangSource(char[] content, final IYangValidationListener validationListener) {
+        final ANTLRInputStream input = new ANTLRInputStream(content, content.length);
+        final YangLexer lexer = new YangLexer(input);
+        final CommonTokenStream tokens = new CommonTokenStream(lexer);
+        final YangParser parser = new YangParser(tokens);
+        parser.removeErrorListeners();
+        if (validationListener != null) {
+            parser.addErrorListener(new BaseErrorListener() {
+                @Override
+                public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line,
+                        int charPositionInLine, String msg, RecognitionException e) {
+
+                    int charStart = 0;
+                    int charEnd = 0;
+                    if (offendingSymbol != null && offendingSymbol instanceof Token) {
+                        charStart = ((Token) offendingSymbol).getStartIndex();
+                        charEnd = ((Token) offendingSymbol).getStopIndex() + 1;
+                    }
+                    validationListener.syntaxError(msg, line, charStart, charEnd);
+                }
+            });
+        }
+        return parser.yang();
+    }
+
+    public static String formatYangSource(YangFormattingPreferences preferences, char[] content, int indentationLevel,
+            String lineSeparator) {
+        ANTLRInputStream input = new ANTLRInputStream(content, content.length);
+        final YangLexer lexer = new YangLexer(input) {
+            @Override
+            public void skip() {
+                // disable skipping of comment tokens
+            }
+        };
+        LexerErrorListener errorListener = new LexerErrorListener();
+        lexer.addErrorListener(errorListener);
+        final BufferedTokenStream tokens = new BufferedTokenStream(lexer);
+        final ITokenFormatter formatter = new YangTokenFormatter(preferences, indentationLevel, lineSeparator);
+        while (tokens.LT(1).getType() != IntStream.EOF) {
+            formatter.process(tokens.LT(1));
+            tokens.consume();
+        }
+        if (errorListener.isErrorDetected()) {
+            // Source that contains parsing errors should never be formatted
+            return String.valueOf(content);
+        }
+        return formatter.getFormattedContent();
+    }
+
+    private static final class LexerErrorListener extends BaseErrorListener {
+        private boolean anErrorDetected = false;
+
+        @Override
+        public void syntaxError(Recognizer<?, ?> recognizer, Object offendingSymbol, int line, int charPositionInLine,
+                String msg, RecognitionException e) {
+            anErrorDetected = true;
+        }
+
+        @Override
+        public void reportAmbiguity(Parser recognizer, DFA dfa, int startIndex, int stopIndex, BitSet ambigAlts,
+                ATNConfigSet configs) {
+            anErrorDetected = true;
+        }
+        
+        public boolean isErrorDetected() {
+            return anErrorDetected;
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/YangTokenFormatter.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/YangTokenFormatter.java
new file mode 100644 (file)
index 0000000..cf6d0de
--- /dev/null
@@ -0,0 +1,392 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.parser;
+
+import static org.opendaylight.yangtools.antlrv4.code.gen.YangLexer.LEFT_BRACE;
+import static org.opendaylight.yangtools.antlrv4.code.gen.YangLexer.RIGHT_BRACE;
+import static org.opendaylight.yangtools.antlrv4.code.gen.YangLexer.S;
+import static org.opendaylight.yangtools.antlrv4.code.gen.YangLexer.SEMICOLON;
+import static org.opendaylight.yangtools.antlrv4.code.gen.YangLexer.STRING;
+import static org.opendaylight.yangtools.antlrv4.code.gen.YangLexer.WS;
+import static org.opendaylight.yangtools.antlrv4.code.gen.YangLexer.LINE_COMMENT;
+import static org.opendaylight.yangtools.antlrv4.code.gen.YangLexer.END_BLOCK_COMMENT;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import org.antlr.v4.runtime.Token;
+import org.opendaylight.yangtools.antlrv4.code.gen.YangLexer;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 22, 2014
+ */
+public class YangTokenFormatter implements ITokenFormatter {
+
+    private StringBuilder sb;
+    private List<Token> tokens;
+    private Token prevToken;
+
+    // states
+    private int currIndent = 0;
+    private boolean wasNL;
+    private boolean ovrNL;
+    private boolean wasWS;
+    // was new line separator '{' '}' ';'
+    private int nlCount = 0;
+    private boolean importScope = false;
+    private StringBuilder importStatement = null;
+
+    // preferences
+    private int indent;
+    private String lineSeparator;
+    private Boolean formatString;
+    private Boolean formatComment;
+    private int maxLineLength;
+    private Boolean compactImport;
+    private boolean spaceForTabs;
+
+    public YangTokenFormatter(YangFormattingPreferences preferences, int indentationLevel, String lineSeparator) {
+        this.sb = new StringBuilder();
+        this.spaceForTabs = preferences.isSpaceForTabs();
+        this.indent = preferences.getIndentSize();
+        this.formatComment = preferences.isFormatComment();
+        this.formatString = preferences.isFormatStrings();
+        this.compactImport = preferences.isCompactImport();
+        this.maxLineLength = preferences.getMaxLineLength();
+        this.lineSeparator = lineSeparator;
+        this.currIndent = indentationLevel * this.indent;
+        this.tokens = new ArrayList<>();
+    }
+
+    @Override
+    public void process(Token token) {
+        // ignore '\r' token
+        if (isCarriageReturn(token)) {
+            return;
+        }
+
+        if (isWS(token) && (isWS(prevToken) || isNewLine(prevToken))) {
+            return;
+        }
+
+        if (isNewLine(token) && (isNewLine(prevToken) && nlCount > 1)) {
+            return;
+        }
+
+        nlCount = isNewLine(token) ? (nlCount + 1) : 0;
+        prevToken = token;
+        tokens.add(token);
+
+        // System.out.println(ignore + " '" + token.getText() + "'" + " - " +
+        // YangLexer.tokenNames[token.getType()]);
+    }
+
+    /**
+     * @param token token to inspect
+     * @return <code>true</code> if token should be ignored from processing
+     */
+    private boolean checkForIgnore(Token token) {
+
+        // ignore any repeat whitespace
+        if (isWS(token) && (wasWS || wasNL)) {
+            return true;
+        }
+
+        // ignore multiple new lines
+        if (isNewLine(token) && (ovrNL || nlCount > 1)) {
+            ovrNL = false;
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * @param token
+     * @return <code>true</code> if token processed by import case
+     */
+    private boolean processImportCase(Token token) {
+        if (!compactImport) {
+            return false;
+        }
+
+        if (token.getType() == YangLexer.IMPORT_KEYWORD) {
+            importScope = true;
+            importStatement = new StringBuilder();
+        }
+
+        if (importScope) {
+            if (token.getType() == RIGHT_BRACE) {
+                importScope = false;
+                printIndent();
+                sb.append(importStatement.toString()).append(' ');
+                wasWS = true;
+                nlCount = 0;
+                // add indent for right brace processing
+                currIndent += indent;
+                return false;
+            } else if (!isNewLine(token) && !isWS(token)) {
+                if (importStatement.length() > 0 && token.getType() != SEMICOLON) {
+                    importStatement.append(' ');
+                }
+                importStatement.append(token.getText());
+            }
+            return true;
+        }
+
+        return importScope;
+    }
+
+    /**
+     * Prints formatted text of token into string buffer.
+     *
+     * @param token current token
+     */
+    private void processToken(Token token) {
+        int type = token.getType();
+
+        if (type == STRING) {
+            String text = token.getText();
+            if (!formatString || text.length() < maxLineLength) {
+                if (!(wasWS || token.getType() == LEFT_BRACE || token.getType() == SEMICOLON)) {
+                    if (wasNL) {
+                        printIndent();
+                    }
+                    printIndent();
+                }
+                sb.append(text);
+            } else {
+                printFormattedString(text);
+            }
+        } else if (type == YangLexer.END_BLOCK_COMMENT) {
+            if (formatComment) {
+                sb.append(lineSeparator);
+                printIndent();
+                String text = token.getText().substring(0, token.getText().length() - 2);
+                text = text.replaceAll("(?m)^\\s+\\*", "");
+                printFormattedString(text);
+                sb.append(lineSeparator);
+                printIndent();
+                sb.append("*/");
+            } else {
+                sb.append(token.getText());
+            }
+        } else {
+            if (!(wasWS || isNewLine(token) || isWS(token) || token.getType() == SEMICOLON || token.getType() == LEFT_BRACE)) {
+                printIndent();
+            }
+            if (!isNewLine(token)) {
+                sb.append(token.getText());
+            }
+        }
+        if (isNewLine(token)) {
+            sb.append(lineSeparator);
+        }
+    }
+
+    /**
+     * Prints formatted string token.
+     *
+     * @param token string token
+     */
+    private void printFormattedString(String str) {
+        String text = str;
+        text = text.replaceAll("\\s+", " ");
+
+        boolean firstLine = true;
+        StringBuilder textSB = new StringBuilder();
+        StringTokenizer st = new StringTokenizer(text);
+        while (st.hasMoreTokens()) {
+            if (textSB.length() > 0) {
+                textSB.append(" ");
+            }
+            textSB.append(st.nextToken());
+            if (textSB.length() > maxLineLength) {
+                if (!firstLine || wasNL) {
+                    printIndent();
+                    printIndent();
+                }
+                sb.append(textSB.toString());
+                if (st.hasMoreTokens()) {
+                    sb.append(lineSeparator);
+                }
+                textSB = new StringBuilder();
+                firstLine = false;
+            }
+        }
+        if (textSB.length() > 0) {
+            if (!firstLine || wasNL) {
+                printIndent();
+                printIndent();
+            }
+            sb.append(textSB.toString());
+        }
+    }
+
+    /**
+     * Updates the state before token processed.
+     *
+     * @param token current token
+     */
+    private void updatePreState(Token token) {
+        int type = token.getType();
+
+        // decrease indent if '}' token
+        if (type == RIGHT_BRACE) {
+            currIndent -= indent;
+            if (currIndent < 0) {
+                currIndent = 0;
+            }
+        }
+
+        // add space in expression like 'st {'
+        if (!wasWS && type == LEFT_BRACE) {
+            sb.append(" ");
+            wasWS = true;
+        }
+    }
+
+    /**
+     * Updates the state after token processed.
+     *
+     * @param token current token
+     */
+    private void updateState(Token token) {
+        int type = token.getType();
+
+        // increase indent if '{' token
+        if (type == LEFT_BRACE) {
+            currIndent += indent;
+        }
+        ovrNL = false;
+
+        // added new line after '{', ';', '}' tokens
+        if (type == LEFT_BRACE || type == SEMICOLON || type == RIGHT_BRACE) {
+            sb.append(lineSeparator);
+            ovrNL = true;
+            // nlCount++;
+        }
+
+        wasNL = isNewLine(token) || ovrNL;
+        wasWS = isWS(token);
+
+        if (isNewLine(token)) {
+            nlCount++;
+        }
+
+        if (!wasNL) {
+            nlCount = 0;
+        }
+    }
+
+    /**
+     * Prints appropriate indent to string buffer.
+     */
+    private void printIndent() {
+        char[] str = new char[currIndent];
+        Arrays.fill(str, spaceForTabs ? ' ' : '\t');
+        sb.append(str);
+    }
+
+    /**
+     * @param token token to inspect
+     * @return <code>true</code> if token is space or space separator
+     */
+    private boolean isWS(Token token) {
+        if (token == null) {
+            return false;
+        }
+        int type = token.getType();
+        return (type == WS || type == S) && !token.getText().equals("\n") && !token.getText().equals("\r");
+    }
+
+    /**
+     * @param token token to inspect
+     * @return <code>true</code> if token is new line token.
+     */
+    private boolean isNewLine(Token token) {
+        if (token == null) {
+            return false;
+        }
+        int type = token.getType();
+        return (type == WS || type == S) && token.getText().equals("\n");
+    }
+
+    /**
+     * @param token token to inspect
+     * @return <code>true</code> if token is '\r' token.
+     */
+    private boolean isCarriageReturn(Token token) {
+        if (token == null) {
+            return false;
+        }
+        int type = token.getType();
+        return (type == WS || type == S) && token.getText().equals("\r");
+    }
+
+    /**
+     * @param token token to inspect
+     * @return <code>true</code> if token is '{' '}' ';' token.
+     */
+    private boolean isBlockSeparator(Token token) {
+        if (token == null) {
+            return false;
+        }
+        int type = token.getType();
+        return type == LEFT_BRACE || type == SEMICOLON || type == RIGHT_BRACE;
+    }
+
+    @Override
+    public String getFormattedContent() {
+        cleanTokens();
+        for (Token token : tokens) {
+            boolean ignore = checkForIgnore(token);
+            if (!ignore) {
+                if (!processImportCase(token)) {
+                    updatePreState(token);
+                    processToken(token);
+                    updateState(token);
+                }
+            }
+        }
+        return sb.toString();
+    }
+
+    /**
+     * Cleans 'new line' tokens before block separators. We assume that we already clean all 'new
+     * line' that occurred more 2 times.
+     * <br>
+     * New line token is not erased if it followed a comment. 
+     */
+    private void cleanTokens() {
+        int idx = 0;
+        while (idx < tokens.size() - 2) {
+            if (isWS(tokens.get(idx)) && isNewLine(tokens.get(idx + 1))) {
+                tokens.remove(tokens.get(idx));
+                idx--;
+            } 
+            else if (isNewLine(tokens.get(idx)) && isBlockSeparator(tokens.get(idx + 1)) && !isComment(idx-1))
+            {
+                tokens.remove(tokens.get(idx));
+                idx--;
+            } else {
+                idx++;
+            }
+        }
+    }
+
+    /**
+     * Returns true if token at idx is a line comment or is a block comment end.
+     */
+    private boolean isComment(int idx) 
+    {
+        return idx > 0 && (tokens.get(idx).getType() == LINE_COMMENT || tokens.get(idx).getType() == END_BLOCK_COMMENT);
+    }
+}
diff --git a/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/YangValidationException.java b/plugins/com.cisco.yangide.core/src/com/cisco/yangide/core/parser/YangValidationException.java
new file mode 100644 (file)
index 0000000..2bacd26
--- /dev/null
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.core.parser;
+
+import org.antlr.v4.runtime.tree.ParseTree;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 9, 2014
+ */
+public class YangValidationException extends RuntimeException {
+
+    private static final long serialVersionUID = 8844776097829361020L;
+
+    private ParseTree context;
+
+    public YangValidationException(ParseTree ctx, String message, Throwable cause) {
+        super(message, cause);
+        this.context = ctx;
+    }
+
+    public YangValidationException(ParseTree ctx, String message) {
+        super(message);
+        this.context = ctx;
+    }
+
+    /**
+     * @return the context
+     */
+    public ParseTree getContext() {
+        return context;
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/.gitignore b/plugins/com.cisco.yangide.editor/.gitignore
new file mode 100644 (file)
index 0000000..1a79925
--- /dev/null
@@ -0,0 +1,4 @@
+/bin/
+/target/
+/.settings/
+.classpath
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.editor/.project b/plugins/com.cisco.yangide.editor/.project
new file mode 100644 (file)
index 0000000..e8979c1
--- /dev/null
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>com.cisco.yangide.editor</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.m2e.core.maven2Builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.m2e.core.maven2Nature</nature>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/plugins/com.cisco.yangide.editor/META-INF/MANIFEST.MF b/plugins/com.cisco.yangide.editor/META-INF/MANIFEST.MF
new file mode 100644 (file)
index 0000000..be6910c
--- /dev/null
@@ -0,0 +1,28 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Editor
+Bundle-SymbolicName: com.cisco.yangide.editor;singleton:=true
+Bundle-Version: 1.1.1.qualifier
+Bundle-ClassPath: .
+Bundle-Activator: com.cisco.yangide.editor.YangEditorPlugin
+Bundle-Vendor: Cisco
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.ui.editors,
+ org.eclipse.core.runtime,
+ org.eclipse.jface.text,
+ org.eclipse.jdt.ui,
+ org.eclipse.ui.forms,
+ com.cisco.yangide.core;bundle-version="0.1.0",
+ com.cisco.yangide.ui;bundle-version="0.1.0",
+ org.eclipse.core.resources,
+ org.eclipse.ui.ide;bundle-version="3.7.0",
+ org.eclipse.ui.workbench.texteditor,
+ org.eclipse.ui.views,
+ org.eclipse.compare
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-ActivationPolicy: lazy
+Export-Package: com.cisco.yangide.editor,
+ com.cisco.yangide.editor.editors,
+ com.cisco.yangide.editor.preferences
+Import-Package: org.eclipse.ui.texteditor.templates
diff --git a/plugins/com.cisco.yangide.editor/build.properties b/plugins/com.cisco.yangide.editor/build.properties
new file mode 100644 (file)
index 0000000..f6e814b
--- /dev/null
@@ -0,0 +1,18 @@
+###############################################################################
+# Copyright (c) 2014, 2015 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
+#  
+###############################################################################
+source.. = src/
+output.. = target/classes/
+bin.includes = plugin.xml,\
+               META-INF/,\
+               icons/,\
+               resources/,\
+               .,\
+               templates/,\
+               plugin.properties
+jars.compile.order = .
diff --git a/plugins/com.cisco.yangide.editor/help/keywords/module.txt b/plugins/com.cisco.yangide.editor/help/keywords/module.txt
new file mode 100644 (file)
index 0000000..8e5f15e
--- /dev/null
@@ -0,0 +1,33 @@
+<p>
+The "module" statement defines the module's name, and groups all statements that belong to the module together.  The "module" statement's argument is the name of the module, followed by a block of substatements that hold detailed module information.  The module name follows the rules for identifiers. 
+</p><p>
+Names of modules published in RFC streams [RFC4844] MUST be assigned by IANA.
+</p><p>
+Private module names are assigned by the organization owning the module without a central registry. It is RECOMMENDED to choose module names that will have a low probability of colliding with standard or other enterprise modules and submodules, e.g., by using the enterprise or organization name as a prefix for the module name.
+</p><p>
+   A module typically has the following layout:
+</p><pre>
+     module <module-name> {
+
+         // header information
+         &lt;yang-version statement&gt;
+         &lt;namespace statement&gt;
+         &lt;prefix statement&gt;
+
+         // linkage statements
+         &lt;import statements&gt;
+         &lt;include statements&gt;
+
+         // meta information
+         &lt;organization statement&gt;
+         &lt;contact statement&gt;
+         &lt;description statement&gt;
+         &lt;reference statement&gt;
+
+         // revision history
+         &lt;revision statements&gt;
+
+         // module definitions
+         &lt;other statements&gt;
+     }
+</pre>
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.editor/help/keywords/namespace.txt b/plugins/com.cisco.yangide.editor/help/keywords/namespace.txt
new file mode 100644 (file)
index 0000000..aea672a
--- /dev/null
@@ -0,0 +1 @@
+The "namespace" statement defines the XML namespace that all identifiers defined by the module are qualified by, with the exception of data node identifiers defined inside a grouping. The argument to the "namespace" statement is the URI of the namespace.
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.editor/help/types/binary.txt b/plugins/com.cisco.yangide.editor/help/types/binary.txt
new file mode 100644 (file)
index 0000000..8fb57fd
--- /dev/null
@@ -0,0 +1 @@
+Any binary data
diff --git a/plugins/com.cisco.yangide.editor/help/types/bits.txt b/plugins/com.cisco.yangide.editor/help/types/bits.txt
new file mode 100644 (file)
index 0000000..2b7b19c
--- /dev/null
@@ -0,0 +1 @@
+A set of bits or flags
diff --git a/plugins/com.cisco.yangide.editor/help/types/boolean.txt b/plugins/com.cisco.yangide.editor/help/types/boolean.txt
new file mode 100644 (file)
index 0000000..1cde861
--- /dev/null
@@ -0,0 +1 @@
+"true" or "false"
diff --git a/plugins/com.cisco.yangide.editor/help/types/decimal64.txt b/plugins/com.cisco.yangide.editor/help/types/decimal64.txt
new file mode 100644 (file)
index 0000000..71e14f0
--- /dev/null
@@ -0,0 +1 @@
+64-bit signed decimal number
diff --git a/plugins/com.cisco.yangide.editor/help/types/empty.txt b/plugins/com.cisco.yangide.editor/help/types/empty.txt
new file mode 100644 (file)
index 0000000..98b5f14
--- /dev/null
@@ -0,0 +1 @@
+A leaf that does not have any value 
diff --git a/plugins/com.cisco.yangide.editor/help/types/enumeration.txt b/plugins/com.cisco.yangide.editor/help/types/enumeration.txt
new file mode 100644 (file)
index 0000000..331c29b
--- /dev/null
@@ -0,0 +1 @@
+Enumerated strings
diff --git a/plugins/com.cisco.yangide.editor/help/types/identityref.txt b/plugins/com.cisco.yangide.editor/help/types/identityref.txt
new file mode 100644 (file)
index 0000000..9683b24
--- /dev/null
@@ -0,0 +1 @@
+A reference to an abstract identity 
diff --git a/plugins/com.cisco.yangide.editor/help/types/instance-identifier.txt b/plugins/com.cisco.yangide.editor/help/types/instance-identifier.txt
new file mode 100644 (file)
index 0000000..f96d2de
--- /dev/null
@@ -0,0 +1 @@
+References a data tree node
diff --git a/plugins/com.cisco.yangide.editor/help/types/int16.txt b/plugins/com.cisco.yangide.editor/help/types/int16.txt
new file mode 100644 (file)
index 0000000..291861f
--- /dev/null
@@ -0,0 +1 @@
+16-bit signed integer
diff --git a/plugins/com.cisco.yangide.editor/help/types/int32.txt b/plugins/com.cisco.yangide.editor/help/types/int32.txt
new file mode 100644 (file)
index 0000000..cd651db
--- /dev/null
@@ -0,0 +1 @@
+32-bit signed integer
diff --git a/plugins/com.cisco.yangide.editor/help/types/int64.txt b/plugins/com.cisco.yangide.editor/help/types/int64.txt
new file mode 100644 (file)
index 0000000..b8ca9e5
--- /dev/null
@@ -0,0 +1 @@
+64-bit signed integer
diff --git a/plugins/com.cisco.yangide.editor/help/types/int8.txt b/plugins/com.cisco.yangide.editor/help/types/int8.txt
new file mode 100644 (file)
index 0000000..65771b4
--- /dev/null
@@ -0,0 +1 @@
+8-bit signed integer
diff --git a/plugins/com.cisco.yangide.editor/help/types/leafref.txt b/plugins/com.cisco.yangide.editor/help/types/leafref.txt
new file mode 100644 (file)
index 0000000..66b28a9
--- /dev/null
@@ -0,0 +1 @@
+A reference to a leaf instance
diff --git a/plugins/com.cisco.yangide.editor/help/types/string.txt b/plugins/com.cisco.yangide.editor/help/types/string.txt
new file mode 100644 (file)
index 0000000..df563b4
--- /dev/null
@@ -0,0 +1 @@
+Human-readable string
diff --git a/plugins/com.cisco.yangide.editor/help/types/uint16.txt b/plugins/com.cisco.yangide.editor/help/types/uint16.txt
new file mode 100644 (file)
index 0000000..65354ed
--- /dev/null
@@ -0,0 +1 @@
+16-bit unsigned integer
diff --git a/plugins/com.cisco.yangide.editor/help/types/uint32.txt b/plugins/com.cisco.yangide.editor/help/types/uint32.txt
new file mode 100644 (file)
index 0000000..686bd5c
--- /dev/null
@@ -0,0 +1 @@
+32-bit unsigned integer
diff --git a/plugins/com.cisco.yangide.editor/help/types/uint64.txt b/plugins/com.cisco.yangide.editor/help/types/uint64.txt
new file mode 100644 (file)
index 0000000..2e50ff9
--- /dev/null
@@ -0,0 +1 @@
+64-bit unsigned integer
diff --git a/plugins/com.cisco.yangide.editor/help/types/uint8.txt b/plugins/com.cisco.yangide.editor/help/types/uint8.txt
new file mode 100644 (file)
index 0000000..e899065
--- /dev/null
@@ -0,0 +1 @@
+8-bit unsigned integer
diff --git a/plugins/com.cisco.yangide.editor/help/types/union.txt b/plugins/com.cisco.yangide.editor/help/types/union.txt
new file mode 100644 (file)
index 0000000..ba47c00
--- /dev/null
@@ -0,0 +1 @@
+Choice of member types
diff --git a/plugins/com.cisco.yangide.editor/icons/yang_file.png b/plugins/com.cisco.yangide.editor/icons/yang_file.png
new file mode 100644 (file)
index 0000000..9a69984
Binary files /dev/null and b/plugins/com.cisco.yangide.editor/icons/yang_file.png differ
diff --git a/plugins/com.cisco.yangide.editor/plugin.properties b/plugins/com.cisco.yangide.editor/plugin.properties
new file mode 100644 (file)
index 0000000..42d9bae
--- /dev/null
@@ -0,0 +1,10 @@
+###############################################################################
+# Copyright (c) 2014, 2015 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
+#  
+###############################################################################
+Source=&Source
+FormatDocument=&Format
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.editor/plugin.xml b/plugins/com.cisco.yangide.editor/plugin.xml
new file mode 100644 (file)
index 0000000..af9e903
--- /dev/null
@@ -0,0 +1,297 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<!--
+    Copyright (c) 2014, 2015 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
+     
+ -->
+<!--                                                                                -->
+<!-- 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                  -->
+<!-- ============================================================================== -->
+<plugin>
+   <extension-point id="actionGroup" name="actionGroup" schema="schema/actionGroup.exsd"/>
+   
+   <extension
+         point="org.eclipse.ui.editors">
+      <editor
+            class="com.cisco.yangide.editor.editors.YangEditor" 
+            default="true"
+            contributorClass="com.cisco.yangide.editor.editors.YangEditorActionContributor"
+            extensions="yang"
+            icon="icons/yang_file.png"
+            id="com.cisco.yangide.editor.editors.YANGEditor"
+            name="YANG Editor">
+            <contentTypeBinding contentTypeId="com.cisco.yangide.core.yangFile"/>
+      </editor>
+   </extension>
+   <extension
+         point="org.eclipse.ui.preferencePages">
+      <page
+            category="com.cisco.yangide.ui.preferences.YANGBasePreferencePage"
+            class="com.cisco.yangide.editor.preferences.YangEditorColoringPreferencePage"
+            id="com.cisco.yangide.editor.preferences.YANGEditorColoringPreferencePage"
+            name="Syntax Coloring">
+      </page>
+      <page
+            category="com.cisco.yangide.ui.preferences.YANGBasePreferencePage"
+            class="com.cisco.yangide.editor.templates.YangEditorTemplatesPage"
+            id="com.cisco.yangide.editor.templates.YANGEditorTemplatesPage"
+            name="Templates">
+      </page>
+      <page
+            category="com.cisco.yangide.ui.preferences.YANGBasePreferencePage"
+            class="com.cisco.yangide.editor.preferences.YangFormatterPreferencePage"
+            id="com.cisco.yangide.editor.preferences.YangFormatterPreferencePage"
+            name="Formatter">
+      </page>
+   </extension>
+   <extension
+         point="org.eclipse.ui.editors.templates">
+      <contextType
+            class="com.cisco.yangide.editor.templates.GeneralContextType"
+            id="com.cisco.yangide.editor.templates.general"
+            name="General">
+      </contextType>
+      <include
+            file="templates/yang.xml"
+            translations="templates/yang.xml">
+      </include>
+   </extension>   
+   
+    <extension point="org.eclipse.ui.workbench.texteditor.hyperlinkDetectors">
+      <hyperlinkDetector
+           activate="true"
+           class="com.cisco.yangide.editor.editors.YangElementHyperlinkDetector"
+           description="A hyperlink detector for Yang source code elements"
+           id="com.cisco.yangide.editor.YangElementHyperlinkDetector"
+           name="Yang Element"
+           targetId="com.cisco.yangide.yang.sourceFiles">
+      </hyperlinkDetector>
+    </extension>
+   
+    <extension point="org.eclipse.ui.workbench.texteditor.hyperlinkDetectorTargets">
+      <target
+           id="com.cisco.yangide.yang.sourceFiles"
+           name="Yang Editor">
+        <context type="com.cisco.yangide.editor.editors.YangEditor"/>
+      </target>
+   </extension>
+   
+   <extension point="org.eclipse.ui.commands">
+       <command 
+           categoryId="com.cisco.yangide.category.navigate" 
+           id="com.cisco.yangide.navigate.open.declaration"
+           name="Open Declaration"/>
+     
+      <command
+            categoryId="com.cisco.yangide.category.source"
+            id="com.cisco.yangide.actions.format"
+            name="Format">
+      </command>
+      
+      <command
+            categoryId="com.cisco.yangide.category.source"
+            id="com.cisco.yangide.actions.toggle.comment"
+            name="Toggle comment">
+      </command>
+      <command
+            categoryId="com.cisco.yangide.category.source"
+            id="com.cisco.yangide.actions.add.block.comment"
+            name="Add Block comment">
+      </command>
+      <command
+            categoryId="com.cisco.yangide.category.source"
+            id="com.cisco.yangide.actions.remove.block.comment"
+            name="Remove Block comment">
+      </command>
+     
+   </extension>
+    
+    <extension point="org.eclipse.ui.bindings">
+        <key
+            commandId="com.cisco.yangide.navigate.open.declaration"
+            contextId="com.cisco.yangide.ui.Context"
+            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+            sequence="F3"/>
+       
+        <key
+            commandId="com.cisco.yangide.actions.toggle.comment"
+            contextId="com.cisco.yangide.ui.Context"
+            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+            sequence="M1+/"/>
+        <key
+            commandId="com.cisco.yangide.actions.toggle.comment"
+            contextId="com.cisco.yangide.ui.Context"
+            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+            sequence="M1+M2+C"/>
+        <key
+            commandId="com.cisco.yangide.actions.add.block.comment"
+            contextId="com.cisco.yangide.ui.Context"
+            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+            sequence="M1+M2+/"/>
+        <key
+            commandId="com.cisco.yangide.actions.remove.block.comment"
+            contextId="com.cisco.yangide.ui.Context"
+            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
+            sequence="M1+M2+\"/>
+            
+        <key
+            sequence="M1+M2+F"
+            contextId="com.cisco.yangide.ui.Context"
+            commandId="com.cisco.yangide.actions.format"
+            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/> 
+    </extension>
+    
+     <extension point="org.eclipse.ui.actionSets">
+        <actionSet
+            id="com.cisco.yangide.editor.CodingActionSet" 
+            label="Source">
+          <menu
+                id="com.cisco.yangide.editor.source.menu"
+                label="%Source"
+                path="edit">
+             <separator name="commentGroup"/>
+             <separator name="shiftGroup"/>
+             <separator name="formatGroup"/>
+          </menu>
+           <action
+                allowLabelUpdate="true"
+                definitionId="com.cisco.yangide.navigate.open.declaration"
+                id="com.cisco.yangide.editor.actions.OpenDeclaration"
+                label="Open Declaration"
+                menubarPath="navigate/open.ext"
+                retarget="true">
+          </action>
+          <action
+                allowLabelUpdate="true"
+                definitionId="com.cisco.yangide.actions.remove.block.comment"
+                id="com.cisco.yangide.editor.actions.RemoveBlockComment"
+                label="Remove Block Comment"
+                menubarPath="com.cisco.yangide.editor.source.menu/commentGroup"
+                retarget="true">
+          </action>
+          <action
+                allowLabelUpdate="true"
+                definitionId="com.cisco.yangide.actions.add.block.comment"
+                id="com.cisco.yangide.editor.actions.AddBlockComment"
+                label="Add Block Comment"
+                menubarPath="com.cisco.yangide.editor.source.menu/commentGroup"
+                retarget="true">
+          </action>
+          <action
+                allowLabelUpdate="true"
+                definitionId="com.cisco.yangide.actions.toggle.comment"
+                id="com.cisco.yangide.editor.actions.ToggleComment"
+                label="Toggle Comment"
+                menubarPath="com.cisco.yangide.editor.source.menu/commentGroup"
+                retarget="true">
+          </action>
+            <action 
+                id="com.cisco.yangide.editor.actions.shiftLeft" 
+                definitionId="org.eclipse.ui.edit.text.shiftLeft"
+                menubarPath="com.cisco.yangide.editor.source.menu/shiftGroup"
+                label="Shift Left"
+                retarget="true">
+            </action>
+            <action 
+                id="com.cisco.yangide.editor.actions.shiftRight" 
+                definitionId="org.eclipse.ui.edit.text.shiftRight"
+                menubarPath="com.cisco.yangide.editor.source.menu/shiftGroup"
+                label="Shift Right"
+                retarget="true">
+            </action>
+          <action
+                allowLabelUpdate="true"
+                definitionId="com.cisco.yangide.actions.format"
+                id="com.cisco.yangide.editor.actions.FormatDocument"
+                label="Format"
+                menubarPath="com.cisco.yangide.editor.source.menu/formatGroup"
+                retarget="true">
+          </action>
+       </actionSet>
+    </extension>
+    
+    <extension point="org.eclipse.ui.menus">
+        <!-- Contribute a Open meno for popup-->
+        <menuContribution locationURI="popup:org.eclipse.ui.popup.any?endof=group.open">
+            <command id="OpenDeclaration"
+                commandId="com.cisco.yangide.navigate.open.declaration"
+                style="push">
+                <visibleWhen checkEnabled="false"><reference definitionId="com.cisco.yangide.activeContext.definition"/></visibleWhen>
+            </command>
+        </menuContribution>
+    
+        <!-- Contribute a Source menu for popup -->
+         <menuContribution locationURI="popup:org.eclipse.ui.popup.any?before=group.find">
+            <menu id="sourceMenuId" label="%Source">
+                <command id="ToggleComment"
+                    commandId="com.cisco.yangide.actions.toggle.comment"
+                    style="push">
+                    <visibleWhen checkEnabled="false"><reference definitionId="com.cisco.yangide.activeContext.definition"/></visibleWhen>
+                </command>
+                <command id="AddBlockComment"
+                    commandId="com.cisco.yangide.actions.add.block.comment"
+                    style="push">
+                    <visibleWhen checkEnabled="false"><reference definitionId="com.cisco.yangide.activeContext.definition"/></visibleWhen>
+                </command>
+                <command id="RemoveBlockComment"
+                    commandId="com.cisco.yangide.actions.remove.block.comment"
+                    style="push">
+                    <visibleWhen checkEnabled="false"><reference definitionId="com.cisco.yangide.activeContext.definition"/></visibleWhen>
+                </command>
+                
+                <separator name="format" visible="true"></separator>
+                
+                <command id="FormatDocument"
+                    commandId="com.cisco.yangide.actions.format" 
+                    style="push">
+                    <visibleWhen checkEnabled="false"><reference definitionId="com.cisco.yangide.activeContext.definition"/></visibleWhen>
+                </command>
+            </menu>
+        </menuContribution>
+    </extension>
+    
+    <extension point="org.eclipse.ui.actionSetPartAssociations">
+       <actionSetPartAssociation targetID="com.cisco.yangide.editor.CodingActionSet">
+          <part id="com.cisco.yangide.editor.editors.YANGEditor"/>
+       </actionSetPartAssociation>
+    </extension>
+   
+    <extension point="org.eclipse.core.expressions.definitions">
+        <definition id="com.cisco.yangide.activeContext.definition">
+            <with variable="activeContexts">
+               <iterate operator="or">
+                  <equals value="com.cisco.yangide.ui.Context"/>
+               </iterate>
+            </with>
+        </definition>
+    </extension>
+    
+    <extension point="org.eclipse.compare.contentViewers">
+        <viewer
+            id="com.cisco.yangide.editor.compare.YangFileViewer" 
+            extensions="yang"
+            class="com.cisco.yangide.editor.compare.YangFileViewerCreator"/>
+
+        <contentTypeBinding 
+            contentTypeId="com.cisco.yangide.core.yangFile" 
+            contentViewerId="com.cisco.yangide.editor.compare.YangFileViewer"/>
+    </extension>
+    
+    <extension point="org.eclipse.compare.contentMergeViewers">
+        <viewer 
+            id="com.cisco.yangide.editor.compare.YangFileMergeViewer" 
+            extensions="yang"
+            label="YANG File Merge Viewer"
+            class="com.cisco.yangide.editor.compare.YangFileMergeViewerCreator"/>
+
+        <contentTypeBinding
+            contentTypeId="com.cisco.yangide.core.yangFile"
+            contentMergeViewerId="com.cisco.yangide.editor.compare.YangFileMergeViewer"/>
+    </extension>    
+</plugin>
diff --git a/plugins/com.cisco.yangide.editor/pom.xml b/plugins/com.cisco.yangide.editor/pom.xml
new file mode 100644 (file)
index 0000000..1809929
--- /dev/null
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2014, 2015 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
+     
+ -->
+<!--                                                                                -->
+<!-- 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">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>com.cisco.yangide</groupId>
+    <artifactId>com.cisco.yangide.parent</artifactId>
+    <version>1.1.1-SNAPSHOT</version>
+    <relativePath>../..</relativePath>
+  </parent>
+
+  <artifactId>com.cisco.yangide.editor</artifactId>
+  <packaging>eclipse-plugin</packaging>
+  <version>1.1.1-SNAPSHOT</version>
+  <build>
+    <sourceDirectory>src</sourceDirectory>
+  </build>
+</project>
diff --git a/plugins/com.cisco.yangide.editor/resources/ColorSettingPreviewCode.txt b/plugins/com.cisco.yangide.editor/resources/ColorSettingPreviewCode.txt
new file mode 100644 (file)
index 0000000..0686f3a
--- /dev/null
@@ -0,0 +1,122 @@
+/* Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved. */
+module dhcp {
+  namespace "http://yang-central.org/ns/example/dhcp";
+  prefix dhcp;
+
+  /* import statements*/
+  import ietf-yang-types { prefix yang; }
+  import ietf-inet-types { prefix inet; }
+
+  organization
+    "yang-central.org"; // your organization
+  description
+    "Partial data model for DHCP, based on the config of
+     the ISC DHCP reference implementation.";
+
+  container dhcp {
+    description
+      "configuration and operational parameters for a DHCP server.";
+
+    leaf max-lease-time {
+      type uint32;
+      units seconds;
+      default 7200;
+    }
+
+    leaf default-lease-time {
+      type uint32;
+      units seconds;
+      must 'current() <= ../max-lease-time' {
+        error-message
+          "The default-lease-time must be less than max-lease-time";
+      }
+      default 600;
+    }
+    
+    uses subnet-list;
+  
+    container shared-networks {
+      list shared-network {
+        key name;
+
+        leaf name {
+          type string;
+        }
+      }
+    }
+
+    container status {
+      config false;
+      list leases {
+        key address;
+      
+        leaf address {
+          type inet:ip-address;
+        }
+        leaf starts {
+          type yang:date-and-time;
+        }
+        leaf ends {
+          type yang:date-and-time;
+        }
+        container hardware {
+          leaf type {
+            type enumeration {
+              enum "ethernet";
+              enum "token-ring";
+              enum "fddi";
+            }
+          }
+          leaf address {
+            type yang:phys-address;
+          }
+        }
+      }
+    }
+  }
+
+  grouping subnet-list {
+    description "A reusable list of subnets";
+    list subnet {
+      key net;
+      leaf net {
+        type inet:ip-prefix;
+      }
+      container range {
+        presence "enables dynamic address assignment";
+        leaf dynamic-bootp {
+          type empty;
+          description 
+            "Allows BOOTP clients to get addresses in this range";
+        }
+        leaf low {
+          type inet:ip-address;
+          mandatory true;
+        }
+        leaf high {
+          type inet:ip-address;
+          mandatory true;
+        }
+      }
+      
+      container dhcp-options {
+        description "Options in the DHCP protocol";
+        leaf-list router {
+          type inet:host;
+          ordered-by user;
+          reference "RFC 2132, sec. 3.8";
+        }
+        leaf domain-name {
+          type inet:domain-name;
+          reference "RFC 2132, sec. 3.17";
+        }
+      }
+      
+      leaf max-lease-time {
+        type uint32;
+        units seconds;
+        default 7200;
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.editor/resources/FormatterSettingPreviewCode.txt b/plugins/com.cisco.yangide.editor/resources/FormatterSettingPreviewCode.txt
new file mode 100644 (file)
index 0000000..7567c50
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ * Copyright (c) 2014 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
+ */
+module dhcp {
+  namespace "http://yang-central.org/ns/example/dhcp";
+  prefix dhcp;
+
+  /* import statements*/
+  import ietf-yang-types {prefix yang;revision-date "2013-08-19";}
+  import ietf-inet-types { prefix inet; }
+
+  organization "yang-central.org"; // your organization
+  description "Partial data model for DHCP, based on the config of the ISC DHCP reference implementation.";
+
+  container dhcp {
+    description
+      "configuration and operational parameters for a DHCP server.";
+
+    leaf max-lease-time {
+      type uint32;
+      units seconds;
+      default 7200;
+    }
+
+    leaf default-lease-time {
+      type uint32;
+      units seconds;
+      must 'current() <= ../max-lease-time' {
+        error-message
+          "The default-lease-time must be less than max-lease-time";
+      }
+      default 600;
+    }
+    
+    uses subnet-list;
+  
+    container shared-networks {
+      list shared-network {
+        key name;
+
+        leaf name {
+          type string;
+        }
+        uses subnet-list;
+      }
+    }
+
+    container status {
+      config false;
+      list leases {
+        key address;
+      
+        leaf address {
+          type inet:ip-address;
+        }
+        leaf starts {
+          type yang:date-and-time;
+        }
+        leaf ends {
+          type yang:date-and-time;
+        }
+        container hardware {
+          leaf type {
+            type enumeration {
+              enum "ethernet";
+              enum "token-ring";
+              enum "fddi";
+            }
+          }
+          leaf address {
+            type yang:phys-address;
+          }
+        }
+      }
+    }
+  }
+
+  grouping subnet-list {
+    description "A reusable list of subnets";
+    list subnet {
+      key net;
+      leaf net {
+        type inet:ip-prefix;
+      }
+      container range {
+        presence "enables dynamic address assignment";
+        leaf dynamic-bootp {
+          type empty;
+          description 
+            "Allows BOOTP clients to get addresses in this range";
+        }
+        leaf low {
+          type inet:ip-address;
+          mandatory true;
+        }
+        leaf high {
+          type inet:ip-address;
+          mandatory true;
+        }
+      }
+      
+      container dhcp-options {
+        description "Options in the DHCP protocol";
+        leaf-list router {
+          type inet:host;
+          ordered-by user;
+          reference "RFC 2132, sec. 3.8";
+        }
+        leaf domain-name {
+          type inet:domain-name;
+          reference "RFC 2132, sec. 3.17";
+        }
+      }
+      
+      leaf max-lease-time {
+        type uint32;
+        units seconds;
+        default 7200;
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.editor/resources/HoverStyleSheet.css b/plugins/com.cisco.yangide.editor/resources/HoverStyleSheet.css
new file mode 100644 (file)
index 0000000..95022ae
--- /dev/null
@@ -0,0 +1,42 @@
+/* Font definitions */
+html         { font-family: sans-serif; font-size: 9pt; font-style: normal; font-weight: normal; }
+body, h1, h2, h3, h4, h5, h6, p, table, td, caption, th, ul, ol, dl, li, dd, dt { font-size: 1em; }
+pre          { font-family: monospace; }
+
+/* Margins */
+body        { overflow: auto; margin-top: 0px; margin-bottom: 0.5em; margin-left: 0.3em; margin-right: 0px; }
+h1           { margin-top: 0.3em; margin-bottom: 0.04em; }     
+h2           { margin-top: 2em; margin-bottom: 0.25em; }
+h3           { margin-top: 1.7em; margin-bottom: 0.25em; }
+h4           { margin-top: 2em; margin-bottom: 0.3em; }
+h5           { margin-top: 0px; margin-bottom: 0px; }
+p            { margin-top: 1em; margin-bottom: 1em; }
+pre          { margin-left: 0.6em; }
+ul              { margin-top: 0px; margin-bottom: 1em; margin-left: 1em; padding-left: 1em;}
+li              { margin-top: 0px; margin-bottom: 0px; } 
+li p        { margin-top: 0px; margin-bottom: 0px; } 
+ol              { margin-top: 0px; margin-bottom: 1em; margin-left: 1em; padding-left: 1em; }
+dl              { margin-top: 0px; margin-bottom: 1em; }
+dt              { margin-top: 0px; margin-bottom: 0px; font-weight: bold; }
+dd              { margin-top: 0px; margin-bottom: 0px; }
+
+/* Styles and colors */
+a:link      { color: #0000FF; }
+a:hover             { color: #000080; }
+a:visited    { text-decoration: underline; }
+a.header:link    { text-decoration: none; color: InfoText }
+a.header:visited { text-decoration: none; color: InfoText }
+a.header:hover   { text-decoration: underline; color: #000080; }
+h4           { font-style: italic; }
+strong      { font-weight: bold; }
+em              { font-style: italic; }
+var             { font-style: italic; }
+th              { font-weight: bold; }
+
+/* Workarounds for new Javadoc stylesheet (1.7) */ 
+ul.blockList li.blockList, ul.blockListLast li.blockList {
+    list-style:none;
+}
+ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast {
+    list-style:none;
+}
diff --git a/plugins/com.cisco.yangide.editor/schema/actionGroup.exsd b/plugins/com.cisco.yangide.editor/schema/actionGroup.exsd
new file mode 100644 (file)
index 0000000..32df1b2
--- /dev/null
@@ -0,0 +1,109 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="com.cisco.yangide.editor" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+      <appinfo>
+         <meta.schema plugin="com.cisco.yangide.editor" id="actionGroup" name="actionGroup"/>
+      </appinfo>
+      <documentation>
+         Additional Action Group for YANG Editor
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <annotation>
+         <appinfo>
+            <meta.element />
+         </appinfo>
+      </annotation>
+      <complexType>
+         <sequence>
+            <element ref="actionGroup"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appinfo>
+                  <meta.attribute translatable="true"/>
+               </appinfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="actionGroup">
+      <complexType>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appinfo>
+                  <meta.attribute kind="java" basedOn="org.eclipse.ui.actions.ActionGroup:com.cisco.yangide.editor.editors.IActionGroup"/>
+               </appinfo>
+            </annotation>
+         </attribute>
+         <attribute name="groupName" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appinfo>
+         <meta.section type="since"/>
+      </appinfo>
+      <documentation>
+         [Enter the first release in which this extension point appears.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appinfo>
+         <meta.section type="examples"/>
+      </appinfo>
+      <documentation>
+         [Enter extension point usage example here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appinfo>
+         <meta.section type="apiinfo"/>
+      </appinfo>
+      <documentation>
+         [Enter API information here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appinfo>
+         <meta.section type="implementation"/>
+      </appinfo>
+      <documentation>
+         [Enter information about supplied implementation of this extension point.]
+      </documentation>
+   </annotation>
+
+
+</schema>
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/EditorUtility.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/EditorUtility.java
new file mode 100644 (file)
index 0000000..657cacf
--- /dev/null
@@ -0,0 +1,221 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IStorage;
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.internal.ui.javaeditor.JarEntryEditorInput;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.ui.IEditorDescriptor;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.ui.part.FileEditorInput;
+
+import com.cisco.yangide.core.YangJarFileEntryResource;
+import com.cisco.yangide.core.indexing.ElementIndexInfo;
+import com.cisco.yangide.editor.editors.IYangEditor;
+import com.cisco.yangide.ui.YangUIPlugin;
+
+/**
+ * A number of routines for working with YangElements in editors. Use 'isOpenInEditor' to test if an
+ * element is already open in a editor Use 'openInEditor' to force opening an element in a editor
+ * With 'getWorkingCopy' you get the working copy (element in the editor) of an element
+ *
+ * @author Konstantin Zaitsev
+ * date: Jul 4, 2014
+ */
+@SuppressWarnings("restriction")
+public class EditorUtility {
+
+    /**
+     * Tests if a CU is currently shown in an editor
+     *
+     * @param inputElement the input element
+     * @return the IEditorPart if shown, null if element is not open in an editor
+     */
+    public static IEditorPart isOpenInEditor(Object inputElement) {
+        IEditorInput input = getEditorInput(inputElement);
+
+        if (input != null) {
+            IWorkbenchPage p = YangUIPlugin.getActivePage();
+            if (p != null) {
+                return p.findEditor(input);
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * Opens a Yang editor for an element such as <code>YangElement</code>, <code>IFile</code>, or
+     * <code>IStorage</code>. The editor is activated by default.
+     *
+     * @param inputElement the input element
+     * @return an open editor or <code>null</code> if an external editor was opened
+     * @throws PartInitException if the editor could not be opened or the input element is not
+     * valid.
+     */
+    public static IEditorPart openInEditor(Object inputElement) throws PartInitException {
+        return openInEditor(inputElement, true);
+    }
+
+    /**
+     * Opens the editor currently associated with the given element (YangElement, IFile,
+     * IStorage...)
+     *
+     * @param inputElement the input element
+     * @param activate <code>true</code> if the editor should be activated
+     * @return an open editor or <code>null</code> if an external editor was opened
+     * @throws PartInitException if the editor could not be opened or the input element is not valid
+     */
+    public static IEditorPart openInEditor(Object inputElement, boolean activate) throws PartInitException {
+
+        if (inputElement instanceof IFile) {
+            return openInEditor((IFile) inputElement, activate);
+        }
+
+        IEditorInput input = getEditorInput(inputElement);
+        if (input == null) {
+            throwPartInitException("No editor input");
+        }
+        return openInEditor(input, getEditorID(input), activate);
+    }
+
+    /**
+     * Selects and reveals the given region in the given editor part.
+     *
+     * @param part the editor part
+     * @param region the region
+     */
+    public static void revealInEditor(IEditorPart part, IRegion region) {
+        if (part != null && region != null) {
+            revealInEditor(part, region.getOffset(), region.getLength());
+        }
+    }
+
+    /**
+     * Selects and reveals the given offset and length in the given editor part.
+     *
+     * @param editor the editor part
+     * @param offset the offset
+     * @param length the length
+     */
+    public static void revealInEditor(IEditorPart editor, final int offset, final int length) {
+        if (editor instanceof IYangEditor) {
+            ((IYangEditor) editor).selectAndReveal(offset, length);
+            return;
+        }
+
+        if (editor != null && editor.getEditorSite().getSelectionProvider() != null) {
+            IEditorSite site = editor.getEditorSite();
+            if (site == null) {
+                return;
+            }
+
+            ISelectionProvider provider = editor.getEditorSite().getSelectionProvider();
+            if (provider == null) {
+                return;
+            }
+
+            provider.setSelection(new TextSelection(offset, length));
+        }
+    }
+
+    public static void openInEditor(ElementIndexInfo info) {
+        IStorage storage = null;
+        if (info.getEntry() != null && info.getEntry().length() > 0) {
+            IProject project = YangUIPlugin.getWorkspace().getRoot().getProject(info.getProject());
+            storage = new YangJarFileEntryResource(JavaCore.create(project), new Path(info.getPath()), info.getEntry());
+        } else {
+            storage = YangUIPlugin.getWorkspace().getRoot().getFile(new Path(info.getPath()));
+        }
+        IEditorPart editor = isOpenInEditor(storage);
+        if (editor == null) {
+            try {
+                editor = openInEditor(storage, true);
+            } catch (PartInitException e) {
+                YangUIPlugin.log(e);
+            }
+        }
+        YangUIPlugin.getActivePage().activate(editor);
+        revealInEditor(editor, info.getStartPosition(), info.getLength());
+    }
+
+    private static IEditorPart openInEditor(IFile file, boolean activate) throws PartInitException {
+        if (file == null) {
+            throwPartInitException("File must not be null");
+        }
+
+        IWorkbenchPage p = YangUIPlugin.getActivePage();
+        if (p == null) {
+            throwPartInitException("No active workbench page");
+        }
+
+        IEditorPart editorPart = IDE.openEditor(p, file, activate);
+        return editorPart;
+    }
+
+    private static IEditorPart openInEditor(IEditorInput input, String editorID, boolean activate)
+            throws PartInitException {
+        Assert.isNotNull(input);
+        Assert.isNotNull(editorID);
+
+        IWorkbenchPage p = YangUIPlugin.getActivePage();
+        if (p == null) {
+            throwPartInitException("No active workbench");
+        }
+
+        return p.openEditor(input, editorID, activate);
+    }
+
+    private static void throwPartInitException(String message, int code) throws PartInitException {
+        IStatus status = new Status(IStatus.ERROR, YangUIPlugin.PLUGIN_ID, code, message, null);
+        throw new PartInitException(status);
+    }
+
+    private static void throwPartInitException(String message) throws PartInitException {
+        throwPartInitException(message, IStatus.OK);
+    }
+
+    public static String getEditorID(IEditorInput input) throws PartInitException {
+        Assert.isNotNull(input);
+        IEditorDescriptor editorDescriptor;
+        if (input instanceof IFileEditorInput) {
+            editorDescriptor = IDE.getEditorDescriptor(((IFileEditorInput) input).getFile());
+        } else {
+            editorDescriptor = IDE.getEditorDescriptor(input.getName());
+        }
+        return editorDescriptor.getId();
+    }
+
+    public static IEditorInput getEditorInput(Object input) {
+
+        if (input instanceof IFile) {
+            return new FileEditorInput((IFile) input);
+        }
+
+        if (input instanceof IStorage) {
+            return new JarEntryEditorInput((IStorage) input);
+        }
+
+        return null;
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/YangEditorPlugin.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/YangEditorPlugin.java
new file mode 100644 (file)
index 0000000..4a6384b
--- /dev/null
@@ -0,0 +1,173 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.editors.text.EditorsUI;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.ui.texteditor.ChainedPreferenceStore;
+import org.osgi.framework.BundleContext;
+
+import com.cisco.yangide.ui.YangUIPlugin;
+
+/**
+ * The activator class controls the plug-in life cycle
+ *
+ * @author Alexey Kholupko
+ */
+public class YangEditorPlugin extends AbstractUIPlugin {
+
+    // The plug-in ID
+    public static final String PLUGIN_ID = "com.cisco.yangide.editor"; //$NON-NLS-1$
+
+    // The shared instance
+    private static YangEditorPlugin plugin;
+
+    /**
+     * The combined preference store.
+     */
+    private IPreferenceStore fCombinedPreferenceStore;
+
+    /**
+     * The constructor
+     */
+    public YangEditorPlugin() {
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+     */
+    @Override
+    public void start(BundleContext context) throws Exception {
+        super.start(context);
+        plugin = this;
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+     */
+    @Override
+    public void stop(BundleContext context) throws Exception {
+        plugin = null;
+        super.stop(context);
+    }
+
+    /**
+     * Returns the shared instance
+     *
+     * @return the shared instance
+     */
+    public static YangEditorPlugin getDefault() {
+        return plugin;
+    }
+
+    /**
+     * Returns an image descriptor for the image file at the given plug-in relative path
+     *
+     * @param path the path
+     * @return the image descriptor
+     */
+    public static ImageDescriptor getImageDescriptor(String path) {
+        return imageDescriptorFromPlugin(PLUGIN_ID, path);
+    }
+
+    /**
+     * Logs the specified throwable as an error with this plug-in's log.
+     *
+     * @param t throwable to log
+     */
+    public static void log(Throwable t) {
+        logError("Error logged from YANG Editor: ", t); //$NON-NLS-1$
+    }
+
+    /**
+     * Logs the specified throwable as an error with this plug-in's log, using the provided message.
+     *
+     * @param msg  a message that describes the error
+     * @param t throwable to log
+     */
+    public static void logError(String msg, Throwable t) {
+        log(new Status(IStatus.ERROR, PLUGIN_ID, 500, msg, t)); 
+    }
+
+    /**
+     * Logs the specified throwable as a warning with this plug-in's log, using the provided message.
+     *
+     * @param msg  a message that describes the error
+     * @param t throwable to log
+     */
+    public static void logWarning(String msg, Throwable t) {
+        log(new Status(IStatus.WARNING, PLUGIN_ID, 500, msg, t)); 
+    }
+
+    /**
+     * Logs the specified status with this plug-in's log.
+     */
+    public static void log(IStatus status) {
+        getDefault().getLog().log(status);
+    }
+
+    private IWorkbenchPage internalGetActivePage() {
+        IWorkbenchWindow window = getWorkbench().getActiveWorkbenchWindow();
+        if (window == null) {
+            return null;
+        }
+        return window.getActivePage();
+    }
+
+    public static IWorkbenchPage getActivePage() {
+        return getDefault().internalGetActivePage();
+    }
+
+    /**
+     * Returns a combined preference store, this store is read-only.
+     *
+     * @return the combined preference store
+     */
+    public IPreferenceStore getCombinedPreferenceStore() {
+        if (fCombinedPreferenceStore == null) {
+            IPreferenceStore generalTextStore = EditorsUI.getPreferenceStore();
+            fCombinedPreferenceStore = new ChainedPreferenceStore(new IPreferenceStore[] {
+                    YangUIPlugin.getDefault().getPreferenceStore(), generalTextStore });
+        }
+        return fCombinedPreferenceStore;
+    }
+
+    /**
+     * @param path path to file relative to this bundle.
+     * @return string content of the bundle file
+     */
+    public String getBundleFileContent(String path) {
+        try (InputStreamReader in = new InputStreamReader(FileLocator.openStream(getBundle(), new Path(path), false),
+                "UTF-8")) {
+            StringBuilder sb = new StringBuilder();
+            char[] cbuf = new char[1024];
+            int len = 0;
+            while ((len = in.read(cbuf)) > 0) {
+                sb.append(cbuf, 0, len);
+            }
+            return sb.toString();
+        } catch (IOException e) {
+            return null;
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/actions/AddBlockCommentAction.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/actions/AddBlockCommentAction.java
new file mode 100644 (file)
index 0000000..888209e
--- /dev/null
@@ -0,0 +1,185 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.actions;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.ResourceBundle;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.BadPartitioningException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IDocumentExtension3;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+import com.cisco.yangide.editor.editors.YangPartitionScanner;
+import com.cisco.yangide.editor.preferences.YangDocumentSetupParticipant;
+
+/**
+ * Action that encloses the editor's current selection with Yang block comment terminators (
+ * <code>&#47;&#42;</code> and <code>&#42;&#47;</code>).
+ *
+ * @author Alexey Kholupko
+ */
+public class AddBlockCommentAction extends BlockCommentAction {
+
+    /**
+     * Creates a new instance.
+     *
+     * @param bundle the resource bundle
+     * @param prefix a prefix to be prepended to the various resource keys (described in
+     * <code>ResourceAction</code> constructor), or <code>null</code> if none
+     * @param editor the text editor
+     */
+    public AddBlockCommentAction(ResourceBundle bundle, String prefix, ITextEditor editor) {
+        super(bundle, prefix, editor);
+    }
+
+    /*
+     * @see com.cisco.yangide.editor.actions.BlockCommentAction#runInternal(org.eclipse.jface.text.
+     * ITextSelection, org.eclipse.jface.text.IDocumentExtension3,
+     * com.cisco.yangide.editor.actions.BlockCommentAction.Edit.EditFactory)
+     */
+    @Override
+    protected void runInternal(ITextSelection selection, IDocumentExtension3 docExtension, Edit.EditFactory factory)
+            throws BadLocationException, BadPartitioningException {
+        int selectionOffset = selection.getOffset();
+        int selectionEndOffset = selectionOffset + selection.getLength();
+        List<Edit> edits = new LinkedList<Edit>();
+        ITypedRegion partition = docExtension.getPartition(YangDocumentSetupParticipant.YANG_PARTITIONING,
+                selectionOffset, false);
+
+        handleFirstPartition(partition, edits, factory, selectionOffset);
+
+        while (partition.getOffset() + partition.getLength() < selectionEndOffset) {
+            partition = handleInteriorPartition(partition, edits, factory, docExtension);
+        }
+
+        handleLastPartition(partition, edits, factory, selectionEndOffset);
+
+        executeEdits(edits);
+    }
+
+    /**
+     * Handle the partition under the start offset of the selection.
+     *
+     * @param partition the partition under the start of the selection
+     * @param edits the list of edits to later execute
+     * @param factory the factory for edits
+     * @param offset the start of the selection, which must lie inside <code>partition</code>
+     */
+    private void handleFirstPartition(ITypedRegion partition, List<Edit> edits, Edit.EditFactory factory, int offset)
+            throws BadLocationException {
+
+        int partOffset = partition.getOffset();
+        String partType = partition.getType();
+
+        Assert.isTrue(partOffset <= offset, "illegal partition"); //$NON-NLS-1$
+
+        // first partition: mark start of comment
+        if (partType == IDocument.DEFAULT_CONTENT_TYPE) {
+            // Java code: right where selection starts
+            edits.add(factory.createEdit(offset, 0, getCommentStart()));
+        } else if (isSpecialPartition(partType)) {
+            // special types: include the entire partition
+            edits.add(factory.createEdit(partOffset, 0, getCommentStart()));
+        } // javadoc: no mark, will only start after comment
+
+    }
+
+    /**
+     * Handles partition boundaries within the selection. The end of the current partition and the
+     * start of the next partition are examined for whether they contain comment tokens that
+     * interfere with the created comment. Comment tokens are removed from interior multi-line
+     * comments.
+     *
+     * @param partition the current partition
+     * @param edits the list of edits to add to
+     * @param factory the edit factory
+     * @param docExtension the document to get the partitions from
+     * @return the next partition after the current
+     */
+    private ITypedRegion handleInteriorPartition(ITypedRegion partition, List<Edit> edits, Edit.EditFactory factory,
+            IDocumentExtension3 docExtension) throws BadPartitioningException, BadLocationException {
+
+        // end of previous partition
+        String partType = partition.getType();
+        int partEndOffset = partition.getOffset() + partition.getLength();
+        int tokenLength = getCommentStart().length();
+
+        if (partType == YangPartitionScanner.YANG_COMMENT) {
+
+            // already in a comment - remove ending mark
+            edits.add(factory.createEdit(partEndOffset - tokenLength, tokenLength, "")); //$NON-NLS-1$
+
+        }
+
+        // advance to next partition
+        partition = docExtension.getPartition(YangDocumentSetupParticipant.YANG_PARTITIONING, partEndOffset, false);
+        partType = partition.getType();
+
+        // start of next partition
+        if (partType == YangPartitionScanner.YANG_COMMENT) {
+            // already in a comment - remove startToken
+            edits.add(factory.createEdit(partition.getOffset(), getCommentStart().length(), "")); //$NON-NLS-1$
+
+        }
+
+        return partition;
+    }
+
+    /**
+     * Handles the partition under the end of the selection. For normal java code, the comment end
+     * token is inserted at the selection end; if the selection ends inside a special (i.e. string,
+     * character, line comment) partition, the entire partition is included inside the comment.
+     *
+     * @param partition the partition under the selection end offset
+     * @param edits the list of edits to add to
+     * @param factory the edit factory
+     * @param endOffset the end offset of the selection
+     */
+    private void handleLastPartition(ITypedRegion partition, List<Edit> edits, Edit.EditFactory factory, int endOffset)
+            throws BadLocationException {
+
+        String partType = partition.getType();
+
+        if (partType == IDocument.DEFAULT_CONTENT_TYPE) {
+            // normal yang: end comment where selection ends
+            edits.add(factory.createEdit(endOffset, 0, getCommentEnd()));
+        } else if (isSpecialPartition(partType)) {
+            // special types: consume entire partition
+            edits.add(factory.createEdit(partition.getOffset() + partition.getLength(), 0, getCommentEnd()));
+        }
+
+    }
+
+    /**
+     * Returns whether <code>partType</code> is special, i.e. a YANG <code>String</code> or
+     * <code>Line End Comment</code> partition.
+     *
+     * @param partType the partition type to check
+     * @return <code>true</code> if <code>partType</code> is special, <code>false</code> otherwise
+     */
+    private boolean isSpecialPartition(String partType) {
+        return partType == YangPartitionScanner.YANG_STRING || partType == YangPartitionScanner.YANG_STRING_SQ;
+    }
+
+    /*
+     * @see
+     * com.cisco.yangide.editor.actions.BlockCommentAction#validSelection(org.eclipse.jface.text
+     * .ITextSelection)
+     */
+    @Override
+    protected boolean isValidSelection(ITextSelection selection) {
+        return selection != null && !selection.isEmpty() && selection.getLength() > 0;
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/actions/BlockCommentAction.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/actions/BlockCommentAction.java
new file mode 100644 (file)
index 0000000..9ebd800
--- /dev/null
@@ -0,0 +1,316 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.actions;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.ResourceBundle;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.BadPartitioningException;
+import org.eclipse.jface.text.BadPositionCategoryException;
+import org.eclipse.jface.text.DefaultPositionUpdater;
+import org.eclipse.jface.text.DocumentEvent;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IDocumentExtension3;
+import org.eclipse.jface.text.IPositionUpdater;
+import org.eclipse.jface.text.IRewriteTarget;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.texteditor.IDocumentProvider;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.ITextEditorExtension2;
+import org.eclipse.ui.texteditor.TextEditorAction;
+
+/**
+ * Common block comment code.
+ *
+ * @author Alexey Kholupko
+ */
+public abstract class BlockCommentAction extends TextEditorAction {
+
+    /**
+     * Creates a new instance.
+     *
+     * @param bundle
+     * @param prefix
+     * @param editor
+     */
+    public BlockCommentAction(ResourceBundle bundle, String prefix, ITextEditor editor) {
+        super(bundle, prefix, editor);
+    }
+
+    /**
+     * An edit is a kind of <code>DocumentEvent</code>, an edit instruction, that is affiliated with
+     * a position on a document.
+     */
+    static class Edit extends DocumentEvent {
+
+        /**
+         * Factory for edits which manages the creation, installation and destruction of position
+         * categories, position updaters etc. on a certain document.
+         */
+        public static class EditFactory {
+
+            /** The position category basename for this edits. */
+            private static final String CATEGORY = "__positionalEditPositionCategory"; //$NON-NLS-1$
+
+            /** The count of factories. */
+            private static int fgCount = 0;
+
+            /** This factory's category. */
+            private final String fCategory;
+            private IDocument fDocument;
+            private IPositionUpdater fUpdater;
+
+            /**
+             * Creates a new <code>EditFactory</code> with an unambiguous position category name.
+             *
+             * @param document the document that is being edited.
+             */
+            public EditFactory(IDocument document) {
+                fCategory = CATEGORY + fgCount++;
+                fDocument = document;
+            }
+
+            /**
+             * Creates a new edition on the document of this factory.
+             *
+             * @param offset the offset of the edition at the point when is created.
+             * @param length the length of the edition (not updated via the position update
+             * mechanism)
+             * @param text the text to be replaced on the document
+             * @return an <code>Edit</code> reflecting the edition on the document
+             */
+            public Edit createEdit(int offset, int length, String text) throws BadLocationException {
+
+                if (!fDocument.containsPositionCategory(fCategory)) {
+                    fDocument.addPositionCategory(fCategory);
+                    fUpdater = new DefaultPositionUpdater(fCategory);
+                    fDocument.addPositionUpdater(fUpdater);
+                }
+
+                Position position = new Position(offset);
+                try {
+                    fDocument.addPosition(fCategory, position);
+                } catch (BadPositionCategoryException e) {
+                    Assert.isTrue(false);
+                }
+                return new Edit(fDocument, length, text, position);
+            }
+
+            /**
+             * Releases the position category on the document and uninstalls the position updater.
+             * <code>Edit</code>s managed by this factory are not updated after this call.
+             */
+            public void release() {
+                if (fDocument != null && fDocument.containsPositionCategory(fCategory)) {
+                    fDocument.removePositionUpdater(fUpdater);
+                    try {
+                        fDocument.removePositionCategory(fCategory);
+                    } catch (BadPositionCategoryException e) {
+                        Assert.isTrue(false);
+                    }
+                    fDocument = null;
+                    fUpdater = null;
+                }
+            }
+        }
+
+        /** The position in the document where this edit be executed. */
+        private Position fPosition;
+
+        /**
+         * Creates a new edition on <code>document</code>, taking its offset from
+         * <code>position</code>.
+         *
+         * @param document the document being edited
+         * @param length the length of the edition
+         * @param text the replacement text of the edition
+         * @param position the position keeping the edition's offset
+         */
+        protected Edit(IDocument document, int length, String text, Position position) {
+            super(document, 0, length, text);
+            fPosition = position;
+        }
+
+        /*
+         * @see org.eclipse.jface.text.DocumentEvent#getOffset()
+         */
+        @Override
+        public int getOffset() {
+            return fPosition.getOffset();
+        }
+
+        /**
+         * Executes the edition on document. The offset is taken from the position.
+         *
+         * @throws BadLocationException if the execution of the document fails.
+         */
+        public void perform() throws BadLocationException {
+            getDocument().replace(getOffset(), getLength(), getText());
+        }
+
+    }
+
+    @Override
+    public void run() {
+        if (!isEnabled())
+            return;
+
+        ITextEditor editor = getTextEditor();
+        if (editor == null || !ensureEditable(editor))
+            return;
+
+        ITextSelection selection = getCurrentSelection();
+        if (!isValidSelection(selection))
+            return;
+
+        if (!validateEditorInputState())
+            return;
+
+        IDocumentProvider docProvider = editor.getDocumentProvider();
+        IEditorInput input = editor.getEditorInput();
+        if (docProvider == null || input == null)
+            return;
+
+        IDocument document = docProvider.getDocument(input);
+        if (document == null)
+            return;
+
+        IDocumentExtension3 docExtension;
+        if (document instanceof IDocumentExtension3)
+            docExtension = (IDocumentExtension3) document;
+        else
+            return;
+
+        IRewriteTarget target = (IRewriteTarget) editor.getAdapter(IRewriteTarget.class);
+        if (target != null) {
+            target.beginCompoundChange();
+        }
+
+        Edit.EditFactory factory = new Edit.EditFactory(document);
+
+        try {
+            runInternal(selection, docExtension, factory);
+
+        } catch (BadLocationException e) {
+            // can happen on concurrent modification, deletion etc. of the document
+            // -> don't complain, just bail out
+        } catch (BadPartitioningException e) {
+            // should not happen
+            Assert.isTrue(false, "bad partitioning"); //$NON-NLS-1$
+        } finally {
+            factory.release();
+
+            if (target != null) {
+                target.endCompoundChange();
+            }
+        }
+    }
+
+    /**
+     * Calls <code>perform</code> on all <code>Edit</code>s in <code>edits</code>.
+     *
+     * @param edits a list of <code>Edit</code>s
+     * @throws BadLocationException if an <code>Edit</code> threw such an exception.
+     */
+    protected void executeEdits(List<Edit> edits) throws BadLocationException {
+        for (Iterator<Edit> it = edits.iterator(); it.hasNext();) {
+            Edit edit = it.next();
+            edit.perform();
+        }
+    }
+
+    /**
+     * Ensures that the editor is modifyable.
+     */
+    protected boolean ensureEditable(ITextEditor editor) {
+        Assert.isNotNull(editor);
+
+        if (editor instanceof ITextEditorExtension2) {
+            ITextEditorExtension2 ext = (ITextEditorExtension2) editor;
+            return ext.validateEditorInputState();
+        }
+
+        return editor.isEditable();
+    }
+
+    /*
+     * @see org.eclipse.ui.texteditor.IUpdate#update()
+     */
+    @Override
+    public void update() {
+        super.update();
+
+        if (isEnabled()) {
+            if (!canModifyEditor() || !isValidSelection(getCurrentSelection()))
+                setEnabled(false);
+        }
+    }
+
+    /**
+     * Returns the editor's selection, or <code>null</code> if no selection can be obtained or the
+     * editor is <code>null</code>.
+     *
+     * @return the selection of the action's editor, or <code>null</code>
+     */
+    protected ITextSelection getCurrentSelection() {
+        ITextEditor editor = getTextEditor();
+        if (editor != null) {
+            ISelectionProvider provider = editor.getSelectionProvider();
+            if (provider != null) {
+                ISelection selection = provider.getSelection();
+                if (selection instanceof ITextSelection)
+                    return (ITextSelection) selection;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Runs the real command once all the editor, document, and selection checks have succeeded.
+     *
+     * @param selection the current selection we are being called for
+     * @param docExtension the document extension where we get the partitioning from
+     * @param factory the edit factory we can use to create <code>Edit</code>s
+     * @throws BadLocationException if an edition fails
+     * @throws BadPartitioningException if a partitioning call fails
+     */
+    protected abstract void runInternal(ITextSelection selection, IDocumentExtension3 docExtension,
+            Edit.EditFactory factory) throws BadLocationException, BadPartitioningException;
+
+    /**
+     * Checks whether <code>selection</code> is valid.
+     *
+     * @param selection the selection to check
+     * @return <code>true</code> if the selection is valid, <code>false</code> otherwise
+     */
+    protected abstract boolean isValidSelection(ITextSelection selection);
+
+    /**
+     * @return the text to be inserted at the selection start
+     */
+    protected String getCommentStart() {
+        // for now: no space story
+        return "/*"; //$NON-NLS-1$
+    }
+
+    /**
+     * @return the text to be inserted at the selection end
+     */
+    protected String getCommentEnd() {
+        // for now: no space story
+        return "*/"; //$NON-NLS-1$
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/actions/IYangEditorActionDefinitionIds.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/actions/IYangEditorActionDefinitionIds.java
new file mode 100644 (file)
index 0000000..72878d3
--- /dev/null
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.actions;
+
+/**
+ * @author Alexey Kholupko
+ */
+public interface IYangEditorActionDefinitionIds {
+    /**
+     * Action definition ID of the source -> toggle comment action (value
+     * <code>"com.cisco.yangide.actions.toggle.comment"</code>).
+     */
+    public static final String TOGGLE_COMMENT = "com.cisco.yangide.actions.toggle.comment"; //$NON-NLS-1$
+
+    /**
+     * Action definition ID of the source -> add block comment action (value
+     * <code>"com.cisco.yangide.actions.add.block.comment"</code>).
+     */
+    public static final String ADD_BLOCK_COMMENT = "com.cisco.yangide.actions.add.block.comment"; //$NON-NLS-1$
+
+    /**
+     * Action definition ID of the source -> remove block comment action (value
+     * <code>"com.cisco.yangide.actions.remove.block.comment"</code>).
+     */
+    public static final String REMOVE_BLOCK_COMMENT = "com.cisco.yangide.actions.remove.block.comment"; //$NON-NLS-1$
+
+    /**
+     * Action definition ID of the source -> format action (value
+     * <code>"com.cisco.yangide.actions.format"</code>).
+     */
+    public static final String FORMAT = "com.cisco.yangide.actions.format"; //$NON-NLS-1$
+
+    /**
+     * Action definition ID of the open declration action (value
+     * <code>"com.cisco.yangide.navigate.open.declaration"</code>).
+     */
+    public static final String OPEN_DECLARATION = "com.cisco.yangide.navigate.open.declaration"; //$NON-NLS-1$
+
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/actions/OpenDeclarationAction.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/actions/OpenDeclarationAction.java
new file mode 100644 (file)
index 0000000..91c251a
--- /dev/null
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.actions;
+
+import java.util.ResourceBundle;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.TextEditorAction;
+
+import com.cisco.yangide.core.dom.ASTNode;
+import com.cisco.yangide.core.dom.BaseReference;
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.core.dom.ModuleImport;
+import com.cisco.yangide.core.dom.QName;
+import com.cisco.yangide.core.dom.TypeReference;
+import com.cisco.yangide.core.dom.UsesNode;
+import com.cisco.yangide.core.indexing.ElementIndexInfo;
+import com.cisco.yangide.core.indexing.ElementIndexType;
+import com.cisco.yangide.core.model.YangModelManager;
+import com.cisco.yangide.core.parser.YangParserUtil;
+import com.cisco.yangide.editor.EditorUtility;
+import com.cisco.yangide.editor.editors.YangEditor;
+import com.cisco.yangide.ui.YangUIPlugin;
+
+/**
+ * Open type declaration.
+ *
+ * @author Konstantin Zaitsev
+ * date: Jul 4, 2014
+ */
+public class OpenDeclarationAction extends TextEditorAction {
+
+    public OpenDeclarationAction(ResourceBundle bundle, String prefix, ITextEditor editor) {
+        super(bundle, prefix, editor);
+    }
+
+    @Override
+    public void run() {
+        YangEditor editor = (YangEditor) getTextEditor();
+
+        try {
+            ISelection selection = editor.getSelectionProvider().getSelection();
+            Module module = YangParserUtil.parseYangFile(editor.getDocument().get().toCharArray());
+            ASTNode node = module.getNodeAtPosition(((ITextSelection) selection).getOffset());
+            IEditorInput    editorInput = editor.getEditorInput();
+
+            // Determine the current project so definitions from the current project or dependent projects, are preferred.
+            IProject    project = null;
+            if (editorInput instanceof FileEditorInput) {
+                if (((FileEditorInput) editorInput).getFile() != null)
+                    project = ((FileEditorInput) editorInput).getFile().getProject();
+            }
+            else {
+                YangUIPlugin.log(IStatus.WARNING,
+                                 "Could not determine project, because editorInput not FileEditorInput, but \"" + editorInput.getClass().getName() + "\".");
+            }
+            
+            ElementIndexInfo[] searchResult = null;
+
+            if (node instanceof ModuleImport) {
+                ModuleImport importNode = (ModuleImport) node;
+                searchResult = YangModelManager.search(null, importNode.getRevision(), importNode.getName(),
+                        ElementIndexType.MODULE, project, null);
+            } else if (node instanceof TypeReference) {
+                TypeReference ref = (TypeReference) node;
+                QName type = ref.getType();
+                searchResult = YangModelManager.search(type.getModule(), type.getRevision(), type.getName(),
+                        ElementIndexType.TYPE, project, null);
+                if (searchResult.length == 0) {
+                    searchResult = YangModelManager.search(type.getModule(), type.getRevision(), type.getName(),
+                            ElementIndexType.IDENTITY, project, null);
+                }
+            } else if (node instanceof UsesNode) {
+                UsesNode usesNode = (UsesNode) node;
+                QName ref = usesNode.getGrouping();
+                searchResult = YangModelManager.search(ref.getModule(), ref.getRevision(), ref.getName(),
+                        ElementIndexType.GROUPING, project, null);
+            } else if (node instanceof BaseReference) {
+                BaseReference base = (BaseReference) node;
+                QName ref = base.getType();
+                searchResult = YangModelManager.search(ref.getModule(), ref.getRevision(), ref.getName(),
+                        ElementIndexType.IDENTITY, project, null);
+            }
+
+            if (searchResult != null && searchResult.length > 0) {
+                EditorUtility.openInEditor(searchResult[0]);
+            }
+        } catch (Exception e) {
+            YangUIPlugin.log(e);
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/actions/RemoveBlockCommentAction.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/actions/RemoveBlockCommentAction.java
new file mode 100644 (file)
index 0000000..21ac5a5
--- /dev/null
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.actions;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.ResourceBundle;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.BadPartitioningException;
+import org.eclipse.jface.text.IDocumentExtension3;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+import com.cisco.yangide.editor.editors.YangPartitionScanner;
+import com.cisco.yangide.editor.preferences.YangDocumentSetupParticipant;
+
+/**
+ * Action that removes the enclosing comment marks from a YANG block comment.
+ *
+ * @author Alexey Kholupko
+ */
+public class RemoveBlockCommentAction extends BlockCommentAction {
+
+    /**
+     * Creates a new instance.
+     *
+     * @param bundle the resource bundle
+     * @param prefix a prefix to be prepended to the various resource keys (described in
+     * <code>ResourceAction</code> constructor), or <code>null</code> if none
+     * @param editor the text editor
+     */
+    public RemoveBlockCommentAction(ResourceBundle bundle, String prefix, ITextEditor editor) {
+        super(bundle, prefix, editor);
+    }
+
+    /*
+     * @see
+     * com.cisco.yangide.editor.actions.AddBlockCommentAction#runInternal(org.eclipse.jface.text
+     * .ITextSelection, org.eclipse.jface.text.IDocumentExtension3,
+     * org.eclipse.jdt.internal.ui.actions.AddBlockCommentAction.Edit.EditFactory)
+     */
+    @Override
+    protected void runInternal(ITextSelection selection, IDocumentExtension3 docExtension, Edit.EditFactory factory)
+            throws BadPartitioningException, BadLocationException {
+        List<Edit> edits = new LinkedList<Edit>();
+        int tokenLength = getCommentStart().length();
+
+        int offset = selection.getOffset();
+        int endOffset = offset + selection.getLength();
+
+        ITypedRegion partition = docExtension.getPartition(YangDocumentSetupParticipant.YANG_PARTITIONING, offset,
+                false);
+        int partOffset = partition.getOffset();
+        int partEndOffset = partOffset + partition.getLength();
+
+        while (partEndOffset < endOffset) {
+
+            if (partition.getType() == YangPartitionScanner.YANG_COMMENT) {
+                edits.add(factory.createEdit(partOffset, tokenLength, "")); //$NON-NLS-1$
+                edits.add(factory.createEdit(partEndOffset - tokenLength, tokenLength, "")); //$NON-NLS-1$
+            }
+
+            partition = docExtension.getPartition(YangDocumentSetupParticipant.YANG_PARTITIONING, partEndOffset, false);
+            partOffset = partition.getOffset();
+            partEndOffset = partOffset + partition.getLength();
+        }
+
+        if (partition.getType() == YangPartitionScanner.YANG_COMMENT) {
+            edits.add(factory.createEdit(partOffset, tokenLength, "")); //$NON-NLS-1$
+            edits.add(factory.createEdit(partEndOffset - tokenLength, tokenLength, "")); //$NON-NLS-1$
+        }
+
+        executeEdits(edits);
+    }
+
+    /*
+     * @see
+     * com.cisco.yangide.editor.actions.AddBlockCommentAction#validSelection(org.eclipse.jface.text
+     * .ITextSelection)
+     */
+    @Override
+    protected boolean isValidSelection(ITextSelection selection) {
+        return selection != null && !selection.isEmpty();
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/actions/ToggleCommentAction.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/actions/ToggleCommentAction.java
new file mode 100644 (file)
index 0000000..a85d4c3
--- /dev/null
@@ -0,0 +1,322 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.actions;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.ResourceBundle;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextOperationTarget;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.TextUtilities;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.SourceViewerConfiguration;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.ResourceAction;
+import org.eclipse.ui.texteditor.TextEditorAction;
+
+import com.cisco.yangide.editor.YangEditorPlugin;
+import com.cisco.yangide.editor.editors.YangEditorMessages;
+
+/**
+ * An action which toggles comment prefixes on the selected lines.
+ *
+ * @author Alexey Kholupko
+ */
+public final class ToggleCommentAction extends TextEditorAction {
+
+    /** The text operation target */
+    private ITextOperationTarget fOperationTarget;
+    /** The document partitioning */
+    private String fDocumentPartitioning;
+    /** The comment prefixes */
+    private Map<String, String[]> fPrefixesMap;
+
+    /**
+     * Creates and initializes the action for the given text editor. The action configures its
+     * visual representation from the given resource bundle.
+     *
+     * @param bundle the resource bundle
+     * @param prefix a prefix to be prepended to the various resource keys, or <code>null</code> if
+     * none
+     * @param editor the text editor
+     * @see ResourceAction#ResourceAction(ResourceBundle, String, int)
+     */
+    public ToggleCommentAction(ResourceBundle bundle, String prefix, ITextEditor editor) {
+        super(bundle, prefix, editor);
+    }
+
+    /**
+     * Checks if the selected lines are all commented or not and uncomments/comments them
+     * respectively.
+     */
+    @Override
+    public void run() {
+        if (fOperationTarget == null || fDocumentPartitioning == null || fPrefixesMap == null)
+            return;
+
+        ITextEditor editor = getTextEditor();
+        if (editor == null)
+            return;
+
+        if (!validateEditorInputState())
+            return;
+
+        final int operationCode;
+        if (isSelectionCommented(editor.getSelectionProvider().getSelection()))
+            operationCode = ITextOperationTarget.STRIP_PREFIX;
+        else
+            operationCode = ITextOperationTarget.PREFIX;
+
+        Shell shell = editor.getSite().getShell();
+        if (!fOperationTarget.canDoOperation(operationCode)) {
+            if (shell != null)
+                MessageDialog.openError(shell, YangEditorMessages.ToggleComment_error_title,
+                        YangEditorMessages.ToggleComment_error_message);
+            return;
+        }
+
+        Display display = null;
+        if (shell != null && !shell.isDisposed())
+            display = shell.getDisplay();
+
+        BusyIndicator.showWhile(display, new Runnable() {
+            public void run() {
+                fOperationTarget.doOperation(operationCode);
+            }
+        });
+    }
+
+    /**
+     * Is the given selection single-line commented
+     */
+    private boolean isSelectionCommented(ISelection selection) {
+        if (!(selection instanceof ITextSelection))
+            return false;
+
+        ITextSelection textSelection = (ITextSelection) selection;
+        if (textSelection.getStartLine() < 0 || textSelection.getEndLine() < 0)
+            return false;
+
+        IDocument document = getTextEditor().getDocumentProvider().getDocument(getTextEditor().getEditorInput());
+
+        try {
+
+            IRegion block = getTextBlockFromSelection(textSelection, document);
+            ITypedRegion[] regions = TextUtilities.computePartitioning(document, fDocumentPartitioning,
+                    block.getOffset(), block.getLength(), false);
+
+            int[] lines = new int[regions.length * 2]; // [startline, endline, startline, endline,
+                                                       // ...]
+            for (int i = 0, j = 0; i < regions.length; i++, j += 2) {
+                // start line of region
+                lines[j] = getFirstCompleteLineOfRegion(regions[i], document);
+                // end line of region
+                int length = regions[i].getLength();
+                int offset = regions[i].getOffset() + length;
+                if (length > 0)
+                    offset--;
+                lines[j + 1] = (lines[j] == -1 ? -1 : document.getLineOfOffset(offset));
+            }
+
+            // Perform the check
+            for (int i = 0, j = 0; i < regions.length; i++, j += 2) {
+                String[] prefixes = fPrefixesMap.get(regions[i].getType());
+                if (prefixes != null && prefixes.length > 0 && lines[j] >= 0 && lines[j + 1] >= 0)
+                    if (!isBlockCommented(lines[j], lines[j + 1], prefixes, document))
+                        return false;
+            }
+
+            return true;
+
+        } catch (BadLocationException x) {
+            // should not happen
+            YangEditorPlugin.log(x);
+        }
+
+        return false;
+    }
+
+    /**
+     * Creates a region describing the text block (something that starts at the beginning of a line)
+     * completely containing the current selection.
+     */
+    private IRegion getTextBlockFromSelection(ITextSelection selection, IDocument document) {
+
+        try {
+            IRegion line = document.getLineInformationOfOffset(selection.getOffset());
+            int length = selection.getLength() == 0 ? line.getLength() : selection.getLength()
+                    + (selection.getOffset() - line.getOffset());
+            return new Region(line.getOffset(), length);
+
+        } catch (BadLocationException x) {
+            // should not happen
+            YangEditorPlugin.log(x);
+        }
+
+        return null;
+    }
+
+    /**
+     * Returns the index of the first line whose start offset is in the given text range.
+     */
+    private int getFirstCompleteLineOfRegion(IRegion region, IDocument document) {
+
+        try {
+
+            final int startLine = document.getLineOfOffset(region.getOffset());
+
+            int offset = document.getLineOffset(startLine);
+            if (offset >= region.getOffset())
+                return startLine;
+
+            final int nextLine = startLine + 1;
+            if (nextLine == document.getNumberOfLines())
+                return -1;
+
+            offset = document.getLineOffset(nextLine);
+            return (offset > region.getOffset() + region.getLength() ? -1 : nextLine);
+
+        } catch (BadLocationException x) {
+            // should not happen
+            YangEditorPlugin.log(x);
+        }
+
+        return -1;
+    }
+
+    /**
+     * Determines whether each line is prefixed by one of the prefixes.
+     *
+     * @param prefixes Possible comment prefixes
+     */
+    private boolean isBlockCommented(int startLine, int endLine, String[] prefixes, IDocument document) {
+
+        try {
+
+            // check for occurrences of prefixes in the given lines
+            for (int i = startLine; i <= endLine; i++) {
+
+                IRegion line = document.getLineInformation(i);
+                String text = document.get(line.getOffset(), line.getLength());
+
+                int[] found = TextUtilities.indexOf(prefixes, text, 0);
+
+                if (found[0] == -1)
+                    // found a line which is not commented
+                    return false;
+
+                String s = document.get(line.getOffset(), found[0]);
+                s = s.trim();
+                if (s.length() != 0)
+                    // found a line which is not commented
+                    return false;
+
+            }
+
+            return true;
+
+        } catch (BadLocationException x) {
+            // should not happen
+            YangEditorPlugin.log(x);
+        }
+
+        return false;
+    }
+
+    @Override
+    public void update() {
+        super.update();
+
+        if (!canModifyEditor()) {
+            setEnabled(false);
+            return;
+        }
+
+        ITextEditor editor = getTextEditor();
+        if (fOperationTarget == null && editor != null)
+            fOperationTarget = (ITextOperationTarget) editor.getAdapter(ITextOperationTarget.class);
+
+        boolean isEnabled = (fOperationTarget != null && fOperationTarget.canDoOperation(ITextOperationTarget.PREFIX) && fOperationTarget
+                .canDoOperation(ITextOperationTarget.STRIP_PREFIX));
+        setEnabled(isEnabled);
+    }
+
+    /*
+     * @see TextEditorAction#setEditor(ITextEditor)
+     */
+    @Override
+    public void setEditor(ITextEditor editor) {
+        super.setEditor(editor);
+        fOperationTarget = null;
+    }
+
+    public void configure(ISourceViewer sourceViewer, SourceViewerConfiguration configuration) {
+        fPrefixesMap = null;
+
+        String[] types = configuration.getConfiguredContentTypes(sourceViewer);
+        Map<String, String[]> prefixesMap = new HashMap<String, String[]>(types.length);
+        for (int i = 0; i < types.length; i++) {
+            String type = types[i];
+            String[] prefixes = configuration.getDefaultPrefixes(sourceViewer, type);
+            if (prefixes != null && prefixes.length > 0) {
+                int emptyPrefixes = 0;
+                for (int j = 0; j < prefixes.length; j++)
+                    if (prefixes[j].length() == 0)
+                        emptyPrefixes++;
+
+                if (emptyPrefixes > 0) {
+                    String[] nonemptyPrefixes = new String[prefixes.length - emptyPrefixes];
+                    for (int j = 0, k = 0; j < prefixes.length; j++) {
+                        String prefix = prefixes[j];
+                        if (prefix.length() != 0) {
+                            nonemptyPrefixes[k] = prefix;
+                            k++;
+                        }
+                    }
+                    prefixes = nonemptyPrefixes;
+                }
+
+                prefixesMap.put(type, prefixes);
+            }
+        }
+        fDocumentPartitioning = configuration.getConfiguredDocumentPartitioning(sourceViewer);
+        fPrefixesMap = prefixesMap;
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see org.eclipse.jface.action.Action#isEnabled()
+     */
+    @Override
+    public boolean isEnabled() {
+        return super.isEnabled();
+
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see org.eclipse.jface.action.Action#isHandled()
+     */
+    @Override
+    public boolean isHandled() {
+        return super.isHandled();
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/compare/YangFileMergeViewer.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/compare/YangFileMergeViewer.java
new file mode 100644 (file)
index 0000000..36c77e3
--- /dev/null
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.compare;
+
+import org.eclipse.compare.CompareConfiguration;
+import org.eclipse.compare.contentmergeviewer.TextMergeViewer;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.IDocumentPartitioner;
+import org.eclipse.jface.text.TextViewer;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.editors.text.EditorsUI;
+import org.eclipse.ui.texteditor.ChainedPreferenceStore;
+
+import com.cisco.yangide.editor.YangEditorPlugin;
+import com.cisco.yangide.editor.editors.YangColorManager;
+import com.cisco.yangide.editor.editors.YangSourceViewerConfiguration;
+import com.cisco.yangide.editor.preferences.YangDocumentSetupParticipant;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 31, 2014
+ */
+public class YangFileMergeViewer extends TextMergeViewer {
+
+    public YangFileMergeViewer(Composite parent, CompareConfiguration config) {
+        super(parent, config);
+    }
+
+    @Override
+    protected void configureTextViewer(TextViewer textViewer) {
+        SourceViewer yangSourceViewer = (SourceViewer) textViewer;
+        YangColorManager colorManager = new YangColorManager(false);
+
+        IPreferenceStore store = new ChainedPreferenceStore(new IPreferenceStore[] {
+                YangEditorPlugin.getDefault().getCombinedPreferenceStore(), EditorsUI.getPreferenceStore() });
+
+        YangSourceViewerConfiguration configuration = new YangSourceViewerConfiguration(store, colorManager, null);
+
+        yangSourceViewer.configure(configuration);
+        yangSourceViewer.setEditable(false);
+        Font font = JFaceResources.getFont(JFaceResources.TEXT_FONT);
+        yangSourceViewer.getTextWidget().setFont(font);
+    }
+
+    @Override
+    protected IDocumentPartitioner getDocumentPartitioner() {
+        return YangDocumentSetupParticipant.createDocumentPartitioner();
+    }
+
+    @Override
+    protected String getDocumentPartitioning() {
+        return YangDocumentSetupParticipant.YANG_PARTITIONING;
+    }
+
+    @Override
+    public String getTitle() {
+        return "YANG File Compare Viewer";
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/compare/YangFileMergeViewerCreator.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/compare/YangFileMergeViewerCreator.java
new file mode 100644 (file)
index 0000000..7e86bbc
--- /dev/null
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.compare;
+
+import org.eclipse.compare.CompareConfiguration;
+import org.eclipse.compare.IViewerCreator;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 31, 2014
+ */
+public class YangFileMergeViewerCreator implements IViewerCreator {
+
+    @Override
+    public Viewer createViewer(Composite parent, CompareConfiguration config) {
+        return new YangFileMergeViewer(parent, config);
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/compare/YangFileViewerCreator.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/compare/YangFileViewerCreator.java
new file mode 100644 (file)
index 0000000..507d636
--- /dev/null
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.compare;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+import org.eclipse.compare.CompareConfiguration;
+import org.eclipse.compare.IStreamContentAccessor;
+import org.eclipse.compare.IViewerCreator;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.editors.text.EditorsUI;
+import org.eclipse.ui.texteditor.ChainedPreferenceStore;
+
+import com.cisco.yangide.editor.YangEditorPlugin;
+import com.cisco.yangide.editor.editors.YangColorManager;
+import com.cisco.yangide.editor.editors.YangSourceViewer;
+import com.cisco.yangide.editor.editors.YangSourceViewerConfiguration;
+import com.cisco.yangide.editor.preferences.YangDocumentSetupParticipant;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 31, 2014
+ */
+public class YangFileViewerCreator implements IViewerCreator {
+
+    @Override
+    public Viewer createViewer(Composite parent, CompareConfiguration config) {
+        YangSourceViewer yangSourceViewer = new YangSourceViewer(parent, null, null, false, SWT.BORDER | SWT.V_SCROLL
+                | SWT.H_SCROLL) {
+            @Override
+            public void setInput(Object input) {
+                if (input instanceof IStreamContentAccessor) {
+                    IDocument document = new Document(getContentFromStream((IStreamContentAccessor) input));
+                    new YangDocumentSetupParticipant().setup(document);
+                    setDocument(document);
+                } else {
+                    super.setInput(input);
+                }
+            }
+        };
+        YangColorManager colorManager = new YangColorManager(false);
+
+        IPreferenceStore store = new ChainedPreferenceStore(new IPreferenceStore[] {
+                YangEditorPlugin.getDefault().getCombinedPreferenceStore(), EditorsUI.getPreferenceStore() });
+
+        YangSourceViewerConfiguration configuration = new YangSourceViewerConfiguration(store, colorManager, null);
+
+        yangSourceViewer.configure(configuration);
+        yangSourceViewer.setEditable(false);
+        Font font = JFaceResources.getFont(JFaceResources.TEXT_FONT);
+        yangSourceViewer.getTextWidget().setFont(font);
+
+        return yangSourceViewer;
+    }
+
+    private String getContentFromStream(IStreamContentAccessor input) {
+        char[] cbuf = new char[1024];
+        int len = 0;
+        StringBuilder sb = new StringBuilder();
+        try (InputStreamReader in = new InputStreamReader(input.getContents(), "UTF-8")) {
+            while ((len = in.read(cbuf)) > 0) {
+                sb.append(cbuf, 0, len);
+            }
+        } catch (IOException | CoreException e) {
+            YangEditorPlugin.log(e);
+        }
+        return sb.toString();
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/dialogs/StatusInfo.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/dialogs/StatusInfo.java
new file mode 100644 (file)
index 0000000..b7df007
--- /dev/null
@@ -0,0 +1,169 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.dialogs;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.IStatus;
+
+import com.cisco.yangide.editor.YangEditorPlugin;
+
+/**
+ * A settable IStatus. Can be an error, warning, info or ok. For error, info and warning states, a
+ * message describes the problem.
+ *
+ * @author Alexey Kholupko
+ */
+public class StatusInfo implements IStatus {
+
+    public static final IStatus OK_STATUS = new StatusInfo();
+
+    private String fStatusMessage;
+    private int fSeverity;
+
+    /**
+     * Creates a status set to OK (no message)
+     */
+    public StatusInfo() {
+        this(OK, null);
+    }
+
+    /**
+     * Creates a status .
+     *
+     * @param severity: ERROR, WARNING, INFO and OK.
+     * @param message The message of the status. Applies only for ERROR, WARNING and INFO.
+     */
+    public StatusInfo(int severity, String message) {
+        fStatusMessage = message;
+        fSeverity = severity;
+    }
+
+    public boolean isOK() {
+        return fSeverity == IStatus.OK;
+    }
+
+    public boolean isWarning() {
+        return fSeverity == IStatus.WARNING;
+    }
+
+    public boolean isInfo() {
+        return fSeverity == IStatus.INFO;
+    }
+
+    public boolean isError() {
+        return fSeverity == IStatus.ERROR;
+    }
+
+    /**
+     * @see IStatus#getMessage
+     */
+    public String getMessage() {
+        return fStatusMessage;
+    }
+
+    public void setError(String errorMessage) {
+        Assert.isNotNull(errorMessage);
+        fStatusMessage = errorMessage;
+        fSeverity = IStatus.ERROR;
+    }
+
+    public void setWarning(String warningMessage) {
+        Assert.isNotNull(warningMessage);
+        fStatusMessage = warningMessage;
+        fSeverity = IStatus.WARNING;
+    }
+
+    public void setInfo(String infoMessage) {
+        Assert.isNotNull(infoMessage);
+        fStatusMessage = infoMessage;
+        fSeverity = IStatus.INFO;
+    }
+
+    public void setOK() {
+        fStatusMessage = null;
+        fSeverity = IStatus.OK;
+    }
+
+    /*
+     * @see IStatus#matches(int)
+     */
+    public boolean matches(int severityMask) {
+        return (fSeverity & severityMask) != 0;
+    }
+
+    /**
+     * Returns always <code>false</code>.
+     *
+     * @see IStatus#isMultiStatus()
+     */
+    public boolean isMultiStatus() {
+        return false;
+    }
+
+    /*
+     * @see IStatus#getSeverity()
+     */
+    public int getSeverity() {
+        return fSeverity;
+    }
+
+    /*
+     * @see IStatus#getPlugin()
+     */
+    public String getPlugin() {
+        return YangEditorPlugin.PLUGIN_ID;
+    }
+
+    /**
+     * Returns always <code>null</code>.
+     *
+     * @see IStatus#getException()
+     */
+    public Throwable getException() {
+        return null;
+    }
+
+    /**
+     * Returns always the error severity.
+     *
+     * @see IStatus#getCode()
+     */
+    public int getCode() {
+        return fSeverity;
+    }
+
+    /**
+     * Returns always an empty array.
+     *
+     * @see IStatus#getChildren()
+     */
+    public IStatus[] getChildren() {
+        return new IStatus[0];
+    }
+
+    @Override
+    public String toString() {
+        StringBuffer buf = new StringBuffer();
+        buf.append("StatusInfo ");
+        if (fSeverity == OK) {
+            buf.append("OK");
+        } else if (fSeverity == ERROR) {
+            buf.append("ERROR");
+        } else if (fSeverity == WARNING) {
+            buf.append("WARNING");
+        } else if (fSeverity == INFO) {
+            buf.append("INFO");
+        } else {
+            buf.append("severity=");
+            buf.append(fSeverity);
+        }
+        buf.append(": ");
+        buf.append(fStatusMessage);
+        return buf.toString();
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/dialogs/StatusUtil.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/dialogs/StatusUtil.java
new file mode 100644 (file)
index 0000000..f68dc8e
--- /dev/null
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.dialogs;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.dialogs.DialogPage;
+import org.eclipse.jface.dialogs.IMessageProvider;
+
+/**
+ * A utility class to work with IStatus.
+ *
+ * @author Alexey Kholupko
+ */
+public class StatusUtil {
+
+    /**
+     * Compares two instances of <code>IStatus</code>. The more severe is returned: An error is more
+     * severe than a warning, and a warning is more severe than ok. If the two statuses have the
+     * same severity, the second is returned.
+     */
+    public static IStatus getMoreSevere(IStatus s1, IStatus s2) {
+        if (s1.getSeverity() > s2.getSeverity()) {
+            return s1;
+        } else {
+            return s2;
+        }
+    }
+
+    /**
+     * Finds the most severe status from a array of statuses. An error is more severe than a
+     * warning, and a warning is more severe than ok.
+     */
+    public static IStatus getMostSevere(IStatus[] status) {
+        IStatus max = null;
+        for (int i = 0; i < status.length; i++) {
+            IStatus curr = status[i];
+            if (curr.matches(IStatus.ERROR)) {
+                return curr;
+            }
+            if (max == null || curr.getSeverity() > max.getSeverity()) {
+                max = curr;
+            }
+        }
+        return max;
+    }
+
+    /**
+     * Applies the status to the status line of a dialog page.
+     */
+    public static void applyToStatusLine(DialogPage page, IStatus status) {
+        String message = status.getMessage();
+        if (message != null && message.length() == 0) {
+            message = null;
+        }
+        switch (status.getSeverity()) {
+        case IStatus.OK:
+            page.setMessage(message, IMessageProvider.NONE);
+            page.setErrorMessage(null);
+            break;
+        case IStatus.WARNING:
+            page.setMessage(message, IMessageProvider.WARNING);
+            page.setErrorMessage(null);
+            break;
+        case IStatus.INFO:
+            page.setMessage(message, IMessageProvider.INFORMATION);
+            page.setErrorMessage(null);
+            break;
+        default:
+            page.setMessage(null);
+            page.setErrorMessage(message);
+            break;
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/AbstractYangScanner.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/AbstractYangScanner.java
new file mode 100644 (file)
index 0000000..5cf6234
--- /dev/null
@@ -0,0 +1,291 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.jdt.ui.PreferenceConstants;
+import org.eclipse.jdt.ui.text.IColorManager;
+import org.eclipse.jdt.ui.text.IColorManagerExtension;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferenceConverter;
+import org.eclipse.jface.resource.StringConverter;
+import org.eclipse.jface.text.TextAttribute;
+import org.eclipse.jface.text.rules.BufferedRuleBasedScanner;
+import org.eclipse.jface.text.rules.IRule;
+import org.eclipse.jface.text.rules.IToken;
+import org.eclipse.jface.text.rules.Token;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * Initialized with a color manager and a preference store
+ * <p>
+ * This scanner stores the color defined by the color preference key into the color manager under
+ * the same key.
+ * </p>
+ * <p>
+ * Preference color key + PreferenceConstants#EDITOR_<X>_SUFFIX} are used to retrieve whether the
+ * token is rendered in bold, italic, strikethrough or underline
+ * </p>
+ *
+ * @author Alexey Kholupko
+ */
+public abstract class AbstractYangScanner extends BufferedRuleBasedScanner {
+
+    private IColorManager fColorManager;
+    private IPreferenceStore fPreferenceStore;
+
+    private Map<String, Token> fTokenMap = new HashMap<String, Token>();
+    private String[] fPropertyNamesColor;
+
+    private String[] fPropertyNamesBold;
+
+    private String[] fPropertyNamesItalic;
+
+    private String[] fPropertyNamesStrikethrough;
+
+    private String[] fPropertyNamesUnderline;
+
+    private boolean fNeedsLazyColorLoading;
+
+    abstract protected String[] getTokenProperties();
+
+    abstract protected List<IRule> createRules();
+
+    public AbstractYangScanner(IColorManager manager, IPreferenceStore store) {
+        super();
+        fColorManager = manager;
+        fPreferenceStore = store;
+        initialize();
+    }
+
+    /**
+     * Must be called after the constructor has been called.
+     */
+    public final void initialize() {
+
+        fPropertyNamesColor = getTokenProperties();
+        int length = fPropertyNamesColor.length;
+        fPropertyNamesBold = new String[length];
+        fPropertyNamesItalic = new String[length];
+        fPropertyNamesStrikethrough = new String[length];
+        fPropertyNamesUnderline = new String[length];
+
+        for (int i = 0; i < length; i++) {
+            fPropertyNamesBold[i] = getBoldKey(fPropertyNamesColor[i]);
+            fPropertyNamesItalic[i] = getItalicKey(fPropertyNamesColor[i]);
+            fPropertyNamesStrikethrough[i] = getStrikethroughKey(fPropertyNamesColor[i]);
+            fPropertyNamesUnderline[i] = getUnderlineKey(fPropertyNamesColor[i]);
+        }
+
+        fNeedsLazyColorLoading = Display.getCurrent() == null;
+        for (int i = 0; i < length; i++) {
+            if (fNeedsLazyColorLoading)
+                addTokenWithProxyAttribute(fPropertyNamesColor[i], fPropertyNamesBold[i], fPropertyNamesItalic[i],
+                        fPropertyNamesStrikethrough[i], fPropertyNamesUnderline[i]);
+            else
+                addToken(fPropertyNamesColor[i], fPropertyNamesBold[i], fPropertyNamesItalic[i],
+                        fPropertyNamesStrikethrough[i], fPropertyNamesUnderline[i]);
+        }
+
+        initializeRules();
+    }
+
+    protected String getBoldKey(String colorKey) {
+        return colorKey + PreferenceConstants.EDITOR_BOLD_SUFFIX;
+    }
+
+    protected String getItalicKey(String colorKey) {
+        return colorKey + PreferenceConstants.EDITOR_ITALIC_SUFFIX;
+    }
+
+    protected String getStrikethroughKey(String colorKey) {
+        return colorKey + PreferenceConstants.EDITOR_STRIKETHROUGH_SUFFIX;
+    }
+
+    protected String getUnderlineKey(String colorKey) {
+        return colorKey + PreferenceConstants.EDITOR_UNDERLINE_SUFFIX;
+    }
+
+    @Override
+    public IToken nextToken() {
+        if (fNeedsLazyColorLoading)
+            resolveProxyAttributes();
+        return super.nextToken();
+    }
+
+    private void resolveProxyAttributes() {
+        if (fNeedsLazyColorLoading && Display.getCurrent() != null) {
+            for (int i = 0; i < fPropertyNamesColor.length; i++) {
+                addToken(fPropertyNamesColor[i], fPropertyNamesBold[i], fPropertyNamesItalic[i],
+                        fPropertyNamesStrikethrough[i], fPropertyNamesUnderline[i]);
+            }
+            fNeedsLazyColorLoading = false;
+        }
+    }
+
+    private void addTokenWithProxyAttribute(String colorKey, String boldKey, String italicKey, String strikethroughKey,
+            String underlineKey) {
+        fTokenMap.put(colorKey,
+                new Token(createTextAttribute(null, boldKey, italicKey, strikethroughKey, underlineKey)));
+    }
+
+    private void addToken(String colorKey, String boldKey, String italicKey, String strikethroughKey,
+            String underlineKey) {
+        if (fColorManager != null && colorKey != null && fColorManager.getColor(colorKey) == null) {
+            RGB rgb = PreferenceConverter.getColor(fPreferenceStore, colorKey);
+            if (fColorManager instanceof IColorManagerExtension) {
+                IColorManagerExtension ext = (IColorManagerExtension) fColorManager;
+                ext.unbindColor(colorKey);
+                ext.bindColor(colorKey, rgb);
+            }
+        }
+
+        if (!fNeedsLazyColorLoading)
+            fTokenMap.put(colorKey,
+                    new Token(createTextAttribute(colorKey, boldKey, italicKey, strikethroughKey, underlineKey)));
+        else {
+            Token token = fTokenMap.get(colorKey);
+            if (token != null)
+                token.setData(createTextAttribute(colorKey, boldKey, italicKey, strikethroughKey, underlineKey));
+        }
+    }
+
+    /**
+     * Create a text attribute based on the given color, bold, italic, strikethrough and underline
+     * preference keys.
+     */
+    private TextAttribute createTextAttribute(String colorKey, String boldKey, String italicKey,
+            String strikethroughKey, String underlineKey) {
+        Color color = null;
+        if (colorKey != null)
+            color = fColorManager.getColor(colorKey);
+
+        int style = fPreferenceStore.getBoolean(boldKey) ? SWT.BOLD : SWT.NORMAL;
+        if (fPreferenceStore.getBoolean(italicKey))
+            style |= SWT.ITALIC;
+
+        if (fPreferenceStore.getBoolean(strikethroughKey))
+            style |= TextAttribute.STRIKETHROUGH;
+
+        if (fPreferenceStore.getBoolean(underlineKey))
+            style |= TextAttribute.UNDERLINE;
+
+        return new TextAttribute(color, null, style);
+    }
+
+    protected Token getToken(String key) {
+        if (fNeedsLazyColorLoading)
+            resolveProxyAttributes();
+        return fTokenMap.get(key);
+    }
+
+    private void initializeRules() {
+        List<IRule> rules = createRules();
+        if (rules != null) {
+            IRule[] result = new IRule[rules.size()];
+            rules.toArray(result);
+            setRules(result);
+        }
+    }
+
+    private int indexOf(String property) {
+        if (property != null) {
+            int length = fPropertyNamesColor.length;
+            for (int i = 0; i < length; i++) {
+                if (property.equals(fPropertyNamesColor[i]) || property.equals(fPropertyNamesBold[i])
+                        || property.equals(fPropertyNamesItalic[i]) || property.equals(fPropertyNamesStrikethrough[i])
+                        || property.equals(fPropertyNamesUnderline[i]))
+                    return i;
+            }
+        }
+        return -1;
+    }
+
+    public boolean affectsBehavior(PropertyChangeEvent event) {
+        return indexOf(event.getProperty()) >= 0;
+    }
+
+    public void adaptToPreferenceChange(PropertyChangeEvent event) {
+        String p = event.getProperty();
+        int index = indexOf(p);
+        Token token = getToken(fPropertyNamesColor[index]);
+        if (fPropertyNamesColor[index].equals(p))
+            adaptToColorChange(token, event);
+        else if (fPropertyNamesBold[index].equals(p))
+            adaptToStyleChange(token, event, SWT.BOLD);
+        else if (fPropertyNamesItalic[index].equals(p))
+            adaptToStyleChange(token, event, SWT.ITALIC);
+        else if (fPropertyNamesStrikethrough[index].equals(p))
+            adaptToStyleChange(token, event, TextAttribute.STRIKETHROUGH);
+        else if (fPropertyNamesUnderline[index].equals(p))
+            adaptToStyleChange(token, event, TextAttribute.UNDERLINE);
+    }
+
+    private void adaptToColorChange(Token token, PropertyChangeEvent event) {
+        RGB rgb = null;
+
+        Object value = event.getNewValue();
+        if (value instanceof RGB)
+            rgb = (RGB) value;
+        else if (value instanceof String)
+            rgb = StringConverter.asRGB((String) value);
+
+        if (rgb != null) {
+
+            String property = event.getProperty();
+            Color color = fColorManager.getColor(property);
+
+            if ((color == null || !rgb.equals(color.getRGB())) && fColorManager instanceof IColorManagerExtension) {
+                IColorManagerExtension ext = (IColorManagerExtension) fColorManager;
+
+                ext.unbindColor(property);
+                ext.bindColor(property, rgb);
+
+                color = fColorManager.getColor(property);
+            }
+
+            Object data = token.getData();
+            if (data instanceof TextAttribute) {
+                TextAttribute oldAttr = (TextAttribute) data;
+                token.setData(new TextAttribute(color, oldAttr.getBackground(), oldAttr.getStyle()));
+            }
+        }
+    }
+
+    private void adaptToStyleChange(Token token, PropertyChangeEvent event, int styleAttribute) {
+        boolean eventValue = false;
+        Object value = event.getNewValue();
+        if (value instanceof Boolean)
+            eventValue = ((Boolean) value).booleanValue();
+        else if (IPreferenceStore.TRUE.equals(value))
+            eventValue = true;
+
+        Object data = token.getData();
+        if (data instanceof TextAttribute) {
+            TextAttribute oldAttr = (TextAttribute) data;
+            boolean activeValue = (oldAttr.getStyle() & styleAttribute) == styleAttribute;
+            if (activeValue != eventValue)
+                token.setData(new TextAttribute(oldAttr.getForeground(), oldAttr.getBackground(), eventValue ? oldAttr
+                        .getStyle() | styleAttribute : oldAttr.getStyle() & ~styleAttribute));
+        }
+    }
+
+    /**
+     * @return the preference store.
+     */
+    protected IPreferenceStore getPreferenceStore() {
+        return fPreferenceStore;
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/IActionGroup.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/IActionGroup.java
new file mode 100644 (file)
index 0000000..0166f10
--- /dev/null
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors;
+
+/**
+ * Interface to describe custom actions group for YANG editor.
+ *
+ * @author Konstantin Zaitsev
+ * date: Jul 29, 2014
+ */
+public interface IActionGroup {
+
+    /**
+     * Initializes action group.
+     *
+     * @param editor yang editor
+     * @param groupName action group name
+     */
+    void init(YangEditor editor, String groupName);
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/IReconcileHandler.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/IReconcileHandler.java
new file mode 100644 (file)
index 0000000..68960df
--- /dev/null
@@ -0,0 +1,16 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors;
+
+/**
+ * @author Konstantin Zaitsev
+ * date:   Aug 14, 2014
+ */
+public interface IReconcileHandler {
+    void reconcile();
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/IYangEditor.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/IYangEditor.java
new file mode 100644 (file)
index 0000000..4bc5619
--- /dev/null
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors;
+
+/**
+ * Basic interface to operate with YangEditor.
+ *
+ * @author Konstantin Zaitsev
+ * date: Aug 27, 2014
+ */
+public interface IYangEditor {
+
+    /**
+     * Select text and scroll to selected text.
+     *
+     * @param offset
+     * @param length
+     */
+    void selectAndReveal(int offset, int length);
+
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/SemanticHighlighting.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/SemanticHighlighting.java
new file mode 100644 (file)
index 0000000..a83b17d
--- /dev/null
@@ -0,0 +1,160 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors;
+
+import org.eclipse.swt.graphics.RGB;
+
+import com.cisco.yangide.core.dom.ASTCompositeNode;
+import com.cisco.yangide.core.dom.ASTNamedNode;
+import com.cisco.yangide.core.dom.ASTNode;
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.core.dom.SimpleNode;
+import com.cisco.yangide.core.dom.SubModule;
+
+/**
+ * Semantic highlighting
+ *
+ * @author Alexey Kholupko
+ */
+public abstract class SemanticHighlighting {
+
+    /**
+     * @return the preference key, will be augmented by a prefix and a suffix for each preference
+     */
+    public abstract String getPreferenceKey();
+
+    /**
+     * @return the default default text color
+     */
+    public abstract RGB getDefaultTextColor();
+
+    /**
+     * @return <code>true</code> if the text attribute bold is set by default
+     */
+    public abstract boolean isBoldByDefault();
+
+    /**
+     * @return <code>true</code> if the text attribute italic is set by default
+     */
+    public abstract boolean isItalicByDefault();
+
+    /**
+     * @return <code>true</code> if the text attribute strikethrough is set by default
+     */
+    public boolean isStrikethroughByDefault() {
+        return false;
+    }
+
+    /**
+     * @return <code>true</code> if the text attribute underline is set by default
+     */
+    public boolean isUnderlineByDefault() {
+        return false;
+    }
+
+    /**
+     * @return <code>true</code> if the text attribute italic is enabled by default
+     */
+    public abstract boolean isEnabledByDefault();
+
+    /**
+     * @return the display name
+     */
+    public abstract String getDisplayName();
+
+    /**
+     * Returns <code>true</code> iff the semantic highlighting consumes the semantic token.
+     * <p>
+     * NOTE: Implementors are not allowed to keep a reference on the token or on any object
+     * retrieved from the token.
+     * </p>
+     *
+     * @param node the semantic token for a {@link org.eclipse.jdt.core.dom.SimpleName}
+     * @return <code>true</code> iff the semantic highlighting consumes the semantic token
+     */
+    public abstract boolean consumes(ASTNode node);
+
+    /**
+     * @param node
+     * @return
+     */
+    protected int getHiglightingOffset(ASTNode node, String nodeModulePrefix) {
+        int result = -1;
+        if (node instanceof ASTNamedNode) {
+
+            String thisModulePrefix = null;
+            ASTNode thisModule = node.getModule();
+            if (thisModule instanceof SubModule) {
+                thisModulePrefix = ((SubModule) thisModule).getParentPrefix();
+            } else {
+                SimpleNode<String> prefixNode = ((Module) thisModule).getPrefix();
+                if (prefixNode != null) {
+                    thisModulePrefix = prefixNode.getValue();
+                }
+            }
+
+            result = ((ASTNamedNode) node).getNameStartPosition();
+            // skip prefix
+            if (nodeModulePrefix != null && !nodeModulePrefix.equals(thisModulePrefix)) {
+                result += nodeModulePrefix.length() + 1; // 1 is is for colon to be black
+            }
+        }
+        if (node instanceof ASTCompositeNode) {
+            return ((ASTCompositeNode) node).getNameStartPosition();
+        }
+
+        return result;
+    }
+
+    /**
+     * @param node
+     * @return
+     */
+    public abstract int getHiglightingOffset(ASTNode node);
+
+    /**
+     * @param node
+     * @return
+     */
+    protected int getHiglightingLength(ASTNode node, String nodeModulePrefix) {
+        int result = -1;
+        if (node instanceof ASTNamedNode) {
+
+            String thisModulePrefix = null;
+            ASTNode thisModule = node.getModule();
+            if (thisModule instanceof SubModule) {
+                thisModulePrefix = ((SubModule) thisModule).getParentPrefix();
+            } else {
+                SimpleNode<String> prefixNode = ((Module) thisModule).getPrefix();
+                if (prefixNode != null) {
+                    thisModulePrefix = prefixNode.getValue();
+                }
+            }
+
+            result = ((ASTNamedNode) node).getNameLength();
+            // skip prefix
+            if (nodeModulePrefix != null && !nodeModulePrefix.equals(thisModulePrefix)) {
+                result -= nodeModulePrefix.length() + 1; // 1 is is for semicolon to be black
+            }
+
+            // in case of name is quoted
+            if (((ASTNamedNode) node).getName().length() != ((ASTNamedNode) node).getNameLength()) {
+                result -= 1;
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * @param node
+     * @return
+     */
+    public abstract int getHiglightingLength(ASTNode node);
+
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/SemanticHighlightingManager.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/SemanticHighlightingManager.java
new file mode 100644 (file)
index 0000000..ada17e1
--- /dev/null
@@ -0,0 +1,642 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jdt.ui.text.IColorManager;
+import org.eclipse.jdt.ui.text.IColorManagerExtension;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferenceConverter;
+import org.eclipse.jface.resource.StringConverter;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.TextAttribute;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.RGB;
+
+import com.cisco.yangide.editor.YangEditorPlugin;
+
+/**
+ * Semantic highlighting manager
+ *
+ * @author Alexey Kholupko
+ */
+public class SemanticHighlightingManager implements IPropertyChangeListener {
+
+    static class Highlighting { // TODO: rename to HighlightingStyle
+
+        /** Text attribute */
+        private TextAttribute fTextAttribute;
+        /** Enabled state */
+        private boolean fIsEnabled;
+
+        /**
+         * Initialize with the given text attribute.
+         */
+        public Highlighting(TextAttribute textAttribute, boolean isEnabled) {
+            setTextAttribute(textAttribute);
+            setEnabled(isEnabled);
+        }
+
+        /**
+         * @return Returns the text attribute.
+         */
+        public TextAttribute getTextAttribute() {
+            return fTextAttribute;
+        }
+
+        /**
+         * @param textAttribute The background to set.
+         */
+        public void setTextAttribute(TextAttribute textAttribute) {
+            fTextAttribute = textAttribute;
+        }
+
+        /**
+         * @return the enabled state
+         */
+        public boolean isEnabled() {
+            return fIsEnabled;
+        }
+
+        /**
+         * @param isEnabled the new enabled state
+         */
+        public void setEnabled(boolean isEnabled) {
+            fIsEnabled = isEnabled;
+        }
+    }
+
+    /**
+     * Highlighted Positions.
+     */
+    static class HighlightedPosition extends Position {
+
+        /** Highlighting of the position */
+        private Highlighting fStyle;
+
+        /** Lock object */
+        private Object fLock;
+
+        /**
+         * Initialize the styled positions with the given offset, length and foreground color.
+         *
+         * @param offset The position offset
+         * @param length The position length
+         * @param highlighting The position's highlighting
+         * @param lock The lock object
+         */
+        public HighlightedPosition(int offset, int length, Highlighting highlighting, Object lock) {
+            super(offset, length);
+            fStyle = highlighting;
+            fLock = lock;
+        }
+
+        /**
+         * @return Returns a corresponding style range.
+         */
+        public StyleRange createStyleRange() {
+            int len = 0;
+            if (fStyle.isEnabled()) {
+                len = getLength();
+            }
+
+            TextAttribute textAttribute = fStyle.getTextAttribute();
+            int style = textAttribute.getStyle();
+            int fontStyle = style & (SWT.ITALIC | SWT.BOLD | SWT.NORMAL);
+            StyleRange styleRange = new StyleRange(getOffset(), len, textAttribute.getForeground(),
+                    textAttribute.getBackground(), fontStyle);
+            styleRange.strikeout = (style & TextAttribute.STRIKETHROUGH) != 0;
+            styleRange.underline = (style & TextAttribute.UNDERLINE) != 0;
+
+            return styleRange;
+        }
+
+        /**
+         * Uses reference equality for the highlighting.
+         *
+         * @param off The offset
+         * @param len The length
+         * @param highlighting The highlighting
+         * @return <code>true</code> iff the given offset, length and highlighting are equal to the
+         * internal ones.
+         */
+        public boolean isEqual(int off, int len, Highlighting highlighting) {
+            synchronized (fLock) {
+                return !isDeleted() && getOffset() == off && getLength() == len && fStyle == highlighting;
+            }
+        }
+
+        /**
+         * Is this position contained in the given range (inclusive)? Synchronizes on position
+         * updater.
+         *
+         * @param off The range offset
+         * @param len The range length
+         * @return <code>true</code> iff this position is not delete and contained in the given
+         * range.
+         */
+        public boolean isContained(int off, int len) {
+            synchronized (fLock) {
+                return !isDeleted() && off <= getOffset() && off + len >= getOffset() + getLength();
+            }
+        }
+
+        public void update(int off, int len) {
+            synchronized (fLock) {
+                super.setOffset(off);
+                super.setLength(len);
+            }
+        }
+
+        /*
+         * @see org.eclipse.jface.text.Position#setLength(int)
+         */
+        @Override
+        public void setLength(int length) {
+            synchronized (fLock) {
+                super.setLength(length);
+            }
+        }
+
+        /*
+         * @see org.eclipse.jface.text.Position#setOffset(int)
+         */
+        @Override
+        public void setOffset(int offset) {
+            synchronized (fLock) {
+                super.setOffset(offset);
+            }
+        }
+
+        /*
+         * @see org.eclipse.jface.text.Position#delete()
+         */
+        @Override
+        public void delete() {
+            synchronized (fLock) {
+                super.delete();
+            }
+        }
+
+        /*
+         * @see org.eclipse.jface.text.Position#undelete()
+         */
+        @Override
+        public void undelete() {
+            synchronized (fLock) {
+                super.undelete();
+            }
+        }
+
+        /**
+         * @return Returns the highlighting.
+         */
+        public Highlighting getHighlighting() {
+            return fStyle;
+        }
+    }
+
+    /**
+     * Highlighted ranges.
+     */
+    public static class HighlightedRange extends Region {
+        /** The highlighting key as returned by {@link SemanticHighlighting#getPreferenceKey()}. */
+        private String fKey;
+
+        /**
+         * Initialize with the given offset, length and highlighting key.
+         *
+         * @param offset the offset
+         * @param length the length
+         * @param key the highlighting key as returned by
+         * {@link SemanticHighlighting#getPreferenceKey()}
+         */
+        public HighlightedRange(int offset, int length, String key) {
+            super(offset, length);
+            fKey = key;
+        }
+
+        /**
+         * @return the highlighting key as returned by
+         * {@link SemanticHighlighting#getPreferenceKey()}
+         */
+        public String getKey() {
+            return fKey;
+        }
+
+        /*
+         * @see org.eclipse.jface.text.Region#equals(java.lang.Object)
+         */
+        @Override
+        public boolean equals(Object o) {
+            return super.equals(o) && o instanceof HighlightedRange && fKey.equals(((HighlightedRange) o).getKey());
+        }
+
+        /*
+         * @see org.eclipse.jface.text.Region#hashCode()
+         */
+        @Override
+        public int hashCode() {
+            return super.hashCode() | fKey.hashCode();
+        }
+    }
+
+    private SemanticHighlightingPresenter fPresenter;
+
+    private SemanticHighlightingReconciler fReconciler;
+
+    private SemanticHighlighting[] fSemanticHighlightings;
+
+    private Highlighting[] fHighlightings;
+
+    private YangEditor fEditor;
+
+    private SourceViewer fSourceViewer;
+
+    private IColorManager fColorManager;
+
+    private IPreferenceStore fPreferenceStore;
+
+    private YangSourceViewerConfiguration fConfiguration;
+
+    private YangPresentationReconciler fPresentationReconciler;
+
+    /** The hard-coded ranges */
+    private HighlightedRange[][] fHardcodedRanges;
+
+    /**
+     * Install the semantic highlighting on the given editor infrastructure
+     */
+    public void install(YangEditor editor, SourceViewer sourceViewer, IColorManager colorManager,
+            IPreferenceStore preferenceStore) {
+        fEditor = editor;
+        fSourceViewer = sourceViewer;
+        fColorManager = colorManager;
+        fPreferenceStore = preferenceStore;
+        if (fEditor != null) {
+            fConfiguration = new YangSourceViewerConfiguration(YangEditorPlugin.getDefault()
+                    .getCombinedPreferenceStore(), fColorManager, null);
+            fPresentationReconciler = (YangPresentationReconciler) fConfiguration
+                    .getPresentationReconciler(sourceViewer);
+        } else {
+            fConfiguration = null;
+            fPresentationReconciler = null;
+        }
+
+        fPreferenceStore.addPropertyChangeListener(this);
+
+        if (isEnabled()) {
+            enable();
+        }
+    }
+
+    /**
+     * Install the semantic highlighting on the given source viewer infrastructure. No
+     * reconciliation will be performed.
+     */
+    public void install(SourceViewer sourceViewer, IColorManager colorManager, IPreferenceStore preferenceStore,
+            HighlightedRange[][] hardcodedRanges) {
+        fHardcodedRanges = hardcodedRanges;
+        install(null, sourceViewer, colorManager, preferenceStore);
+    }
+
+    /**
+     * Enable semantic highlighting.
+     */
+    private void enable() {
+        initializeHighlightings();
+
+        fPresenter = new SemanticHighlightingPresenter();
+        fPresenter.install(fSourceViewer, fPresentationReconciler);
+
+        if (fEditor != null) {
+            fReconciler = new SemanticHighlightingReconciler();
+            fReconciler.install(fEditor, fSourceViewer, fPresenter, fSemanticHighlightings, fHighlightings);
+        } else {
+            fPresenter.updatePresentation(null, createHardcodedPositions(), new HighlightedPosition[0]);
+        }
+    }
+
+    /**
+     * Computes the hard-coded positions from the hard-coded ranges
+     *
+     * @return the hard-coded positions
+     */
+    private HighlightedPosition[] createHardcodedPositions() {
+        List<HighlightedPosition> positions = new ArrayList<HighlightedPosition>();
+        for (int i = 0; i < fHardcodedRanges.length; i++) {
+            HighlightedRange range = null;
+            Highlighting hl = null;
+            for (int j = 0; j < fHardcodedRanges[i].length; j++) {
+                hl = getHighlighting(fHardcodedRanges[i][j].getKey());
+                if (hl.isEnabled()) {
+                    range = fHardcodedRanges[i][j];
+                    break;
+                }
+            }
+
+            if (range != null) {
+                positions.add(fPresenter.createHighlightedPosition(range.getOffset(), range.getLength(), hl));
+            }
+        }
+        return positions.toArray(new HighlightedPosition[positions.size()]);
+    }
+
+    /**
+     * Returns the highlighting corresponding to the given key.
+     */
+    private Highlighting getHighlighting(String key) {
+        for (int i = 0; i < fSemanticHighlightings.length; i++) {
+            SemanticHighlighting semanticHighlighting = fSemanticHighlightings[i];
+            if (key.equals(semanticHighlighting.getPreferenceKey())) {
+                return fHighlightings[i];
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Uninstall the semantic highlighting
+     */
+    public void uninstall() {
+        disable();
+
+        if (fPreferenceStore != null) {
+            fPreferenceStore.removePropertyChangeListener(this);
+            fPreferenceStore = null;
+        }
+
+        fEditor = null;
+        fSourceViewer = null;
+        fColorManager = null;
+        fConfiguration = null;
+        fPresentationReconciler = null;
+        fHardcodedRanges = null;
+    }
+
+    /**
+     * Disable semantic highlighting.
+     */
+    private void disable() {
+        if (fReconciler != null) {
+            fReconciler.uninstall();
+            fReconciler = null;
+        }
+
+        if (fPresenter != null) {
+            fPresenter.uninstall();
+            fPresenter = null;
+        }
+
+        if (fSemanticHighlightings != null) {
+            disposeHighlightings();
+        }
+    }
+
+    /**
+     * @return <code>true</code> iff semantic highlighting is enabled in the preferences
+     */
+    private boolean isEnabled() {
+        return SemanticHighlightings.isEnabled(fPreferenceStore);
+    }
+
+    /**
+     * Initialize semantic highlightings.
+     */
+    private void initializeHighlightings() {
+        fSemanticHighlightings = SemanticHighlightings.getSemanticHighlightings();
+        fHighlightings = new Highlighting[fSemanticHighlightings.length];
+
+        for (int i = 0, n = fSemanticHighlightings.length; i < n; i++) {
+            SemanticHighlighting semanticHighlighting = fSemanticHighlightings[i];
+            String colorKey = SemanticHighlightings.getColorPreferenceKey(semanticHighlighting);
+            addColor(colorKey);
+
+            String boldKey = SemanticHighlightings.getBoldPreferenceKey(semanticHighlighting);
+            int style = fPreferenceStore.getBoolean(boldKey) ? SWT.BOLD : SWT.NORMAL;
+
+            String italicKey = SemanticHighlightings.getItalicPreferenceKey(semanticHighlighting);
+            if (fPreferenceStore.getBoolean(italicKey)) {
+                style |= SWT.ITALIC;
+            }
+
+            String strikethroughKey = SemanticHighlightings.getStrikethroughPreferenceKey(semanticHighlighting);
+            if (fPreferenceStore.getBoolean(strikethroughKey)) {
+                style |= TextAttribute.STRIKETHROUGH;
+            }
+
+            String underlineKey = SemanticHighlightings.getUnderlinePreferenceKey(semanticHighlighting);
+            if (fPreferenceStore.getBoolean(underlineKey)) {
+                style |= TextAttribute.UNDERLINE;
+            }
+
+            boolean isEnabled = fPreferenceStore.getBoolean(SemanticHighlightings
+                    .getEnabledPreferenceKey(semanticHighlighting));
+
+            fHighlightings[i] = new Highlighting(new TextAttribute(fColorManager.getColor(PreferenceConverter.getColor(
+                    fPreferenceStore, colorKey)), null, style), isEnabled);
+        }
+    }
+
+    /**
+     * Dispose the semantic highlightings.
+     */
+    private void disposeHighlightings() {
+        for (int i = 0, n = fSemanticHighlightings.length; i < n; i++) {
+            removeColor(SemanticHighlightings.getColorPreferenceKey(fSemanticHighlightings[i]));
+        }
+
+        fSemanticHighlightings = null;
+        fHighlightings = null;
+    }
+
+    /*
+     * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.
+     * PropertyChangeEvent)
+     */
+    @Override
+    public void propertyChange(PropertyChangeEvent event) {
+        handlePropertyChangeEvent(event);
+        fSourceViewer.invalidateTextPresentation();
+    }
+
+    /**
+     * Handle the given property change event
+     *
+     * @param event The event
+     */
+    private void handlePropertyChangeEvent(PropertyChangeEvent event) {
+        if (fPreferenceStore == null) {
+            return; // Uninstalled during event notification
+        }
+
+        if (fConfiguration != null) {
+            fConfiguration.handlePropertyChangeEvent(event);
+        }
+
+        if (SemanticHighlightings.affectsEnablement(fPreferenceStore, event)) {
+            if (isEnabled()) {
+                enable();
+            } else {
+                disable();
+            }
+        }
+
+        if (!isEnabled()) {
+            return;
+        }
+
+        boolean refreshNeeded = false;
+
+        for (int i = 0, n = fSemanticHighlightings.length; i < n; i++) {
+            SemanticHighlighting semanticHighlighting = fSemanticHighlightings[i];
+
+            String colorKey = SemanticHighlightings.getColorPreferenceKey(semanticHighlighting);
+            if (colorKey.equals(event.getProperty())) {
+                adaptToTextForegroundChange(fHighlightings[i], event);
+                fPresenter.highlightingStyleChanged(fHighlightings[i]);
+                refreshNeeded = true;
+                continue;
+            }
+
+            String boldKey = SemanticHighlightings.getBoldPreferenceKey(semanticHighlighting);
+            if (boldKey.equals(event.getProperty())) {
+                adaptToTextStyleChange(fHighlightings[i], event, SWT.BOLD);
+                fPresenter.highlightingStyleChanged(fHighlightings[i]);
+                refreshNeeded = true;
+                continue;
+            }
+
+            String italicKey = SemanticHighlightings.getItalicPreferenceKey(semanticHighlighting);
+            if (italicKey.equals(event.getProperty())) {
+                adaptToTextStyleChange(fHighlightings[i], event, SWT.ITALIC);
+                fPresenter.highlightingStyleChanged(fHighlightings[i]);
+                refreshNeeded = true;
+                continue;
+            }
+
+            String strikethroughKey = SemanticHighlightings.getStrikethroughPreferenceKey(semanticHighlighting);
+            if (strikethroughKey.equals(event.getProperty())) {
+                adaptToTextStyleChange(fHighlightings[i], event, TextAttribute.STRIKETHROUGH);
+                fPresenter.highlightingStyleChanged(fHighlightings[i]);
+                refreshNeeded = true;
+                continue;
+            }
+
+            String underlineKey = SemanticHighlightings.getUnderlinePreferenceKey(semanticHighlighting);
+            if (underlineKey.equals(event.getProperty())) {
+                adaptToTextStyleChange(fHighlightings[i], event, TextAttribute.UNDERLINE);
+                fPresenter.highlightingStyleChanged(fHighlightings[i]);
+                refreshNeeded = true;
+                continue;
+            }
+
+            String enabledKey = SemanticHighlightings.getEnabledPreferenceKey(semanticHighlighting);
+            if (enabledKey.equals(event.getProperty())) {
+                adaptToEnablementChange(fHighlightings[i], event);
+                fPresenter.highlightingStyleChanged(fHighlightings[i]);
+                refreshNeeded = true;
+                continue;
+            }
+        }
+
+        if (refreshNeeded && fReconciler != null) {
+            fReconciler.refresh();
+        }
+    }
+
+    private void adaptToEnablementChange(Highlighting highlighting, PropertyChangeEvent event) {
+        Object value = event.getNewValue();
+        boolean eventValue;
+        if (value instanceof Boolean) {
+            eventValue = ((Boolean) value).booleanValue();
+        } else if (IPreferenceStore.TRUE.equals(value)) {
+            eventValue = true;
+        } else {
+            eventValue = false;
+        }
+        highlighting.setEnabled(eventValue);
+    }
+
+    private void adaptToTextForegroundChange(Highlighting highlighting, PropertyChangeEvent event) {
+        RGB rgb = null;
+
+        Object value = event.getNewValue();
+        if (value instanceof RGB) {
+            rgb = (RGB) value;
+        } else if (value instanceof String) {
+            rgb = StringConverter.asRGB((String) value);
+        }
+
+        if (rgb != null) {
+
+            String property = event.getProperty();
+            Color color = fColorManager.getColor(property);
+
+            if ((color == null || !rgb.equals(color.getRGB())) && fColorManager instanceof IColorManagerExtension) {
+                IColorManagerExtension ext = (IColorManagerExtension) fColorManager;
+                ext.unbindColor(property);
+                ext.bindColor(property, rgb);
+                color = fColorManager.getColor(property);
+            }
+
+            TextAttribute oldAttr = highlighting.getTextAttribute();
+            highlighting.setTextAttribute(new TextAttribute(color, oldAttr.getBackground(), oldAttr.getStyle()));
+        }
+    }
+
+    private void adaptToTextStyleChange(Highlighting highlighting, PropertyChangeEvent event, int styleAttribute) {
+        boolean eventValue = false;
+        Object value = event.getNewValue();
+        if (value instanceof Boolean) {
+            eventValue = ((Boolean) value).booleanValue();
+        } else if (IPreferenceStore.TRUE.equals(value)) {
+            eventValue = true;
+        }
+
+        TextAttribute oldAttr = highlighting.getTextAttribute();
+        boolean activeValue = (oldAttr.getStyle() & styleAttribute) == styleAttribute;
+
+        if (activeValue != eventValue) {
+            highlighting.setTextAttribute(new TextAttribute(oldAttr.getForeground(), oldAttr.getBackground(),
+                    eventValue ? oldAttr.getStyle() | styleAttribute : oldAttr.getStyle() & ~styleAttribute));
+        }
+    }
+
+    private void addColor(String colorKey) {
+        if (fColorManager != null && colorKey != null && fColorManager.getColor(colorKey) == null) {
+            RGB rgb = PreferenceConverter.getColor(fPreferenceStore, colorKey);
+            if (fColorManager instanceof IColorManagerExtension) {
+                IColorManagerExtension ext = (IColorManagerExtension) fColorManager;
+                ext.unbindColor(colorKey);
+                ext.bindColor(colorKey, rgb);
+            }
+        }
+    }
+
+    private void removeColor(String colorKey) {
+        if (fColorManager instanceof IColorManagerExtension) {
+            ((IColorManagerExtension) fColorManager).unbindColor(colorKey);
+        }
+    }
+
+    /**
+     * Returns this hightlighter's reconciler.
+     */
+    public SemanticHighlightingReconciler getReconciler() {
+        return fReconciler;
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/SemanticHighlightingPresenter.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/SemanticHighlightingPresenter.java
new file mode 100644 (file)
index 0000000..0a23384
--- /dev/null
@@ -0,0 +1,791 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.BadPositionCategoryException;
+import org.eclipse.jface.text.DocumentEvent;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IDocumentListener;
+import org.eclipse.jface.text.IPositionUpdater;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ISynchronizable;
+import org.eclipse.jface.text.ITextInputListener;
+import org.eclipse.jface.text.ITextPresentationListener;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.TextPresentation;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.swt.custom.StyleRange;
+
+import com.cisco.yangide.editor.YangEditorPlugin;
+import com.cisco.yangide.editor.editors.SemanticHighlightingManager.HighlightedPosition;
+import com.cisco.yangide.editor.editors.SemanticHighlightingManager.Highlighting;
+
+/**
+ * Semantic highlighting presenter - UI thread implementation.
+ *
+ * @author Alexey Kholupko
+ */
+public class SemanticHighlightingPresenter implements ITextPresentationListener, ITextInputListener, IDocumentListener {
+
+    /**
+     * Semantic highlighting position updater.
+     */
+    private class HighlightingPositionUpdater implements IPositionUpdater {
+
+        /** The position category. */
+        private final String fCategory;
+
+        /**
+         * Creates a new updater for the given <code>category</code>.
+         *
+         * @param category the new category.
+         */
+        public HighlightingPositionUpdater(String category) {
+            fCategory = category;
+        }
+
+        /*
+         * @see org.eclipse.jface.text.IPositionUpdater#update(org.eclipse.jface.text.DocumentEvent)
+         */
+        @Override
+        public void update(DocumentEvent event) {
+
+            int eventOffset = event.getOffset();
+            int eventOldLength = event.getLength();
+            int eventEnd = eventOffset + eventOldLength;
+
+            try {
+                Position[] positions = event.getDocument().getPositions(fCategory);
+
+                for (int i = 0; i != positions.length; i++) {
+
+                    HighlightedPosition position = (HighlightedPosition) positions[i];
+
+                    // Also update deleted positions because they get deleted by the background
+                    // thread and removed/invalidated only in the UI runnable
+                    // if (position.isDeleted())
+                    // continue;
+
+                    int offset = position.getOffset();
+                    int length = position.getLength();
+                    int end = offset + length;
+
+                    if (offset > eventEnd) {
+                        updateWithPrecedingEvent(position, event);
+                    } else if (end < eventOffset) {
+                        updateWithSucceedingEvent(position, event);
+                    } else if (offset <= eventOffset && end >= eventEnd) {
+                        updateWithIncludedEvent(position, event);
+                    } else if (offset <= eventOffset) {
+                        updateWithOverEndEvent(position, event);
+                    } else if (end >= eventEnd) {
+                        updateWithOverStartEvent(position, event);
+                    } else {
+                        updateWithIncludingEvent(position, event);
+                    }
+                }
+            } catch (BadPositionCategoryException e) {
+                // ignore and return
+            }
+        }
+
+        /**
+         * Update the given position with the given event. The event precedes the position.
+         *
+         * @param position The position
+         * @param event The event
+         */
+        private void updateWithPrecedingEvent(HighlightedPosition position, DocumentEvent event) {
+            String newText = event.getText();
+            int eventNewLength = newText != null ? newText.length() : 0;
+            int deltaLength = eventNewLength - event.getLength();
+
+            position.setOffset(position.getOffset() + deltaLength);
+        }
+
+        /**
+         * Update the given position with the given event. The event succeeds the position.
+         *
+         * @param position The position
+         * @param event The event
+         */
+        private void updateWithSucceedingEvent(HighlightedPosition position, DocumentEvent event) {
+        }
+
+        /**
+         * Update the given position with the given event. The event is included by the position.
+         *
+         * @param position The position
+         * @param event The event
+         */
+        private void updateWithIncludedEvent(HighlightedPosition position, DocumentEvent event) {
+            int eventOffset = event.getOffset();
+            String newText = event.getText();
+            if (newText == null) {
+                newText = ""; //$NON-NLS-1$
+            }
+            int eventNewLength = newText.length();
+
+            int deltaLength = eventNewLength - event.getLength();
+
+            int offset = position.getOffset();
+            int length = position.getLength();
+            int end = offset + length;
+
+            int includedLength = 0;
+            while (includedLength < eventNewLength && Character.isJavaIdentifierPart(newText.charAt(includedLength))) {
+                includedLength++;
+            }
+            if (includedLength == eventNewLength) {
+                position.setLength(length + deltaLength);
+            } else {
+                int newLeftLength = eventOffset - offset + includedLength;
+
+                int excludedLength = eventNewLength;
+                while (excludedLength > 0 && Character.isJavaIdentifierPart(newText.charAt(excludedLength - 1))) {
+                    excludedLength--;
+                }
+                int newRightOffset = eventOffset + excludedLength;
+                int newRightLength = end + deltaLength - newRightOffset;
+
+                if (newRightLength == 0) {
+                    position.setLength(newLeftLength);
+                } else {
+                    if (newLeftLength == 0) {
+                        position.update(newRightOffset, newRightLength);
+                    } else {
+                        position.setLength(newLeftLength);
+                        addPositionFromUI(newRightOffset, newRightLength, position.getHighlighting());
+                    }
+                }
+            }
+        }
+
+        /**
+         * Update the given position with the given event. The event overlaps with the end of the
+         * position.
+         *
+         * @param position The position
+         * @param event The event
+         */
+        private void updateWithOverEndEvent(HighlightedPosition position, DocumentEvent event) {
+            String newText = event.getText();
+            if (newText == null) {
+                newText = ""; //$NON-NLS-1$
+            }
+            int eventNewLength = newText.length();
+
+            int includedLength = 0;
+            while (includedLength < eventNewLength && Character.isJavaIdentifierPart(newText.charAt(includedLength))) {
+                includedLength++;
+            }
+            position.setLength(event.getOffset() - position.getOffset() + includedLength);
+        }
+
+        /**
+         * Update the given position with the given event. The event overlaps with the start of the
+         * position.
+         *
+         * @param position The position
+         * @param event The event
+         */
+        private void updateWithOverStartEvent(HighlightedPosition position, DocumentEvent event) {
+            int eventOffset = event.getOffset();
+            int eventEnd = eventOffset + event.getLength();
+
+            String newText = event.getText();
+            if (newText == null) {
+                newText = ""; //$NON-NLS-1$
+            }
+            int eventNewLength = newText.length();
+
+            int excludedLength = eventNewLength;
+            while (excludedLength > 0 && Character.isJavaIdentifierPart(newText.charAt(excludedLength - 1))) {
+                excludedLength--;
+            }
+            int deleted = eventEnd - position.getOffset();
+            int inserted = eventNewLength - excludedLength;
+            position.update(eventOffset + excludedLength, position.getLength() - deleted + inserted);
+        }
+
+        /**
+         * Update the given position with the given event. The event includes the position.
+         *
+         * @param position The position
+         * @param event The event
+         */
+        private void updateWithIncludingEvent(HighlightedPosition position, DocumentEvent event) {
+            position.delete();
+            position.update(event.getOffset(), 0);
+        }
+    }
+
+    /** Position updater */
+    private IPositionUpdater fPositionUpdater = new HighlightingPositionUpdater(getPositionCategory());
+
+    /** The source viewer this semantic highlighting reconciler is installed on */
+    private SourceViewer fSourceViewer;
+    /** The background presentation reconciler */
+    private YangPresentationReconciler fPresentationReconciler;
+
+    /** UI's current highlighted positions - can contain <code>null</code> elements */
+    private List<Position> fPositions = new ArrayList<Position>();
+    /** UI position lock */
+    private Object fPositionLock = new Object();
+
+    /** <code>true</code> iff the current reconcile is canceled. */
+    private boolean fIsCanceled = false;
+
+    /**
+     * Creates and returns a new highlighted position with the given offset, length and
+     * highlighting.
+     */
+    public HighlightedPosition createHighlightedPosition(int offset, int length, Highlighting highlighting) {
+        // TODO: reuse deleted positions
+        return new HighlightedPosition(offset, length, highlighting, fPositionUpdater);
+    }
+
+    /**
+     * Adds all current positions to the given list.
+     *
+     * @param list The list
+     */
+    public void addAllPositions(List<Position> list) {
+        synchronized (fPositionLock) {
+            list.addAll(fPositions);
+        }
+    }
+
+    /**
+     * Create a text presentation in the background.
+     *
+     * @param addedPositions the added positions
+     * @param removedPositions the removed positions
+     * @return the text presentation or <code>null</code>, if reconciliation should be canceled
+     */
+    public TextPresentation createPresentation(List<Position> addedPositions, List<Position> removedPositions) {
+        SourceViewer sourceViewer = fSourceViewer;
+        YangPresentationReconciler presentationReconciler = fPresentationReconciler;
+        if (sourceViewer == null || presentationReconciler == null) {
+            return null;
+        }
+
+        if (isCanceled()) {
+            return null;
+        }
+
+        IDocument document = sourceViewer.getDocument();
+        if (document == null) {
+            return null;
+        }
+
+        int minStart = Integer.MAX_VALUE;
+        int maxEnd = Integer.MIN_VALUE;
+        for (int i = 0, n = removedPositions.size(); i < n; i++) {
+            Position position = removedPositions.get(i);
+            int offset = position.getOffset();
+            minStart = Math.min(minStart, offset);
+            maxEnd = Math.max(maxEnd, offset + position.getLength());
+        }
+        for (int i = 0, n = addedPositions.size(); i < n; i++) {
+            Position position = addedPositions.get(i);
+            int offset = position.getOffset();
+            minStart = Math.min(minStart, offset);
+            maxEnd = Math.max(maxEnd, offset + position.getLength());
+        }
+
+        if (minStart < maxEnd) {
+            try {
+                return presentationReconciler
+                        .createRepairDescription(new Region(minStart, maxEnd - minStart), document);
+            } catch (RuntimeException e) {
+                // Assume concurrent modification from UI thread
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * Create a runnable for updating the presentation.
+     *
+     * @param textPresentation the text presentation
+     * @param addedPositions the added positions
+     * @param removedPositions the removed positions
+     * @return the runnable or <code>null</code>, if reconciliation should be canceled
+     */
+    public Runnable createUpdateRunnable(final TextPresentation textPresentation, List<Position> addedPositions,
+            List<Position> removedPositions) {
+        if (fSourceViewer == null || textPresentation == null) {
+            return null;
+        }
+
+        // TODO: do clustering of positions and post multiple fast runnables
+        final HighlightedPosition[] added = new SemanticHighlightingManager.HighlightedPosition[addedPositions.size()];
+        addedPositions.toArray(added);
+        final SemanticHighlightingManager.HighlightedPosition[] removed = new SemanticHighlightingManager.HighlightedPosition[removedPositions
+                                                                                                                              .size()];
+        removedPositions.toArray(removed);
+
+        if (isCanceled()) {
+            return null;
+        }
+
+        Runnable runnable = new Runnable() {
+            @Override
+            public void run() {
+                updatePresentation(textPresentation, added, removed);
+            }
+        };
+        return runnable;
+    }
+
+    /**
+     * Invalidate the presentation of the positions based on the given added positions and the
+     * existing deleted positions. Also unregisters the deleted positions from the document and
+     * patches the positions of this presenter.
+     */
+    public void updatePresentation(TextPresentation textPresentation, HighlightedPosition[] addedPositions,
+            HighlightedPosition[] removedPositions) {
+        if (fSourceViewer == null) {
+            return;
+        }
+
+        //             checkOrdering("added positions: ", Arrays.asList(addedPositions)); //$NON-NLS-1$
+        //             checkOrdering("removed positions: ", Arrays.asList(removedPositions)); //$NON-NLS-1$
+        //             checkOrdering("old positions: ", fPositions); //$NON-NLS-1$
+
+        // TODO: double-check consistency with document.getPositions(...)
+        // TODO: reuse removed positions
+        if (isCanceled()) {
+            return;
+        }
+
+        IDocument document = fSourceViewer.getDocument();
+        if (document == null) {
+            return;
+        }
+
+        String positionCategory = getPositionCategory();
+
+        List<HighlightedPosition> removedPositionsList = Arrays.asList(removedPositions);
+
+        try {
+            synchronized (fPositionLock) {
+                List<Position> oldPositions = fPositions;
+                int newSize = Math.max(fPositions.size() + addedPositions.length - removedPositions.length, 10);
+
+                /*
+                 * The following loop is a kind of merge sort: it merges two List<Position>, each
+                 * sorted by position.offset, into one new list. The first of the two is the
+                 * previous list of positions (oldPositions), from which any deleted positions get
+                 * removed on the fly. The second of two is the list of added positions. The result
+                 * is stored in newPositions.
+                 */
+                List<Position> newPositions = new ArrayList<Position>(newSize);
+                Position position = null;
+                Position addedPosition = null;
+                for (int i = 0, j = 0, n = oldPositions.size(), m = addedPositions.length; i < n || position != null
+                        || j < m || addedPosition != null;) {
+                    // loop variant: i + j < old(i + j)
+
+                    // a) find the next non-deleted Position from the old list
+                    while (position == null && i < n) {
+                        position = oldPositions.get(i++);
+                        if (position.isDeleted() || contain(removedPositionsList, position)) {
+                            document.removePosition(positionCategory, position);
+                            position = null;
+                        }
+                    }
+
+                    // b) find the next Position from the added list
+                    if (addedPosition == null && j < m) {
+                        addedPosition = addedPositions[j++];
+                        document.addPosition(positionCategory, addedPosition);
+                    }
+
+                    // c) merge: add the next of position/addedPosition with the lower offset
+                    if (position != null) {
+                        if (addedPosition != null) {
+                            if (position.getOffset() <= addedPosition.getOffset()) {
+                                newPositions.add(position);
+                                position = null;
+                            } else {
+                                newPositions.add(addedPosition);
+                                addedPosition = null;
+                            }
+                        } else {
+                            newPositions.add(position);
+                            position = null;
+                        }
+                    } else if (addedPosition != null) {
+                        newPositions.add(addedPosition);
+                        addedPosition = null;
+                    }
+                }
+                fPositions = newPositions;
+            }
+        } catch (BadPositionCategoryException e) {
+            // Should not happen
+            YangEditorPlugin.log(e);
+        } catch (BadLocationException e) {
+            // Should not happen
+            YangEditorPlugin.log(e);
+        }
+        //             checkOrdering("new positions: ", fPositions); //$NON-NLS-1$
+
+        if (textPresentation != null) {
+            fSourceViewer.changeTextPresentation(textPresentation, false);
+        } else {
+            fSourceViewer.invalidateTextPresentation();
+        }
+    }
+
+    // private void checkOrdering(String s, List positions) {
+    // Position previous= null;
+    // for (int i= 0, n= positions.size(); i < n; i++) {
+    // Position current= (Position) positions.get(i);
+    // if (previous != null && previous.getOffset() + previous.getLength() > current.getOffset())
+    // return;
+    // }
+    // }
+
+    /**
+     * Returns <code>true</code> iff the positions contain the position.
+     *
+     * @param positions the positions, must be ordered by offset but may overlap
+     * @param position the position
+     * @return <code>true</code> iff the positions contain the position
+     */
+    private boolean contain(List<? extends Position> positions, Position position) {
+        return indexOf(positions, position) != -1;
+    }
+
+    /**
+     * Returns index of the position in the positions, <code>-1</code> if not found.
+     *
+     * @param positions the positions, must be ordered by offset but may overlap
+     * @param position the position
+     * @return the index
+     */
+    private int indexOf(List<? extends Position> positions, Position position) {
+        int index = computeIndexAtOffset(positions, position.getOffset());
+        int size = positions.size();
+        while (index < size) {
+            if (positions.get(index) == position) {
+                return index;
+            }
+            index++;
+        }
+        return -1;
+    }
+
+    /**
+     * Insert the given position in <code>fPositions</code>, s.t. the offsets remain in linear
+     * order.
+     *
+     * @param position The position for insertion
+     */
+    private void insertPosition(Position position) {
+        int i = computeIndexAfterOffset(fPositions, position.getOffset());
+        fPositions.add(i, position);
+    }
+
+    /**
+     * Returns the index of the first position with an offset greater than the given offset.
+     *
+     * @param positions the positions, must be ordered by offset and must not overlap
+     * @param offset the offset
+     * @return the index of the last position with an offset greater than the given offset
+     */
+    private int computeIndexAfterOffset(List<Position> positions, int offset) {
+        int i = -1;
+        int j = positions.size();
+        while (j - i > 1) {
+            int k = (i + j) >> 1;
+                            Position position = positions.get(k);
+                            if (position.getOffset() > offset) {
+                                j = k;
+                            } else {
+                                i = k;
+                            }
+        }
+        return j;
+    }
+
+    /**
+     * Returns the index of the first position with an offset equal or greater than the given
+     * offset.
+     */
+    private int computeIndexAtOffset(List<? extends Position> positions, int offset) {
+        int i = -1;
+        int j = positions.size();
+        while (j - i > 1) {
+            int k = (i + j) >> 1;
+                Position position = positions.get(k);
+                if (position.getOffset() >= offset) {
+                    j = k;
+                } else {
+                    i = k;
+                }
+        }
+        return j;
+    }
+
+    /*
+     * @see
+     * org.eclipse.jface.text.ITextPresentationListener#applyTextPresentation(org.eclipse.jface.
+     * text.TextPresentation)
+     */
+    @Override
+    public void applyTextPresentation(TextPresentation textPresentation) {
+        IRegion region = textPresentation.getExtent();
+        int i = computeIndexAtOffset(fPositions, region.getOffset()), n = computeIndexAtOffset(fPositions,
+                region.getOffset() + region.getLength());
+        if (n - i > 2) {
+            List<StyleRange> ranges = new ArrayList<StyleRange>(n - i);
+            for (; i < n; i++) {
+                HighlightedPosition position = (HighlightedPosition) fPositions.get(i);
+                if (!position.isDeleted()) {
+                    ranges.add(position.createStyleRange());
+                }
+            }
+            StyleRange[] array = new StyleRange[ranges.size()];
+            array = ranges.toArray(array);
+            textPresentation.replaceStyleRanges(array);
+        } else {
+            for (; i < n; i++) {
+                HighlightedPosition position = (HighlightedPosition) fPositions.get(i);
+                if (!position.isDeleted()) {
+                    textPresentation.replaceStyleRange(position.createStyleRange());
+                }
+            }
+        }
+    }
+
+    /*
+     * @see
+     * org.eclipse.jface.text.ITextInputListener#inputDocumentAboutToBeChanged(org.eclipse.jface
+     * .text.IDocument, org.eclipse.jface.text.IDocument)
+     */
+    @Override
+    public void inputDocumentAboutToBeChanged(IDocument oldInput, IDocument newInput) {
+        setCanceled(true);
+        releaseDocument(oldInput);
+        resetState();
+    }
+
+    /*
+     * @see
+     * org.eclipse.jface.text.ITextInputListener#inputDocumentChanged(org.eclipse.jface.text.IDocument
+     * , org.eclipse.jface.text.IDocument)
+     */
+    @Override
+    public void inputDocumentChanged(IDocument oldInput, IDocument newInput) {
+        manageDocument(newInput);
+    }
+
+    /*
+     * @see
+     * org.eclipse.jface.text.IDocumentListener#documentAboutToBeChanged(org.eclipse.jface.text.
+     * DocumentEvent)
+     */
+    @Override
+    public void documentAboutToBeChanged(DocumentEvent event) {
+        setCanceled(true);
+    }
+
+    /*
+     * @see
+     * org.eclipse.jface.text.IDocumentListener#documentChanged(org.eclipse.jface.text.DocumentEvent
+     * )
+     */
+    @Override
+    public void documentChanged(DocumentEvent event) {
+    }
+
+    /**
+     * @return Returns <code>true</code> iff the current reconcile is canceled.
+     */
+    public boolean isCanceled() {
+        IDocument document = fSourceViewer != null ? fSourceViewer.getDocument() : null;
+        if (document == null) {
+            return fIsCanceled;
+        }
+
+        synchronized (getLockObject(document)) {
+            return fIsCanceled;
+        }
+    }
+
+    /**
+     * Set whether or not the current reconcile is canceled.
+     */
+    public void setCanceled(boolean isCanceled) {
+        IDocument document = fSourceViewer != null ? fSourceViewer.getDocument() : null;
+        if (document == null) {
+            fIsCanceled = isCanceled;
+            return;
+        }
+
+        synchronized (getLockObject(document)) {
+            fIsCanceled = isCanceled;
+        }
+    }
+
+    /**
+     * @param document the document
+     * @return the document's lock object
+     */
+    private Object getLockObject(IDocument document) {
+        if (document instanceof ISynchronizable) {
+            Object lock = ((ISynchronizable) document).getLockObject();
+            if (lock != null) {
+                return lock;
+            }
+        }
+        return document;
+    }
+
+    /**
+     * Install this presenter on the given source viewer and background presentation reconciler.
+     */
+    public void install(SourceViewer sourceViewer, YangPresentationReconciler backgroundPresentationReconciler) {
+        fSourceViewer = sourceViewer;
+        fPresentationReconciler = backgroundPresentationReconciler;
+
+        ((YangSourceViewer) fSourceViewer).prependTextPresentationListener(this);
+        fSourceViewer.addTextInputListener(this);
+        manageDocument(fSourceViewer.getDocument());
+    }
+
+    /**
+     * Uninstall this presenter.
+     */
+    public void uninstall() {
+        setCanceled(true);
+
+        if (fSourceViewer != null) {
+            fSourceViewer.removeTextPresentationListener(this);
+            releaseDocument(fSourceViewer.getDocument());
+            invalidateTextPresentation();
+            resetState();
+
+            fSourceViewer.removeTextInputListener(this);
+            fSourceViewer = null;
+        }
+    }
+
+    /**
+     * Invalidate text presentation of positions with the given highlighting.
+     *
+     * @param highlighting The highlighting
+     */
+    public void highlightingStyleChanged(Highlighting highlighting) {
+        for (int i = 0, n = fPositions.size(); i < n; i++) {
+            HighlightedPosition position = (HighlightedPosition) fPositions.get(i);
+            if (position.getHighlighting() == highlighting) {
+                fSourceViewer.invalidateTextPresentation(position.getOffset(), position.getLength());
+            }
+        }
+    }
+
+    /**
+     * Invalidate text presentation of all positions.
+     */
+    private void invalidateTextPresentation() {
+        for (int i = 0, n = fPositions.size(); i < n; i++) {
+            Position position = fPositions.get(i);
+            fSourceViewer.invalidateTextPresentation(position.getOffset(), position.getLength());
+        }
+    }
+
+    /**
+     * Add a position with the given range and highlighting unconditionally, only from UI thread.
+     * The position will also be registered on the document. The text presentation is not
+     * invalidated.
+     *
+     * @param offset The range offset
+     * @param length The range length
+     * @param highlighting the highlighting
+     */
+    private void addPositionFromUI(int offset, int length, Highlighting highlighting) {
+        Position position = createHighlightedPosition(offset, length, highlighting);
+        synchronized (fPositionLock) {
+            insertPosition(position);
+        }
+
+        IDocument document = fSourceViewer.getDocument();
+        if (document == null) {
+            return;
+        }
+        String positionCategory = getPositionCategory();
+        try {
+            document.addPosition(positionCategory, position);
+        } catch (BadLocationException e) {
+            // Should not happen
+            YangEditorPlugin.log(e);
+        } catch (BadPositionCategoryException e) {
+            // Should not happen
+            YangEditorPlugin.log(e);
+        }
+    }
+
+    /**
+     * Reset to initial state.
+     */
+    private void resetState() {
+        synchronized (fPositionLock) {
+            fPositions.clear();
+        }
+    }
+
+    /**
+     * Start managing the given document.
+     *
+     * @param document The document
+     */
+    private void manageDocument(IDocument document) {
+        if (document != null) {
+            document.addPositionCategory(getPositionCategory());
+            document.addPositionUpdater(fPositionUpdater);
+            document.addDocumentListener(this);
+        }
+    }
+
+    /**
+     * Stop managing the given document.
+     *
+     * @param document The document
+     */
+    private void releaseDocument(IDocument document) {
+        if (document != null) {
+            document.removeDocumentListener(this);
+            document.removePositionUpdater(fPositionUpdater);
+            try {
+                document.removePositionCategory(getPositionCategory());
+            } catch (BadPositionCategoryException e) {
+                // Should not happen
+                YangEditorPlugin.log(e);
+            }
+        }
+    }
+
+    /**
+     * @return The semantic reconciler position's category.
+     */
+    private String getPositionCategory() {
+        return toString();
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/SemanticHighlightingReconciler.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/SemanticHighlightingReconciler.java
new file mode 100644 (file)
index 0000000..acf8ecc
--- /dev/null
@@ -0,0 +1,530 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextInputListener;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.TextPresentation;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchPartSite;
+
+import com.cisco.yangide.core.YangModelException;
+import com.cisco.yangide.core.dom.ASTNode;
+import com.cisco.yangide.core.dom.ASTVisitor;
+import com.cisco.yangide.core.dom.GroupingDefinition;
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.core.dom.TypeDefinition;
+import com.cisco.yangide.core.dom.TypeReference;
+import com.cisco.yangide.core.dom.UsesNode;
+import com.cisco.yangide.editor.YangEditorPlugin;
+import com.cisco.yangide.editor.editors.SemanticHighlightingManager.HighlightedPosition;
+import com.cisco.yangide.editor.editors.SemanticHighlightingManager.Highlighting;
+
+/**
+ * Semantic highlighting reconciler - Background thread implementation.
+ *
+ * @author Alexey Kholupko
+ */
+public class SemanticHighlightingReconciler implements ITextInputListener {
+
+    /**
+     * Collects positions from the AST.
+     */
+    private class PositionCollector extends ASTVisitor {
+
+        /** The semantic token */
+        private ASTNode fToken = null;
+
+        /*
+         * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.SimpleName)
+         */
+        @Override
+        public boolean visit(Module node) {
+            return true;
+        }
+
+        /*
+         * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.SimpleName)
+         */
+        @Override
+        public boolean visit(TypeReference node) {
+            if ((node.getFlags() & ASTNode.MALFORMED) == ASTNode.MALFORMED) {
+                retainPositions(node.getStartPosition(), node.getLength());
+                return false;
+            }
+            fToken = node;
+            for (int i = 0, n = fJobSemanticHighlightings.length; i < n; i++) {
+                SemanticHighlighting semanticHighlighting = fJobSemanticHighlightings[i];
+                if (fJobHighlightings[i].isEnabled() && semanticHighlighting.consumes(fToken)) {
+                    int offset = semanticHighlighting.getHiglightingOffset(node);
+                    int length = semanticHighlighting.getHiglightingLength(node);
+                    if (offset > -1 && length > 0) {
+                        addPosition(offset, length, fJobHighlightings[i]);
+                        // break;
+                    }
+                }
+            }
+            return true;
+        }
+
+        @Override
+        public boolean visit(UsesNode node) {
+            if ((node.getFlags() & ASTNode.MALFORMED) == ASTNode.MALFORMED) {
+                retainPositions(node.getStartPosition(), node.getLength());
+                return false;
+            }
+            fToken = node;
+            for (int i = 0, n = fJobSemanticHighlightings.length; i < n; i++) {
+                SemanticHighlighting semanticHighlighting = fJobSemanticHighlightings[i];
+                if (fJobHighlightings[i].isEnabled() && semanticHighlighting.consumes(fToken)) {
+                    int offset = semanticHighlighting.getHiglightingOffset(node);
+                    int length = semanticHighlighting.getHiglightingLength(node);
+                    if (offset > -1 && length > 0) {
+                        addPosition(offset, length, fJobHighlightings[i]);
+                        // break;
+                    }
+                }
+            }
+            return true;
+        }
+
+        @Override
+        public boolean visit(GroupingDefinition node) {
+            if ((node.getFlags() & ASTNode.MALFORMED) == ASTNode.MALFORMED) {
+                retainPositions(node.getStartPosition(), node.getLength());
+                return false;
+            }
+            fToken = node;
+            for (int i = 0, n = fJobSemanticHighlightings.length; i < n; i++) {
+                SemanticHighlighting semanticHighlighting = fJobSemanticHighlightings[i];
+                if (fJobHighlightings[i].isEnabled() && semanticHighlighting.consumes(fToken)) {
+                    int offset = semanticHighlighting.getHiglightingOffset(node);
+                    int length = semanticHighlighting.getHiglightingLength(node);
+                    if (offset > -1 && length > 0) {
+                        addPosition(offset, length, fJobHighlightings[i]);
+                        // break;
+                    }
+                }
+            }
+            return true;
+        }
+
+        @Override
+        public boolean visit(TypeDefinition node) {
+            if ((node.getFlags() & ASTNode.MALFORMED) == ASTNode.MALFORMED) {
+                retainPositions(node.getStartPosition(), node.getLength());
+                return false;
+            }
+            fToken = node;
+            for (int i = 0, n = fJobSemanticHighlightings.length; i < n; i++) {
+                SemanticHighlighting semanticHighlighting = fJobSemanticHighlightings[i];
+                if (fJobHighlightings[i].isEnabled() && semanticHighlighting.consumes(fToken)) {
+                    int offset = semanticHighlighting.getHiglightingOffset(node);
+                    int length = semanticHighlighting.getHiglightingLength(node);
+                    if (offset > -1 && length > 0) {
+                        addPosition(offset, length, fJobHighlightings[i]);
+                    }
+                    break;
+                }
+            }
+            return true;
+        }
+
+        /**
+         * Add a position with the given range and highlighting iff it does not exist already.
+         *
+         * @param offset The range offset
+         * @param length The range length
+         * @param highlighting The highlighting
+         */
+        private void addPosition(int offset, int length, Highlighting highlighting) {
+            boolean isExisting = false;
+            // TODO: use binary search
+            for (int i = 0, n = fRemovedPositions.size(); i < n; i++) {
+                HighlightedPosition position = (HighlightedPosition) fRemovedPositions.get(i);
+                if (position == null) {
+                    continue;
+                }
+                if (position.isEqual(offset, length, highlighting)) {
+                    isExisting = true;
+                    fRemovedPositions.set(i, null);
+                    fNOfRemovedPositions--;
+                    break;
+                }
+            }
+
+            if (!isExisting) {
+                Position position = fJobPresenter.createHighlightedPosition(offset, length, highlighting);
+                fAddedPositions.add(position);
+            }
+        }
+
+        /**
+         * Retain the positions completely contained in the given range.
+         *
+         * @param offset The range offset
+         * @param length The range length
+         */
+        private void retainPositions(int offset, int length) {
+            // TODO: use binary search
+            for (int i = 0, n = fRemovedPositions.size(); i < n; i++) {
+                HighlightedPosition position = (HighlightedPosition) fRemovedPositions.get(i);
+                if (position != null && position.isContained(offset, length)) {
+                    fRemovedPositions.set(i, null);
+                    fNOfRemovedPositions--;
+                }
+            }
+        }
+    }
+
+    /** Position collector */
+    private PositionCollector fCollector = new PositionCollector();
+
+    /** The Java editor this semantic highlighting reconciler is installed on */
+    private YangEditor fEditor;
+    /** The source viewer this semantic highlighting reconciler is installed on */
+    private ISourceViewer fSourceViewer;
+    /** The semantic highlighting presenter */
+    private SemanticHighlightingPresenter fPresenter;
+    /** Semantic highlightings */
+    private SemanticHighlighting[] fSemanticHighlightings;
+    /** Highlightings */
+    private Highlighting[] fHighlightings;
+
+    /** Background job's added highlighted positions */
+    private List<Position> fAddedPositions = new ArrayList<Position>();
+    /** Background job's removed highlighted positions */
+    private List<Position> fRemovedPositions = new ArrayList<Position>();
+    /** Number of removed positions */
+    private int fNOfRemovedPositions;
+
+    /** Background job */
+    private Job fJob;
+    /** Background job lock */
+    private final Object fJobLock = new Object();
+    /**
+     * Reconcile operation lock.
+     */
+    private final Object fReconcileLock = new Object();
+    /**
+     * <code>true</code> if any thread is executing <code>reconcile</code>, <code>false</code>
+     * otherwise.
+     */
+    private boolean fIsReconciling = false;
+
+    /**
+     * The semantic highlighting presenter - cache for background thread, only valid during
+     */
+    private SemanticHighlightingPresenter fJobPresenter;
+    /**
+     * Semantic highlightings - cache for background thread, only valid during
+     */
+    private SemanticHighlighting[] fJobSemanticHighlightings;
+    /**
+     * Highlightings - cache for background thread, only valid during
+     */
+    private Highlighting[] fJobHighlightings;
+
+    /*
+     * @see org.eclipse.jdt.internal.ui.text.java.IJavaReconcilingListener#aboutToBeReconciled()
+     */
+    public void aboutToBeReconciled() {
+        // Do nothing
+    }
+
+    /*
+     * @see
+     * org.eclipse.jdt.internal.ui.text.java.IJavaReconcilingListener#reconciled(CompilationUnit,
+     * boolean, IProgressMonitor)
+     */
+    public void reconciled(ASTNode ast, boolean forced, IProgressMonitor progressMonitor) {
+        // ensure at most one thread can be reconciling at any time
+        synchronized (fReconcileLock) {
+            if (fIsReconciling) {
+                return;
+            } else {
+                fIsReconciling = true;
+            }
+        }
+        fJobPresenter = fPresenter;
+        fJobSemanticHighlightings = fSemanticHighlightings;
+        fJobHighlightings = fHighlightings;
+
+        try {
+            if (fJobPresenter == null || fJobSemanticHighlightings == null || fJobHighlightings == null) {
+                return;
+            }
+
+            fJobPresenter.setCanceled(progressMonitor.isCanceled());
+
+            if (ast == null || fJobPresenter.isCanceled()) {
+                return;
+            }
+
+            ASTNode[] subtrees = getAffectedSubtrees(ast);
+            if (subtrees.length == 0) {
+                return;
+            }
+
+            startReconcilingPositions();
+
+            if (!fJobPresenter.isCanceled()) {
+                reconcilePositions(subtrees);
+            }
+
+            TextPresentation textPresentation = null;
+            if (!fJobPresenter.isCanceled()) {
+                textPresentation = fJobPresenter.createPresentation(fAddedPositions, fRemovedPositions);
+            }
+
+            if (!fJobPresenter.isCanceled()) {
+                updatePresentation(textPresentation, fAddedPositions, fRemovedPositions);
+            }
+
+            stopReconcilingPositions();
+        } finally {
+            fJobPresenter = null;
+            fJobSemanticHighlightings = null;
+            fJobHighlightings = null;
+            synchronized (fReconcileLock) {
+                fIsReconciling = false;
+            }
+        }
+    }
+
+    /**
+     * @param node Root node
+     * @return Array of subtrees that may be affected by past document changes
+     */
+    private ASTNode[] getAffectedSubtrees(ASTNode node) {
+        // TODO: only return nodes which are affected by document changes - would require an
+        // 'anchor' concept for taking distant effects into account
+        return new ASTNode[] { node };
+    }
+
+    /**
+     * Start reconciling positions.
+     */
+    private void startReconcilingPositions() {
+        fJobPresenter.addAllPositions(fRemovedPositions);
+        fNOfRemovedPositions = fRemovedPositions.size();
+    }
+
+    /**
+     * Reconcile positions based on the AST subtrees
+     *
+     * @param subtrees the AST subtrees
+     */
+    private void reconcilePositions(ASTNode[] subtrees) {
+        // FIXME: remove positions not covered by subtrees
+
+        for (int i = 0, n = subtrees.length; i < n; i++) {
+            subtrees[i].accept(fCollector);
+        }
+        List<Position> oldPositions = fRemovedPositions;
+        List<Position> newPositions = new ArrayList<Position>(fNOfRemovedPositions);
+        for (int i = 0, n = oldPositions.size(); i < n; i++) {
+            Position current = oldPositions.get(i);
+            if (current != null) {
+                newPositions.add(current);
+            }
+        }
+        fRemovedPositions = newPositions;
+    }
+
+    /**
+     * Update the presentation.
+     *
+     * @param textPresentation the text presentation
+     * @param addedPositions the added positions
+     * @param removedPositions the removed positions
+     */
+    private void updatePresentation(TextPresentation textPresentation, List<Position> addedPositions,
+            List<Position> removedPositions) {
+        Runnable runnable = fJobPresenter.createUpdateRunnable(textPresentation, addedPositions, removedPositions);
+        if (runnable == null) {
+            return;
+        }
+
+        YangEditor editor = fEditor;
+        if (editor == null) {
+            return;
+        }
+
+        IWorkbenchPartSite site = editor.getSite();
+        if (site == null) {
+            return;
+        }
+
+        Shell shell = site.getShell();
+        if (shell == null || shell.isDisposed()) {
+            return;
+        }
+
+        Display display = shell.getDisplay();
+        if (display == null || display.isDisposed()) {
+            return;
+        }
+
+        display.asyncExec(runnable);
+    }
+
+    /**
+     * Stop reconciling positions.
+     */
+    private void stopReconcilingPositions() {
+        fRemovedPositions.clear();
+        fNOfRemovedPositions = 0;
+        fAddedPositions.clear();
+    }
+
+    /**
+     * Install this reconciler on the given editor, presenter and highlightings.
+     *
+     * @param editor the editor
+     * @param sourceViewer the source viewer
+     * @param presenter the semantic highlighting presenter
+     * @param semanticHighlightings the semantic highlightings
+     * @param highlightings the highlightings
+     */
+    public void install(YangEditor editor, ISourceViewer sourceViewer, SemanticHighlightingPresenter presenter,
+            SemanticHighlighting[] semanticHighlightings, Highlighting[] highlightings) {
+        fPresenter = presenter;
+        fSemanticHighlightings = semanticHighlightings;
+        fHighlightings = highlightings;
+
+        fEditor = editor;
+        fSourceViewer = sourceViewer;
+
+        fSourceViewer.addTextInputListener(this);
+        // fEditor.addReconcileListener(this);
+        fEditor.updateSemanticHigliting();
+        if (fEditor == null) {
+            scheduleJob();
+        }
+    }
+
+    /**
+     * Uninstall this reconciler from the editor
+     */
+    public void uninstall() {
+        if (fPresenter != null) {
+            fPresenter.setCanceled(true);
+        }
+
+        if (fEditor != null) {
+            fSourceViewer.removeTextInputListener(this);
+            fEditor = null;
+        }
+
+        fSourceViewer = null;
+        fSemanticHighlightings = null;
+        fHighlightings = null;
+        fPresenter = null;
+    }
+
+    /**
+     * Schedule a background job for retrieving the AST and reconciling the Semantic Highlighting
+     * model.
+     */
+    private void scheduleJob() {
+
+        synchronized (fJobLock) {
+            final Job oldJob = fJob;
+            if (fJob != null) {
+                fJob.cancel();
+                fJob = null;
+            }
+
+            // TODO some checks here
+            // final ITypeRoot element= fEditor.getInputJavaElement();
+            // if (element != null) {
+            fJob = new Job("JavaEditorMessages.SemanticHighlighting_job") {
+                @Override
+                protected IStatus run(IProgressMonitor monitor) {
+                    if (oldJob != null) {
+                        try {
+                            oldJob.join();
+                        } catch (InterruptedException e) {
+                            YangEditorPlugin.log(e);
+                            return Status.CANCEL_STATUS;
+                        }
+                    }
+                    if (monitor.isCanceled()) {
+                        return Status.CANCEL_STATUS;
+                    }
+
+                    Module ast;
+                    try {
+                        ast = fEditor.getModule();
+                    } catch (YangModelException e) {
+                        YangEditorPlugin.log(e);
+                        return Status.CANCEL_STATUS;
+                    }
+
+                    reconciled(ast, false, monitor);
+                    synchronized (fJobLock) {
+                        // allow the job to be gc'ed
+                        if (fJob == this) {
+                            fJob = null;
+                        }
+                    }
+                    return Status.OK_STATUS;
+                }
+            };
+            fJob.setSystem(true);
+            fJob.setPriority(Job.DECORATE);
+            fJob.schedule();
+            // }
+        }
+    }
+
+    /*
+     * @see
+     * org.eclipse.jface.text.ITextInputListener#inputDocumentAboutToBeChanged(org.eclipse.jface
+     * .text.IDocument, org.eclipse.jface.text.IDocument)
+     */
+    @Override
+    public void inputDocumentAboutToBeChanged(IDocument oldInput, IDocument newInput) {
+        synchronized (fJobLock) {
+            if (fJob != null) {
+                fJob.cancel();
+                fJob = null;
+            }
+        }
+    }
+
+    /*
+     * @see
+     * org.eclipse.jface.text.ITextInputListener#inputDocumentChanged(org.eclipse.jface.text.IDocument
+     * , org.eclipse.jface.text.IDocument)
+     */
+    @Override
+    public void inputDocumentChanged(IDocument oldInput, IDocument newInput) {
+        if (newInput != null) {
+            scheduleJob();
+        }
+    }
+
+    /**
+     * Refreshes the highlighting.
+     */
+    public void refresh() {
+        scheduleJob();
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/SemanticHighlightings.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/SemanticHighlightings.java
new file mode 100644 (file)
index 0000000..8f78df2
--- /dev/null
@@ -0,0 +1,551 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors;
+
+import org.eclipse.jdt.ui.PreferenceConstants;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferenceConverter;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.swt.graphics.RGB;
+
+import com.cisco.yangide.core.YangTypeUtil;
+import com.cisco.yangide.core.dom.ASTNamedNode;
+import com.cisco.yangide.core.dom.ASTNode;
+import com.cisco.yangide.core.dom.GroupingDefinition;
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.core.dom.SimpleNode;
+import com.cisco.yangide.core.dom.SubModule;
+import com.cisco.yangide.core.dom.TypeDefinition;
+import com.cisco.yangide.core.dom.TypeReference;
+import com.cisco.yangide.core.dom.UsesNode;
+import com.cisco.yangide.editor.preferences.YangPreferencesMessages;
+
+/**
+ * Semantic highlightings
+ *
+ * @author Alexey Kholupko
+ */
+public class SemanticHighlightings {
+
+    /**
+     * A named preference part that controls the highlighting of fields.
+     */
+    public static final String TYPE = "type"; //$NON-NLS-1$
+    public static final String GROUPING = "grouping"; //$NON-NLS-1$
+    public static final String PREFIX = "prefix"; //$NON-NLS-1$
+
+    /**
+     * Semantic highlightings
+     */
+    private static SemanticHighlighting[] fgSemanticHighlightings;
+
+    /**
+     * Semantic highlighting for client types.
+     */
+    private static final class TypeHighlighting extends SemanticHighlighting {
+
+        /*
+         * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#getPreferenceKey()
+         */
+        @Override
+        public String getPreferenceKey() {
+            return TYPE;
+        }
+
+        /*
+         * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextColor()
+         */
+        @Override
+        public RGB getDefaultTextColor() {
+            return new RGB(128, 128, 0);
+        }
+
+        /*
+         * @see
+         * org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextStyleBold()
+         */
+        @Override
+        public boolean isBoldByDefault() {
+            return false;
+        }
+
+        /*
+         * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isItalicByDefault()
+         */
+        @Override
+        public boolean isItalicByDefault() {
+            return true;
+        }
+
+        /*
+         * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isEnabledByDefault()
+         */
+        @Override
+        public boolean isEnabledByDefault() {
+            return true;
+        }
+
+        /*
+         * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDisplayName()
+         */
+        @Override
+        public String getDisplayName() {
+            return YangPreferencesMessages.SemanticHighlighting_type;
+        }
+
+        /*
+         * @see
+         * org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#consumes(org.eclipse.jdt.
+         * internal.ui.javaeditor.SemanticToken)
+         */
+        @Override
+        public boolean consumes(ASTNode node) {
+
+            if (node instanceof TypeReference) {
+                String typeWholeName = ((TypeReference) node).getName();
+                return !YangTypeUtil.isBuiltInType(typeWholeName);
+            }
+
+            return node instanceof TypeDefinition;
+        }
+
+        /*
+         * (non-Javadoc)
+         *
+         * @see
+         * com.cisco.yangide.editor.editors.SemanticHighlighting#getHiglightingOffset(com.cisco.
+         * yangide.core.dom.ASTNode)
+         */
+        @Override
+        public int getHiglightingOffset(ASTNode node) {
+            int result = -1;
+            String nodeModulePrefix = null;
+            if (node instanceof TypeReference) {
+                nodeModulePrefix = ((TypeReference) node).getType().getPrefix();
+            }
+
+            result = getHiglightingOffset(node, nodeModulePrefix);
+            return result;
+        }
+
+        /*
+         * (non-Javadoc)
+         *
+         * @see
+         * com.cisco.yangide.editor.editors.SemanticHighlighting#getHiglightingLength(com.cisco.
+         * yangide.core.dom.ASTNode)
+         */
+        @Override
+        public int getHiglightingLength(ASTNode node) {
+            int result = -1;
+            String nodeModulePrefix = null;
+            if (node instanceof TypeReference) {
+                nodeModulePrefix = ((TypeReference) node).getType().getPrefix();
+            }
+
+            result = getHiglightingLength(node, nodeModulePrefix);
+            return result;
+        }
+    }
+
+    /**
+     * Semantic highlighting for client groupings.
+     */
+    private static final class GroupingHighlighting extends SemanticHighlighting {
+
+        /*
+         * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#getPreferenceKey()
+         */
+        @Override
+        public String getPreferenceKey() {
+            return GROUPING;
+        }
+
+        /*
+         * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextColor()
+         */
+        @Override
+        public RGB getDefaultTextColor() {
+            return new RGB(168, 98, 0);
+        }
+
+        /*
+         * @see
+         * org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextStyleBold()
+         */
+        @Override
+        public boolean isBoldByDefault() {
+            return false;
+        }
+
+        /*
+         * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isItalicByDefault()
+         */
+        @Override
+        public boolean isItalicByDefault() {
+            return true;
+        }
+
+        /*
+         * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isEnabledByDefault()
+         */
+        @Override
+        public boolean isEnabledByDefault() {
+            return true;
+        }
+
+        /*
+         * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDisplayName()
+         */
+        @Override
+        public String getDisplayName() {
+            return YangPreferencesMessages.SemanticHighlighting_grouping;
+        }
+
+        /*
+         * @see
+         * org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#consumes(org.eclipse.jdt.
+         * internal.ui.javaeditor.SemanticToken)
+         */
+        @Override
+        public boolean consumes(ASTNode node) {
+
+            return node instanceof GroupingDefinition || node instanceof UsesNode;
+        }
+
+        /*
+         * (non-Javadoc)
+         *
+         * @see
+         * com.cisco.yangide.editor.editors.SemanticHighlighting#getHiglightingOffset(com.cisco.
+         * yangide.core.dom.ASTNode)
+         */
+        @Override
+        public int getHiglightingOffset(ASTNode node) {
+            int result = -1;
+
+            String nodeModulePrefix = null;
+            if (node instanceof UsesNode) {
+                nodeModulePrefix = ((UsesNode) node).getGrouping().getPrefix();
+            }
+
+            result = getHiglightingOffset(node, nodeModulePrefix);
+            return result;
+        }
+
+        /*
+         * (non-Javadoc)
+         *
+         * @see
+         * com.cisco.yangide.editor.editors.SemanticHighlighting#getHiglightingLength(com.cisco.
+         * yangide.core.dom.ASTNode)
+         */
+        @Override
+        public int getHiglightingLength(ASTNode node) {
+            int result = -1;
+
+            String nodeModulePrefix = null;
+            if (node instanceof UsesNode) {
+                nodeModulePrefix = ((UsesNode) node).getGrouping().getPrefix();
+            }
+
+            result = getHiglightingLength(node, nodeModulePrefix);
+            return result;
+        }
+    }
+
+    /**
+     * Semantic highlighting for fields.
+     */
+    private static final class PrefixHighlighting extends SemanticHighlighting {
+
+        /*
+         * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#getPreferenceKey()
+         */
+        @Override
+        public String getPreferenceKey() {
+            return PREFIX;
+        }
+
+        /*
+         * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextColor()
+         */
+        @Override
+        public RGB getDefaultTextColor() {
+            return new RGB(128, 128, 128);
+        }
+
+        /*
+         * @see
+         * org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDefaultTextStyleBold()
+         */
+        @Override
+        public boolean isBoldByDefault() {
+            return false;
+        }
+
+        /*
+         * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isItalicByDefault()
+         */
+        @Override
+        public boolean isItalicByDefault() {
+            return true;
+        }
+
+        /*
+         * @see org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#isEnabledByDefault()
+         */
+        @Override
+        public boolean isEnabledByDefault() {
+            return true;
+        }
+
+        /*
+         * @see org.eclipse.jdt.internal.ui.javaeditor.ISemanticHighlighting#getDisplayName()
+         */
+        @Override
+        public String getDisplayName() {
+            return YangPreferencesMessages.SemanticHighlighting_prefix;
+        }
+
+        /*
+         * @see
+         * org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlighting#consumes(org.eclipse.jdt.
+         * internal.ui.javaeditor.SemanticToken)
+         */
+        @Override
+        public boolean consumes(ASTNode node) {
+
+            String thisModulePrefix = null;
+            ASTNode thisModule = node.getModule();
+            if (thisModule instanceof SubModule) {
+                thisModulePrefix = null;// ((SubModule) thisModule).getParentPrefix();
+            } else {
+                SimpleNode<String> prefixNode = ((Module) thisModule).getPrefix();
+                if (prefixNode != null) {
+                    thisModulePrefix = prefixNode.getValue();
+                }
+            }
+
+            if (node instanceof TypeReference) {
+                String typeWholeName = ((TypeReference) node).getName();
+                String typePrefix = ((TypeReference) node).getType().getPrefix();
+
+                return !YangTypeUtil.isBuiltInType(typeWholeName) && !typePrefix.equals(thisModulePrefix);
+
+            }
+
+            if (node instanceof UsesNode) {
+                String usesPrefix = ((UsesNode) node).getGrouping().getPrefix();
+                if (usesPrefix != null) {
+                    return !usesPrefix.equals(thisModulePrefix);
+                }
+            }
+
+            return false;
+        }
+
+        /*
+         * (non-Javadoc)
+         *
+         * @see
+         * com.cisco.yangide.editor.editors.SemanticHighlighting#getHiglightingOffset(com.cisco.
+         * yangide.core.dom.ASTNode)
+         */
+        @Override
+        public int getHiglightingOffset(ASTNode node) {
+            if (node instanceof ASTNamedNode) {
+                ASTNamedNode nnode = (ASTNamedNode) node;
+                // increase offset because of quoted name
+                return nnode.getName().length() != nnode.getNameLength() ? nnode.getNameStartPosition() + 1 : nnode
+                        .getNameStartPosition();
+            }
+
+            return -1;
+        }
+
+        /*
+         * (non-Javadoc)
+         *
+         * @see
+         * com.cisco.yangide.editor.editors.SemanticHighlighting#getHiglightingLength(com.cisco.
+         * yangide.core.dom.ASTNode)
+         */
+        @Override
+        public int getHiglightingLength(ASTNode node) {
+            if (node instanceof TypeReference) {
+                return ((TypeReference) node).getType().getPrefix().length();
+            }
+
+            if (node instanceof UsesNode) {
+                return ((UsesNode) node).getGrouping().getPrefix().length();
+            }
+
+            return -1;
+        }
+    }
+
+    /**
+     * A named preference that controls the given semantic highlighting's color.
+     */
+    public static String getColorPreferenceKey(SemanticHighlighting semanticHighlighting) {
+        return PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_PREFIX + semanticHighlighting.getPreferenceKey()
+                + PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_COLOR_SUFFIX;
+    }
+
+    /**
+     * A named preference that controls if the given semantic highlighting has the text attribute
+     * bold.
+     */
+    public static String getBoldPreferenceKey(SemanticHighlighting semanticHighlighting) {
+        return PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_PREFIX + semanticHighlighting.getPreferenceKey()
+                + PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_BOLD_SUFFIX;
+    }
+
+    /**
+     * A named preference that controls if the given semantic highlighting has the text attribute
+     * italic.
+     */
+    public static String getItalicPreferenceKey(SemanticHighlighting semanticHighlighting) {
+        return PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_PREFIX + semanticHighlighting.getPreferenceKey()
+                + PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_ITALIC_SUFFIX;
+    }
+
+    /**
+     * A named preference that controls if the given semantic highlighting has the text attribute
+     * strikethrough.
+     */
+    public static String getStrikethroughPreferenceKey(SemanticHighlighting semanticHighlighting) {
+        return PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_PREFIX + semanticHighlighting.getPreferenceKey()
+                + PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_STRIKETHROUGH_SUFFIX;
+    }
+
+    /**
+     * A named preference that controls if the given semantic highlighting has the text attribute
+     * underline.
+     */
+    public static String getUnderlinePreferenceKey(SemanticHighlighting semanticHighlighting) {
+        return PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_PREFIX + semanticHighlighting.getPreferenceKey()
+                + PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_UNDERLINE_SUFFIX;
+    }
+
+    /**
+     * A named preference that controls if the given semantic highlighting is enabled.
+     */
+    public static String getEnabledPreferenceKey(SemanticHighlighting semanticHighlighting) {
+        return PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_PREFIX + semanticHighlighting.getPreferenceKey()
+                + PreferenceConstants.EDITOR_SEMANTIC_HIGHLIGHTING_ENABLED_SUFFIX;
+    }
+
+    /**
+     * @return The semantic highlightings, the order defines the precedence of matches, the first
+     * match wins.
+     */
+    public static SemanticHighlighting[] getSemanticHighlightings() {
+        if (fgSemanticHighlightings == null) {
+            fgSemanticHighlightings = new SemanticHighlighting[] { new TypeHighlighting(), new GroupingHighlighting(),
+                    new PrefixHighlighting() };
+        }
+        return fgSemanticHighlightings;
+    }
+
+    /**
+     * Initialize default preferences in the given preference store.
+     *
+     * @param store The preference store TODO refactor and call from PreferenceInitializer
+     */
+    public static void initDefaults(IPreferenceStore store) {
+        SemanticHighlighting[] semanticHighlightings = getSemanticHighlightings();
+        for (int i = 0, n = semanticHighlightings.length; i < n; i++) {
+            SemanticHighlighting semanticHighlighting = semanticHighlightings[i];
+            setDefaultAndFireEvent(store, SemanticHighlightings.getColorPreferenceKey(semanticHighlighting),
+                    semanticHighlighting.getDefaultTextColor());
+            store.setDefault(SemanticHighlightings.getBoldPreferenceKey(semanticHighlighting),
+                    semanticHighlighting.isBoldByDefault());
+            store.setDefault(SemanticHighlightings.getItalicPreferenceKey(semanticHighlighting),
+                    semanticHighlighting.isItalicByDefault());
+            store.setDefault(SemanticHighlightings.getStrikethroughPreferenceKey(semanticHighlighting),
+                    semanticHighlighting.isStrikethroughByDefault());
+            store.setDefault(SemanticHighlightings.getUnderlinePreferenceKey(semanticHighlighting),
+                    semanticHighlighting.isUnderlineByDefault());
+            store.setDefault(SemanticHighlightings.getEnabledPreferenceKey(semanticHighlighting),
+                    semanticHighlighting.isEnabledByDefault());
+        }
+
+    }
+
+    /**
+     * Tests whether <code>event</code> in <code>store</code> affects the enablement of semantic
+     * highlighting.
+     */
+    public static boolean affectsEnablement(IPreferenceStore store, PropertyChangeEvent event) {
+        String relevantKey = null;
+        SemanticHighlighting[] highlightings = getSemanticHighlightings();
+        for (int i = 0; i < highlightings.length; i++) {
+            if (event.getProperty().equals(getEnabledPreferenceKey(highlightings[i]))) {
+                relevantKey = event.getProperty();
+                break;
+            }
+        }
+        if (relevantKey == null) {
+            return false;
+        }
+
+        for (int i = 0; i < highlightings.length; i++) {
+            String key = getEnabledPreferenceKey(highlightings[i]);
+            if (key.equals(relevantKey)) {
+                continue;
+            }
+            if (store.getBoolean(key)) {
+                return false; // another is still enabled or was enabled before
+            }
+        }
+
+        // all others are disabled, so toggling relevantKey affects the enablement
+        return true;
+    }
+
+    /**
+     * Tests whether semantic highlighting is currently enabled.
+     */
+    public static boolean isEnabled(IPreferenceStore store) {
+        SemanticHighlighting[] highlightings = getSemanticHighlightings();
+        boolean enable = false;
+        for (int i = 0; i < highlightings.length; i++) {
+            String enabledKey = getEnabledPreferenceKey(highlightings[i]);
+            if (store.getBoolean(enabledKey)) {
+                enable = true;
+                break;
+            }
+        }
+
+        return enable;
+    }
+
+    /**
+     * Sets the default value and fires a property change event if necessary.
+     */
+    private static void setDefaultAndFireEvent(IPreferenceStore store, String key, RGB newValue) {
+        RGB oldValue = null;
+        if (store.isDefault(key)) {
+            oldValue = PreferenceConverter.getDefaultColor(store, key);
+        }
+
+        PreferenceConverter.setDefault(store, key, newValue);
+
+        if (oldValue != null && !oldValue.equals(newValue)) {
+            store.firePropertyChangeEvent(key, oldValue, newValue);
+        }
+    }
+
+    /**
+     * Do not instantiate
+     */
+    private SemanticHighlightings() {
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangAutoIndentStrategy.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangAutoIndentStrategy.java
new file mode 100644 (file)
index 0000000..3795b38
--- /dev/null
@@ -0,0 +1,863 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jdt.ui.PreferenceConstants;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.DefaultIndentLineAutoEditStrategy;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.DocumentCommand;
+import org.eclipse.jface.text.DocumentRewriteSession;
+import org.eclipse.jface.text.DocumentRewriteSessionType;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.TextUtilities;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.ui.texteditor.AbstractDecoratedTextEditorPreferenceConstants;
+
+import com.cisco.yangide.editor.YangEditorPlugin;
+import com.cisco.yangide.editor.editors.text.Symbols;
+import com.cisco.yangide.editor.editors.text.YangHeuristicScanner;
+import com.cisco.yangide.editor.editors.text.YangIndenter;
+import com.cisco.yangide.editor.preferences.YangDocumentSetupParticipant;
+import com.cisco.yangide.ui.YangUIPlugin;
+import com.cisco.yangide.ui.preferences.YangPreferenceConstants;
+
+/**
+ * Auto indent strategy sensitive to brackets.
+ *
+ * @author Alexey Kholupko
+ */
+public class YangAutoIndentStrategy extends DefaultIndentLineAutoEditStrategy {
+
+    /** The line comment introducer. Value is "{@value} " */
+    private static final String LINE_COMMENT = "//"; //$NON-NLS-1$
+
+    private boolean fCloseBrace;
+    private boolean fIsSmartIndentAfterNewline;
+
+    private String fPartitioning;
+    /**
+     * The viewer.
+     */
+    private final ISourceViewer fViewer;
+
+    /**
+     * Creates a new YANG auto indent strategy for the given document partitioning.
+     *
+     * @param partitioning the document partitioning
+     * @param viewer the source viewer that this strategy is attached to
+     */
+    public YangAutoIndentStrategy(String partitioning, ISourceViewer viewer) {
+        fPartitioning = partitioning;
+        fViewer = viewer;
+    }
+
+    private int getBracketCount(IDocument d, int startOffset, int endOffset, boolean ignoreCloseBrackets)
+            throws BadLocationException {
+
+        int bracketCount = 0;
+        while (startOffset < endOffset) {
+            char curr = d.getChar(startOffset);
+            startOffset++;
+            switch (curr) {
+            case '/':
+                if (startOffset < endOffset) {
+                    char next = d.getChar(startOffset);
+                    if (next == '*') {
+                        // a comment starts, advance to the comment end
+                        startOffset = getCommentEnd(d, startOffset + 1, endOffset);
+                    } else if (next == '/') {
+                        // '//'-comment: nothing to do anymore on this line
+                        startOffset = endOffset;
+                    }
+                }
+                break;
+            case '*':
+                if (startOffset < endOffset) {
+                    char next = d.getChar(startOffset);
+                    if (next == '/') {
+                        // we have been in a comment: forget what we read before
+                        bracketCount = 0;
+                        startOffset++;
+                    }
+                }
+                break;
+            case '{':
+                bracketCount++;
+                ignoreCloseBrackets = false;
+                break;
+            case '}':
+                if (!ignoreCloseBrackets) {
+                    bracketCount--;
+                }
+                break;
+            case '"':
+            case '\'':
+                startOffset = getStringEnd(d, startOffset, endOffset, curr);
+                break;
+            default:
+            }
+        }
+        return bracketCount;
+    }
+
+    // ----------- bracket counting ------------------------------------------------------
+
+    private int getCommentEnd(IDocument d, int offset, int endOffset) throws BadLocationException {
+        while (offset < endOffset) {
+            char curr = d.getChar(offset);
+            offset++;
+            if (curr == '*') {
+                if (offset < endOffset && d.getChar(offset) == '/') {
+                    return offset + 1;
+                }
+            }
+        }
+        return endOffset;
+    }
+
+    private String getIndentOfLine(IDocument d, int line) throws BadLocationException {
+        if (line > -1) {
+            int start = d.getLineOffset(line);
+            int end = start + d.getLineLength(line) - 1;
+            int whiteEnd = findEndOfWhiteSpace(d, start, end);
+            return d.get(start, whiteEnd - start);
+        } else {
+            return ""; //$NON-NLS-1$
+        }
+    }
+
+    private int getStringEnd(IDocument d, int offset, int endOffset, char ch) throws BadLocationException {
+        while (offset < endOffset) {
+            char curr = d.getChar(offset);
+            offset++;
+            if (curr == '\\') {
+                // ignore escaped characters
+                offset++;
+            } else if (curr == ch) {
+                return offset;
+            }
+        }
+        return endOffset;
+    }
+
+    private void smartIndentAfterClosingBracket(IDocument d, DocumentCommand c) {
+        if (c.offset == -1 || d.getLength() == 0) {
+            return;
+        }
+
+        try {
+
+            int p = (c.offset == d.getLength() ? c.offset - 1 : c.offset);
+            int line = d.getLineOfOffset(p);
+            int start = d.getLineOffset(line);
+            int whiteend = findEndOfWhiteSpace(d, start, c.offset);
+
+            YangHeuristicScanner scanner = new YangHeuristicScanner(d);
+            YangIndenter indenter = new YangIndenter(d, scanner);
+
+            // shift only when line does not contain any text up to the closing bracket
+            if (whiteend == c.offset) { // evaluate the line with the opening bracket that matches
+                // out closing bracket
+
+                int reference = indenter.findReferencePosition(c.offset, false, true, false, false);
+                int indLine = d.getLineOfOffset(reference);
+                if (indLine != -1 && indLine != line) { // take the indent of the found line
+                    StringBuffer replaceText = new StringBuffer(getIndentOfLine(d, indLine));
+                    // add the rest of the current line including the just added close bracket
+                    replaceText.append(d.get(whiteend, c.offset - whiteend));
+                    replaceText.append(c.text); // modify document command
+                    c.length += c.offset - start;
+                    c.offset = start;
+                    c.text = replaceText.toString();
+                }
+            }
+        } catch (BadLocationException e) {
+            YangEditorPlugin.log(e);
+        }
+    }
+
+    private void smartIndentAfterOpeningBracket(IDocument d, DocumentCommand c) {
+        if (c.offset < 1 || d.getLength() == 0) {
+            return;
+        }
+
+        YangHeuristicScanner scanner = new YangHeuristicScanner(d);
+
+        int p = (c.offset == d.getLength() ? c.offset - 1 : c.offset);
+
+        try {
+            // current line
+            int line = d.getLineOfOffset(p);
+            int lineOffset = d.getLineOffset(line);
+
+            // make sure we don't have any leading comments etc.
+            if (d.get(lineOffset, p - lineOffset).trim().length() != 0) {
+                return;
+            }
+
+            // line of last Java code
+            int pos = scanner.findNonWhitespaceBackward(p, YangHeuristicScanner.UNBOUND);
+            if (pos == -1) {
+                return;
+            }
+            int lastLine = d.getLineOfOffset(pos);
+
+            // only shift if the last java line is further up and is a braceless block candidate
+            if (lastLine < line) {
+
+                YangIndenter indenter = new YangIndenter(d, scanner);
+                StringBuffer indent = indenter.computeIndentation(p, true);
+                String toDelete = d.get(lineOffset, c.offset - lineOffset);
+                if (indent != null && !indent.toString().equals(toDelete)) {
+                    c.text = indent.append(c.text).toString();
+                    c.length += c.offset - lineOffset;
+                    c.offset = lineOffset;
+                }
+            }
+
+        } catch (BadLocationException e) {
+            YangEditorPlugin.log(e);
+        }
+
+    }
+
+    private void smartIndentAfterNewLine(IDocument d, DocumentCommand c) {
+        YangHeuristicScanner scanner = new YangHeuristicScanner(d);
+        YangIndenter indenter = new YangIndenter(d, scanner);
+        StringBuffer indent = indenter.computeIndentation(c.offset);
+        if (indent == null) {
+            indent = new StringBuffer();
+        }
+
+        // indent.append("    ");
+
+        int docLength = d.getLength();
+        if (c.offset == -1 || docLength == 0) {
+            return;
+        }
+
+        try {
+            int p = (c.offset == docLength ? c.offset - 1 : c.offset);
+            int line = d.getLineOfOffset(p);
+
+            StringBuffer buf = new StringBuffer(c.text + indent);
+
+            IRegion reg = d.getLineInformation(line);
+            int lineEnd = reg.getOffset() + reg.getLength();
+
+            int contentStart = findEndOfWhiteSpace(d, c.offset, lineEnd);
+            c.length = Math.max(contentStart - c.offset, 0);
+
+            int start = reg.getOffset();
+
+            // insert closing brace on new line after an unclosed opening brace
+            if (getBracketCount(d, start, c.offset, true) > 0 && closeBrace() && !isClosed(d, c.offset, c.length)) {
+                c.caretOffset = c.offset + buf.length();
+                c.shiftsCaret = false;
+
+                // copy old content of line behind insertion point to new line
+
+                if (c.offset == 0) {
+                    if (lineEnd - contentStart > 0) {
+                        c.length = lineEnd - c.offset;
+                        buf.append(d.get(contentStart, lineEnd - contentStart).toCharArray());
+                    }
+                }
+
+                buf.append(TextUtilities.getDefaultLineDelimiter(d));
+                StringBuffer reference = null;
+                int nonWS = findEndOfWhiteSpace(d, start, lineEnd);
+                if (nonWS < c.offset && d.getChar(nonWS) == '{') {
+                    reference = new StringBuffer(d.get(start, nonWS - start));
+                } else {
+                    reference = indenter.getReferenceIndentation(c.offset);
+                }
+                if (reference != null) {
+                    buf.append(reference);
+                }
+                buf.append('}');
+            }
+            // insert extra line upon new line between two braces
+            else if (c.offset > start && contentStart < lineEnd && d.getChar(contentStart) == '}') {
+                int firstCharPos = scanner.findNonWhitespaceBackward(c.offset - 1, start);
+                if (firstCharPos != YangHeuristicScanner.NOT_FOUND && d.getChar(firstCharPos) == '{') {
+                    c.caretOffset = c.offset + buf.length();
+                    c.shiftsCaret = false;
+
+                    StringBuffer reference = null;
+                    int nonWS = findEndOfWhiteSpace(d, start, lineEnd);
+                    if (nonWS < c.offset && d.getChar(nonWS) == '{') {
+                        reference = new StringBuffer(d.get(start, nonWS - start));
+                    } else {
+                        reference = indenter.getReferenceIndentation(c.offset);
+                    }
+
+                    buf.append(TextUtilities.getDefaultLineDelimiter(d));
+
+                    if (reference != null) {
+                        buf.append(reference);
+                    }
+                }
+            }
+            c.text = buf.toString();
+
+        } catch (BadLocationException e) {
+            YangEditorPlugin.log(e);
+        }
+    }
+
+    /*
+     * @see org.eclipse.jdt.internal.ui.text.java.JavaAutoIndentStrategy#isClosed
+     */
+    private boolean isClosed(IDocument document, int offset, int length) {
+
+        return getBlockBalance(document, offset, fPartitioning) <= 0;
+
+    }
+
+    private void smartPaste(IDocument document, DocumentCommand command) {
+        int newOffset = command.offset;
+        int newLength = command.length;
+        String newText = command.text;
+
+        try {
+            YangHeuristicScanner scanner = new YangHeuristicScanner(document);
+            YangIndenter indenter = new YangIndenter(document, scanner);
+            int offset = newOffset;
+
+            // reference position to get the indent from
+            int refOffset = indenter.findReferencePosition(offset);
+            if (refOffset == YangHeuristicScanner.NOT_FOUND) {
+                return;
+            }
+            int peerOffset = getPeerPosition(document, command);
+            peerOffset = indenter.findReferencePosition(peerOffset);
+            if (peerOffset != YangHeuristicScanner.NOT_FOUND) {
+                refOffset = Math.min(refOffset, peerOffset);
+            }
+
+            // eat any WS before the insertion to the beginning of the line
+            int firstLine = 1; // don't format the first line per default, as it has other content
+            // before it
+            IRegion line = document.getLineInformationOfOffset(offset);
+            String notSelected = document.get(line.getOffset(), offset - line.getOffset());
+            if (notSelected.trim().length() == 0) {
+                newLength += notSelected.length();
+                newOffset = line.getOffset();
+                firstLine = 0;
+            }
+
+            // prefix: the part we need for formatting but won't paste
+            IRegion refLine = document.getLineInformationOfOffset(refOffset);
+            String prefix = document.get(refLine.getOffset(), newOffset - refLine.getOffset());
+
+            // handle the indentation computation inside a temporary document
+            Document temp = new Document(prefix + newText);
+            DocumentRewriteSession session = temp.startRewriteSession(DocumentRewriteSessionType.STRICTLY_SEQUENTIAL);
+            scanner = new YangHeuristicScanner(temp);
+            indenter = new YangIndenter(temp, scanner);
+            installYangStuff(temp);
+
+            // indent the first and second line
+            // compute the relative indentation difference from the second line
+            // (as the first might be partially selected) and use the value to
+            // indent all other lines.
+            boolean isIndentDetected = false;
+            StringBuffer addition = new StringBuffer();
+            int insertLength = 0;
+            int firstLineInsertLength = 0;
+            int firstLineIndent = 0;
+            int first = document.computeNumberOfLines(prefix) + firstLine; // don't format first
+            // line
+            int lines = temp.getNumberOfLines();
+            int tabLength = getVisualTabLengthPreference();
+            boolean changed = false;
+            for (int l = first; l < lines; l++) { // we don't change the number of lines while
+                // adding indents
+
+                IRegion r = temp.getLineInformation(l);
+                int lineOffset = r.getOffset();
+                int lineLength = r.getLength();
+
+                if (lineLength == 0) {
+                    continue;
+                }
+
+                if (!isIndentDetected) {
+
+                    // indent the first pasted line
+                    String current = getCurrentIndent(temp, l);
+                    StringBuffer correct = indenter.computeIndentation(lineOffset);
+                    if (correct == null) {
+                        return; // bail out
+                    }
+
+                    insertLength = subtractIndent(correct, current, addition, tabLength);
+                    if (l == first) {
+                        firstLineInsertLength = insertLength;
+                        firstLineIndent = current.length();
+                    }
+                    if (l != first && temp.get(lineOffset, lineLength).trim().length() != 0) {
+                        isIndentDetected = true;
+                        if (firstLineIndent >= current.length()) {
+                            insertLength = firstLineInsertLength;
+                        }
+                        if (insertLength == 0) {
+                            // no adjustment needed, bail out
+                            if (firstLine == 0) {
+                                // but we still need to adjust the first line
+                                command.offset = newOffset;
+                                command.length = newLength;
+                                if (changed) {
+                                    break; // still need to get the leading indent of the first line
+                                }
+                            }
+                            return;
+                        }
+                    } else {
+                        changed = insertLength != 0;
+                    }
+                }
+
+                // relatively indent all pasted lines
+                if (insertLength > 0) {
+                    addIndent(temp, l, addition, tabLength);
+                } else if (insertLength < 0) {
+                    cutIndent(temp, l, -insertLength, tabLength);
+                }
+
+            }
+
+            removeYangStuff(temp);
+            temp.stopRewriteSession(session);
+            newText = temp.get(prefix.length(), temp.getLength() - prefix.length());
+
+            command.offset = newOffset;
+            command.length = newLength;
+            command.text = newText;
+
+        } catch (BadLocationException e) {
+            YangEditorPlugin.log(e);
+        }
+
+    }
+
+    private void installYangStuff(Document temp) {
+        YangDocumentSetupParticipant setupParticipant = new YangDocumentSetupParticipant();
+        setupParticipant.setup(temp);
+
+    }
+
+    private static void removeYangStuff(Document document) {
+        document.setDocumentPartitioner(YangDocumentSetupParticipant.YANG_PARTITIONING, null);
+    }
+
+    /**
+     * Returns the indentation of the line <code>line</code> in <code>document</code>. The returned
+     * string may contain pairs of leading slashes that are considered part of the indentation.
+     */
+    private static String getCurrentIndent(Document document, int line) throws BadLocationException {
+        IRegion region = document.getLineInformation(line);
+        int from = region.getOffset();
+        int endOffset = region.getOffset() + region.getLength();
+
+        // go behind line comments
+        int to = from;
+        while (to < endOffset - 2 && document.get(to, 2).equals(LINE_COMMENT)) {
+            to += 2;
+        }
+
+        while (to < endOffset) {
+            char ch = document.getChar(to);
+            if (!Character.isWhitespace(ch)) {
+                break;
+            }
+            to++;
+        }
+
+        // don't count the space before javadoc like, asterisk-style comment lines
+        if (to > from && to < endOffset - 1 && document.get(to - 1, 2).equals(" *")) { //$NON-NLS-1$
+            String type = TextUtilities.getContentType(document, YangDocumentSetupParticipant.YANG_PARTITIONING, to,
+                    true);
+            if (type.equals(YangPartitionScanner.YANG_COMMENT)) {
+                to--;
+            }
+        }
+
+        return document.get(from, to - from);
+    }
+
+    /**
+     * Computes the difference of two indentations and returns the difference in length of current
+     * and correct. If the return value is positive, <code>addition</code> is initialized with a
+     * substring of that length of <code>correct</code>.
+     */
+    private int subtractIndent(CharSequence correctIndentation, CharSequence currentIndentation,
+            StringBuffer difference, int tabLength) {
+        int c1 = computeVisualLength(correctIndentation, tabLength);
+        int c2 = computeVisualLength(currentIndentation, tabLength);
+        int diff = c1 - c2;
+        if (diff <= 0) {
+            return diff;
+        }
+
+        difference.setLength(0);
+        int len = 0, i = 0;
+        while (len < diff) {
+            char c = correctIndentation.charAt(i++);
+            difference.append(c);
+            len += computeVisualLength(c, tabLength);
+        }
+
+        return diff;
+    }
+
+    /**
+     * Indents line <code>line</code> in <code>document</code> with <code>indent</code>. Leaves
+     * leading comment signs alone.
+     */
+    private void addIndent(Document document, int line, CharSequence indent, int tabLength) throws BadLocationException {
+        IRegion region = document.getLineInformation(line);
+        int insert = region.getOffset();
+        int endOffset = region.getOffset() + region.getLength();
+
+        // Compute insert after all leading line comment markers
+        int newInsert = insert;
+        while (newInsert < endOffset - 2 && document.get(newInsert, 2).equals(LINE_COMMENT)) {
+            newInsert += 2;
+        }
+
+        // Heuristic to check whether it is commented code or just a comment
+        if (newInsert > insert) {
+            int whitespaceCount = 0;
+            int i = newInsert;
+            while (i < endOffset - 1) {
+                char ch = document.get(i, 1).charAt(0);
+                if (!Character.isWhitespace(ch)) {
+                    break;
+                }
+                whitespaceCount = whitespaceCount + computeVisualLength(ch, tabLength);
+                i++;
+            }
+
+            // TODO
+            if (whitespaceCount != 0) {
+                // CodeFormatterUtil.getIndentWidth(fProject))
+                insert = newInsert;
+            }
+        }
+
+        // Insert indent
+        document.replace(insert, 0, indent.toString());
+    }
+
+    /**
+     * Cuts the visual equivalent of <code>toDelete</code> characters out of the indentation of line
+     * <code>line</code> in <code>document</code>. Leaves leading comment signs alone.
+     */
+    private void cutIndent(Document document, int line, int toDelete, int tabLength) throws BadLocationException {
+        IRegion region = document.getLineInformation(line);
+        int from = region.getOffset();
+        int endOffset = region.getOffset() + region.getLength();
+
+        // go behind line comments
+        while (from < endOffset - 2 && document.get(from, 2).equals(LINE_COMMENT)) {
+            from += 2;
+        }
+
+        int to = from;
+        while (toDelete > 0 && to < endOffset) {
+            char ch = document.getChar(to);
+            if (!Character.isWhitespace(ch)) {
+                break;
+            }
+            toDelete -= computeVisualLength(ch, tabLength);
+            if (toDelete >= 0) {
+                to++;
+            } else {
+                break;
+            }
+        }
+
+        document.replace(from, to - from, ""); //$NON-NLS-1$
+    }
+
+    /**
+     * Returns the visual length of a given <code>CharSequence</code> taking into account the visual
+     * tabulator length.
+     */
+    private int computeVisualLength(CharSequence seq, int tabLength) {
+        int size = 0;
+
+        for (int i = 0; i < seq.length(); i++) {
+            char ch = seq.charAt(i);
+            if (ch == '\t') {
+                if (tabLength != 0) {
+                    size += tabLength - size % tabLength;
+                    // else: size stays the same
+                }
+            } else {
+                size++;
+            }
+        }
+        return size;
+    }
+
+    /**
+     * Returns the visual length of a given character taking into account the visual tabulator
+     * length.
+     */
+    private int computeVisualLength(char ch, int tabLength) {
+        if (ch == '\t') {
+            return tabLength;
+        } else {
+            return 1;
+        }
+    }
+
+    /**
+     * The preference setting for the visual tabulator display.
+     */
+    private int getVisualTabLengthPreference() {
+        return YangEditorPlugin.getDefault().getCombinedPreferenceStore()
+                .getInt(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_TAB_WIDTH);
+    }
+
+    private boolean isLineDelimiter(IDocument document, String text) {
+        String[] delimiters = document.getLegalLineDelimiters();
+        if (delimiters != null) {
+            return TextUtilities.equals(delimiters, text) > -1;
+        }
+        return false;
+    }
+
+    private void smartIndentOnKeypress(IDocument document, DocumentCommand command) {
+        switch (command.text.charAt(0)) {
+        case '}':
+            smartIndentAfterClosingBracket(document, command);
+            break;
+        case '{':
+            smartIndentAfterOpeningBracket(document, command);
+            break;
+        }
+    }
+
+    /*
+     * @see
+     * org.eclipse.jface.text.IAutoIndentStrategy#customizeDocumentCommand(org.eclipse.jface.text
+     * .IDocument, org.eclipse.jface.text.DocumentCommand)
+     */
+    @Override
+    public void customizeDocumentCommand(IDocument d, DocumentCommand c) {
+        if (c.doit == false) {
+            return;
+        }
+
+        clearCachedValues();
+
+        if (c.length == 0 && c.text != null && isLineDelimiter(d, c.text)) {
+            if (fIsSmartIndentAfterNewline) {
+                smartIndentAfterNewLine(d, c);
+            }
+        } else if (c.text.length() == 1) {
+            smartIndentOnKeypress(d, c);
+        } else if (c.text.length() > 1 && getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_SMART_PASTE)) {
+            if (fViewer == null || fViewer.getTextWidget() == null || !fViewer.getTextWidget().getBlockSelection()) {
+                smartPaste(d, c); // no smart backspace for paste
+            }
+        }
+    }
+
+    private static IPreferenceStore getPreferenceStore() {
+        return YangUIPlugin.getDefault().getPreferenceStore();
+    }
+
+    private boolean closeBrace() {
+        return fCloseBrace;
+    }
+
+    private void clearCachedValues() {
+        IPreferenceStore preferenceStore = getPreferenceStore();
+        fCloseBrace = preferenceStore.getBoolean(YangPreferenceConstants.EDITOR_CLOSE_BRACES);
+        // fIsSmartTab = preferenceStore.getBoolean(YangPreferenceConstants.EDITOR_SMART_TAB);
+        fIsSmartIndentAfterNewline = preferenceStore
+                .getBoolean(YangPreferenceConstants.EDITOR_SMART_INDENT_AFTER_NEWLINE);
+        // fIsSmartMode = computeSmartMode();
+    }
+
+    // private boolean computeSmartMode() {
+    // IWorkbenchPage page = YangEditorPlugin.getActivePage();
+    // if (page != null) {
+    // IEditorPart part = page.getActiveEditor();
+    // if (part instanceof ITextEditorExtension3) {
+    // ITextEditorExtension3 extension = (ITextEditorExtension3) part;
+    // return extension.getInsertMode() == ITextEditorExtension3.SMART_INSERT;
+    // }
+    // }
+    // return false;
+    // }
+
+    /**
+     * Returns the block balance, i.e. zero if the blocks are balanced at <code>offset</code>, a
+     * negative number if there are more closing than opening braces, and a positive number if there
+     * are more opening than closing braces.
+     */
+    private static int getBlockBalance(IDocument document, int offset, String partitioning) {
+        if (offset < 1) {
+            return -1;
+        }
+        if (offset >= document.getLength()) {
+            return 1;
+        }
+
+        int begin = offset;
+        int end = offset - 1;
+
+        YangHeuristicScanner scanner = new YangHeuristicScanner(document);
+
+        while (true) {
+            begin = scanner.findOpeningPeer(begin - 1, '{', '}');
+            end = scanner.findClosingPeer(end + 1, '{', '}');
+            if (begin == -1 && end == -1) {
+                return 0;
+            }
+            if (begin == -1) {
+                return -1;
+            }
+            if (end == -1) {
+                return 1;
+            }
+        }
+    }
+
+    private int getPeerPosition(IDocument document, DocumentCommand command) {
+        if (document.getLength() == 0) {
+            return 0;
+        }
+        /*
+         * Search for scope closers in the pasted text and find their opening peers in the document.
+         */
+        Document pasted = new Document(command.text);
+        installYangStuff(pasted);
+        int firstPeer = command.offset;
+
+        YangHeuristicScanner pScanner = new YangHeuristicScanner(pasted);
+        YangHeuristicScanner dScanner = new YangHeuristicScanner(document);
+
+        // add scope relevant after context to peer search
+        int afterToken = dScanner.nextToken(command.offset + command.length, YangHeuristicScanner.UNBOUND);
+        try {
+            switch (afterToken) {
+            case Symbols.TokenRBRACE:
+                pasted.replace(pasted.getLength(), 0, "}"); //$NON-NLS-1$
+                break;
+            case Symbols.TokenRPAREN:
+                pasted.replace(pasted.getLength(), 0, ")"); //$NON-NLS-1$
+                break;
+            case Symbols.TokenRBRACKET:
+                pasted.replace(pasted.getLength(), 0, "]"); //$NON-NLS-1$
+                break;
+            }
+        } catch (BadLocationException e) {
+            // cannot happen
+            Assert.isTrue(false);
+        }
+
+        int pPos = 0; // paste text position (increasing from 0)
+        int dPos = Math.max(0, command.offset - 1); // document position (decreasing from paste
+        // offset)
+        while (true) {
+            int token = pScanner.nextToken(pPos, YangHeuristicScanner.UNBOUND);
+            pPos = pScanner.getPosition();
+            switch (token) {
+            case Symbols.TokenLBRACE:
+            case Symbols.TokenLBRACKET:
+            case Symbols.TokenLPAREN:
+                pPos = skipScope(pScanner, pPos, token);
+                if (pPos == YangHeuristicScanner.NOT_FOUND) {
+                    return firstPeer;
+                }
+                break; // closed scope -> keep searching
+            case Symbols.TokenRBRACE:
+                int peer = dScanner.findOpeningPeer(dPos, '{', '}');
+                dPos = peer - 1;
+                if (peer == YangHeuristicScanner.NOT_FOUND) {
+                    return firstPeer;
+                }
+                firstPeer = peer;
+                break; // keep searching
+            case Symbols.TokenRBRACKET:
+                peer = dScanner.findOpeningPeer(dPos, '[', ']');
+                dPos = peer - 1;
+                if (peer == YangHeuristicScanner.NOT_FOUND) {
+                    return firstPeer;
+                }
+                firstPeer = peer;
+                break; // keep searching
+            case Symbols.TokenRPAREN:
+                peer = dScanner.findOpeningPeer(dPos, '(', ')');
+                dPos = peer - 1;
+                if (peer == YangHeuristicScanner.NOT_FOUND) {
+                    return firstPeer;
+                }
+                firstPeer = peer;
+                break; // keep searching
+            case Symbols.TokenEOF:
+                return firstPeer;
+            default:
+                // keep searching
+            }
+        }
+    }
+
+    /**
+     * Skips the scope opened by <code>token</code>.
+     */
+    private static int skipScope(YangHeuristicScanner scanner, int startPosition, int token) {
+        int openToken = token;
+        int closeToken;
+        switch (token) {
+        case Symbols.TokenLPAREN:
+            closeToken = Symbols.TokenRPAREN;
+            break;
+        case Symbols.TokenLBRACKET:
+            closeToken = Symbols.TokenRBRACKET;
+            break;
+        case Symbols.TokenLBRACE:
+            closeToken = Symbols.TokenRBRACE;
+            break;
+        default:
+            Assert.isTrue(false);
+            return -1; // dummy
+        }
+
+        int depth = 1;
+        int p = startPosition;
+
+        while (true) {
+            int tok = scanner.nextToken(p, YangHeuristicScanner.UNBOUND);
+            p = scanner.getPosition();
+
+            if (tok == openToken) {
+                depth++;
+            } else if (tok == closeToken) {
+                depth--;
+                if (depth == 0) {
+                    return p + 1;
+                }
+            } else if (tok == Symbols.TokenEOF) {
+                return YangHeuristicScanner.NOT_FOUND;
+            }
+        }
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangColorManager.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangColorManager.java
new file mode 100644 (file)
index 0000000..5945717
--- /dev/null
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.eclipse.jdt.ui.text.IColorManager;
+import org.eclipse.jdt.ui.text.IColorManagerExtension;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @author Alexey Kholupko
+ */
+public class YangColorManager implements IColorManager, IColorManagerExtension {
+
+    protected Map<String, RGB> fKeyTable = new HashMap<String, RGB>(10);
+    protected Map<Display, Map<RGB, Color>> fDisplayTable = new HashMap<Display, Map<RGB, Color>>(2);
+
+    /**
+     * Flag which tells if the colors are automatically disposed when the current display gets
+     * disposed.
+     */
+    private boolean fAutoDisposeOnDisplayDispose;
+
+    /**
+     * Creates a new YANG color manager which automatically disposes the allocated colors when the
+     * current display gets disposed.
+     */
+    public YangColorManager() {
+        this(true);
+    }
+
+    /**
+     * Creates a new YANG color manager.
+     *
+     * @param autoDisposeOnDisplayDispose if <code>true</code> the color manager automatically
+     * disposes all managed colors when the current display gets disposed and all calls to
+     * {@link org.eclipse.jface.text.source.ISharedTextColors#dispose()} are ignored.
+     */
+    public YangColorManager(boolean autoDisposeOnDisplayDispose) {
+        fAutoDisposeOnDisplayDispose = autoDisposeOnDisplayDispose;
+    }
+
+    public void dispose(Display display) {
+        Map<RGB, Color> colorTable = fDisplayTable.get(display);
+        if (colorTable != null) {
+            Iterator<Color> e = colorTable.values().iterator();
+            while (e.hasNext()) {
+                Color color = e.next();
+                if (color != null && !color.isDisposed())
+                    color.dispose();
+            }
+        }
+    }
+
+    /*
+     * @see IColorManager#getColor(RGB)
+     */
+    public Color getColor(RGB rgb) {
+
+        if (rgb == null)
+            return null;
+
+        final Display display = Display.getCurrent();
+        Map<RGB, Color> colorTable = fDisplayTable.get(display);
+        if (colorTable == null) {
+            colorTable = new HashMap<RGB, Color>(10);
+            fDisplayTable.put(display, colorTable);
+            if (fAutoDisposeOnDisplayDispose) {
+                display.disposeExec(new Runnable() {
+                    public void run() {
+                        dispose(display);
+                    }
+                });
+            }
+        }
+
+        Color color = colorTable.get(rgb);
+        if (color == null) {
+            color = new Color(Display.getCurrent(), rgb);
+            colorTable.put(rgb, color);
+        }
+
+        return color;
+    }
+
+    /*
+     * @see IColorManager#dispose
+     */
+    public void dispose() {
+        if (!fAutoDisposeOnDisplayDispose)
+            dispose(Display.getCurrent());
+    }
+
+    /*
+     * @see IColorManager#getColor(String)
+     */
+    public Color getColor(String key) {
+
+        if (key == null)
+            return null;
+
+        RGB rgb = fKeyTable.get(key);
+        return getColor(rgb);
+    }
+
+    /*
+     * @see IColorManagerExtension#bindColor(String, RGB)
+     */
+    public void bindColor(String key, RGB rgb) {
+        Object value = fKeyTable.get(key);
+        if (value != null)
+            throw new UnsupportedOperationException();
+
+        fKeyTable.put(key, rgb);
+    }
+
+    /*
+     * @see IColorManagerExtension#unbindColor(String)
+     */
+    public void unbindColor(String key) {
+        fKeyTable.remove(key);
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangCommentScanner.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangCommentScanner.java
new file mode 100644 (file)
index 0000000..b21125c
--- /dev/null
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jdt.ui.text.IColorManager;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.rules.IRule;
+import org.eclipse.jface.text.rules.IToken;
+
+import com.cisco.yangide.ui.preferences.IYangColorConstants;
+
+/**
+ * @author Alexey Kholupko
+ */
+public class YangCommentScanner extends AbstractYangScanner {
+
+    private static String[] tokenProperties = { IYangColorConstants.YANG_COMMENT };
+
+    /**
+     * @param manager
+     * @param store
+     */
+    public YangCommentScanner(IColorManager manager, IPreferenceStore store) {
+        super(manager, store);
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see com.cisco.yangide.editor.editors.AbstractYangScanner#getTokenProperties()
+     */
+    @Override
+    protected String[] getTokenProperties() {
+        return tokenProperties;
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see com.cisco.yangide.editor.editors.AbstractYangScanner#createRules()
+     */
+    @Override
+    protected List<IRule> createRules() {
+        List<IRule> rules = new ArrayList<IRule>();
+
+        IToken comment = getToken(IYangColorConstants.YANG_COMMENT);
+        setDefaultReturnToken(comment);
+
+        /*
+         * @see com.cisco.yangide.editor.editors.YangStringScanner#createRules()
+         */
+
+        return rules;
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangContentOutlinePage.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangContentOutlinePage.java
new file mode 100644 (file)
index 0000000..57746f5
--- /dev/null
@@ -0,0 +1,229 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider;
+import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.StyledString;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
+
+import com.cisco.yangide.core.YangModelException;
+import com.cisco.yangide.core.dom.ASTCompositeNode;
+import com.cisco.yangide.core.dom.ASTNamedNode;
+import com.cisco.yangide.core.dom.ASTNode;
+import com.cisco.yangide.core.dom.AugmentationSchema;
+import com.cisco.yangide.core.dom.ContrainerSchemaNode;
+import com.cisco.yangide.core.dom.Deviation;
+import com.cisco.yangide.core.dom.ExtensionDefinition;
+import com.cisco.yangide.core.dom.GroupingDefinition;
+import com.cisco.yangide.core.dom.IdentitySchemaNode;
+import com.cisco.yangide.core.dom.LeafSchemaNode;
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.core.dom.ModuleImport;
+import com.cisco.yangide.core.dom.NotificationDefinition;
+import com.cisco.yangide.core.dom.RpcDefinition;
+import com.cisco.yangide.core.dom.RpcInputNode;
+import com.cisco.yangide.core.dom.RpcOutputNode;
+import com.cisco.yangide.core.dom.SubModuleInclude;
+import com.cisco.yangide.core.dom.TypeDefinition;
+import com.cisco.yangide.core.dom.TypeReference;
+import com.cisco.yangide.core.dom.UsesNode;
+import com.cisco.yangide.ui.internal.IYangUIConstants;
+import com.cisco.yangide.ui.internal.YangUIImages;
+
+public class YangContentOutlinePage extends ContentOutlinePage {
+    
+    private YangEditor editor;
+    
+    private class YangOutlineStyledLabelProvider extends LabelProvider implements  IStyledLabelProvider{
+
+        @Override
+        public StyledString getStyledText(Object element) {
+            if(element instanceof ASTNode) {
+                StyledString result = new StyledString(((ASTNode) element).getNodeName());
+                if (element instanceof ASTCompositeNode) {
+                    result = new StyledString(((ASTCompositeNode)element).getName()).append(getStyledTypeName((ASTCompositeNode) element));
+                } else if (element instanceof ASTNamedNode) {
+                    result = new StyledString(((ASTNamedNode)element).getName());
+                }
+                return result;
+            }
+            return null;
+        }
+
+        private StyledString getStyledTypeName(ASTCompositeNode node) {
+            for (ASTNode n : ((ASTCompositeNode) node).getChildren()) {
+                if (n instanceof TypeReference) {
+                    return new StyledString(" : " + ((TypeReference)n).getName(), StyledString.DECORATIONS_STYLER);
+                }
+            }
+            return new StyledString();
+        }
+        
+        @Override
+        public Image getImage(Object element) {
+            if(element instanceof AugmentationSchema) {
+                return YangUIImages.getImage(IYangUIConstants.IMG_AUGMENT_PROPOSAL);
+            } else if (element instanceof Deviation) {
+                return YangUIImages.getImage(IYangUIConstants.IMG_DEVIATION_PROPOSAL);
+            } else if (element instanceof IdentitySchemaNode) {
+                return YangUIImages.getImage(IYangUIConstants.IMG_IDENTITY_PROPOSAL);
+            } else if (element instanceof ExtensionDefinition) {
+                return YangUIImages.getImage(IYangUIConstants.IMG_EXTENSION_PROPOSAL);
+            } else if (element instanceof NotificationDefinition) {
+                return YangUIImages.getImage(IYangUIConstants.IMG_NOTIFICATION_PROPOSAL);
+            } else if (element instanceof RpcInputNode) {
+                return YangUIImages.getImage(IYangUIConstants.IMG_RPC_INPUT_PROPOSAL);
+            } else if (element instanceof RpcOutputNode) {
+                return YangUIImages.getImage(IYangUIConstants.IMG_RPC_OUTPUT_PROPOSAL);
+            } else if (element instanceof RpcDefinition) {
+                return YangUIImages.getImage(IYangUIConstants.IMG_RPC_PROPOSAL);
+            } else if (element instanceof ModuleImport) {
+                return YangUIImages.getImage(IYangUIConstants.IMG_IMPORT_PROPOSAL);
+            } else if (element instanceof TypeReference) {
+                return YangUIImages.getImage(IYangUIConstants.IMG_TYPE_PROPOSAL);
+            } else if (element instanceof TypeDefinition) {
+                return YangUIImages.getImage(IYangUIConstants.IMG_CUSTOM_TYPE_PROPOSAL);
+            } else if (element instanceof GroupingDefinition) {
+                return YangUIImages.getImage(IYangUIConstants.IMG_GROUPING_PROPOSAL);
+            } else if (element instanceof SubModuleInclude) {
+                return YangUIImages.getImage(IYangUIConstants.IMG_SUBMODULE_PROPOSAL);
+            } else if (element instanceof ContrainerSchemaNode) {
+                return YangUIImages.getImage(IYangUIConstants.IMG_CONTAINER_PROPOSAL);   
+            } else if (element instanceof LeafSchemaNode) {
+                return YangUIImages.getImage(IYangUIConstants.IMG_LEAF_PROPOSAL);
+            } else if (element instanceof UsesNode) {
+                return YangUIImages.getImage(IYangUIConstants.IMG_USES_PROPOSAL);
+            } else if (element instanceof SubModuleInclude) {
+                return YangUIImages.getImage(IYangUIConstants.IMG_SUBMODULE_PROPOSAL);
+            } else if (element instanceof Module) {
+                return YangUIImages.getImage(IYangUIConstants.IMG_MODULE_PROPOSAL);
+            }
+            
+            return null;
+        }       
+        
+    }
+    
+  
+    private class YangOutlineContentProvider implements ITreeContentProvider {
+
+        @Override
+        public void dispose() {     
+        }
+        
+        @Override
+        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {      
+        }
+
+        @Override
+        public Object[] getElements(Object inputElement) {
+            if (inputElement instanceof ASTNode) {
+                return filterChildren((ASTNode) inputElement).toArray();
+            }
+            return null;
+        }
+        
+        public List<ASTNode> filterChildren(ASTNode parent) {
+            List<ASTNode> result = new ArrayList<ASTNode>();
+            if (null != parent && parent instanceof ASTCompositeNode) {
+                for (ASTNode n : ((ASTCompositeNode)parent).getChildren()) {
+                    if (n.isShowedInOutline()) {
+                        result.add(n);
+                    }
+                }
+            }
+            return result;
+        }
+
+        @Override
+        public Object[] getChildren(Object parentElement) {
+            return getElements(parentElement);
+        }
+
+        @Override
+        public Object getParent(Object element) {
+            if (element instanceof ASTNode) {
+                return ((ASTNode) element).getParent();
+            }
+            return null;
+        }
+
+        @Override
+        public boolean hasChildren(Object element) {
+            if (element instanceof ASTNode) {
+                return !filterChildren((ASTNode) element).isEmpty();
+            }
+            return false;
+        }
+        
+    }
+    
+    public YangContentOutlinePage(YangEditor e) {
+        super();
+        editor = e;
+    }
+
+       @Override
+       public void createControl(Composite parent) {
+               super.createControl(parent);
+               getTreeViewer().setContentProvider(new YangOutlineContentProvider());
+               getTreeViewer().setLabelProvider(new DelegatingStyledCellLabelProvider(new YangOutlineStyledLabelProvider()));
+               getTreeViewer().setInput(getOutlineRoot());
+       }
+
+    private ASTNode getOutlineRoot() {
+        try {
+            return editor.getModule();
+        } catch (YangModelException e) {
+            return null;
+        }
+       }
+    
+    public void selectNode(ASTNode node) {
+        ASTNode s = getFirstNodeInTree(node);
+        if (null != s) {
+            ISelection selected = getTreeViewer().getSelection();            
+            if (selected instanceof IStructuredSelection && !((IStructuredSelection)selected).toList().contains(s)) {
+                getTreeViewer().setSelection(new StructuredSelection(s), true);
+            }            
+        }
+    }
+    private ASTNode getFirstNodeInTree (ASTNode node) {
+        ASTNode result = node;
+        while (null != result && !result.isShowedInOutline()) {
+            result = result.getParent();
+        }
+        return result;
+    }
+    
+    public void updateOutline() {         
+        Display d = getControl().getDisplay();
+        if (d != null) {
+            d.asyncExec(new Runnable() {
+                public void run() {
+                    getTreeViewer().setInput(getOutlineRoot());
+                }
+            });
+        }
+        
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangDocumentProvider.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangDocumentProvider.java
new file mode 100644 (file)
index 0000000..72cde01
--- /dev/null
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IDocumentExtension3;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.ui.editors.text.TextFileDocumentProvider;
+import org.eclipse.ui.texteditor.IDocumentProvider;
+
+import com.cisco.yangide.editor.editors.text.YangAnnotationModel;
+import com.cisco.yangide.editor.preferences.YangDocumentSetupParticipant;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 5, 2014
+ */
+public class YangDocumentProvider extends TextFileDocumentProvider {
+
+    private YangDocumentSetupParticipant documentSetupParticipant;
+
+    public YangDocumentProvider() {
+        IDocumentProvider provider = new TextFileDocumentProvider(new YangStorageDocumentProvider());
+        setParentDocumentProvider(provider);
+        documentSetupParticipant = new YangDocumentSetupParticipant();
+    }
+
+    @Override
+    protected IAnnotationModel createAnnotationModel(IFile file) {
+        return new YangAnnotationModel(file);
+    }
+
+    @Override
+    protected FileInfo createFileInfo(Object element) throws CoreException {
+        FileInfo info = super.createFileInfo(element);
+        if (info != null) {
+            IDocument document = info.fTextFileBuffer.getDocument();
+            if (document instanceof IDocumentExtension3) {
+                IDocumentExtension3 extension = (IDocumentExtension3) document;
+                if (extension.getDocumentPartitioner(YangDocumentSetupParticipant.YANG_PARTITIONING) == null) {
+                    documentSetupParticipant.setup(document);
+                }
+            }
+        }
+        return info;
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangDoubleClickStrategy.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangDoubleClickStrategy.java
new file mode 100644 (file)
index 0000000..e387bca
--- /dev/null
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextDoubleClickStrategy;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+
+/**
+ * @author Alexey Kholupko
+ */
+public class YangDoubleClickStrategy implements ITextDoubleClickStrategy {
+
+    @Override
+    public void doubleClicked(ITextViewer part) {
+        ISelectionProvider selectionProvider = part.getSelectionProvider();
+        if (selectionProvider != null) {
+            ISelection selection = selectionProvider.getSelection();
+            if (selection != null && selection instanceof ITextSelection) {
+                int pos = ((ITextSelection) selection).getOffset();
+                if (pos > 0) {
+                    if (!selectComment(part, pos)) {
+                        selectWord(part, pos);
+                    }
+                }
+            }
+        }
+    }
+
+    private boolean selectComment(ITextViewer part, int caretPos) {
+        IDocument doc = part.getDocument();
+        int startPos, endPos;
+
+        try {
+            int pos = caretPos;
+            char c = ' ';
+
+            while (pos >= 0) {
+                c = doc.getChar(pos);
+                if (c == '\\') {
+                    pos -= 2;
+                    continue;
+                }
+                if (c == Character.LINE_SEPARATOR || c == '\"') {
+                    break;
+                }
+                --pos;
+            }
+
+            if (c != '\"') {
+                return false;
+            }
+
+            startPos = pos;
+
+            pos = caretPos;
+            int length = doc.getLength();
+            c = ' ';
+
+            while (pos < length) {
+                c = doc.getChar(pos);
+                if (c == Character.LINE_SEPARATOR || c == '\"') {
+                    break;
+                }
+                ++pos;
+            }
+            if (c != '\"') {
+                return false;
+            }
+
+            endPos = pos;
+
+            int offset = startPos + 1;
+            int len = endPos - offset;
+            part.setSelectedRange(offset, len);
+            return true;
+        } catch (BadLocationException x) {
+        }
+
+        return false;
+    }
+
+    protected boolean selectWord(ITextViewer part, int caretPos) {
+
+        IDocument doc = part.getDocument();
+        int startPos;
+
+        try {
+
+            int pos = caretPos;
+            char c;
+
+            while (pos >= 0) {
+                c = doc.getChar(pos);
+                if (!isYangIdentifierPart(c)) {
+                    break;
+                }
+                --pos;
+            }
+
+            startPos = pos;
+
+            pos = caretPos;
+            int length = doc.getLength();
+
+            while (pos < length) {
+                c = doc.getChar(pos);
+                if (!isYangIdentifierPart(c)) {
+                    break;
+                }
+                ++pos;
+            }
+
+            part.setSelectedRange(startPos + 1, pos - startPos - 1);
+            return true;
+
+        } catch (BadLocationException x) {
+        }
+
+        return false;
+    }
+
+    private boolean isYangIdentifierPart(char c) {
+        return Character.isJavaIdentifierPart(c) || c == '-' || c == ':';
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangEditor.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangEditor.java
new file mode 100644 (file)
index 0000000..19a8aa5
--- /dev/null
@@ -0,0 +1,598 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.ResourceBundle;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IStorage;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jdt.internal.core.JarEntryFile;
+import org.eclipse.jdt.internal.ui.javaeditor.JarEntryEditorInput;
+import org.eclipse.jdt.ui.text.IColorManager;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IDocumentExtension3;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.source.DefaultCharacterPairMatcher;
+import org.eclipse.jface.text.source.ICharacterPairMatcher;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.ISourceViewerExtension2;
+import org.eclipse.jface.text.source.IVerticalRuler;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.jface.text.source.SourceViewerConfiguration;
+import org.eclipse.jface.text.source.projection.IProjectionListener;
+import org.eclipse.jface.text.source.projection.ProjectionSupport;
+import org.eclipse.jface.text.source.projection.ProjectionViewer;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.IPostSelectionProvider;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.ActionContext;
+import org.eclipse.ui.actions.ActionGroup;
+import org.eclipse.ui.editors.text.EditorsUI;
+import org.eclipse.ui.editors.text.ITextEditorHelpContextIds;
+import org.eclipse.ui.editors.text.TextEditor;
+import org.eclipse.ui.texteditor.ChainedPreferenceStore;
+import org.eclipse.ui.texteditor.ITextEditorActionConstants;
+import org.eclipse.ui.texteditor.SourceViewerDecorationSupport;
+import org.eclipse.ui.texteditor.TextOperationAction;
+import org.eclipse.ui.views.contentoutline.ContentOutline;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+
+import com.cisco.yangide.core.YangCorePlugin;
+import com.cisco.yangide.core.YangJarFileEntryResource;
+import com.cisco.yangide.core.YangModelException;
+import com.cisco.yangide.core.dom.ASTNamedNode;
+import com.cisco.yangide.core.dom.ASTNode;
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.core.model.YangModelManager;
+import com.cisco.yangide.core.parser.YangParserUtil;
+import com.cisco.yangide.editor.YangEditorPlugin;
+import com.cisco.yangide.editor.actions.AddBlockCommentAction;
+import com.cisco.yangide.editor.actions.IYangEditorActionDefinitionIds;
+import com.cisco.yangide.editor.actions.OpenDeclarationAction;
+import com.cisco.yangide.editor.actions.RemoveBlockCommentAction;
+import com.cisco.yangide.editor.actions.ToggleCommentAction;
+import com.cisco.yangide.editor.editors.text.YangFoldingStructureProvider;
+import com.cisco.yangide.ui.YangUIPlugin;
+import com.cisco.yangide.ui.preferences.IYangColorConstants;
+
+/**
+ * Editor class
+ *
+ * @author Alexey Kholupko
+ */
+@SuppressWarnings("restriction")
+public class YangEditor extends TextEditor implements IProjectionListener, IYangEditor {
+    public final static String EDITOR_ID = "com.cisco.yangide.editor.editors.YANGEditor";
+
+    // TODO extract logic to separate classes
+    public final static String EDITOR_MATCHING_BRACKETS = "matchingBrackets";
+
+    private IColorManager colorManager;
+
+    private ProjectionSupport projectionSupport;
+
+    private YangFoldingStructureProvider fFoldingStructureProvider;
+
+    private SemanticHighlightingManager fSemanticManager;
+
+    private YangEditorSelectionChangedListener editorSelectionChangedListener;
+
+    private YangOutlineSelectionChangedListener outlineSelectionChangedListener = new YangOutlineSelectionChangedListener();
+
+    private YangContentOutlinePage outlinePage;
+
+    private List<ActionGroup> actionGroups = new ArrayList<ActionGroup>();
+    private List<IReconcileHandler> reconcileHandlers = new ArrayList<>();
+
+    private abstract class AbstractSelectionChangedListener implements ISelectionChangedListener {
+        public void install(ISelectionProvider selectionProvider) {
+            try {
+                if (selectionProvider == null || getModule() == null) {
+                    return;
+                }
+            } catch (YangModelException e) {
+                return;
+            }
+            if (selectionProvider instanceof IPostSelectionProvider) {
+                IPostSelectionProvider provider = (IPostSelectionProvider) selectionProvider;
+                provider.addPostSelectionChangedListener(this);
+            } else {
+                selectionProvider.addSelectionChangedListener(this);
+            }
+        }
+
+        public void uninstall(ISelectionProvider selectionProvider) {
+            try {
+                if (selectionProvider == null || getModule() == null) {
+                    return;
+                }
+            } catch (YangModelException e) {
+                return;
+            }
+            if (selectionProvider instanceof IPostSelectionProvider) {
+                IPostSelectionProvider provider = (IPostSelectionProvider) selectionProvider;
+                provider.removePostSelectionChangedListener(this);
+            } else {
+                selectionProvider.removeSelectionChangedListener(this);
+            }
+        }
+    }
+
+    private class YangEditorSelectionChangedListener extends AbstractSelectionChangedListener {
+
+        @Override
+        public void selectionChanged(SelectionChangedEvent event) {
+            if (event.getSelection() instanceof ITextSelection) {
+                ITextSelection textSelection = (ITextSelection) event.getSelection();
+                try {
+                    if (null != outlinePage) {
+                        outlinePage.selectNode(getModule().getNodeAtPosition(textSelection.getOffset()));
+                    }
+                } catch (YangModelException e) {
+                }
+            }
+
+        }
+    }
+
+    private class YangOutlineSelectionChangedListener extends AbstractSelectionChangedListener {
+        @Override
+        public void selectionChanged(SelectionChangedEvent event) {
+            if (isYangOutlinePageActive() && event.getSelection() instanceof IStructuredSelection) {
+                Object element = ((IStructuredSelection) event.getSelection()).getFirstElement();
+                if (element instanceof ASTNode) {
+                    IRegion selection = getSelectionRegion((ASTNode) element);
+                    if (selection != null) {
+                        selectAndReveal(selection.getOffset(), selection.getLength());
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Gets length and offset for selection of the provided {@code node}. 
+     * @param node  an ASTNode that specifies offset and length of selection
+     * @return an IRegion that corresponds to the given {@code node} or null if it was null
+     */
+    public static IRegion getSelectionRegion(ASTNode node) {
+        if (node != null) {
+            if (node instanceof ASTNamedNode) {
+                ASTNamedNode namedNode = (ASTNamedNode) node;
+                return new Region(namedNode.getNameStartPosition(), namedNode.getNameLength());
+            } else {
+                return new Region(node.getStartPosition(), node.getLength());
+            }
+        }
+        return null;
+    }
+    
+    public YangEditor() {
+        super();
+
+        colorManager = new YangColorManager(false);
+        setSourceViewerConfiguration(new YangSourceViewerConfiguration(YangEditorPlugin.getDefault()
+                .getCombinedPreferenceStore(), colorManager, this));
+        setDocumentProvider(new YangDocumentProvider());
+    }
+
+    @Override
+    protected void initializeEditor() {
+        setCompatibilityMode(false);
+
+        setEditorContextMenuId("#TextEditorContext"); //$NON-NLS-1$
+        setRulerContextMenuId("#TextRulerContext"); //$NON-NLS-1$
+        setHelpContextId(ITextEditorHelpContextIds.TEXT_EDITOR);
+        configureInsertMode(SMART_INSERT, true);
+        setInsertMode(INSERT);
+
+        setPreferenceStore(YangEditorPlugin.getDefault().getCombinedPreferenceStore());
+    }
+
+    @Override
+    public void dispose() {
+        if (editorSelectionChangedListener != null) {
+            editorSelectionChangedListener.uninstall(getSelectionProvider());
+            editorSelectionChangedListener = null;
+        }
+        colorManager.dispose();
+        for (ActionGroup actionGroup : actionGroups) {
+            actionGroup.dispose();
+        }
+        actionGroups.clear();
+        super.dispose();
+
+        uninstallSemanticHighlighting();
+
+        IEditorInput input = getEditorInput();
+        // revert index to file content instead of editor
+        if (input != null && input instanceof IFileEditorInput) {
+            IFile file = ((IFileEditorInput) input).getFile();
+            if (file != null) {
+                try {
+                    YangModelManager.getYangModelManager().removeInfoAndChildren(YangCorePlugin.createYangFile(file));
+                    YangModelManager.getIndexManager().addWorkingCopy(file);
+                } catch (YangModelException e) {
+                    // ignore exception
+                }
+            }
+        }
+    }
+
+    /**
+     * @return the actionGroups
+     */
+    public List<ActionGroup> getActionGroups() {
+        return actionGroups;
+    }
+
+    @Override
+    protected void doSetInput(IEditorInput input) throws CoreException {
+        ISourceViewer sourceViewer = getSourceViewer();
+        if (!(sourceViewer instanceof ISourceViewerExtension2)) {
+            setPreferenceStore(createCombinedPreferenceStore(input));
+            internalDoSetInput(input);
+            return;
+        }
+
+        // uninstall & unregister preference store listener
+        getSourceViewerDecorationSupport(sourceViewer).uninstall();
+        ((ISourceViewerExtension2) sourceViewer).unconfigure();
+
+        setPreferenceStore(createCombinedPreferenceStore(input));
+
+        // install & register preference store listener
+        sourceViewer.configure(getSourceViewerConfiguration());
+        getSourceViewerDecorationSupport(sourceViewer).install(getPreferenceStore());
+
+        internalDoSetInput(input);
+    }
+
+    private void internalDoSetInput(IEditorInput input) throws CoreException {
+
+        super.doSetInput(input);
+
+        if (fEncodingSupport != null) {
+            fEncodingSupport.reset();
+        }
+    }
+
+    /**
+     * Creates and returns the preference store for this YANG editor with the given input.
+     */
+    private IPreferenceStore createCombinedPreferenceStore(IEditorInput input) {
+        List<IPreferenceStore> stores = new ArrayList<IPreferenceStore>(3);
+
+        stores.add(YangUIPlugin.getDefault().getPreferenceStore());
+        stores.add(EditorsUI.getPreferenceStore());
+        stores.add(PlatformUI.getPreferenceStore());
+
+        return new ChainedPreferenceStore(stores.toArray(new IPreferenceStore[stores.size()]));
+    }
+
+    @Override
+    protected void configureSourceViewerDecorationSupport(SourceViewerDecorationSupport support) {
+        // Enable bracket highlighting in the preference store
+
+        IPreferenceStore store = YangUIPlugin.getDefault().getPreferenceStore();
+        store.setDefault(EDITOR_MATCHING_BRACKETS, true);
+
+        char[] matchChars = { '{', '}', '(', ')', '[', ']' }; // which brackets to match
+        ICharacterPairMatcher matcher = new DefaultCharacterPairMatcher(matchChars,
+                IDocumentExtension3.DEFAULT_PARTITIONING);
+        support.setCharacterPairMatcher(matcher);
+        support.setMatchingCharacterPainterPreferenceKeys(EDITOR_MATCHING_BRACKETS,
+                IYangColorConstants.EDITOR_MATCHING_BRACKETS_COLOR);
+
+        super.configureSourceViewerDecorationSupport(support);
+
+    }
+
+    @Override
+    protected void handlePreferenceStoreChanged(PropertyChangeEvent event) {
+
+        ((YangSourceViewerConfiguration) getSourceViewerConfiguration()).handlePropertyChangeEvent(event);
+        getSourceViewer().invalidateTextPresentation();
+
+        super.handlePreferenceStoreChanged(event);
+
+    }
+
+    @Override
+    protected void initializeKeyBindingScopes() {
+        setKeyBindingScopes(new String[] { "com.cisco.yangide.ui.Context" }); //$NON-NLS-1$
+    }
+
+    @Override
+    public ISelectionProvider getSelectionProvider() {
+        return getSourceViewer().getSelectionProvider();
+    }
+
+    public IDocument getDocument() {
+        return getSourceViewer().getDocument();
+    }
+
+    @Override
+    protected void createActions() {
+
+        super.createActions();
+        IAction action = null;
+        ResourceBundle bundle = ResourceBundle.getBundle(YangEditorMessages.getBundleName());
+
+        action = new TextOperationAction(bundle, "ContentFormat_", this, ISourceViewer.FORMAT); //$NON-NLS-1$
+        action.setActionDefinitionId(IYangEditorActionDefinitionIds.FORMAT);
+        setAction("FormatDocument", action); //$NON-NLS-1$
+
+        action = getAction(ITextEditorActionConstants.CONTENT_ASSIST_CONTEXT_INFORMATION);
+
+        action = new OpenDeclarationAction(bundle, "OpenDeclaration_", this); //$NON-NLS-1$
+        action.setActionDefinitionId(IYangEditorActionDefinitionIds.OPEN_DECLARATION);
+        setAction("OpenDeclaration", action); //$NON-NLS-1$
+        markAsStateDependentAction("OpenDeclaration", true); //$NON-NLS-1$
+        markAsSelectionDependentAction("OpenDeclaration", true); //$NON-NLS-1$
+
+        action = new ToggleCommentAction(bundle, "ToggleComment_", this); //$NON-NLS-1$
+        action.setActionDefinitionId(IYangEditorActionDefinitionIds.TOGGLE_COMMENT);
+        setAction("ToggleComment", action); //$NON-NLS-1$
+        markAsStateDependentAction("ToggleComment", true); //$NON-NLS-1$
+        configureToggleCommentAction();
+
+        action = new AddBlockCommentAction(bundle, "AddBlockComment_", this); //$NON-NLS-1$
+        action.setActionDefinitionId(IYangEditorActionDefinitionIds.ADD_BLOCK_COMMENT);
+        setAction("AddBlockComment", action); //$NON-NLS-1$
+        markAsStateDependentAction("AddBlockComment", true); //$NON-NLS-1$
+        markAsSelectionDependentAction("AddBlockComment", true); //$NON-NLS-1$
+
+        action = new RemoveBlockCommentAction(bundle, "RemoveBlockComment_", this); //$NON-NLS-1$
+        action.setActionDefinitionId(IYangEditorActionDefinitionIds.REMOVE_BLOCK_COMMENT);
+        setAction("RemoveBlockComment", action); //$NON-NLS-1$
+        markAsStateDependentAction("RemoveBlockComment", true); //$NON-NLS-1$
+        markAsSelectionDependentAction("RemoveBlockComment", true); //$NON-NLS-1$
+
+        IConfigurationElement[] configs = Platform.getExtensionRegistry().getConfigurationElementsFor(
+                "com.cisco.yangide.editor.actionGroup");
+        for (IConfigurationElement config : configs) {
+            try {
+                IActionGroup actionGroup = (IActionGroup) config.createExecutableExtension("class");
+                actionGroup.init(this, config.getAttribute("groupName"));
+                actionGroups.add((ActionGroup) actionGroup);
+            } catch (CoreException e) {
+                YangEditorPlugin.log(e);
+            }
+        }
+    }
+
+    private void configureToggleCommentAction() {
+        IAction action = getAction("ToggleComment"); //$NON-NLS-1$
+        if (action instanceof ToggleCommentAction) {
+            ISourceViewer sourceViewer = getSourceViewer();
+            SourceViewerConfiguration configuration = getSourceViewerConfiguration();
+            ((ToggleCommentAction) action).configure(sourceViewer, configuration);
+        }
+    }
+
+    @Override
+    public void createPartControl(Composite parent) {
+        super.createPartControl(parent);
+        ProjectionViewer projectionviewer = (ProjectionViewer) getSourceViewer();
+        projectionviewer.addProjectionListener(this);
+
+        projectionSupport = new ProjectionSupport(projectionviewer, getAnnotationAccess(), getSharedColors());
+        projectionSupport.install();
+
+        editorSelectionChangedListener = new YangEditorSelectionChangedListener();
+        editorSelectionChangedListener.install(getSelectionProvider());
+
+        // turn projection mode on
+        projectionviewer.doOperation(ProjectionViewer.TOGGLE);
+
+        SemanticHighlightings.initDefaults(YangUIPlugin.getDefault().getPreferenceStore());
+        installSemanticHighlighting();
+    }
+
+    @Override
+    protected ISourceViewer createSourceViewer(Composite parent, IVerticalRuler ruler, int styles) {
+        fAnnotationAccess = getAnnotationAccess();
+        fOverviewRuler = createOverviewRuler(getSharedColors());
+
+        ISourceViewer viewer = new YangSourceViewer(parent, ruler, getOverviewRuler(), isOverviewRulerVisible(), styles);
+
+        // ensure decoration support has been created and configured.
+        getSourceViewerDecorationSupport(viewer);
+
+        if (fFoldingStructureProvider != null) {
+            fFoldingStructureProvider.setDocument(getDocumentProvider().getDocument(getEditorInput()));
+        }
+
+        return viewer;
+    }
+
+    @Override
+    public void projectionEnabled() {
+        safelySanityCheckState(getEditorInput());
+        firePropertyChange(IEditorPart.PROP_INPUT);
+        fFoldingStructureProvider = new YangFoldingStructureProvider(this);
+        fFoldingStructureProvider.setDocument(getDocumentProvider().getDocument(getEditorInput()));
+
+        Module module = YangParserUtil.parseYangFile(getDocumentProvider().getDocument(getEditorInput()).get()
+                .toCharArray());
+
+        if (module != null) {
+            fFoldingStructureProvider.updateFoldingRegions(module);
+        }
+
+        // IPreferenceStore preferenceStore = AntUIPlugin.getDefault().getPreferenceStore();
+        // preferenceStore.setValue(AntEditorPreferenceConstants.EDITOR_FOLDING_ENABLED, true);
+    }
+
+    @Override
+    public void projectionDisabled() {
+        fFoldingStructureProvider = null;
+        // IPreferenceStore preferenceStore = AntUIPlugin.getDefault().getPreferenceStore();
+        // preferenceStore.setValue(AntEditorPreferenceConstants.EDITOR_FOLDING_ENABLED, false);
+
+    }
+
+    @Override
+    protected void editorContextMenuAboutToShow(IMenuManager menu) {
+        super.editorContextMenuAboutToShow(menu);
+        ActionContext context = new ActionContext(getSelectionProvider().getSelection());
+        for (ActionGroup actionGroup : actionGroups) {
+            actionGroup.setContext(context);
+            actionGroup.fillContextMenu(menu);
+            actionGroup.setContext(null);
+        }
+    }
+
+    @Override
+    public Object getAdapter(@SuppressWarnings("rawtypes") Class key) {
+        if (IContentOutlinePage.class.equals(key)) {
+            return getYangOulinePage();
+        }
+        if (projectionSupport != null) {
+            Object adapter = projectionSupport.getAdapter(getSourceViewer(), key);
+            if (adapter != null) {
+                return adapter;
+            }
+        }
+
+        return super.getAdapter(key);
+    }
+
+    private boolean isYangOutlinePageActive() {
+        IWorkbenchPart part = getSite().getWorkbenchWindow().getPartService().getActivePart();
+        return part instanceof ContentOutline && ((ContentOutline) part).getCurrentPage() == outlinePage;
+    }
+
+    private YangContentOutlinePage getYangOulinePage() {
+        if (null == outlinePage) {
+            outlinePage = new YangContentOutlinePage(this);
+            outlineSelectionChangedListener.install(outlinePage);
+        }
+        return outlinePage;
+    }
+
+    public void reconcile() {
+        updateOutline();
+        updateFoldingRegions();
+        for (IReconcileHandler reconcileHandler : reconcileHandlers) {
+            reconcileHandler.reconcile();
+        }
+    }
+
+    private void updateFoldingRegions() {
+        try {
+            if (fFoldingStructureProvider != null) {
+                fFoldingStructureProvider.updateFoldingRegions(getModule());
+            }
+        } catch (YangModelException e) {
+            YangUIPlugin.log(e);
+        }
+    }
+
+    private void updateOutline() {
+        if (null != outlinePage) {
+            outlinePage.updateOutline();
+        }
+    }
+
+    public void updateSemanticHigliting() {
+        if (fSemanticManager != null) {
+            fSemanticManager.getReconciler().refresh();
+        }
+    }
+
+    /**
+     * @return {@link Module} of the current editor input or <code>null</code> if editor input does
+     * not contains appropriate {@link Module}
+     * @throws YangModelException error during initialization of Module
+     */
+    public Module getModule() throws YangModelException {
+        IEditorInput input = getEditorInput();
+        if (input == null) {
+            return null;
+        }
+
+        if (input instanceof IFileEditorInput) {
+            IFile file = ((IFileEditorInput) input).getFile();
+            return YangCorePlugin.createYangFile(file).getModule();
+        } else if (input instanceof JarEntryEditorInput) {
+            JarEntryEditorInput jarInput = (JarEntryEditorInput) input;
+            IStorage storage = jarInput.getStorage();
+            if (storage instanceof YangJarFileEntryResource) {
+                YangJarFileEntryResource jarEntry = (YangJarFileEntryResource) storage;
+                return YangCorePlugin.createJarEntry(jarEntry.getPath(), jarEntry.getEntry()).getModule();
+            } else if (storage instanceof JarEntryFile) {
+                JarEntryFile jarEntry = (JarEntryFile) storage;
+                return YangCorePlugin.createJarEntry(jarEntry.getPackageFragmentRoot().getPath(),
+                        jarEntry.getFullPath().makeRelative().toString()).getModule();
+            }
+        }
+        return null;
+    }
+
+    public ISourceViewer getViewer() {
+        return this.getSourceViewer();
+    }
+
+    protected void installSemanticHighlighting() {
+        if (fSemanticManager == null) {
+            fSemanticManager = new SemanticHighlightingManager();
+            fSemanticManager.install(this, (SourceViewer) getSourceViewer(), colorManager, getPreferenceStore());
+        }
+    }
+
+    private void uninstallSemanticHighlighting() {
+        if (fSemanticManager != null) {
+            fSemanticManager.uninstall();
+            fSemanticManager = null;
+        }
+    }
+
+    public void installOccurrencesFinder(boolean b) {
+        // TODO implement mark occurrence functionality
+    }
+
+    public boolean isMarkingOccurrences() {
+        return false;
+    }
+
+    public void uninstallOccurrencesFinder() {
+    }
+
+    public void reconcileModel() {
+        ((YangSourceViewer) getSourceViewer()).getReconciler().getReconcilingStrategy("").reconcile(null);
+    }
+
+    public void addReconcileHandler(IReconcileHandler reconcileHandler) {
+        reconcileHandlers.add(reconcileHandler);
+    }
+
+    public void removeReconcileHandler(IReconcileHandler reconcileHandler) {
+        reconcileHandlers.remove(reconcileHandler);
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangEditorActionContributor.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangEditorActionContributor.java
new file mode 100644 (file)
index 0000000..3a09eb8
--- /dev/null
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors;
+
+import java.util.List;
+
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.actions.ActionGroup;
+import org.eclipse.ui.texteditor.BasicTextEditorActionContributor;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+/**
+ * @author Alexey Kholupko
+ */
+public class YangEditorActionContributor extends BasicTextEditorActionContributor {
+
+    @Override
+    public void setActiveEditor(IEditorPart part) {
+        if (getActiveEditorPart() == part) {
+            return;
+        }
+        super.setActiveEditor(part);
+
+        ITextEditor textEditor = null;
+        if (part instanceof ITextEditor) {
+            textEditor = (ITextEditor) part;
+        }
+        IActionBars actionBars = getActionBars();
+        actionBars.setGlobalActionHandler(
+                "com.cisco.yangide.editor.actions.shiftRight", getAction(textEditor, "ShiftRight")); //$NON-NLS-1$
+        actionBars.setGlobalActionHandler(
+                "com.cisco.yangide.editor.actions.shiftLeft", getAction(textEditor, "ShiftLeft")); //$NON-NLS-1$
+        actionBars.setGlobalActionHandler("com.cisco.yangide.editor.actions.ToggleComment",
+                getAction(textEditor, "ToggleComment")); //$NON-NLS-1$
+        actionBars.setGlobalActionHandler("com.cisco.yangide.editor.actions.AddBlockComment",
+                getAction(textEditor, "AddBlockComment")); //$NON-NLS-1$
+        actionBars.setGlobalActionHandler("com.cisco.yangide.editor.actions.RemoveBlockComment",
+                getAction(textEditor, "RemoveBlockComment")); //$NON-NLS-1$
+        actionBars.setGlobalActionHandler(
+                "com.cisco.yangide.editor.actions.FormatDocument", getAction(textEditor, "FormatDocument")); //$NON-NLS-1$
+        actionBars.setGlobalActionHandler(
+                "com.cisco.yangide.editor.actions.OpenDeclaration", getAction(textEditor, "OpenDeclaration")); //$NON-NLS-1$
+
+        if (part instanceof YangEditor) {
+            List<ActionGroup> actionGroups = ((YangEditor) part).getActionGroups();
+            for (ActionGroup actionGroup : actionGroups) {
+                actionGroup.fillActionBars(actionBars);
+            }
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangEditorMessages.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangEditorMessages.java
new file mode 100644 (file)
index 0000000..4e727db
--- /dev/null
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * @author Alexey Kholupko
+ */
+public class YangEditorMessages extends NLS {
+    private static final String BUNDLE_NAME = YangEditorMessages.class.getName();
+
+    /**
+     * @return the bundleName
+     */
+    public static String getBundleName() {
+        return BUNDLE_NAME;
+    }
+
+    static {
+        NLS.initializeMessages(BUNDLE_NAME, YangEditorMessages.class);
+    }
+
+    public static String ToggleComment_error_title;
+    public static String ToggleComment_error_message;
+    public static String ContentFormat_label;
+    public static String ContentFormat_tooltip;
+    public static String ContentFormat_image;
+    public static String ContentFormat_description;
+
+    public static String ToggleComment_label;
+    public static String ToggleComment_tooltip;
+    public static String ToggleComment_description;
+
+    public static String AddBlockComment_label;
+    public static String AddBlockComment_tooltip;
+    public static String AddBlockComment_description;
+
+    public static String RemoveBlockComment_label;
+    public static String RemoveBlockComment_tooltip;
+    public static String RemoveBlockComment_description;
+
+    public static String OpenDeclaration_label;
+    public static String OpenDeclaration_tooltip;
+    public static String OpenDeclaration_image;
+    public static String OpenDeclaration_description;
+
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangEditorMessages.properties b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangEditorMessages.properties
new file mode 100644 (file)
index 0000000..7d644d3
--- /dev/null
@@ -0,0 +1,35 @@
+###############################################################################
+# Copyright (c) 2014, 2015 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
+#  
+###############################################################################
+
+ToggleComment_error_title=Toggle Comment
+ToggleComment_error_message=An error occurred while toggling comments.
+
+## constructed messages
+
+ContentFormat_label=&Format
+ContentFormat_tooltip=Format YANG file source
+ContentFormat_image=
+ContentFormat_description=Format YANG file source 
+
+ToggleComment_label=Togg&le Comment
+ToggleComment_tooltip=Toggle Comment For the Selected Lines
+ToggleComment_description=Toggle comment for the selected lines
+
+AddBlockComment_label=Add &Block Comment
+AddBlockComment_tooltip=Enclose the Selection in a Block Comment
+AddBlockComment_description=Encloses the selection with block comment markers
+
+RemoveBlockComment_label=Remove Bloc&k Comment
+RemoveBlockComment_tooltip=Remove Block Comment Markers Enclosing the Caret
+RemoveBlockComment_description=Removes any block comment markers enclosing the caret
+
+OpenDeclaration_label=&Open Declaration
+OpenDeclaration_tooltip=Open declaration of the selected element
+OpenDeclaration_image=
+OpenDeclaration_description=Open declaration of the selected element 
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangElementHyperlink.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangElementHyperlink.java
new file mode 100644 (file)
index 0000000..1be5940
--- /dev/null
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors;
+
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+
+import com.cisco.yangide.core.indexing.ElementIndexInfo;
+import com.cisco.yangide.editor.EditorUtility;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 4, 2014
+ */
+public class YangElementHyperlink implements IHyperlink {
+
+    /** Hyperlink region. */
+    private IRegion region;
+
+    /** Info to reference. */
+    private ElementIndexInfo info;
+
+    public YangElementHyperlink(IRegion region, ElementIndexInfo info) {
+        this.region = region;
+        this.info = info;
+    }
+
+    @Override
+    public IRegion getHyperlinkRegion() {
+        return region;
+    }
+
+    @Override
+    public String getTypeLabel() {
+        return info.getType().toString();
+    }
+
+    @Override
+    public String getHyperlinkText() {
+        return info.getModule() + ": " + info.getPath();
+    }
+
+    @Override
+    public void open() {
+        EditorUtility.openInEditor(info);
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangElementHyperlinkDetector.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangElementHyperlinkDetector.java
new file mode 100644 (file)
index 0000000..01da136
--- /dev/null
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.hyperlink.AbstractHyperlinkDetector;
+import org.eclipse.jface.text.hyperlink.IHyperlink;
+
+import com.cisco.yangide.core.dom.ASTNamedNode;
+import com.cisco.yangide.core.dom.ASTNode;
+import com.cisco.yangide.core.dom.BaseReference;
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.core.dom.ModuleImport;
+import com.cisco.yangide.core.dom.QName;
+import com.cisco.yangide.core.dom.TypeReference;
+import com.cisco.yangide.core.dom.UsesNode;
+import com.cisco.yangide.core.indexing.ElementIndexInfo;
+import com.cisco.yangide.core.indexing.ElementIndexType;
+import com.cisco.yangide.core.model.YangModelManager;
+import com.cisco.yangide.core.parser.YangParserUtil;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 4, 2014
+ */
+public class YangElementHyperlinkDetector extends AbstractHyperlinkDetector {
+
+    @Override
+    public IHyperlink[] detectHyperlinks(ITextViewer textViewer, IRegion region, boolean canShowMultipleHyperlinks) {
+        if (region == null || textViewer == null) {
+            return null;
+        }
+
+        IDocument document = textViewer.getDocument();
+
+        int offset = region.getOffset();
+
+        if (document == null) {
+            return null;
+        }
+
+        try {
+            Module module = YangParserUtil.parseYangFile(document.get().toCharArray());
+            ASTNode node = module.getNodeAtPosition(offset);
+
+            if (node == null) {
+                return null;
+            }
+
+            ElementIndexInfo[] searchResult = null;
+
+            if (node instanceof ModuleImport) {
+                ModuleImport importNode = (ModuleImport) node;
+                searchResult = YangModelManager.search(null, importNode.getRevision(), importNode.getName(),
+                        ElementIndexType.MODULE, null, null);
+            } else if (node instanceof TypeReference) {
+                TypeReference ref = (TypeReference) node;
+                QName type = ref.getType();
+                searchResult = YangModelManager.search(type.getModule(), type.getRevision(), type.getName(),
+                        ElementIndexType.TYPE, null, null);
+                if (searchResult.length == 0) {
+                    searchResult = YangModelManager.search(type.getModule(), type.getRevision(), type.getName(),
+                            ElementIndexType.IDENTITY, null, null);
+                }
+            } else if (node instanceof UsesNode) {
+                UsesNode usesNode = (UsesNode) node;
+                QName ref = usesNode.getGrouping();
+                searchResult = YangModelManager.search(ref.getModule(), ref.getRevision(), ref.getName(),
+                        ElementIndexType.GROUPING, null, null);
+            } else if (node instanceof BaseReference) {
+                BaseReference base = (BaseReference) node;
+                QName ref = base.getType();
+                searchResult = YangModelManager.search(ref.getModule(), ref.getRevision(), ref.getName(),
+                        ElementIndexType.IDENTITY, null, null);
+            }
+
+            if (searchResult != null && searchResult.length > 0) {
+                IRegion elementRegion = new Region(((ASTNamedNode) node).getNameStartPosition(),
+                        ((ASTNamedNode) node).getNameLength());
+                return new IHyperlink[] { new YangElementHyperlink(elementRegion, searchResult[0]) };
+            }
+        } catch (Exception e) {
+            return null;
+        }
+
+        return null;
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangPartitionScanner.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangPartitionScanner.java
new file mode 100644 (file)
index 0000000..d0039db
--- /dev/null
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.text.rules.EndOfLineRule;
+import org.eclipse.jface.text.rules.IPredicateRule;
+import org.eclipse.jface.text.rules.IToken;
+import org.eclipse.jface.text.rules.MultiLineRule;
+import org.eclipse.jface.text.rules.RuleBasedPartitionScanner;
+import org.eclipse.jface.text.rules.Token;
+
+/**
+ * @author Alexey Kholupko
+ */
+public class YangPartitionScanner extends RuleBasedPartitionScanner {
+
+    /**
+     * Double qoute string partition
+     */    
+    public final static String YANG_STRING = "__yang_string";
+    /**
+     * Single qoute string partition 
+     */
+    public final static String YANG_STRING_SQ = "__yang_string_sq"; 
+    public final static String YANG_COMMENT = "__yang_comment";
+
+    public YangPartitionScanner() {
+
+        List<IPredicateRule> rules = new ArrayList<IPredicateRule>();
+
+        IToken comment = new Token(YANG_COMMENT);
+        rules.add(new MultiLineRule("/*", "*/", comment, (char) 0, true));
+        rules.add(new EndOfLineRule("//", comment));
+
+        IToken multiLineString = new Token(YANG_STRING);
+        // TODO escaping " or ' in each other sequence
+        rules.add(new MultiLineRule("\"", "\"", multiLineString, '\\', true));
+        IToken multiLineString_sq = new Token(YANG_STRING_SQ);
+        rules.add(new MultiLineRule("'", "'", multiLineString_sq, '\\', true));
+
+        IPredicateRule[] result = new IPredicateRule[rules.size()];
+        rules.toArray(result);
+        setPredicateRules(result);
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangPresentationReconciler.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangPresentationReconciler.java
new file mode 100644 (file)
index 0000000..1e5a4fa
--- /dev/null
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.TextPresentation;
+import org.eclipse.jface.text.presentation.PresentationReconciler;
+
+/**
+ * Presentation reconciler, adding functionality for operation without a viewer.
+ *
+ * @author Alexey Kholupko
+ */
+public class YangPresentationReconciler extends PresentationReconciler {
+
+    /** Last used document */
+    private IDocument fLastDocument;
+
+    /**
+     * Constructs a "repair description" for the given damage and returns this description as a text
+     * presentation.
+     * <p>
+     * NOTE: Should not be used if this reconciler is installed on a viewer.
+     * </p>
+     */
+    public TextPresentation createRepairDescription(IRegion damage, IDocument document) {
+        if (document != fLastDocument) {
+            setDocumentToDamagers(document);
+            setDocumentToRepairers(document);
+            fLastDocument = document;
+        }
+        return createPresentation(damage, document);
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangScanner.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangScanner.java
new file mode 100644 (file)
index 0000000..a9aeb49
--- /dev/null
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jdt.ui.text.IColorManager;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.rules.IRule;
+import org.eclipse.jface.text.rules.IToken;
+import org.eclipse.jface.text.rules.NumberRule;
+import org.eclipse.jface.text.rules.WhitespaceRule;
+import org.eclipse.jface.text.rules.WordRule;
+
+import com.cisco.yangide.ui.preferences.IYangColorConstants;
+
+/**
+ * @author Alexey Kholupko
+ */
+public class YangScanner extends AbstractYangScanner {
+
+    private static String[] tokenProperties = { IYangColorConstants.YANG_IDENTIFIER, IYangColorConstants.YANG_KEYWORD,
+            IYangColorConstants.YANG_TYPE, IYangColorConstants.YANG_NUMBER, };
+
+    static String[] keywords = { "yin-element", "yang-version", "when", "value", "uses", "units", "unique", "typedef",
+            "type", "submodule", "status", "rpc", "revision-date", "revision", "require-instance", "refine",
+            "reference", "range", "presence", "prefix", "position", "pattern", "path", "output", "organization",
+            "ordered-by", "notification", "namespace", "must", "module", "min-elements", "max-elements", "mandatory",
+            "list", "length", "leaf-list", "leaf", "key", "input", "include", "import", "if-feature", "identity",
+            "grouping", "fraction-digits", "feature", "deviate", "deviation", "extension", "error-message",
+            "error-app-tag", "enum", "description", "default", "container", "contact", "config", "choice", "case",
+            "bit", "belongs-to", "base", "augment", "argument", "anyxml" };
+
+    static String[] types = { "binary", "bits", "boolean", "decimal64", "empty", "enumeration", "identityref",
+            "instance-identifier", "int8", "int16", "int32", "int64", "leafref", "string", "uint8", "uint16", "uint32",
+            "uint64", "union" };
+
+    public static String[] getKeywords() {
+        return keywords;
+    }
+
+    public static String[] getTypes() {
+        return types;
+    }
+
+    /**
+     * @param manager
+     * @param store
+     */
+    public YangScanner(IColorManager manager, IPreferenceStore store) {
+        super(manager, store);
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see com.cisco.yangide.editor.editors.AbstractYangScanner#getTokenProperties()
+     */
+    @Override
+    protected String[] getTokenProperties() {
+        return tokenProperties;
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see com.cisco.yangide.editor.editors.AbstractYangScanner#createRules()
+     */
+    @Override
+    protected List<IRule> createRules() {
+
+        List<IRule> rules = new ArrayList<IRule>();
+        // Add generic whitespace rule.
+        rules.add(new WhitespaceRule(new YangWhitespaceDetector()));
+
+        IToken number = getToken(IYangColorConstants.YANG_NUMBER);
+        NumberRule numberRule = new NumberRule(number);
+        rules.add(numberRule);
+
+        IToken identifier = getToken(IYangColorConstants.YANG_IDENTIFIER);
+        IToken keyword = getToken(IYangColorConstants.YANG_KEYWORD);
+        IToken type = getToken(IYangColorConstants.YANG_TYPE);
+
+        setDefaultReturnToken(identifier);
+
+        WordRule wordRule = new WordRule(new YangWordDetector(), identifier);
+
+        for (int i = 0; i < keywords.length; i++) {
+            String word = keywords[i];
+            wordRule.addWord(word, keyword);
+        }
+
+        for (int i = 0; i < getTypes().length; i++) {
+            String word = getTypes()[i];
+            wordRule.addWord(word, type);
+        }
+
+        rules.add(wordRule);
+
+        return rules;
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangSourceViewer.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangSourceViewer.java
new file mode 100644 (file)
index 0000000..03f376e
--- /dev/null
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors;
+
+import java.util.ArrayList;
+
+import org.eclipse.jface.text.ITextPresentationListener;
+import org.eclipse.jface.text.reconciler.IReconciler;
+import org.eclipse.jface.text.source.IOverviewRuler;
+import org.eclipse.jface.text.source.IVerticalRuler;
+import org.eclipse.jface.text.source.projection.ProjectionViewer;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 24, 2014
+ */
+public class YangSourceViewer extends ProjectionViewer {
+    private boolean notifyTextListeners = true;
+
+    public YangSourceViewer(Composite parent, IVerticalRuler verticalRuler, IOverviewRuler overviewRuler,
+            boolean showAnnotationsOverview, int styles) {
+        super(parent, verticalRuler, overviewRuler, showAnnotationsOverview, styles);
+    }
+
+    /**
+     * Prepends the text presentation listener at the beginning of the viewer's list of text
+     * presentation listeners. If the listener is already registered with the viewer this call moves
+     * the listener to the beginning of the list.
+     *
+     * @param listener the text presentation listener
+     */
+    @SuppressWarnings("unchecked")
+    public void prependTextPresentationListener(ITextPresentationListener listener) {
+        if (fTextPresentationListeners == null) {
+            fTextPresentationListeners = new ArrayList<ITextPresentationListener>();
+        }
+
+        fTextPresentationListeners.remove(listener);
+        fTextPresentationListeners.add(0, listener);
+    }
+
+    /**
+     * @return the reconciler
+     */
+    public IReconciler getReconciler() {
+        return fReconciler;
+    }
+
+    public void updateDocument() {
+        resetVisibleRegion();
+    }
+
+    public void enableTextListeners() {
+        this.notifyTextListeners = true;
+    }
+
+    public void disableTextListeners() {
+        this.notifyTextListeners = false;
+    }
+
+    @Override
+    protected void updateTextListeners(WidgetCommand cmd) {
+        if (notifyTextListeners) {
+            super.updateTextListeners(cmd);
+        }
+    }
+
+    @Override
+    public int modelLine2WidgetLine(int modelLine) {
+        try {
+            return super.modelLine2WidgetLine(modelLine);
+        } catch (IllegalStateException e) {
+            return modelLine;
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangSourceViewerConfiguration.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangSourceViewerConfiguration.java
new file mode 100644 (file)
index 0000000..3b11009
--- /dev/null
@@ -0,0 +1,302 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors;
+
+import org.eclipse.jdt.ui.text.IColorManager;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.JFacePreferences;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.DefaultInformationControl;
+import org.eclipse.jface.text.IAutoEditStrategy;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IInformationControl;
+import org.eclipse.jface.text.IInformationControlCreator;
+import org.eclipse.jface.text.ITextDoubleClickStrategy;
+import org.eclipse.jface.text.ITextHover;
+import org.eclipse.jface.text.contentassist.ContentAssistant;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.jface.text.contentassist.IContentAssistant;
+import org.eclipse.jface.text.formatter.IContentFormatter;
+import org.eclipse.jface.text.formatter.MultiPassContentFormatter;
+import org.eclipse.jface.text.hyperlink.IHyperlinkDetector;
+import org.eclipse.jface.text.presentation.IPresentationReconciler;
+import org.eclipse.jface.text.reconciler.IReconciler;
+import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
+import org.eclipse.jface.text.reconciler.MonoReconciler;
+import org.eclipse.jface.text.rules.DefaultDamagerRepairer;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.editors.text.TextSourceViewerConfiguration;
+import org.eclipse.ui.texteditor.AbstractDecoratedTextEditorPreferenceConstants;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+import com.cisco.yangide.editor.editors.text.CompositeReconcilingStrategy;
+import com.cisco.yangide.editor.editors.text.YangFormattingStrategy;
+import com.cisco.yangide.editor.editors.text.YangReconcilingStrategy;
+import com.cisco.yangide.editor.editors.text.help.YangSimpleCompletionProcessor;
+import com.cisco.yangide.editor.editors.text.hover.YangTextHover;
+import com.cisco.yangide.editor.preferences.YangDocumentSetupParticipant;
+
+/**
+ * @author Alexey Kholupko
+ */
+public class YangSourceViewerConfiguration extends TextSourceViewerConfiguration {
+    private YangDoubleClickStrategy doubleClickStrategy;
+    private YangStringScanner stringScanner;
+    private YangCommentScanner commentScanner;
+    private YangScanner scanner;
+    private IColorManager colorManager;
+    private IPreferenceStore preferencesStore;
+    private ITextEditor editor;
+
+    public YangSourceViewerConfiguration(IPreferenceStore preferencesStore, IColorManager colorManager,
+            ITextEditor editor) {
+        super(preferencesStore);
+        this.preferencesStore = preferencesStore;
+        this.colorManager = colorManager;
+        this.editor = editor;
+        this.scanner = new YangScanner(colorManager, preferencesStore);
+        this.stringScanner = new YangStringScanner(colorManager, preferencesStore);
+        this.commentScanner = new YangCommentScanner(colorManager, preferencesStore);
+    }
+
+    @Override
+    public String[] getConfiguredContentTypes(ISourceViewer sourceViewer) {
+        return new String[] { IDocument.DEFAULT_CONTENT_TYPE, YangPartitionScanner.YANG_COMMENT,
+                YangPartitionScanner.YANG_STRING, YangPartitionScanner.YANG_STRING_SQ };
+    }
+
+    @Override
+    public ITextDoubleClickStrategy getDoubleClickStrategy(ISourceViewer sourceViewer, String contentType) {
+        if (doubleClickStrategy == null) {
+            doubleClickStrategy = new YangDoubleClickStrategy();
+        }
+        return doubleClickStrategy;
+    }
+
+    protected YangScanner getYangScanner() {
+        if (scanner == null) {
+            scanner = new YangScanner(colorManager, preferencesStore);
+        }
+        return scanner;
+    }
+
+    protected YangStringScanner getYangStringScanner() {
+        if (stringScanner == null) {
+            stringScanner = new YangStringScanner(colorManager, preferencesStore);
+        }
+        return stringScanner;
+    }
+
+    /**
+     * @return the commentScanner
+     */
+    public YangCommentScanner getYangCommentScanner() {
+        if (commentScanner == null) {
+            commentScanner = new YangCommentScanner(colorManager, preferencesStore);
+        }
+        return commentScanner;
+    }
+
+    @Override
+    public ITextHover getTextHover(ISourceViewer sourceViewer, String contentType) {
+        YangTextHover yangTextHover = new YangTextHover(sourceViewer);
+        yangTextHover.setEditor(editor);
+        return yangTextHover;
+    }
+
+    @Override
+    public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) {
+
+        /**
+         * for semantic higlighting @see org.eclipse.jdt.internal.ui.text.JavaPresentationReconciler
+         */
+        YangPresentationReconciler reconciler = new YangPresentationReconciler();
+        reconciler.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
+
+        DefaultDamagerRepairer dr = new DefaultDamagerRepairer(getYangScanner());
+        reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
+        reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
+
+        dr = new DefaultDamagerRepairer(getYangCommentScanner());
+        reconciler.setDamager(dr, YangPartitionScanner.YANG_COMMENT);
+        reconciler.setRepairer(dr, YangPartitionScanner.YANG_COMMENT);
+
+        dr = new DefaultDamagerRepairer(getYangStringScanner());
+        reconciler.setDamager(dr, YangPartitionScanner.YANG_STRING);
+        reconciler.setRepairer(dr, YangPartitionScanner.YANG_STRING);
+
+        dr = new DefaultDamagerRepairer(getYangStringScanner());
+        reconciler.setDamager(dr, YangPartitionScanner.YANG_STRING_SQ);
+        reconciler.setRepairer(dr, YangPartitionScanner.YANG_STRING_SQ);
+
+        return reconciler;
+    }
+
+    @Override
+    public String getConfiguredDocumentPartitioning(ISourceViewer sourceViewer) {
+        return YangDocumentSetupParticipant.YANG_PARTITIONING;
+    }
+
+    /**
+     * Determines whether the preference change encoded by the given event changes the behavior of
+     * one of its contained components.
+     */
+    public boolean affectsTextPresentation(PropertyChangeEvent event) {
+        return scanner.affectsBehavior(event) || stringScanner.affectsBehavior(event)
+                || commentScanner.affectsBehavior(event);
+
+    }
+
+    /**
+     * Adapts the behavior of the contained components to the change encoded in the given event.
+     */
+    public void handlePropertyChangeEvent(PropertyChangeEvent event) {
+
+        if (scanner.affectsBehavior(event)) {
+            scanner.adaptToPreferenceChange(event);
+        }
+        if (stringScanner.affectsBehavior(event)) {
+            stringScanner.adaptToPreferenceChange(event);
+        }
+        if (commentScanner.affectsBehavior(event)) {
+            commentScanner.adaptToPreferenceChange(event);
+
+        }
+    }
+
+    @Override
+    public IAutoEditStrategy[] getAutoEditStrategies(ISourceViewer sourceViewer, String contentType) {
+        String partitioning = getConfiguredDocumentPartitioning(sourceViewer);
+        return new IAutoEditStrategy[] { new YangAutoIndentStrategy(partitioning, sourceViewer) }; // usefull
+    }
+
+    @Override
+    public int getTabWidth(ISourceViewer sourceViewer) {
+        if (preferencesStore == null) {
+            return super.getTabWidth(sourceViewer);
+        }
+        return preferencesStore.getInt(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_TAB_WIDTH);
+    }
+
+    @Override
+    public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {
+
+        ContentAssistant assistant = new ContentAssistant();
+        IContentAssistProcessor processor = new YangSimpleCompletionProcessor(getEditor());
+        assistant.setContentAssistProcessor(processor, IDocument.DEFAULT_CONTENT_TYPE);
+
+        assistant.setDocumentPartitioning(YangDocumentSetupParticipant.YANG_PARTITIONING);
+
+        assistant.enableAutoActivation(false);
+        assistant.setAutoActivationDelay(200);
+        assistant.setProposalPopupOrientation(ContentAssistant.PROPOSAL_REMOVE);
+        assistant.setContextInformationPopupOrientation(ContentAssistant.CONTEXT_INFO_ABOVE);
+        assistant.setInformationControlCreator(getInformationControlCreator());
+
+        Color background = JFaceResources.getColorRegistry().get(JFacePreferences.CONTENT_ASSIST_BACKGROUND_COLOR);
+        assistant.setContextInformationPopupBackground(background);
+        assistant.setContextSelectorBackground(background);
+
+        Color foreground = JFaceResources.getColorRegistry().get(JFacePreferences.CONTENT_ASSIST_FOREGROUND_COLOR);
+        assistant.setContextInformationPopupForeground(foreground);
+        assistant.setContextSelectorForeground(foreground);
+
+        assistant.setStatusLineVisible(true);
+
+        assistant.enableAutoInsert(true);
+
+        return assistant;
+    }
+
+    @Override
+    public IHyperlinkDetector[] getHyperlinkDetectors(ISourceViewer sourceViewer) {
+        IHyperlinkDetector[] detectors = super.getHyperlinkDetectors(sourceViewer);
+        IHyperlinkDetector[] result = new IHyperlinkDetector[detectors.length + 1];
+        System.arraycopy(detectors, 0, result, 0, detectors.length);
+        result[detectors.length] = new YangElementHyperlinkDetector();
+        return result;
+    }
+
+    @Override
+    public String[] getDefaultPrefixes(ISourceViewer sourceViewer, String contentType) {
+        return new String[] { "//", "" }; //$NON-NLS-1$ //$NON-NLS-2$
+    }
+
+    @Override
+    public IReconciler getReconciler(ISourceViewer sourceViewer) {
+        final ITextEditor editor = getEditor();
+        if (editor != null && editor.isEditable()) {
+            CompositeReconcilingStrategy strategy = new CompositeReconcilingStrategy();
+            strategy.setReconcilingStrategies(new IReconcilingStrategy[] {
+            // yang syntax reconcile
+            new YangReconcilingStrategy(sourceViewer, getEditor()) });
+            MonoReconciler reconciler = new MonoReconciler(strategy, false);
+            reconciler.setIsAllowedToModifyDocument(false);
+            reconciler.setDelay(500);
+
+            return reconciler;
+        }
+        return null;
+    }
+
+    @Override
+    public IContentFormatter getContentFormatter(ISourceViewer sourceViewer) {
+        final MultiPassContentFormatter formatter = new MultiPassContentFormatter(
+                getConfiguredDocumentPartitioning(sourceViewer), IDocument.DEFAULT_CONTENT_TYPE);
+        formatter.setMasterStrategy(new YangFormattingStrategy());
+        return formatter;
+    }
+
+    /**
+     * @return the editor
+     */
+    public ITextEditor getEditor() {
+        return editor;
+    }
+
+    /**
+     * A copy-paste from {@link TextSourceViewerConfiguration}.getQuickAssistAssistantInformationControlCreator()
+     */
+    private IInformationControlCreator getInformationControlCreator() {
+        return new IInformationControlCreator() {
+            public IInformationControl createInformationControl(Shell parent) {
+                return new DefaultInformationControl(parent, "Press 'Tab' from proposal table or click for focus");
+            }
+        };
+    }
+    
+    // @Override
+    // public IInformationPresenter getInformationPresenter(ISourceViewer sourceViewer) {
+    // InformationPresenter presenter = new
+    // InformationPresenter(getInformationPresenterControlCreator(sourceViewer));
+    // presenter.setDocumentPartitioning(getConfiguredDocumentPartitioning(sourceViewer));
+    //
+    // // Register information provider
+    // IInformationProvider provider = new YangInformationProvider(getEditor());
+    // String[] contentTypes = getConfiguredContentTypes(sourceViewer);
+    // for (int i = 0; i < contentTypes.length; i++) {
+    // presenter.setInformationProvider(provider, contentTypes[i]);
+    // }
+    //
+    // // sizes: see org.eclipse.jface.text.TextViewer.TEXT_HOVER_*_CHARS
+    // return presenter;
+    // }
+
+    // private IInformationControlCreator getInformationPresenterControlCreator(ISourceViewer
+    // sourceViewer) {
+    // return new IInformationControlCreator() {
+    // @Override
+    // public IInformationControl createInformationControl(Shell parent) {
+    // return new DefaultInformationControl(parent, true);
+    // }
+    // };
+    // }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangStorageDocumentProvider.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangStorageDocumentProvider.java
new file mode 100644 (file)
index 0000000..b1c9d1b
--- /dev/null
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IDocumentExtension3;
+import org.eclipse.jface.text.IDocumentPartitioner;
+import org.eclipse.ui.editors.text.StorageDocumentProvider;
+
+import com.cisco.yangide.editor.preferences.YangDocumentSetupParticipant;
+
+/**
+ * @author Alexey Kholupko
+ */
+public class YangStorageDocumentProvider extends StorageDocumentProvider {
+
+    @Override
+    protected void setupDocument(Object element, IDocument document) {
+        if (document != null) {
+            IDocumentPartitioner partitioner = createDocumentPartitioner();
+            if (document instanceof IDocumentExtension3) {
+                IDocumentExtension3 extension3 = (IDocumentExtension3) document;
+                extension3.setDocumentPartitioner(YangDocumentSetupParticipant.YANG_PARTITIONING, partitioner);
+            } else {
+                document.setDocumentPartitioner(partitioner);
+            }
+            partitioner.connect(document);
+        }
+    }
+
+    private IDocumentPartitioner createDocumentPartitioner() {
+        return YangDocumentSetupParticipant.createDocumentPartitioner();
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangStringScanner.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangStringScanner.java
new file mode 100644 (file)
index 0000000..58ece10
--- /dev/null
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jdt.ui.text.IColorManager;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.rules.IRule;
+import org.eclipse.jface.text.rules.IToken;
+
+import com.cisco.yangide.ui.preferences.IYangColorConstants;
+
+/**
+ * @author Alexey Kholupko
+ */
+public class YangStringScanner extends AbstractYangScanner {
+
+    private static String[] tokenProperties = { IYangColorConstants.YANG_STRING };
+
+    /**
+     * @param manager
+     * @param store
+     */
+    public YangStringScanner(IColorManager manager, IPreferenceStore store) {
+        super(manager, store);
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see com.cisco.yangide.editor.editors.AbstractYangScanner#getTokenProperties()
+     */
+    @Override
+    protected String[] getTokenProperties() {
+        return tokenProperties;
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see com.cisco.yangide.editor.editors.AbstractYangScanner#createRules()
+     */
+    @Override
+    protected List<IRule> createRules() {
+        List<IRule> rules = new ArrayList<IRule>();
+
+        IToken string = getToken(IYangColorConstants.YANG_STRING);
+        setDefaultReturnToken(string);
+
+        // Do not create rules here, they are defined in PartitionScanner
+        // here we just define default token for string partition
+
+        return rules;
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangWhitespaceDetector.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangWhitespaceDetector.java
new file mode 100644 (file)
index 0000000..b6c01cd
--- /dev/null
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors;
+
+import org.eclipse.jface.text.rules.IWhitespaceDetector;
+
+/**
+ * @author Alexey Kholupko
+ */
+public class YangWhitespaceDetector implements IWhitespaceDetector {
+
+    public boolean isWhitespace(char c) {
+        return (c == ' ' || c == '\t' || c == '\n' || c == '\r');
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangWordDetector.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/YangWordDetector.java
new file mode 100644 (file)
index 0000000..1498a17
--- /dev/null
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors;
+
+import org.eclipse.jface.text.rules.IWordDetector;
+
+/**
+ * @author Alexey Kholupko
+ */
+public class YangWordDetector implements IWordDetector {
+
+    public boolean isWordPart(char character) {
+        return Character.isJavaIdentifierPart(character) || character == '-';
+    }
+
+    public boolean isWordStart(char character) {
+        return Character.isJavaIdentifierPart(character);
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/CompositeReconcilingStrategy.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/CompositeReconcilingStrategy.java
new file mode 100644 (file)
index 0000000..a589b77
--- /dev/null
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors.text;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.reconciler.DirtyRegion;
+import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
+import org.eclipse.jface.text.reconciler.IReconcilingStrategyExtension;
+
+/**
+ * A reconciling strategy consisting of a sequence of internal reconciling strategies. By default,
+ * all requests are passed on to the contained strategies.
+ *
+ * @author Konstantin Zaitsev
+ * date: Jul 10, 2014
+ */
+public class CompositeReconcilingStrategy implements IReconcilingStrategy, IReconcilingStrategyExtension {
+
+    /** The list of internal reconciling strategies. */
+    private IReconcilingStrategy[] fStrategies;
+
+    /**
+     * Creates a new, empty composite reconciling strategy.
+     */
+    public CompositeReconcilingStrategy() {
+    }
+
+    /**
+     * Sets the reconciling strategies for this composite strategy.
+     *
+     * @param strategies the strategies to be set or <code>null</code>
+     */
+    public void setReconcilingStrategies(IReconcilingStrategy[] strategies) {
+        fStrategies = strategies;
+    }
+
+    /**
+     * Returns the previously set stratgies or <code>null</code>.
+     *
+     * @return the contained strategies or <code>null</code>
+     */
+    public IReconcilingStrategy[] getReconcilingStrategies() {
+        return fStrategies;
+    }
+
+    @Override
+    public void setDocument(IDocument document) {
+        if (fStrategies == null) {
+            return;
+        }
+
+        for (int i = 0; i < fStrategies.length; i++) {
+            fStrategies[i].setDocument(document);
+        }
+    }
+
+    @Override
+    public void reconcile(DirtyRegion dirtyRegion, IRegion subRegion) {
+        if (fStrategies == null) {
+            return;
+        }
+
+        for (int i = 0; i < fStrategies.length; i++) {
+            fStrategies[i].reconcile(dirtyRegion, subRegion);
+        }
+    }
+
+    @Override
+    public void reconcile(IRegion partition) {
+        if (fStrategies == null) {
+            return;
+        }
+
+        for (int i = 0; i < fStrategies.length; i++) {
+            fStrategies[i].reconcile(partition);
+        }
+    }
+
+    @Override
+    public void setProgressMonitor(IProgressMonitor monitor) {
+        if (fStrategies == null) {
+            return;
+        }
+
+        for (int i = 0; i < fStrategies.length; i++) {
+            if (fStrategies[i] instanceof IReconcilingStrategyExtension) {
+                IReconcilingStrategyExtension extension = (IReconcilingStrategyExtension) fStrategies[i];
+                extension.setProgressMonitor(monitor);
+            }
+        }
+    }
+
+    @Override
+    public void initialReconcile() {
+        if (fStrategies == null) {
+            return;
+        }
+
+        for (int i = 0; i < fStrategies.length; i++) {
+            if (fStrategies[i] instanceof IReconcilingStrategyExtension) {
+                IReconcilingStrategyExtension extension = (IReconcilingStrategyExtension) fStrategies[i];
+                extension.initialReconcile();
+            }
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/DocumentCharacterIterator.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/DocumentCharacterIterator.java
new file mode 100644 (file)
index 0000000..52f6f75
--- /dev/null
@@ -0,0 +1,207 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors.text;
+
+/**
+ * @author Alexey Kholupko
+ *
+ */
+
+import java.text.CharacterIterator;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+
+/**
+ * An <code>IDocument</code> based implementation of <code>CharacterIterator</code> and
+ * <code>CharSequence</code>. Supplied document is not copied; if the document is modified during
+ * the lifetime of a <code>DocumentCharacterIterator</code>, the methods returning document content
+ * may not always return the same values.
+ */
+public class DocumentCharacterIterator implements CharacterIterator, CharSequence {
+
+    private int fIndex = -1;
+    private final IDocument fDocument;
+    private final int fFirst;
+    private final int fLast;
+
+    private void invariant() {
+        Assert.isTrue(fIndex >= fFirst);
+        Assert.isTrue(fIndex <= fLast);
+    }
+
+    /**
+     * Creates an iterator for the entire document.
+     */
+    public DocumentCharacterIterator(IDocument document) throws BadLocationException {
+        this(document, 0);
+    }
+
+    /**
+     * Creates an iterator, starting at offset <code>first</code>.
+     */
+    public DocumentCharacterIterator(IDocument document, int first) throws BadLocationException {
+        this(document, first, document.getLength());
+    }
+
+    /**
+     * Creates an iterator for the document contents from <code>first</code> (inclusive) to
+     * <code>last</code> (exclusive).
+     */
+    public DocumentCharacterIterator(IDocument document, int first, int last) throws BadLocationException {
+        if (document == null)
+            throw new NullPointerException();
+        if (first < 0 || first > last)
+            throw new BadLocationException();
+        if (last > document.getLength()) {
+            throw new BadLocationException();
+        }
+        fDocument = document;
+        fFirst = first;
+        fLast = last;
+        fIndex = first;
+        invariant();
+    }
+
+    /*
+     * @see java.text.CharacterIterator#first()
+     */
+    public char first() {
+        return setIndex(getBeginIndex());
+    }
+
+    /*
+     * @see java.text.CharacterIterator#last()
+     */
+    public char last() {
+        if (fFirst == fLast)
+            return setIndex(getEndIndex());
+        else
+            return setIndex(getEndIndex() - 1);
+    }
+
+    /*
+     * @see java.text.CharacterIterator#current()
+     */
+    public char current() {
+        if (fIndex >= fFirst && fIndex < fLast)
+            try {
+                return fDocument.getChar(fIndex);
+            } catch (BadLocationException e) {
+                // ignore
+            }
+        return DONE;
+    }
+
+    /*
+     * @see java.text.CharacterIterator#next()
+     */
+    public char next() {
+        return setIndex(Math.min(fIndex + 1, getEndIndex()));
+    }
+
+    /*
+     * @see java.text.CharacterIterator#previous()
+     */
+    public char previous() {
+        if (fIndex > getBeginIndex()) {
+            return setIndex(fIndex - 1);
+        } else {
+            return DONE;
+        }
+    }
+
+    /*
+     * @see java.text.CharacterIterator#setIndex(int)
+     */
+    public char setIndex(int position) {
+        if (position >= getBeginIndex() && position <= getEndIndex())
+            fIndex = position;
+        else
+            throw new IllegalArgumentException();
+
+        invariant();
+        return current();
+    }
+
+    /*
+     * @see java.text.CharacterIterator#getBeginIndex()
+     */
+    public int getBeginIndex() {
+        return fFirst;
+    }
+
+    /*
+     * @see java.text.CharacterIterator#getEndIndex()
+     */
+    public int getEndIndex() {
+        return fLast;
+    }
+
+    /*
+     * @see java.text.CharacterIterator#getIndex()
+     */
+    public int getIndex() {
+        return fIndex;
+    }
+
+    /*
+     * @see java.text.CharacterIterator#clone()
+     */
+    @Override
+    public Object clone() {
+        try {
+            return super.clone();
+        } catch (CloneNotSupportedException e) {
+            throw new InternalError();
+        }
+    }
+
+    /*
+     * @see java.lang.CharSequence#length()
+     */
+    public int length() {
+        return getEndIndex() - getBeginIndex();
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see java.lang.CharSequence#charAt(int)
+     */
+    @Override
+    public char charAt(int index) {
+        if (index >= 0 && index < length())
+            try {
+                return fDocument.getChar(getBeginIndex() + index);
+            } catch (BadLocationException e) {
+                // ignore and return DONE
+                return DONE;
+            }
+        else
+            throw new IndexOutOfBoundsException();
+    }
+
+    /*
+     * @see java.lang.CharSequence#subSequence(int, int)
+     */
+    public CharSequence subSequence(int start, int end) {
+        if (start < 0)
+            throw new IndexOutOfBoundsException();
+        if (end < start)
+            throw new IndexOutOfBoundsException();
+        if (end > length())
+            throw new IndexOutOfBoundsException();
+        try {
+            return new DocumentCharacterIterator(fDocument, getBeginIndex() + start, getBeginIndex() + end);
+        } catch (BadLocationException ex) {
+            throw new IndexOutOfBoundsException();
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/Symbols.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/Symbols.java
new file mode 100644 (file)
index 0000000..c9d2197
--- /dev/null
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors.text;
+
+/**
+ * Symbols for the heuristic YANG scanner.
+ *
+ * @author Alexey Kholupko
+ */
+public interface Symbols {
+    int TokenEOF = -1;
+    int TokenLBRACE = 1;
+    int TokenRBRACE = 2;
+    int TokenLBRACKET = 3;
+    int TokenRBRACKET = 4;
+    int TokenLPAREN = 5;
+    int TokenRPAREN = 6;
+    int TokenSEMICOLON = 7;
+    int TokenOTHER = 8;
+    int TokenCOLON = 9;
+    int TokenQUESTIONMARK = 10;
+    int TokenCOMMA = 11;
+    int TokenEQUAL = 12;
+    int TokenLESSTHAN = 13;
+    int TokenGREATERTHAN = 14;
+    int TokenPLUS = 15;
+    int TokenAT = 16;
+    int TokenKEYWORD = 1000;
+    int TokenIDENT = 2000;
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/YangAnnotationModel.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/YangAnnotationModel.java
new file mode 100644 (file)
index 0000000..075ac83
--- /dev/null
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors.text;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.Position;
+import org.eclipse.ui.texteditor.MarkerAnnotation;
+import org.eclipse.ui.texteditor.ResourceMarkerAnnotationModel;
+
+import com.cisco.yangide.core.YangCorePlugin;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 16, 2014
+ */
+public class YangAnnotationModel extends ResourceMarkerAnnotationModel {
+
+    private ArrayList<YangMarkerAnnotation> curOverlaid = new ArrayList<>();
+    private ArrayList<YangMarkerAnnotation> prevOverlaid;
+    private ArrayList<YangSyntaxAnnotation> genAnnotations = new ArrayList<>();
+    private ArrayList<YangProblem> problems = new ArrayList<>();
+    private IProgressMonitor monitor;
+
+    /**
+     * @param resource
+     */
+    public YangAnnotationModel(IResource resource) {
+        super(resource);
+    }
+
+    public synchronized void init() {
+        problems.clear();
+    }
+
+    public synchronized void addProblem(YangProblem problem) {
+        problems.add(problem);
+    }
+
+    public synchronized void reportProblem() {
+        boolean temporaryProblemsChanged = false;
+        boolean isCanceled = false;
+
+        prevOverlaid = curOverlaid;
+        curOverlaid = new ArrayList<>();
+
+        if (genAnnotations.size() > 0) {
+            temporaryProblemsChanged = true;
+            removeAnnotations(genAnnotations, false, true);
+            genAnnotations.clear();
+        }
+
+        if (problems.size() > 0) {
+
+            Iterator<YangProblem> e = problems.iterator();
+            while (e.hasNext()) {
+
+                if (monitor != null && monitor.isCanceled()) {
+                    isCanceled = true;
+                    break;
+                }
+
+                try {
+                    YangProblem problem = e.next();
+                    overlayMarkers(problem.getPosition(), problem.getAnnotation());
+                    addAnnotation(problem.getAnnotation(), problem.getPosition(), false);
+                    genAnnotations.add(problem.getAnnotation());
+                } catch (BadLocationException e1) {
+                    // ignore exception
+                }
+
+                temporaryProblemsChanged = true;
+            }
+        }
+        removeMarkerOverlays(isCanceled);
+        prevOverlaid = null;
+
+        if (temporaryProblemsChanged) {
+            fireModelChanged();
+        }
+    }
+
+    /**
+     * @param isCanceled
+     */
+    private void removeMarkerOverlays(boolean isCanceled) {
+        if (isCanceled) {
+            curOverlaid.addAll(prevOverlaid);
+        } else if (prevOverlaid != null) {
+            Iterator<YangMarkerAnnotation> e = prevOverlaid.iterator();
+            while (e.hasNext()) {
+                YangMarkerAnnotation annotation = e.next();
+                annotation.markDeleted(true);
+            }
+        }
+    }
+
+    /**
+     * @param position
+     * @param annotation
+     */
+    private void overlayMarkers(Position position, YangSyntaxAnnotation annotation) {
+        Iterator<?> it = getAnnotationIterator();
+        while (it.hasNext()) {
+            Object obj = it.next();
+            if (obj instanceof YangMarkerAnnotation) {
+                YangMarkerAnnotation m = (YangMarkerAnnotation) obj;
+                if (position.equals(m.getPosition())) {
+                    m.markDeleted(false);
+                    prevOverlaid.remove(m);
+                    curOverlaid.add(m);
+                }
+            }
+        }
+    }
+
+    @Override
+    protected MarkerAnnotation createMarkerAnnotation(IMarker marker) {
+        try {
+            if (YangCorePlugin.YANGIDE_PROBLEM_MARKER.equals(marker.getType())) {
+                YangMarkerAnnotation annotation = new YangMarkerAnnotation(marker);
+                curOverlaid.add(annotation);
+                return annotation;
+            }
+        } catch (CoreException e) {
+            // ignore exception
+        }
+        return super.createMarkerAnnotation(marker);
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/YangCodeFormatter.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/YangCodeFormatter.java
new file mode 100644 (file)
index 0000000..08f856f
--- /dev/null
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors.text;
+
+import org.eclipse.text.edits.ReplaceEdit;
+import org.eclipse.text.edits.TextEdit;
+
+import com.cisco.yangide.core.parser.YangFormattingPreferences;
+import com.cisco.yangide.core.parser.YangParserUtil;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 21, 2014
+ */
+public class YangCodeFormatter {
+
+    /** Formatting preferences. */
+    private YangFormattingPreferences preferences;
+
+    /**
+     * @param preferences
+     */
+    public YangCodeFormatter(YangFormattingPreferences preferences) {
+        this.preferences = preferences;
+    }
+
+    public TextEdit format(String source, int offset, int length, int indentationLevel, String lineSeparator) {
+        char[] content = source.substring(offset, offset + length).toCharArray();
+        String str = YangParserUtil.formatYangSource(preferences, content, indentationLevel, lineSeparator);
+        return new ReplaceEdit(offset, length, str);
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/YangFoldingStructureProvider.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/YangFoldingStructureProvider.java
new file mode 100644 (file)
index 0000000..70c4eb5
--- /dev/null
@@ -0,0 +1,344 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors.text;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.BadPositionCategoryException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.rules.IToken;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.projection.IProjectionPosition;
+import org.eclipse.jface.text.source.projection.ProjectionAnnotation;
+import org.eclipse.jface.text.source.projection.ProjectionAnnotationModel;
+
+import com.cisco.yangide.core.dom.ASTNode;
+import com.cisco.yangide.core.dom.ASTVisitor;
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.editor.YangEditorPlugin;
+import com.cisco.yangide.editor.editors.YangEditor;
+import com.cisco.yangide.editor.editors.YangPartitionScanner;
+
+/**
+ * @author Alexey Kholupko
+ */
+@SuppressWarnings({"rawtypes", "unchecked"})
+public class YangFoldingStructureProvider {
+
+    private YangEditor fEditor;
+    private IDocument fDocument;
+
+    /**
+     * A mapping of the foldable position to the
+     * <code>AntElementNode<code> that represent that region
+     */
+
+    private Map fPositionToElement = new HashMap();
+
+    public YangFoldingStructureProvider(YangEditor editor) {
+        fEditor = editor;
+    }
+
+
+    private void updateFoldingRegions(ProjectionAnnotationModel model, List currentRegions) {
+        Annotation[] deletions = computeDifferences(model, currentRegions);
+
+        if (currentRegions.isEmpty()) {
+            return;
+        }
+        Map additionsMap = new HashMap();
+
+
+        Position headerCommentCandidate = (Position) currentRegions.get(0);
+        ProjectionAnnotation headerCommentCandidateAnnotation = null;
+        if(headerCommentCandidate != null){
+            headerCommentCandidateAnnotation = new ProjectionAnnotation(false);
+            additionsMap.put(headerCommentCandidateAnnotation, headerCommentCandidate);
+        }
+
+        for (int i = 1; i < currentRegions.size(); i++) {
+            Position position = (Position) currentRegions.get(i);
+            additionsMap.put(new ProjectionAnnotation(false), position);
+        }
+
+        if ((deletions.length != 0 || additionsMap.size() != 0)) {
+            model.modifyAnnotations(deletions, additionsMap, new Annotation[] {});
+        }
+
+        if (isHeaderComment(headerCommentCandidate)) {
+            model.collapse(headerCommentCandidateAnnotation);
+        }
+
+    }
+
+    /**
+     * @param headerCommentCandidate
+     * @return
+     */
+    private boolean isHeaderComment(Position headerCommentCandidate) {
+        if(headerCommentCandidate == null) {
+            return false;
+        }
+
+        YangPartitionScanner scanner = new YangPartitionScanner();
+        scanner.setRange(fDocument, 0, fDocument.getLength());
+
+        try {
+            // first token must be YANG_COMMENT
+
+            String contentType = null;
+            IToken token;
+            do {
+                token = scanner.nextToken();
+                contentType = getTokenContentType(token);
+            } while (contentType == null && !token.isEOF());
+
+            if (contentType != null && contentType.equals(YangPartitionScanner.YANG_COMMENT)) {
+
+                int tokenStartLine = fDocument.getLineOfOffset(scanner.getTokenOffset());
+                int tokenEndLine = fDocument.getLineOfOffset(scanner.getTokenOffset() + scanner.getTokenLength());
+
+                int start = fDocument.getLineOffset(tokenStartLine);
+                int end = fDocument.getLineOffset(tokenEndLine) + fDocument.getLineLength(tokenEndLine);
+                Position tokenPosition = new Position(start, end - start);
+
+                if (headerCommentCandidate.equals(tokenPosition)) {
+                    return true;
+                }
+
+            }
+
+        } catch (BadLocationException e) {
+            YangEditorPlugin.log(e);
+        }
+
+        return false;
+    }
+
+    private Annotation[] computeDifferences(ProjectionAnnotationModel model, List currentRegions) {
+        List deletions = new ArrayList();
+        for (Iterator iter = model.getAnnotationIterator(); iter.hasNext();) {
+            Object annotation = iter.next();
+            if (annotation instanceof ProjectionAnnotation) {
+                Position position = model.getPosition((Annotation) annotation);
+                if (currentRegions.contains(position)) {
+                    currentRegions.remove(position);
+                } else {
+                    deletions.add(annotation);
+                }
+            }
+        }
+        return (Annotation[]) deletions.toArray(new Annotation[deletions.size()]);
+    }
+
+    public void updateFoldingRegions(Module yangModule) {
+        if (yangModule != null) {
+            fPositionToElement = new HashMap();
+            try {
+                ProjectionAnnotationModel model = (ProjectionAnnotationModel) fEditor
+                        .getAdapter(ProjectionAnnotationModel.class);
+                if (model == null) {
+                    return;
+                }
+
+                final List root = new ArrayList();
+
+                yangModule.accept(new ASTVisitor() {
+
+                    @Override
+                    public void preVisit(ASTNode node) {
+                        root.add(node);
+                    }
+                });
+
+                List currentRegions = new ArrayList<>();
+
+                // order is important, to know about header comment
+                addFoldingNonASTregions(currentRegions);
+
+                addFoldingRegions(currentRegions, root);
+                updateFoldingRegions(model, currentRegions);
+
+            } catch (BadLocationException be) {
+                // ignore as document has changed
+            }
+        }
+    }
+
+    private void addFoldingNonASTregions(List currentRegions) {
+
+        // litle hack here, because of FastPartitioner odd privacy
+        String[] categories = fDocument.getPositionCategories();
+        for (String category : categories) {
+            if (category.startsWith("__content_types_category")) {
+                try {
+                    Position[] positions = fDocument.getPositions(category);
+                    for (Position position : positions) {
+
+                        int positionOffset = position.getOffset();
+                        int positionLength = position.getLength();
+                        // for single line comment - EndOfLineRule
+                        if (fDocument.getChar(positionOffset + position.getLength() - 1) == '\n') {
+                            positionLength--;
+                        }
+
+                        int startLine = fDocument.getLineOfOffset(positionOffset);
+                        int endLine = fDocument.getLineOfOffset(positionOffset + positionLength);
+                        if (startLine < endLine) {
+                            int start = fDocument.getLineOffset(startLine);
+                            int end = fDocument.getLineOffset(endLine) + fDocument.getLineLength(endLine);
+                            Position foldingPosition = // new Position(start, end - start);
+                                    new CommentPosition(start, end - start);
+                            currentRegions.add(foldingPosition);
+                            // fPositionToElement.put(foldingPosition, element);
+                        }
+
+                    }
+
+                } catch (BadPositionCategoryException | BadLocationException e) {
+                    YangEditorPlugin.log(e);
+                }
+            }
+        }
+
+    }
+
+    protected String getTokenContentType(IToken token) {
+        Object data = token.getData();
+        if (data instanceof String) {
+            return (String) data;
+        }
+        return null;
+    }
+
+    private void addFoldingRegions(List currentRegions, List children) throws BadLocationException {
+        // add a Position to 'regions' for each foldable region
+        Iterator iter = children.iterator();
+        while (iter.hasNext()) {
+            ASTNode element = (ASTNode) iter.next();
+            // if (element.getImportNode() != null || element.isExternal()) {
+            // continue; //elements are not really in this document and therefore are not foldable
+            // }
+            int startLine = fDocument.getLineOfOffset(element.getStartPosition());
+            int endLine = fDocument.getLineOfOffset(element.getStartPosition() + element.getLength());
+            if (startLine < endLine) {
+                int start = fDocument.getLineOffset(startLine);
+                int end = fDocument.getLineOffset(endLine) + fDocument.getLineLength(endLine);
+                Position position = new Position(start, end - start);
+                currentRegions.add(position);
+                fPositionToElement.put(position, element);
+            }
+
+            // List childNodes= element.getChildNodes();
+            // if (childNodes != null) {
+            // addFoldingRegions(regions, childNodes);
+            // }
+        }
+    }
+
+    public void setDocument(IDocument document) {
+        fDocument = document;
+    }
+
+    /**
+     * Projection position that will return two foldable regions: one folding away the region from
+     * after the '/**' to the beginning of the content, the other from after the first content line
+     * until after the comment.
+     */
+    private static final class CommentPosition extends Position implements IProjectionPosition {
+        CommentPosition(int offset, int length) {
+            super(offset, length);
+        }
+
+        /*
+         * @see
+         * org.eclipse.jface.text.source.projection.IProjectionPosition#computeFoldingRegions(org
+         * .eclipse.jface.text.IDocument)
+         */
+        @Override
+        public IRegion[] computeProjectionRegions(IDocument document) throws BadLocationException {
+            DocumentCharacterIterator sequence = new DocumentCharacterIterator(document, offset, offset + length);
+            int prefixEnd = 0;
+            int contentStart = findFirstContent(sequence, prefixEnd);
+
+            int firstLine = document.getLineOfOffset(offset + prefixEnd);
+            int captionLine = document.getLineOfOffset(offset + contentStart);
+            int lastLine = document.getLineOfOffset(offset + length);
+
+            Assert.isTrue(firstLine <= captionLine, "first folded line is greater than the caption line"); //$NON-NLS-1$
+            Assert.isTrue(captionLine <= lastLine, "caption line is greater than the last folded line"); //$NON-NLS-1$
+
+            IRegion preRegion;
+            if (firstLine < captionLine) {
+                // preRegion= new Region(offset + prefixEnd, contentStart - prefixEnd);
+                int preOffset = document.getLineOffset(firstLine);
+                IRegion preEndLineInfo = document.getLineInformation(captionLine);
+                int preEnd = preEndLineInfo.getOffset();
+                preRegion = new Region(preOffset, preEnd - preOffset);
+            } else {
+                preRegion = null;
+            }
+
+            if (captionLine < lastLine) {
+                int postOffset = document.getLineOffset(captionLine + 1);
+                int postLength = offset + length - postOffset;
+                if (postLength > 0) {
+                    IRegion postRegion = new Region(postOffset, postLength);
+                    if (preRegion == null) {
+                        return new IRegion[] { postRegion };
+                    }
+                    return new IRegion[] { preRegion, postRegion };
+                }
+            }
+
+            if (preRegion != null) {
+                return new IRegion[] { preRegion };
+            }
+
+            return null;
+        }
+
+        /**
+         * Finds the offset of the first identifier part within <code>content</code>. Returns 0 if
+         * none is found.
+         *
+         * @param content the content to search
+         * @param prefixEnd the end of the prefix
+         * @return the first index of a unicode identifier part, or zero if none can be found
+         */
+        private int findFirstContent(final CharSequence content, int prefixEnd) {
+            int lenght = content.length();
+            for (int i = prefixEnd; i < lenght; i++) {
+                if (Character.isUnicodeIdentifierPart(content.charAt(i))) {
+                    return i;
+                }
+            }
+            return 0;
+        }
+
+        /*
+         * @see
+         * org.eclipse.jface.text.source.projection.IProjectionPosition#computeCaptionOffset(org
+         * .eclipse.jface.text.IDocument)
+         */
+        @Override
+        public int computeCaptionOffset(IDocument document) throws BadLocationException {
+            DocumentCharacterIterator sequence = new DocumentCharacterIterator(document, offset, offset + length);
+            return findFirstContent(sequence, 0);
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/YangFormattingStrategy.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/YangFormattingStrategy.java
new file mode 100644 (file)
index 0000000..66db4d6
--- /dev/null
@@ -0,0 +1,122 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors.text;
+
+import java.util.LinkedList;
+import java.util.Map;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IDocumentPartitioner;
+import org.eclipse.jface.text.TextUtilities;
+import org.eclipse.jface.text.TypedPosition;
+import org.eclipse.jface.text.formatter.ContextBasedFormattingStrategy;
+import org.eclipse.jface.text.formatter.FormattingContextProperties;
+import org.eclipse.jface.text.formatter.IFormattingContext;
+import org.eclipse.text.edits.MalformedTreeException;
+import org.eclipse.text.edits.TextEdit;
+
+import com.cisco.yangide.core.parser.YangFormattingPreferences;
+import com.cisco.yangide.editor.YangEditorPlugin;
+import com.cisco.yangide.ui.YangUIPlugin;
+import com.cisco.yangide.ui.preferences.YangPreferenceConstants;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 21, 2014
+ */
+public class YangFormattingStrategy extends ContextBasedFormattingStrategy {
+
+    /** Documents to be formatted by this strategy */
+    private final LinkedList<IDocument> documents = new LinkedList<IDocument>();
+    /** Partitions to be formatted by this strategy */
+    private final LinkedList<TypedPosition> partitions = new LinkedList<TypedPosition>();
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public void format() {
+        super.format();
+        final IDocument document = documents.removeFirst();
+        final TypedPosition partition = partitions.removeFirst();
+
+        if (document != null && partition != null) {
+            Map<String, IDocumentPartitioner> partitioners = null;
+            try {
+                YangFormattingPreferences pref = new YangFormattingPreferences();
+
+                IPreferenceStore store = YangUIPlugin.getDefault().getPreferenceStore();
+                pref.setSpaceForTabs(store.getBoolean(YangPreferenceConstants.FMT_INDENT_SPACE));
+                pref.setIndentSize(store.getInt(YangPreferenceConstants.FMT_INDENT_WIDTH));
+                pref.setCompactImport(store.getBoolean(YangPreferenceConstants.FMT_COMPACT_IMPORT));
+                pref.setFormatComment(store.getBoolean(YangPreferenceConstants.FMT_COMMENT));
+                pref.setFormatStrings(store.getBoolean(YangPreferenceConstants.FMT_STRING));
+                pref.setMaxLineLength(store.getInt(YangPreferenceConstants.FMT_MAX_LINE_LENGTH));
+
+                int offset = partition.getOffset();
+                final TextEdit edit = new YangCodeFormatter(pref).format(document.get(), offset, partition.getLength(),
+                        getIndentationLevel(document, offset), TextUtilities.getDefaultLineDelimiter(document));
+                if (edit != null) {
+                    if (edit.getChildrenSize() > 20) {
+                        partitioners = TextUtilities.removeDocumentPartitioners(document);
+                    }
+
+                    edit.apply(document);
+                }
+
+            } catch (MalformedTreeException | BadLocationException e) {
+                YangEditorPlugin.log(e);
+            } finally {
+                if (partitioners != null) {
+                    TextUtilities.addDocumentPartitioners(document, partitioners);
+                }
+            }
+        }
+    }
+
+    @Override
+    public void formatterStarts(final IFormattingContext context) {
+        super.formatterStarts(context);
+
+        partitions.addLast((TypedPosition) context.getProperty(FormattingContextProperties.CONTEXT_PARTITION));
+        documents.addLast((IDocument) context.getProperty(FormattingContextProperties.CONTEXT_MEDIUM));
+    }
+
+    @Override
+    public void formatterStops() {
+        super.formatterStops();
+
+        partitions.clear();
+        documents.clear();
+    }
+
+    private int getIndentationLevel(IDocument doc, int offset) {
+        int indentationLevel = 0;
+        boolean skip = false;
+        char[] buff = doc.get().toCharArray();
+        for (int i = 1; i < offset; i++) {
+            if (buff[i - 1] == '/' && buff[i] == '*') {
+                skip = true;
+            }
+
+            if (buff[i - 1] == '*' && buff[i] == '/') {
+                skip = false;
+            }
+
+            if (!skip) {
+                if (buff[i] == '{') {
+                    indentationLevel++;
+                }
+                if (buff[i] == '}') {
+                    indentationLevel--;
+                }
+            }
+        }
+        return indentationLevel > 0 ? indentationLevel : 0;
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/YangHeuristicScanner.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/YangHeuristicScanner.java
new file mode 100644 (file)
index 0000000..72e569c
--- /dev/null
@@ -0,0 +1,710 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors.text;
+
+import java.util.Arrays;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITypedRegion;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.TextUtilities;
+import org.eclipse.jface.text.TypedRegion;
+
+import com.cisco.yangide.editor.editors.YangScanner;
+import com.cisco.yangide.editor.preferences.YangDocumentSetupParticipant;
+
+/**
+ * Utility methods for heuristic based YANG manipulations in an incomplete YANG source file.
+ *
+ * @author Alexey Kholupko
+ */
+public final class YangHeuristicScanner implements Symbols {
+    /**
+     * Returned by all methods when the requested position could not be found
+     */
+    public static final int NOT_FOUND = -1;
+
+    /**
+     * Special bound parameter that means either -1 (backward scanning) or
+     * <code>fDocument.getLength()</code> (forward scanning).
+     */
+    public static final int UNBOUND = -2;
+
+    /* character constants */
+    private static final char LBRACE = '{';
+    private static final char RBRACE = '}';
+    private static final char LPAREN = '(';
+    private static final char RPAREN = ')';
+    private static final char SEMICOLON = ';';
+    private static final char COLON = ':';
+    private static final char COMMA = ',';
+    private static final char LBRACKET = '[';
+    private static final char RBRACKET = ']';
+    private static final char QUESTIONMARK = '?';
+    private static final char EQUAL = '=';
+    private static final char LANGLE = '<';
+    private static final char RANGLE = '>';
+    private static final char PLUS = '+';
+    private static final char AT = '@';
+
+    /**
+     * Specifies the stop condition, upon which the <code>scanXXX</code> methods will decide whether
+     * to keep scanning or not. This interface may implemented by clients.
+     */
+    private static abstract class StopCondition {
+        /**
+         * Instructs the scanner to return the current position.
+         *
+         * @param ch the char at the current position
+         * @param position the current position
+         * @param forward the iteration direction
+         * @return <code>true</code> if the stop condition is met.
+         */
+        public abstract boolean stop(char ch, int position, boolean forward);
+
+        /**
+         * Asks the condition to return the next position to query. The default is to return the
+         * next/previous position.
+         *
+         * @param position the position
+         * @param forward <code>true</code> if next position should be returned
+         * @return the next position to scan
+         */
+        public int nextPosition(int position, boolean forward) {
+            return forward ? position + 1 : position - 1;
+        }
+    }
+
+    /**
+     * Stops upon a non-whitespace (as defined by {@link Character#isWhitespace(char)}) character.
+     */
+    private static class NonWhitespace extends StopCondition {
+        /*
+         * @see com.cisco.yangide.editor.editors.text.YangHeuristicScanner.StopCondition#stop(char)
+         */
+        @Override
+        public boolean stop(char ch, int position, boolean forward) {
+            return !Character.isWhitespace(ch);
+        }
+    }
+
+    /**
+     * Stops upon a non-whitespace character in the default partition.
+     *
+     * @see YangHeuristicScanner.NonWhitespace
+     */
+    private final class NonWhitespaceDefaultPartition extends NonWhitespace {
+        /*
+         * @see com.cisco.yangide.editor.editors.text.YangHeuristicScanner.StopCondition#stop(char)
+         */
+        @Override
+        public boolean stop(char ch, int position, boolean forward) {
+            return super.stop(ch, position, true) && isDefaultPartition(position);
+        }
+
+        /*
+         * @see
+         * com.cisco.yangide.editor.editors.text.YangHeuristicScanner.StopCondition#nextPosition
+         * (int, boolean)
+         */
+        @Override
+        public int nextPosition(int position, boolean forward) {
+            ITypedRegion partition = getPartition(position);
+            if (fPartition.equals(partition.getType()))
+                return super.nextPosition(position, forward);
+
+            if (forward) {
+                int end = partition.getOffset() + partition.getLength();
+                if (position < end)
+                    return end;
+            } else {
+                int offset = partition.getOffset();
+                if (position > offset)
+                    return offset - 1;
+            }
+            return super.nextPosition(position, forward);
+        }
+    }
+
+    /**
+     * Stops upon a non-YANG identifier (as defined by {@link #isYAngIdentifierPart(char)})
+     * character.
+     */
+    private static class NonYangIdentifierPart extends StopCondition {
+        /*
+         * @see com.cisco.yangide.editor.editors.text.YangHeuristicScanner.StopCondition#stop(char)
+         */
+        @Override
+        public boolean stop(char ch, int position, boolean forward) {
+            return !isYangIdentifierPart(ch);
+        }
+    }
+
+    /**
+     * Stops upon a non-YANG identifier character in the default partition.
+     *
+     * @see YangHeuristicScanner.NonYangIdentifierPart
+     */
+    private final class NonYangIdentifierPartDefaultPartition extends NonYangIdentifierPart {
+        /*
+         * @see com.cisco.yangide.editor.editors.text.YangHeuristicScanner.StopCondition#stop(char)
+         */
+        @Override
+        public boolean stop(char ch, int position, boolean forward) {
+            return super.stop(ch, position, true) || !isDefaultPartition(position);
+        }
+
+        /*
+         * @see
+         * com.cisco.yangide.editor.editors.text.YangHeuristicScanner.StopCondition#nextPosition
+         * (int, boolean)
+         */
+        @Override
+        public int nextPosition(int position, boolean forward) {
+            ITypedRegion partition = getPartition(position);
+            if (fPartition.equals(partition.getType()))
+                return super.nextPosition(position, forward);
+
+            if (forward) {
+                int end = partition.getOffset() + partition.getLength();
+                if (position < end)
+                    return end;
+            } else {
+                int offset = partition.getOffset();
+                if (position > offset)
+                    return offset - 1;
+            }
+            return super.nextPosition(position, forward);
+        }
+    }
+
+    /**
+     * Stops upon a character in the default partition that matches the given character list.
+     */
+    private final class CharacterMatch extends StopCondition {
+        private final char[] fChars;
+
+        /**
+         * Creates a new instance.
+         *
+         * @param ch the single character to match
+         */
+        public CharacterMatch(char ch) {
+            this(new char[] { ch });
+        }
+
+        /**
+         * Creates a new instance.
+         *
+         * @param chars the chars to match.
+         */
+        public CharacterMatch(char[] chars) {
+            Assert.isNotNull(chars);
+            Assert.isTrue(chars.length > 0);
+            fChars = chars;
+            Arrays.sort(chars);
+        }
+
+        /*
+         * @see com.cisco.yangide.editor.editors.text.YangHeuristicScanner.StopCondition#stop(char,
+         * int)
+         */
+        @Override
+        public boolean stop(char ch, int position, boolean forward) {
+            return Arrays.binarySearch(fChars, ch) >= 0 && isDefaultPartition(position);
+        }
+
+        /*
+         * @see
+         * com.cisco.yangide.editor.editors.text.YangHeuristicScanner.StopCondition#nextPosition
+         * (int, boolean)
+         */
+        @Override
+        public int nextPosition(int position, boolean forward) {
+            ITypedRegion partition = getPartition(position);
+            if (fPartition.equals(partition.getType()))
+                return super.nextPosition(position, forward);
+
+            if (forward) {
+                int end = partition.getOffset() + partition.getLength();
+                if (position < end)
+                    return end;
+            } else {
+                int offset = partition.getOffset();
+                if (position > offset)
+                    return offset - 1;
+            }
+            return super.nextPosition(position, forward);
+        }
+    }
+
+    /** The document being scanned. */
+    private final IDocument fDocument;
+    /** The partitioning being used for scanning. */
+    private final String fPartitioning;
+    /** The partition to scan in. */
+    private final String fPartition;
+
+    /* internal scan state */
+
+    /** the most recently read character. */
+    private char fChar;
+    /** the most recently read position. */
+    private int fPos;
+    /**
+     * The most recently used partition.
+     */
+    private ITypedRegion fCachedPartition = new TypedRegion(-1, 0, "__no_partition_at_all"); //$NON-NLS-1$
+
+    /* preset stop conditions */
+    private final StopCondition fNonWSDefaultPart = new NonWhitespaceDefaultPartition();
+    private final static StopCondition fNonWS = new NonWhitespace();
+    private final StopCondition fNonIdent = new NonYangIdentifierPartDefaultPartition();
+
+    /**
+     * Creates a new instance.
+     *
+     * @param document the document to scan
+     * @param partitioning the partitioning to use for scanning
+     * @param partition the partition to scan in
+     */
+    public YangHeuristicScanner(IDocument document, String partitioning, String partition) {
+        Assert.isLegal(document != null);
+        Assert.isLegal(partitioning != null);
+        Assert.isLegal(partition != null);
+        fDocument = document;
+        fPartitioning = partitioning;
+        fPartition = partition;
+    }
+
+    /**
+     * Calls
+     * <code>this(document, YangDocumentSetupParticipant.YANG_PARTITIONING, IDocument.DEFAULT_CONTENT_TYPE)</code>
+     *
+     * @param document the document to scan.
+     */
+    public YangHeuristicScanner(IDocument document) {
+        this(document, YangDocumentSetupParticipant.YANG_PARTITIONING, IDocument.DEFAULT_CONTENT_TYPE);
+    }
+
+    /**
+     * Returns the most recent internal scan position.
+     */
+    public int getPosition() {
+        return fPos;
+    }
+
+    /**
+     * Returns the next token in forward direction, starting at <code>start</code>, and not
+     * extending further than <code>bound</code>. The return value is one of the constants defined
+     * in {@link Symbols}. After a call, {@link #getPosition()} will return the position just after
+     * the scanned token (i.e. the next position that will be scanned).
+     */
+    public int nextToken(int start, int bound) {
+        int pos = scanForward(start, bound, fNonWSDefaultPart);
+        if (pos == NOT_FOUND)
+            return TokenEOF;
+
+        fPos++;
+
+        switch (fChar) {
+        case LBRACE:
+            return TokenLBRACE;
+        case RBRACE:
+            return TokenRBRACE;
+        case LBRACKET:
+            return TokenLBRACKET;
+        case RBRACKET:
+            return TokenRBRACKET;
+        case LPAREN:
+            return TokenLPAREN;
+        case RPAREN:
+            return TokenRPAREN;
+        case SEMICOLON:
+            return TokenSEMICOLON;
+        case COMMA:
+            return TokenCOMMA;
+        case QUESTIONMARK:
+            return TokenQUESTIONMARK;
+        case EQUAL:
+            return TokenEQUAL;
+        case LANGLE:
+            return TokenLESSTHAN;
+        case RANGLE:
+            return TokenGREATERTHAN;
+        case PLUS:
+            return TokenPLUS;
+        case AT:
+            return TokenAT;
+        }
+
+        // else
+        if (isYangIdentifierPart(fChar)) {
+            // assume an identifier or keyword
+            int from = pos, to;
+            pos = scanForward(pos + 1, bound, fNonIdent);
+            if (pos == NOT_FOUND)
+                to = bound == UNBOUND ? fDocument.getLength() : bound;
+            else
+                to = pos;
+
+            String identOrKeyword;
+            try {
+                identOrKeyword = fDocument.get(from, to - from);
+            } catch (BadLocationException e) {
+                return TokenEOF;
+            }
+
+            return getToken(identOrKeyword);
+
+        } else {
+            // operators, number literals etc
+            return TokenOTHER;
+        }
+    }
+
+    /**
+     * Returns the next token in backward direction, starting at <code>start</code>, and not
+     * extending further than <code>bound</code>. The return value is one of the constants defined
+     * in {@link Symbols}. After a call, {@link #getPosition()} will return the position just before
+     * the scanned token starts (i.e. the next position that will be scanned).
+     */
+    public int previousToken(int start, int bound) {
+        int pos = scanBackward(start, bound, fNonWSDefaultPart);
+        if (pos == NOT_FOUND)
+            return TokenEOF;
+
+        fPos--;
+
+        switch (fChar) {
+        case LBRACE:
+            return TokenLBRACE;
+        case RBRACE:
+            return TokenRBRACE;
+        case LBRACKET:
+            return TokenLBRACKET;
+        case RBRACKET:
+            return TokenRBRACKET;
+        case LPAREN:
+            return TokenLPAREN;
+        case RPAREN:
+            return TokenRPAREN;
+        case SEMICOLON:
+            return TokenSEMICOLON;
+        case COLON:
+            return TokenCOLON;
+        case COMMA:
+            return TokenCOMMA;
+        case QUESTIONMARK:
+            return TokenQUESTIONMARK;
+        case EQUAL:
+            return TokenEQUAL;
+        case LANGLE:
+            return TokenLESSTHAN;
+        case RANGLE:
+            return TokenGREATERTHAN;
+        case PLUS:
+            return TokenPLUS;
+        case AT:
+            return TokenAT;
+        }
+
+        // else
+        if (isYangIdentifierPart(fChar)) {
+            // assume an ident or keyword
+            int from, to = pos + 1;
+            pos = scanBackward(pos - 1, bound, fNonIdent);
+            if (pos == NOT_FOUND)
+                from = bound == UNBOUND ? 0 : bound + 1;
+            else
+                from = pos + 1;
+
+            String identOrKeyword;
+            try {
+                identOrKeyword = fDocument.get(from, to - from);
+            } catch (BadLocationException e) {
+                return TokenEOF;
+            }
+
+            return getToken(identOrKeyword);
+
+        } else {
+            // operators, number literals etc
+            return TokenOTHER;
+        }
+
+    }
+
+    /**
+     * @param fChar2
+     * @return
+     */
+    public static boolean isYangIdentifierPart(char fChar2) {
+
+        return Character.isJavaIdentifierPart(fChar2) || fChar2 == '-';
+    }
+
+    /**
+     * Returns one of the keyword constants or <code>TokenIDENT</code> for a scanned identifier.
+     *
+     * @param s a scanned identifier
+     * @return one of the constants defined in {@link Symbols}
+     */
+    private int getToken(String s) {
+        Assert.isNotNull(s);
+
+        // TODO types are separate tokens
+        if (Arrays.asList(YangScanner.getKeywords()).contains(s) || Arrays.asList(YangScanner.getTypes()).contains(s))
+            return TokenKEYWORD;
+
+        return TokenIDENT;
+    }
+
+    /**
+     * Returns the position of the closing peer character (forward search). Any scopes introduced by
+     * opening peers are skipped. All peers accounted for must reside in the default partition.
+     * <p>
+     * <code>start</code> must not point to the opening peer, but to the first character being
+     * searched.
+     * </p>
+     */
+    public int findClosingPeer(int start, final char openingPeer, final char closingPeer) {
+        return findClosingPeer(start, UNBOUND, openingPeer, closingPeer);
+    }
+
+    public int findClosingPeer(int start, int bound, final char openingPeer, final char closingPeer) {
+        Assert.isLegal(start >= 0);
+
+        try {
+            CharacterMatch match = new CharacterMatch(new char[] { openingPeer, closingPeer });
+            int depth = 1;
+            start -= 1;
+            while (true) {
+                start = scanForward(start + 1, bound, match);
+                if (start == NOT_FOUND)
+                    return NOT_FOUND;
+
+                if (fDocument.getChar(start) == openingPeer)
+                    depth++;
+                else
+                    depth--;
+
+                if (depth == 0)
+                    return start;
+            }
+
+        } catch (BadLocationException e) {
+            return NOT_FOUND;
+        }
+    }
+
+    /**
+     * Returns the position of the opening peer character (backward search). Any scopes introduced
+     * by closing peers are skipped. All peers accounted for must reside in the default partition.
+     * <p>
+     * <code>start</code> must not point to the closing peer, but to the first character being
+     * searched.
+     * </p>
+     */
+    public int findOpeningPeer(int start, char openingPeer, char closingPeer) {
+        return findOpeningPeer(start, UNBOUND, openingPeer, closingPeer);
+    }
+
+    public int findOpeningPeer(int start, int bound, char openingPeer, char closingPeer) {
+        Assert.isLegal(start < fDocument.getLength());
+
+        try {
+            final CharacterMatch match = new CharacterMatch(new char[] { openingPeer, closingPeer });
+            int depth = 1;
+            start += 1;
+            while (true) {
+                start = scanBackward(start - 1, bound, match);
+                if (start == NOT_FOUND)
+                    return NOT_FOUND;
+
+                if (fDocument.getChar(start) == closingPeer)
+                    depth++;
+                else
+                    depth--;
+
+                if (depth == 0)
+                    return start;
+            }
+
+        } catch (BadLocationException e) {
+            return NOT_FOUND;
+        }
+    }
+
+    /**
+     * Computes the surrounding block around <code>offset</code>. The search is started at the
+     * beginning of <code>offset</code>, i.e. an opening brace at <code>offset</code> will not be
+     * part of the surrounding block, but a closing brace will.
+     */
+    public IRegion findSurroundingBlock(int offset) {
+        if (offset < 1 || offset >= fDocument.getLength())
+            return null;
+
+        int begin = findOpeningPeer(offset - 1, LBRACE, RBRACE);
+        int end = findClosingPeer(offset, LBRACE, RBRACE);
+        if (begin == NOT_FOUND || end == NOT_FOUND)
+            return null;
+        return new Region(begin, end + 1 - begin);
+    }
+
+    /**
+     * Finds the smallest position in <code>fDocument</code> such that the position is &gt;=
+     * <code>position</code> and &lt; <code>bound</code> and
+     * <code>Character.isWhitespace(fDocument.getChar(pos))</code> evaluates to <code>false</code>
+     * and the position is in the default partition.
+     */
+    public int findNonWhitespaceForward(int position, int bound) {
+        return scanForward(position, bound, fNonWSDefaultPart);
+    }
+
+    public int findNonWhitespaceForwardInAnyPartition(int position, int bound) {
+        return scanForward(position, bound, fNonWS);
+    }
+
+    /**
+     * Finds the highest position in <code>fDocument</code> such that the position is &lt;=
+     * <code>position</code> and &gt; <code>bound</code> and
+     * <code>Character.isWhitespace(fDocument.getChar(pos))</code> evaluates to <code>false</code>
+     * and the position is in the default partition.
+     */
+    public int findNonWhitespaceBackward(int position, int bound) {
+        return scanBackward(position, bound, fNonWSDefaultPart);
+    }
+
+    public int findNonWhitespaceBackwardInAnyPartition(int position, int bound) {
+        return scanBackward(position, bound, fNonWS);
+    }
+
+    /**
+     * Finds the lowest position <code>p</code> in <code>fDocument</code> such that
+     * <code>start</code> &lt;= p &lt; <code>bound</code> and
+     * <code>condition.stop(fDocument.getChar(p), p)</code> evaluates to <code>true</code>.
+     */
+    public int scanForward(int start, int bound, StopCondition condition) {
+        Assert.isLegal(start >= 0);
+
+        if (bound == UNBOUND)
+            bound = fDocument.getLength();
+
+        Assert.isLegal(bound <= fDocument.getLength());
+
+        try {
+            fPos = start;
+            while (fPos < bound) {
+
+                fChar = fDocument.getChar(fPos);
+                if (condition.stop(fChar, fPos, true))
+                    return fPos;
+
+                fPos = condition.nextPosition(fPos, true);
+            }
+        } catch (BadLocationException e) {
+        }
+        return NOT_FOUND;
+    }
+
+    public int scanForward(int position, int bound, char ch) {
+        return scanForward(position, bound, new CharacterMatch(ch));
+    }
+
+    public int scanForward(int position, int bound, char[] chars) {
+        return scanForward(position, bound, new CharacterMatch(chars));
+    }
+
+    public int scanBackward(int start, int bound, StopCondition condition) {
+        if (bound == UNBOUND)
+            bound = -1;
+
+        Assert.isLegal(bound >= -1);
+        Assert.isLegal(start < fDocument.getLength());
+
+        try {
+            fPos = start;
+            while (fPos > bound) {
+
+                fChar = fDocument.getChar(fPos);
+                if (condition.stop(fChar, fPos, false))
+                    return fPos;
+
+                fPos = condition.nextPosition(fPos, false);
+            }
+        } catch (BadLocationException e) {
+        }
+        return NOT_FOUND;
+    }
+
+    public int scanBackward(int position, int bound, char ch) {
+        return scanBackward(position, bound, new CharacterMatch(ch));
+    }
+
+    public int scanBackward(int position, int bound, char[] chars) {
+        return scanBackward(position, bound, new CharacterMatch(chars));
+    }
+
+    /**
+     * Checks whether <code>position</code> resides in a default (YANG) partition of
+     * <code>fDocument</code>.
+     */
+    public boolean isDefaultPartition(int position) {
+        return fPartition.equals(getPartition(position).getType());
+    }
+
+    /**
+     * Returns the partition at <code>position</code>.
+     */
+    private ITypedRegion getPartition(int position) {
+        if (!contains(fCachedPartition, position)) {
+            Assert.isTrue(position >= 0);
+            Assert.isTrue(position <= fDocument.getLength());
+
+            try {
+                fCachedPartition = TextUtilities.getPartition(fDocument, fPartitioning, position, false);
+            } catch (BadLocationException e) {
+                fCachedPartition = new TypedRegion(position, 0, "__no_partition_at_all"); //$NON-NLS-1$
+            }
+        }
+
+        return fCachedPartition;
+    }
+
+    /**
+     * Returns <code>true</code> if <code>region</code> contains <code>position</code>.
+     */
+    private boolean contains(IRegion region, int position) {
+        int offset = region.getOffset();
+        return offset <= position && position < offset + region.getLength();
+    }
+
+    /**
+     * Checks if the line seems to be an open condition not followed by a block (i.e. statement with
+     * just one following statement).
+     */
+    public boolean isBracelessBlockStart(int position, int bound) {
+        if (position < 1)
+            return false;
+
+        switch (previousToken(position, bound)) {
+        // for example:
+        // description
+        // "This is..."
+        case TokenKEYWORD:
+            return true;
+        }
+
+        return false;
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/YangIndenter.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/YangIndenter.java
new file mode 100644 (file)
index 0000000..dc417bd
--- /dev/null
@@ -0,0 +1,1217 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors.text;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+//import org.eclipse.jdt.internal.corext.util.CodeFormatterUtil;
+import org.eclipse.ui.texteditor.AbstractDecoratedTextEditorPreferenceConstants;
+
+import com.cisco.yangide.editor.YangEditorPlugin;
+import com.cisco.yangide.ui.YangUIPlugin;
+
+/**
+ * Uses the {@link org.eclipse.jdt.internal.ui.text.YangHeuristicScanner} to get the indentation
+ * level for a certain position in a document.
+ *
+ * @author Alexey Kholupko
+ */
+public final class YangIndenter {
+
+    /**
+     * Core preferences.
+     */
+    private final class CorePrefs {
+
+        final boolean prefUseTabs;
+        final int prefTabSize;
+        final int prefIndentationSize;
+        final boolean prefArrayDimensionsDeepIndent;
+        final int prefArrayIndent;
+        final boolean prefArrayDeepIndent;
+        final boolean prefTernaryDeepAlign;
+        final int prefTernaryIndent;
+        final int prefCaseBlockIndent;
+        final int prefSimpleIndent;
+        final int prefBracketIndent;
+        final boolean prefMethodDeclDeepIndent;
+        final int prefMethodDeclIndent;
+        final boolean prefMethodCallDeepIndent;
+        final int prefMethodCallIndent;
+        final boolean prefParenthesisDeepIndent;
+        final int prefParenthesisIndent;
+        final int prefBlockIndent;
+        final int prefMethodBodyIndent;
+        final int prefTypeIndent;
+        final boolean prefIndentBracesForBlocks;
+        final boolean prefIndentBracesForArrays;
+        final boolean prefIndentBracesForMethods;
+        final boolean prefIndentBracesForTypes;
+        final int prefContinuationIndent;
+        final boolean prefHasGenerics;
+        final String prefTabChar;
+
+        CorePrefs() {
+
+            prefUseTabs = YangEditorPlugin.getDefault().getCombinedPreferenceStore()
+                    .getBoolean(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SPACES_FOR_TABS);
+
+            prefTabSize = prefTabSize();// 2;// 4;
+
+            prefIndentationSize = prefTabSize();// 2;// 4;
+            prefArrayDimensionsDeepIndent = true;
+
+            prefContinuationIndent = prefTabSize();// 2;
+            prefBlockIndent = 1;
+            prefArrayIndent = prefContinuationIndent;
+            prefArrayDeepIndent = true;
+            prefTernaryDeepAlign = false;
+            prefTernaryIndent = prefContinuationIndent;
+            prefCaseBlockIndent = prefBlockIndent;
+            prefIndentBracesForBlocks = false;
+            prefSimpleIndent = (prefIndentBracesForBlocks && prefBlockIndent == 0) ? 1 : prefBlockIndent;
+            prefBracketIndent = prefBlockIndent;
+            prefMethodDeclDeepIndent = true;
+            prefMethodDeclIndent = 1;
+            prefMethodCallDeepIndent = false;
+            prefMethodCallIndent = 1;
+            prefParenthesisDeepIndent = false;
+            prefParenthesisIndent = prefContinuationIndent;
+            prefMethodBodyIndent = 1;
+            prefTypeIndent = 1;
+            prefIndentBracesForArrays = false;
+            prefIndentBracesForMethods = false;
+            prefIndentBracesForTypes = false;
+            prefHasGenerics = false;
+            prefTabChar = getPrefTabChar(); // YangCore.TAB;
+
+        }
+
+        private String getPrefTabChar() {
+            if (YangEditorPlugin.getDefault().getCombinedPreferenceStore()
+                    .getBoolean(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_SPACES_FOR_TABS)) {
+                return YangUIPlugin.SPACE;
+            }
+            return YangUIPlugin.TAB;
+
+        }
+
+        private int prefTabSize() {
+
+            return YangEditorPlugin.getDefault().getCombinedPreferenceStore()
+                    .getInt(AbstractDecoratedTextEditorPreferenceConstants.EDITOR_TAB_WIDTH);
+        }
+
+    }
+
+    /** The document being scanned. */
+    private final IDocument fDocument;
+    /** The indentation accumulated by <code>findReferencePosition</code>. */
+    private int fIndent;
+    /**
+     * The absolute (character-counted) indentation offset for special cases (method defs, array
+     * initializers)
+     */
+    private int fAlign;
+    /** The stateful scanposition for the indentation methods. */
+    private int fPosition;
+    /** The previous position. */
+    private int fPreviousPos;
+    /** The most recent token. */
+    private int fToken;
+    /** The line of <code>fPosition</code>. */
+    private int fLine;
+    /**
+     * The scanner we will use to scan the document. It has to be installed on the same document as
+     * the one we get.
+     */
+    private final YangHeuristicScanner fScanner;
+    /**
+     * Core preferences.
+     */
+    private final CorePrefs fPrefs;
+
+    /**
+     * Creates a new instance.
+     *
+     * @param document the document to scan
+     * @param scanner the {@link YangHeuristicScanner} to be used for scanning the document. Must be
+     * installed on the same <code>IDocument</code>.
+     */
+    public YangIndenter(IDocument document, YangHeuristicScanner scanner) {
+        Assert.isNotNull(document);
+        Assert.isNotNull(scanner);
+        fDocument = document;
+        fScanner = scanner;
+        fPrefs = new CorePrefs();
+    }
+
+    /**
+     * Computes the indentation at the reference point of <code>position</code>.
+     */
+    public StringBuffer getReferenceIndentation(int offset) {
+        return getReferenceIndentation(offset, false);
+    }
+
+    private StringBuffer getReferenceIndentation(int offset, boolean assumeOpeningBrace) {
+
+        int unit;
+        if (assumeOpeningBrace) {
+            unit = findReferencePosition(offset, Symbols.TokenLBRACE);
+        } else {
+            unit = findReferencePosition(offset, peekChar(offset));
+        }
+
+        // if we were unable to find anything, return null
+        if (unit == YangHeuristicScanner.NOT_FOUND) {
+            return null;
+        }
+
+        return getLeadingWhitespace(unit);
+
+    }
+
+    /**
+     * Computes the indentation at <code>offset</code>.
+     */
+    public StringBuffer computeIndentation(int offset) {
+        return computeIndentation(offset, false);
+    }
+
+    public StringBuffer computeIndentation(int offset, boolean assumeOpeningBrace) {
+
+        StringBuffer reference = getReferenceIndentation(offset, assumeOpeningBrace);
+
+        // handle special alignment
+        if (fAlign != YangHeuristicScanner.NOT_FOUND) {
+            try {
+                // a special case has been detected.
+                IRegion line = fDocument.getLineInformationOfOffset(fAlign);
+                int lineOffset = line.getOffset();
+                return createIndent(lineOffset, fAlign, false);
+            } catch (BadLocationException e) {
+                return null;
+            }
+        }
+
+        if (reference == null) {
+            return null;
+        }
+
+        // add additional indent
+        return createReusingIndent(reference, fIndent);
+    }
+
+    /**
+     * Computes the length of a <code>CharacterSequence</code>, counting a tab character as the size
+     * until the next tab stop and every other character as one.
+     */
+    private int computeVisualLength(CharSequence indent) {
+        final int tabSize = fPrefs.prefTabSize;
+        int length = 0;
+        for (int i = 0; i < indent.length(); i++) {
+            char ch = indent.charAt(i);
+            switch (ch) {
+            case '\t':
+                if (tabSize > 0) {
+                    int reminder = length % tabSize;
+                    length += tabSize - reminder;
+                }
+                break;
+            case ' ':
+                length++;
+                break;
+            }
+        }
+        return length;
+    }
+
+    /**
+     * Strips any characters off the end of <code>reference</code> that exceed
+     * <code>indentLength</code>.
+     */
+    private StringBuffer stripExceedingChars(StringBuffer reference, int indentLength) {
+        final int tabSize = fPrefs.prefTabSize;
+        int measured = 0;
+        int chars = reference.length();
+        int i = 0;
+        for (; measured < indentLength && i < chars; i++) {
+            char ch = reference.charAt(i);
+            switch (ch) {
+            case '\t':
+                if (tabSize > 0) {
+                    int reminder = measured % tabSize;
+                    measured += tabSize - reminder;
+                }
+                break;
+            case ' ':
+                measured++;
+                break;
+            }
+        }
+        int deleteFrom = measured > indentLength ? i - 1 : i;
+
+        return reference.delete(deleteFrom, chars);
+    }
+
+    /**
+     * Returns the indentation of the line at <code>offset</code> as a <code>StringBuffer</code>. If
+     * the offset is not valid, the empty string is returned.
+     */
+    private StringBuffer getLeadingWhitespace(int offset) {
+        StringBuffer indent = new StringBuffer();
+        try {
+            IRegion line = fDocument.getLineInformationOfOffset(offset);
+            int lineOffset = line.getOffset();
+            int nonWS = fScanner.findNonWhitespaceForwardInAnyPartition(lineOffset, lineOffset + line.getLength());
+            indent.append(fDocument.get(lineOffset, nonWS - lineOffset));
+            return indent;
+        } catch (BadLocationException e) {
+            return indent;
+        }
+    }
+
+    /**
+     * Creates an indentation string of the length indent - start, consisting of the content in
+     * <code>fDocument</code> in the range [start, indent), with every character replaced by a space
+     * except for tabs, which are kept as such.
+     * <p>
+     * If <code>convertSpaceRunsToTabs</code> is <code>true</code>, every run of the number of
+     * spaces that make up a tab are replaced by a tab character. If it is not set, no conversion
+     * takes place, but tabs in the original range are still copied verbatim.
+     * </p>
+     */
+    private StringBuffer createIndent(int start, final int indent, final boolean convertSpaceRunsToTabs) {
+        final boolean convertTabs = fPrefs.prefUseTabs && convertSpaceRunsToTabs;
+        final int tabLen = fPrefs.prefTabSize;
+        final StringBuffer ret = new StringBuffer();
+        try {
+            int spaces = 0;
+            while (start < indent) {
+
+                char ch = fDocument.getChar(start);
+                if (ch == '\t') {
+                    ret.append('\t');
+                    spaces = 0;
+                } else if (convertTabs) {
+                    spaces++;
+                    if (spaces == tabLen) {
+                        ret.append('\t');
+                        spaces = 0;
+                    }
+                } else {
+                    ret.append(' ');
+                }
+
+                start++;
+            }
+            // remainder
+            while (spaces-- > 0) {
+                ret.append(' ');
+            }
+
+        } catch (BadLocationException e) {
+        }
+
+        return ret;
+    }
+
+    /**
+     * Creates a string with a visual length of the given <code>additional</code> indentation units.
+     *
+     * @return the modified <code>buffer</code> reflecting the indentation adapted to
+     * <code>additional</code>
+     */
+    private StringBuffer createReusingIndent(StringBuffer buffer, int additional) {
+        int refLength = computeVisualLength(buffer);
+        int addLength = fPrefs.prefIndentationSize * additional; // may be < 0
+        int totalLength = Math.max(0, refLength + addLength);
+
+        // copy the reference indentation for the indent up to the last tab
+        // stop within the maxCopy area
+        int minLength = Math.min(totalLength, refLength);
+        int tabSize = fPrefs.prefTabSize;
+        int maxCopyLength = tabSize > 0 ? minLength - minLength % tabSize : minLength; // maximum
+        // indent to
+        // copy
+        stripExceedingChars(buffer, maxCopyLength);
+
+        final String MIXED = "mixed"; //$NON-NLS-1$
+
+        // add additional indent
+        int missing = totalLength - maxCopyLength;
+        final int tabs, spaces;
+        if (YangUIPlugin.SPACE.equals(fPrefs.prefTabChar)) {
+            tabs = 0;
+            spaces = missing;
+        } else if (YangUIPlugin.TAB.equals(fPrefs.prefTabChar)) {
+            tabs = tabSize > 0 ? missing / tabSize : 0;
+            spaces = tabSize > 0 ? missing % tabSize : missing;
+        } else if (MIXED.equals(fPrefs.prefTabChar)) {
+            tabs = tabSize > 0 ? missing / tabSize : 0;
+            spaces = tabSize > 0 ? missing % tabSize : missing;
+        } else {
+            Assert.isTrue(false);
+            return null;
+        }
+        for (int i = 0; i < tabs; i++) {
+            buffer.append('\t');
+        }
+        for (int i = 0; i < spaces; i++) {
+            buffer.append(' ');
+        }
+        return buffer;
+    }
+
+    /**
+     * Returns the reference position regarding to indentation for <code>offset</code>, or
+     * <code>NOT_FOUND</code>. This method calls {@link #findReferencePosition(int, int)
+     * findReferencePosition(offset, nextChar)} where <code>nextChar</code> is the next character
+     * after <code>offset</code>.
+     */
+    public int findReferencePosition(int offset) {
+        return findReferencePosition(offset, peekChar(offset));
+    }
+
+    /**
+     * Peeks the next char in the document that comes after <code>offset</code> on the same line as
+     * <code>offset</code>.
+     */
+    private int peekChar(int offset) {
+        if (offset < fDocument.getLength()) {
+            try {
+                IRegion line = fDocument.getLineInformationOfOffset(offset);
+                int lineOffset = line.getOffset();
+                int next = fScanner.nextToken(offset, lineOffset + line.getLength());
+                return next;
+            } catch (BadLocationException e) {
+            }
+        }
+        return Symbols.TokenEOF;
+    }
+
+    /**
+     * Returns the reference position regarding to indentation for <code>position</code>, or
+     * <code>NOT_FOUND</code>.
+     */
+
+    public int findReferencePosition(int offset, int nextToken) {
+        boolean danglingElse = false;
+        boolean unindent = false;
+        boolean indent = false;
+        boolean matchBrace = false;
+        boolean matchParen = false;
+        boolean matchCase = false;
+        boolean throwsClause = false;
+
+        // account for un-indentation characters already typed in, but after position
+        // if they are on a line by themselves, the indentation gets adjusted
+        // accordingly
+        //
+        if (offset < fDocument.getLength()) {
+            try {
+                IRegion line = fDocument.getLineInformationOfOffset(offset);
+                int lineOffset = line.getOffset();
+                int prevPos = Math.max(offset - 1, 0);
+                boolean isFirstTokenOnLine = fDocument.get(lineOffset, prevPos + 1 - lineOffset).trim().length() == 0;
+                int prevToken = fScanner.previousToken(prevPos, YangHeuristicScanner.UNBOUND);
+                boolean bracelessBlockStart = fScanner.isBracelessBlockStart(prevPos, YangHeuristicScanner.UNBOUND);
+
+                switch (nextToken) {
+                case Symbols.TokenLBRACE: // for opening-brace-on-new-line style
+                    if (bracelessBlockStart && !fPrefs.prefIndentBracesForBlocks) {
+                        unindent = true;
+                    } else if ((prevToken == Symbols.TokenCOLON || prevToken == Symbols.TokenEQUAL)
+                            && !fPrefs.prefIndentBracesForArrays) {
+                        unindent = true;
+                    } else if (!bracelessBlockStart && fPrefs.prefIndentBracesForMethods) {
+                        indent = true;
+                    }
+                    break;
+                case Symbols.TokenRBRACE: // closing braces get unindented
+                    if (isFirstTokenOnLine) {
+                        matchBrace = true;
+                    }
+                    break;
+                case Symbols.TokenRPAREN:
+                    if (isFirstTokenOnLine) {
+                        matchParen = true;
+                    }
+                    break;
+                case Symbols.TokenPLUS:
+                    if (isStringContinuation(offset)) {
+                        if (isSecondLineOfStringContinuation(offset)) {
+                            fAlign = YangHeuristicScanner.NOT_FOUND;
+                            fIndent = fPrefs.prefContinuationIndent;
+                        } else {
+                            int previousLineOffset = fDocument.getLineOffset(fDocument.getLineOfOffset(offset) - 1);
+                            fAlign = fScanner.findNonWhitespaceForwardInAnyPartition(previousLineOffset,
+                                    YangHeuristicScanner.UNBOUND);
+                        }
+                        return fPosition;
+                    }
+                    break;
+                }
+            } catch (BadLocationException e) {
+            }
+        } else {
+            // don't assume an else could come if we are at the end of file
+            danglingElse = false;
+        }
+
+        int ref = findReferencePosition(offset, danglingElse, matchBrace, matchParen, matchCase, throwsClause);
+        if (unindent) {
+            fIndent--;
+        }
+        if (indent) {
+            fIndent++;
+        }
+        return ref;
+    }
+
+    /**
+     * Tells whether the given string is a continuation expression.
+     */
+    private boolean isStringContinuation(int offset) {
+        int nextNonWSCharPosition = fScanner.findNonWhitespaceBackwardInAnyPartition(offset - 1,
+                YangHeuristicScanner.UNBOUND);
+        try {
+            if (fDocument.getChar(nextNonWSCharPosition) == '"') {
+                return true;
+            } else {
+                return false;
+            }
+        } catch (BadLocationException e) {
+            YangEditorPlugin.log(e);
+            return false;
+        }
+    }
+
+    /**
+     * Checks if extra indentation for second line of string continuation is required.
+     */
+    private boolean isSecondLineOfStringContinuation(int offset) {
+        try {
+            int offsetLine = fDocument.getLineOfOffset(offset);
+            fPosition = offset;
+            while (true) {
+                nextToken();
+                switch (fToken) {
+                // scopes: skip them
+                case Symbols.TokenRPAREN:
+                case Symbols.TokenRBRACKET:
+                case Symbols.TokenRBRACE:
+                case Symbols.TokenGREATERTHAN:
+                    skipScope();
+                    break;
+
+                case Symbols.TokenPLUS:
+                    if ((offsetLine - fLine) > 1) {
+                        return false;
+                    }
+                    break;
+
+                case Symbols.TokenCOMMA:
+                case Symbols.TokenLPAREN:
+                case Symbols.TokenLBRACE:
+                case Symbols.TokenEQUAL:
+                    int stringStartingOffset = fScanner.findNonWhitespaceForwardInAnyPartition(fPosition + 1,
+                            YangHeuristicScanner.UNBOUND);
+                    int stringStartingLine = fDocument.getLineOfOffset(stringStartingOffset);
+                    if ((offsetLine - stringStartingLine) == 1) {
+                        fPosition = stringStartingOffset;
+                        return true;
+                    } else {
+                        return false;
+                    }
+                case Symbols.TokenLBRACKET:
+                case Symbols.TokenEOF:
+                    if ((offsetLine - fLine) == 1) {
+                        return true;
+                    } else {
+                        return false;
+                    }
+                }
+            }
+        } catch (BadLocationException e) {
+            YangEditorPlugin.log(e);
+            return false;
+        }
+    }
+
+    public int findReferencePosition(int offset, boolean danglingElse, boolean matchBrace, boolean matchParen,
+            boolean matchCase) {
+        return findReferencePosition(offset, danglingElse, matchBrace, matchParen, matchCase, false);
+    }
+
+    public int findReferencePosition(int offset, boolean danglingElse, boolean matchBrace, boolean matchParen,
+            boolean matchCase, boolean throwsClause) {
+        fIndent = 0; // the indentation modification
+        fAlign = YangHeuristicScanner.NOT_FOUND;
+        fPosition = offset;
+
+        // forward cases an unindentation happens sometimes if the next token is special, namely on
+        // braces, parens
+        // and case labels align braces, but handle the case where we align with the method
+        // declaration start
+        // instead of the opening brace.
+        if (matchBrace) {
+            if (skipScope(Symbols.TokenLBRACE, Symbols.TokenRBRACE)) {
+                try {
+                    // align with the opening brace that is on a line by its own
+                    int lineOffset = fDocument.getLineOffset(fLine);
+                    if (lineOffset <= fPosition
+                            && fDocument.get(lineOffset, fPosition - lineOffset).trim().length() == 0) {
+                        return fPosition;
+                    }
+                } catch (BadLocationException e) {
+                    // concurrent modification - walk default path
+                }
+                // if the opening brace is not on the start of the line, skip to the start
+                int pos = skipToStatementStart(true, true);
+                fIndent = 0; // indent is aligned with reference position
+                return pos;
+            } else {
+                // if we can't find the matching brace, the heuristic is to unindent
+                // by one against the normal position
+                int pos = findReferencePosition(offset, danglingElse, false, matchParen, matchCase, throwsClause);
+                fIndent--;
+                return pos;
+            }
+        }
+
+        // align parenthesis'
+        if (matchParen) {
+            if (skipScope(Symbols.TokenLPAREN, Symbols.TokenRPAREN)) {
+                fIndent = fPrefs.prefContinuationIndent;
+                return fPosition;
+            } else {
+                // if we can't find the matching paren, the heuristic is to unindent
+                // by one against the normal position
+                int pos = findReferencePosition(offset, danglingElse, matchBrace, false, matchCase, throwsClause);
+                fIndent--;
+                return pos;
+            }
+        }
+
+        nextToken();
+        switch (fToken) {
+        case Symbols.TokenGREATERTHAN:
+        case Symbols.TokenRBRACE:
+            // skip the block and fall through
+            // if we can't complete the scope, reset the scan position
+            int pos = fPosition;
+            if (!skipScope()) {
+                fPosition = pos;
+            }
+            return skipToStatementStart(danglingElse, false);
+        case Symbols.TokenSEMICOLON:
+            // this is the 90% case: after a statement block
+            // the end of the previous statement / block previous.end
+            // search to the end of the statement / block before the previous; the token just after
+            // that is previous.start
+            pos = fPosition;
+            return skipToStatementStart(danglingElse, false);
+            // scope introduction: special treat who special is
+        case Symbols.TokenLPAREN:
+        case Symbols.TokenLBRACE:
+        case Symbols.TokenLBRACKET:
+            return handleScopeIntroduction(offset + 1);
+
+        case Symbols.TokenEOF:
+            // trap when hitting start of document
+            return YangHeuristicScanner.NOT_FOUND;
+
+        case Symbols.TokenEQUAL:
+            // indent assignments
+            return handleEqual();
+
+        case Symbols.TokenCOLON:
+            // TODO handle ternary deep indentation
+            fIndent = fPrefs.prefCaseBlockIndent;
+            return fPosition;
+
+        case Symbols.TokenQUESTIONMARK:
+            if (fPrefs.prefTernaryDeepAlign) {
+                setFirstElementAlignment(fPosition, offset + 1);
+                return fPosition;
+            } else {
+                fIndent = fPrefs.prefTernaryIndent;
+                return fPosition;
+            }
+
+            // indentation for blockless introducers:
+        case Symbols.TokenKEYWORD:
+            fIndent = fPrefs.prefSimpleIndent;
+            return fPosition;
+
+        case Symbols.TokenRBRACKET:
+            fIndent = fPrefs.prefContinuationIndent;
+            return fPosition;
+
+        case Symbols.TokenRPAREN:
+            if (throwsClause) {
+                fIndent = fPrefs.prefContinuationIndent;
+                return fPosition;
+            }
+            int line = fLine;
+            if (skipScope(Symbols.TokenLPAREN, Symbols.TokenRPAREN)) {
+                int scope = fPosition;
+                nextToken();
+                fPosition = scope;
+                if (looksLikeMethodDecl()) {
+                    return skipToStatementStart(danglingElse, false);
+                }
+                fPosition = scope;
+                if (looksLikeAnnotation()) {
+                    return skipToStatementStart(danglingElse, false);
+                }
+            }
+            // restore
+            fPosition = offset;
+            fLine = line;
+
+            return skipToPreviousListItemOrListStart();
+        case Symbols.TokenPLUS:
+            if (isStringContinuation(fPosition)) {
+                try {
+                    if (isSecondLineOfStringContinuation(offset)) {
+                        fAlign = YangHeuristicScanner.NOT_FOUND;
+                        fIndent = fPrefs.prefContinuationIndent;
+                    } else {
+                        int previousLineOffset = fDocument.getLineOffset(fDocument.getLineOfOffset(offset) - 1);
+                        fAlign = fScanner.findNonWhitespaceForwardInAnyPartition(previousLineOffset,
+                                YangHeuristicScanner.UNBOUND);
+                    }
+                } catch (BadLocationException e) {
+                    YangEditorPlugin.log(e);
+                }
+                return fPosition;
+            }
+            fPosition = offset;
+            return skipToPreviousListItemOrListStart();
+        case Symbols.TokenCOMMA:
+            // inside a list of some type
+            // easy if there is already a list item before with its own indentation - we just align
+            // if not: take the start of the list ( LPAREN, LBRACE, LBRACKET ) and either align or
+            // indent by list-indent
+        default:
+            // inside whatever we don't know about: similar to the list case:
+            // if we are inside a continued expression, then either align with a previous line that
+            // has indentation
+            // or indent from the expression start line (either a scope introducer or the start of
+            // the expr).
+            return skipToPreviousListItemOrListStart();
+        }
+    }
+
+    /**
+     * Checks if the statement at position is itself a continuation of the previous, else sets the
+     * indentation to Continuation Indent.
+     *
+     * @return the position of the token
+     */
+    private int handleEqual() {
+        try {
+            // If this line is itself continuation of the previous then do nothing
+            IRegion line = fDocument.getLineInformationOfOffset(fPosition);
+            int nonWS = fScanner.findNonWhitespaceBackward(line.getOffset(), YangHeuristicScanner.UNBOUND);
+            if (nonWS != Symbols.TokenEOF) {
+                int tokenAtPreviousLine = fScanner.nextToken(nonWS, nonWS + 1);
+                if (tokenAtPreviousLine != Symbols.TokenSEMICOLON && tokenAtPreviousLine != Symbols.TokenRBRACE
+                        && tokenAtPreviousLine != Symbols.TokenLBRACE && tokenAtPreviousLine != Symbols.TokenEOF) {
+                    return fPosition;
+                }
+            }
+        } catch (BadLocationException e) {
+            return fPosition;
+        }
+
+        fIndent = fPrefs.prefContinuationIndent;
+        return fPosition;
+    }
+
+    /**
+     * Skips to the start of a statement that ends at the current position.
+     *
+     * @param danglingElse whether to indent aligned with the last <code>if</code>
+     * @param isInBlock whether the current position is inside a block, which limits the search
+     * scope to the next scope introducer
+     * @return the reference offset of the start of the statement
+     */
+    private int skipToStatementStart(boolean danglingElse, boolean isInBlock) {
+        final int NOTHING = 0;
+        final int READ_PARENS = 1;
+        final int READ_IDENT = 2;
+        int mayBeMethodBody = NOTHING;
+        boolean isTypeBody = false;
+        while (true) {
+            nextToken();
+
+            if (isInBlock) {
+                switch (fToken) {
+                // exit on all block introducers
+                case Symbols.TokenKEYWORD:
+                    return fPosition;
+                }
+            }
+
+            switch (fToken) {
+            // scope introduction through: LPAREN, LBRACE, LBRACKET
+            // search stop on SEMICOLON, RBRACE, COLON, EOF
+            // -> the next token is the start of the statement (i.e. previousPos when backward
+            // scanning)
+            case Symbols.TokenLPAREN:
+            case Symbols.TokenLBRACE:
+            case Symbols.TokenLBRACKET:
+            case Symbols.TokenSEMICOLON:
+                // XXX custom case, when comments appear above new block
+            case Symbols.TokenOTHER:
+            case Symbols.TokenEOF:
+                if (isInBlock) {
+                    fIndent = getBlockIndent(mayBeMethodBody == READ_IDENT, isTypeBody);
+                }
+                // else: fIndent set by previous calls
+                return fPreviousPos;
+
+            case Symbols.TokenCOLON:
+                int pos = fPreviousPos;
+                if (!isConditional()) {
+                    return pos;
+                }
+                break;
+
+            case Symbols.TokenRBRACE:
+                // RBRACE is a little tricky: it can be the end of an array definition, but
+                // usually it is the end of a previous block
+                pos = fPreviousPos; // store state
+                if (skipScope() && looksLikeArrayInitializerIntro()) {
+                    continue; // it's an array
+                } else {
+                    if (isInBlock) {
+                        fIndent = getBlockIndent(mayBeMethodBody == READ_IDENT, isTypeBody);
+                    }
+                    return pos; // it's not - do as with all the above
+                }
+
+                // scopes: skip them
+            case Symbols.TokenRPAREN:
+                if (isInBlock) {
+                    mayBeMethodBody = READ_PARENS;
+                }
+                //$FALL-THROUGH$
+            case Symbols.TokenRBRACKET:
+            case Symbols.TokenGREATERTHAN:
+                pos = fPreviousPos;
+                if (skipScope()) {
+                    break;
+                } else {
+                    return pos;
+                }
+
+            case Symbols.TokenKEYWORD:
+                // align the WHILE position with its do
+                return fPosition;
+
+            case Symbols.TokenIDENT:
+                if (mayBeMethodBody == READ_PARENS) {
+                    mayBeMethodBody = READ_IDENT;
+                }
+                break;
+
+            default:
+                // keep searching
+
+            }
+
+        }
+
+    }
+
+    private int getBlockIndent(boolean isMethodBody, boolean isTypeBody) {
+        if (isTypeBody) {
+            return fPrefs.prefTypeIndent + (fPrefs.prefIndentBracesForTypes ? 1 : 0);
+        } else if (isMethodBody) {
+            return fPrefs.prefMethodBodyIndent + (fPrefs.prefIndentBracesForMethods ? 1 : 0);
+        } else {
+            return fIndent;
+        }
+    }
+
+    /**
+     * Returns true if the colon at the current position is part of a conditional (ternary)
+     * expression, false otherwise.
+     *
+     * @return true if the colon at the current position is part of a conditional
+     */
+    private boolean isConditional() {
+        while (true) {
+            nextToken();
+            switch (fToken) {
+
+            // search for case labels, which consist of (possibly qualified) identifiers or numbers
+            case Symbols.TokenIDENT:
+            case Symbols.TokenOTHER: // dots for qualified constants
+                continue;
+            default:
+                return true;
+            }
+        }
+    }
+
+    /**
+     * Returns the reference position for a list element: either a previous list item that has its
+     * own indentation, or the list introduction start.
+     */
+    private int skipToPreviousListItemOrListStart() {
+        int startLine = fLine;
+        int startPosition = fPosition;
+        while (true) {
+            nextToken();
+
+            // if any line item comes with its own indentation, adapt to it
+            if (fLine < startLine) {
+                // TODO
+                // try {
+                //
+                // int lineOffset = fDocument.getLineOffset(startLine);
+                // int bound = Math.min(fDocument.getLength(), startPosition + 1);
+                // fAlign= fScanner.findNonWhitespaceForwardInAnyPartition(lineOffset, bound);
+                // } catch (BadLocationException e) {
+                // // ignore and return just the position
+                // }
+                return startPosition;
+            }
+
+            switch (fToken) {
+            // scopes: skip them
+            case Symbols.TokenRPAREN:
+            case Symbols.TokenRBRACKET:
+            case Symbols.TokenRBRACE:
+            case Symbols.TokenGREATERTHAN:
+                skipScope();
+                break;
+
+            // scope introduction: special treat who special is
+            case Symbols.TokenLPAREN:
+            case Symbols.TokenLBRACE:
+            case Symbols.TokenLBRACKET:
+                return handleScopeIntroduction(startPosition + 1);
+
+            case Symbols.TokenSEMICOLON:
+                return fPosition;
+            case Symbols.TokenQUESTIONMARK:
+                if (fPrefs.prefTernaryDeepAlign) {
+                    setFirstElementAlignment(fPosition - 1, fPosition + 1);
+                    return fPosition;
+                } else {
+                    fIndent = fPrefs.prefTernaryIndent;
+                    return fPosition;
+                }
+            case Symbols.TokenEQUAL:
+                return handleEqual();
+            case Symbols.TokenEOF:
+                return 0;
+
+            }
+        }
+    }
+
+    /**
+     * Skips a scope and positions the cursor (<code>fPosition</code>) on the token that opens the
+     * scope. Returns <code>true</code> if a matching peer could be found, <code>false</code>
+     * otherwise. The current token when calling must be one out of <code>Symbols.TokenRPAREN</code>
+     * , <code>Symbols.TokenRBRACE</code>, and <code>Symbols.TokenRBRACKET</code>.
+     *
+     * @return <code>true</code> if a matching peer was found, <code>false</code> otherwise
+     */
+    private boolean skipScope() {
+        switch (fToken) {
+        case Symbols.TokenRPAREN:
+            return skipScope(Symbols.TokenLPAREN, Symbols.TokenRPAREN);
+        case Symbols.TokenRBRACKET:
+            return skipScope(Symbols.TokenLBRACKET, Symbols.TokenRBRACKET);
+        case Symbols.TokenRBRACE:
+            return skipScope(Symbols.TokenLBRACE, Symbols.TokenRBRACE);
+        case Symbols.TokenGREATERTHAN:
+            if (!fPrefs.prefHasGenerics) {
+                return false;
+            }
+            int storedPosition = fPosition;
+            int storedToken = fToken;
+            nextToken();
+            switch (fToken) {
+            case Symbols.TokenIDENT:
+                //$FALL-THROUGH$
+            case Symbols.TokenQUESTIONMARK:
+            case Symbols.TokenGREATERTHAN:
+                if (skipScope(Symbols.TokenLESSTHAN, Symbols.TokenGREATERTHAN)) {
+                    return true;
+                }
+            }
+            // <> are harder to detect - restore the position if we fail
+            fPosition = storedPosition;
+            fToken = storedToken;
+            return false;
+
+        default:
+            Assert.isTrue(false);
+            return false;
+        }
+    }
+
+    /**
+     * Handles the introduction of a new scope. The current token must be one out of
+     * <code>Symbols.TokenLPAREN</code>, <code>Symbols.TokenLBRACE</code>, and
+     * <code>Symbols.TokenLBRACKET</code>. Returns as the reference position either the token
+     * introducing the scope or - if available - the first YANG token after that.
+     */
+    private int handleScopeIntroduction(int bound) {
+        switch (fToken) {
+        // scope introduction: special treat who special is
+        case Symbols.TokenLPAREN:
+            int pos = fPosition; // store
+
+            // special: method declaration deep indentation
+            if (looksLikeMethodDecl()) {
+                if (fPrefs.prefMethodDeclDeepIndent) {
+                    return setFirstElementAlignment(pos, bound);
+                } else {
+                    fIndent = fPrefs.prefMethodDeclIndent;
+                    return pos;
+                }
+            } else {
+                fPosition = pos;
+                if (looksLikeMethodCall()) {
+                    if (fPrefs.prefMethodCallDeepIndent) {
+                        return setFirstElementAlignment(pos, bound);
+                    } else {
+                        fIndent = fPrefs.prefMethodCallIndent;
+                        return pos;
+                    }
+                } else if (fPrefs.prefParenthesisDeepIndent) {
+                    return setFirstElementAlignment(pos, bound);
+                }
+            }
+
+            // normal: return the parenthesis as reference
+            fIndent = fPrefs.prefParenthesisIndent;
+            return pos;
+
+        case Symbols.TokenLBRACE:
+            pos = fPosition; // store
+
+            // special: array initializer
+            if (looksLikeArrayInitializerIntro()) {
+                if (fPrefs.prefArrayDeepIndent) {
+                    return setFirstElementAlignment(pos, bound);
+                } else {
+                    fIndent = fPrefs.prefArrayIndent;
+                }
+            } else {
+                fIndent = fPrefs.prefBlockIndent;
+            }
+
+            // normal: skip to the statement start before the scope introducer
+            // opening braces are often on differently ending indents than e.g. a method definition
+            if (looksLikeArrayInitializerIntro() && !fPrefs.prefIndentBracesForArrays
+                    || !fPrefs.prefIndentBracesForBlocks) {
+                fPosition = pos; // restore
+                return skipToStatementStart(true, true); // set to true to match the first if
+            } else {
+                return pos;
+            }
+
+        case Symbols.TokenLBRACKET:
+            pos = fPosition; // store
+
+            // special: method declaration deep indentation
+            if (fPrefs.prefArrayDimensionsDeepIndent) {
+                return setFirstElementAlignment(pos, bound);
+            }
+
+            // normal: return the bracket as reference
+            fIndent = fPrefs.prefBracketIndent;
+            return pos; // restore
+
+        default:
+            Assert.isTrue(false);
+            return -1; // dummy
+        }
+    }
+
+    /**
+     * Sets the deep indent offset (<code>fAlign</code>) to either the offset right after
+     * <code>scopeIntroducerOffset</code> or - if available - the first YANG token after
+     * <code>scopeIntroducerOffset</code>, but before <code>bound</code>.
+     *
+     * @param scopeIntroducerOffset the offset of the scope introducer
+     * @param bound the bound for the search for another element
+     * @return the reference position
+     */
+    private int setFirstElementAlignment(int scopeIntroducerOffset, int bound) {
+        int firstPossible = scopeIntroducerOffset + 1; // align with the first position after the
+        // scope intro
+        fAlign = fScanner.findNonWhitespaceForwardInAnyPartition(firstPossible, bound);
+        if (fAlign == YangHeuristicScanner.NOT_FOUND) {
+            fAlign = firstPossible;
+        }
+        return fAlign;
+    }
+
+    /**
+     * Returns <code>true</code> if the next token received after calling <code>nextToken</code> is
+     * either an equal sign or an array designator ('[]').
+     *
+     * @return <code>true</code> if the next elements look like the start of an array definition
+     */
+    private boolean looksLikeArrayInitializerIntro() {
+        nextToken();
+        if (fToken == Symbols.TokenEQUAL || skipBrackets()) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Skips brackets if the current token is a RBRACKET. There can be nothing but whitespace in
+     * between, this is only to be used for <code>[]</code> elements.
+     *
+     * @return <code>true</code> if a <code>[]</code> could be scanned, the current token is left at
+     * the LBRACKET.
+     */
+    private boolean skipBrackets() {
+        if (fToken == Symbols.TokenRBRACKET) {
+            nextToken();
+            if (fToken == Symbols.TokenLBRACKET) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Reads the next token in backward direction from the heuristic scanner and sets the fields
+     * <code>fToken, fPreviousPosition</code> and <code>fPosition</code> accordingly.
+     */
+    private void nextToken() {
+        nextToken(fPosition);
+    }
+
+    /**
+     * Reads the next token in backward direction of <code>start</code> from the heuristic scanner
+     * and sets the fields <code>fToken, fPreviousPosition</code> and <code>fPosition</code>
+     * accordingly.
+     *
+     * @param start the start offset from which to scan backwards
+     */
+    private void nextToken(int start) {
+        fToken = fScanner.previousToken(start - 1, YangHeuristicScanner.UNBOUND);
+        fPreviousPos = start;
+        fPosition = fScanner.getPosition() + 1;
+        try {
+            fLine = fDocument.getLineOfOffset(fPosition);
+        } catch (BadLocationException e) {
+            fLine = -1;
+        }
+    }
+
+    /**
+     * Returns <code>true</code> if the current tokens look like a method declaration header (i.e.
+     * only the return type and method name). The heuristic calls <code>nextToken</code> and expects
+     * an identifier (method name) and a type declaration (an identifier with optional brackets)
+     * which also covers the visibility modifier of constructors; it does not recognize package
+     * visible constructors.
+     *
+     * @return <code>true</code> if the current position looks like a method declaration header.
+     */
+    private boolean looksLikeMethodDecl() {
+        /*
+         * TODO This heuristic does not recognize package private constructors since those do have
+         * neither type nor visibility keywords. One option would be to go over the parameter list,
+         * but that might be empty as well, or not typed in yet - hard to do without an AST...
+         */
+
+        nextToken();
+        if (fToken == Symbols.TokenIDENT) { // method name
+            do {
+                nextToken();
+            } while (skipBrackets()); // optional brackets for array valued return types
+
+            return fToken == Symbols.TokenIDENT; // return type name
+
+        }
+        return false;
+    }
+
+    /**
+     * Returns <code>true</code> if the current tokens look like an annotation (i.e. an annotation
+     * name (potentially qualified) preceded by an at-sign).
+     *
+     * @return <code>true</code> if the current position looks like an annotation.
+     */
+
+    private boolean looksLikeAnnotation() {
+        nextToken();
+        if (fToken == Symbols.TokenIDENT) { // Annotation name
+            nextToken();
+            while (fToken == Symbols.TokenOTHER) { // dot of qualification
+                nextToken();
+                if (fToken != Symbols.TokenIDENT) {
+                    return false;
+                }
+                nextToken();
+            }
+            return fToken == Symbols.TokenAT;
+        }
+        return false;
+    }
+
+    /**
+     * Returns <code>true</code> if the current tokens look like a method call header (i.e. an
+     * identifier as opposed to a keyword taking parenthesized parameters such as <code>if</code>).
+     * <p>
+     * The heuristic calls <code>nextToken</code> and expects an identifier (method name).
+     *
+     * @return <code>true</code> if the current position looks like a method call header.
+     */
+    private boolean looksLikeMethodCall() {
+        nextToken();
+        return fToken == Symbols.TokenIDENT; // method name
+    }
+
+    /**
+     * Scans tokens for the matching opening peer. The internal cursor (<code>fPosition</code>) is
+     * set to the offset of the opening peer if found.
+     *
+     * @param openToken the opening peer token
+     * @param closeToken the closing peer token
+     * @return <code>true</code> if a matching token was found, <code>false</code> otherwise
+     */
+    private boolean skipScope(int openToken, int closeToken) {
+
+        int depth = 1;
+
+        while (true) {
+            nextToken();
+
+            if (fToken == closeToken) {
+                depth++;
+            } else if (fToken == openToken) {
+                depth--;
+                if (depth == 0) {
+                    return true;
+                }
+            } else if (fToken == Symbols.TokenEOF) {
+                return false;
+            }
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/YangMarkerAnnotation.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/YangMarkerAnnotation.java
new file mode 100644 (file)
index 0000000..28a48d5
--- /dev/null
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors.text;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.source.IAnnotationPresentation;
+import org.eclipse.jface.text.source.ImageUtilities;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Canvas;
+import org.eclipse.ui.texteditor.MarkerAnnotation;
+
+import com.cisco.yangide.ui.internal.IYangUIConstants;
+import com.cisco.yangide.ui.internal.YangUIImages;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 10, 2014
+ */
+public class YangMarkerAnnotation extends MarkerAnnotation implements IAnnotationPresentation {
+    public static final String TYPE = "com.cisco.yangide.core.error";
+
+    public YangMarkerAnnotation(IMarker marker) {
+        super(marker);
+    }
+
+    public Position getPosition() {
+        IMarker marker = getMarker();
+        int startPos = marker.getAttribute(IMarker.CHAR_START, -1);
+        int endPos = marker.getAttribute(IMarker.CHAR_END, -1);
+        if (startPos != -1 && endPos != -1) {
+            return new Position(startPos, endPos - startPos);
+        }
+        return null;
+    }
+
+    @Override
+    public void paint(GC gc, Canvas canvas, Rectangle r) {
+        Image image = YangUIImages.getImage(isMarkedDeleted() ? IYangUIConstants.IMG_ERROR_MARKER_ALT
+                : IYangUIConstants.IMG_ERROR_MARKER);
+        ImageUtilities.drawImage(image, gc, canvas, r, SWT.CENTER, SWT.TOP);
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/YangProblem.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/YangProblem.java
new file mode 100644 (file)
index 0000000..340ace3
--- /dev/null
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors.text;
+
+import org.eclipse.jface.text.Position;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 16, 2014
+ */
+public class YangProblem {
+    private YangSyntaxAnnotation annotation;
+    private Position position;
+
+    /**
+     * @param annotation
+     * @param position
+     */
+    public YangProblem(YangSyntaxAnnotation annotation, Position position) {
+        this.annotation = annotation;
+        this.position = position;
+    }
+
+    /**
+     * @return the annotation
+     */
+    public YangSyntaxAnnotation getAnnotation() {
+        return annotation;
+    }
+
+    /**
+     * @return the position
+     */
+    public Position getPosition() {
+        return position;
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/YangReconcilingStrategy.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/YangReconcilingStrategy.java
new file mode 100644 (file)
index 0000000..17de943
--- /dev/null
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors.text;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.reconciler.DirtyRegion;
+import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
+import org.eclipse.jface.text.reconciler.IReconcilingStrategyExtension;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+import com.cisco.yangide.core.YangCorePlugin;
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.core.model.YangFile;
+import com.cisco.yangide.core.model.YangFileInfo;
+import com.cisco.yangide.core.model.YangModelManager;
+import com.cisco.yangide.core.parser.IYangValidationListener;
+import com.cisco.yangide.core.parser.YangParserUtil;
+import com.cisco.yangide.editor.editors.YangEditor;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 10, 2014
+ */
+public class YangReconcilingStrategy implements IReconcilingStrategy, IReconcilingStrategyExtension {
+
+    private IProgressMonitor monitor;
+    private IDocument document;
+    private ISourceViewer viewer;
+    private ITextEditor editor;
+
+    /**
+     * next character position - used locally and only valid while {@link #calculatePositions()} is
+     * in progress.
+     */
+    protected int cNextPos = 0;
+
+    /** number of newLines found by {@link #classifyTag()} */
+    protected int cNewLines = 0;
+
+    public YangReconcilingStrategy(ISourceViewer viewer, ITextEditor editor) {
+        this.viewer = viewer;
+        this.editor = editor;
+    }
+
+    @Override
+    public void setDocument(IDocument document) {
+        this.document = document;
+    }
+
+    @Override
+    public void setProgressMonitor(IProgressMonitor monitor) {
+        this.monitor = monitor;
+    }
+
+    @Override
+    public void reconcile(DirtyRegion dirtyRegion, IRegion subRegion) {
+        reconcile(dirtyRegion);
+    }
+
+    @Override
+    public void reconcile(IRegion partition) {
+        if (editor == null || editor.getEditorInput() == null || !(editor.getEditorInput() instanceof IFileEditorInput)) {
+            return;
+        }
+        IFile file = ((IFileEditorInput) editor.getEditorInput()).getFile();
+        final YangAnnotationModel annotationModel = (YangAnnotationModel) getAnnotationModel();
+
+        YangFile yangFile = YangCorePlugin.createYangFile(file);
+        try {
+            annotationModel.init();
+            Module module = YangParserUtil.parseYangFile(document.get().toCharArray(), file.getProject(),
+                    new IYangValidationListener() {
+
+                @Override
+                public void validationError(String msg, int lineNumber, int charStart, int charEnd) {
+                    annotationModel.addProblem(new YangProblem(new YangSyntaxAnnotation(msg), new Position(
+                            charStart, charEnd - charStart)));
+                }
+
+                @Override
+                public void syntaxError(String msg, int lineNumber, int charStart, int charEnd) {
+                    annotationModel.addProblem(new YangProblem(new YangSyntaxAnnotation(msg), new Position(
+                            charStart, charEnd - charStart)));
+                }
+            });
+            annotationModel.reportProblem();
+
+            YangFileInfo fileInfo = (YangFileInfo) yangFile.getElementInfo(monitor);
+
+            // reindex if no errors found
+            if (module.isSyntaxValid()) {
+                fileInfo.setModule(module);
+                fileInfo.setIsStructureKnown(true);
+                // re index content
+                YangModelManager.getIndexManager().addWorkingCopy(file);
+            } else {
+                fileInfo.setModule(module);
+                fileInfo.setIsStructureKnown(false);
+            }
+
+            if (editor instanceof YangEditor) {
+                ((YangEditor) editor).reconcile();
+            }
+
+        } catch (Exception e) {
+            // ignore any exception on reconcile
+        } finally {
+            if (editor instanceof YangEditor) {
+                ((YangEditor) editor).updateSemanticHigliting();
+            }
+        }
+
+    }
+
+    private IAnnotationModel getAnnotationModel() {
+        return viewer.getAnnotationModel();
+    }
+
+    @Override
+    public void initialReconcile() {
+        reconcile(new Region(0, document.getLength()));
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/YangSyntaxAnnotation.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/YangSyntaxAnnotation.java
new file mode 100644 (file)
index 0000000..7a95719
--- /dev/null
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors.text;
+
+import org.eclipse.jface.text.source.Annotation;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 10, 2014
+ */
+public class YangSyntaxAnnotation extends Annotation {
+    public static final String TYPE = "com.cisco.yangide.core.syntax";
+
+    public YangSyntaxAnnotation(String msg) {
+        super(TYPE, false, msg);
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/help/HelpCompositionUtils.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/help/HelpCompositionUtils.java
new file mode 100644 (file)
index 0000000..37ade7c
--- /dev/null
@@ -0,0 +1,208 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors.text.help;
+
+import java.util.Objects;
+
+import org.eclipse.jdt.ui.PreferenceConstants;
+import org.eclipse.jface.internal.text.html.HTMLPrinter;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.graphics.FontData;
+
+import com.cisco.yangide.core.dom.ASTNamedNode;
+import com.cisco.yangide.core.dom.ASTNode;
+import com.cisco.yangide.core.dom.BaseReference;
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.core.dom.ModuleImport;
+import com.cisco.yangide.core.dom.QName;
+import com.cisco.yangide.core.dom.SubModuleInclude;
+import com.cisco.yangide.core.dom.TypeReference;
+import com.cisco.yangide.core.dom.UsesNode;
+import com.cisco.yangide.core.indexing.ElementIndexInfo;
+import com.cisco.yangide.core.indexing.ElementIndexType;
+import com.cisco.yangide.core.model.YangModelManager;
+import com.cisco.yangide.editor.YangEditorPlugin;
+import com.cisco.yangide.editor.editors.text.help.YangLanguageHelpLoader.DefinitionKind;
+
+/**
+ * Utilities aimed to be used in different context-oriented help providers for YANG source
+ * code text editor. These providers include hover, quick-fix, content-assist and the like.
+ *
+ * @author Kirill Karmakulov
+ * date:   Oct 13, 2014
+ */
+@SuppressWarnings("restriction")
+public class HelpCompositionUtils {
+
+    private static String styleSheet = null;
+    
+    /**
+     * Gets quick help related to the provided {@code node}.
+     *
+     * @return a {@link String} containing the help  
+     */
+    public static String getNodeHelp(ASTNode node) {
+        if (node.getDescription() != null && node.getDescription().length() > 0) {
+            return getLocalInfo(node);
+        }
+        String info = getIndexedInfo(node);
+        if (info == null)
+            info = getLanguageHelp(node);
+        return info;
+    }
+
+    /**
+     * Gets quick help related to the provided {@code node}. The information
+     * returned as the result is taken from the index and matches the given {@code node}.
+     */
+    public static String getIndexedInfo(ASTNode node) {
+        QName name = null;
+        ElementIndexType indexType = null;
+        if (node instanceof TypeReference) {
+            name = ((TypeReference) node).getType();
+            indexType = ElementIndexType.TYPE;
+        } else if (node instanceof UsesNode) {
+            name = ((UsesNode) node).getGrouping();
+            indexType = ElementIndexType.GROUPING;
+        } else if (node instanceof ModuleImport) {
+            ModuleImport mImport = (ModuleImport) node;
+            name = new QName(mImport.getName(), mImport.getPrefix(), mImport.getName(), mImport.getRevision());
+            indexType = ElementIndexType.MODULE;
+        } else if (node instanceof SubModuleInclude) {
+            SubModuleInclude include = (SubModuleInclude) node;
+            name = new QName(null, null, include.getName(), include.getRevision());
+            indexType = ElementIndexType.SUBMODULE;
+        } else if (node instanceof BaseReference) {
+            name = ((BaseReference) node).getType();
+            indexType = ElementIndexType.IDENTITY;
+        }
+        return name != null ? getIndexedInfo(name.getName(), name.getModule(), name.getRevision(), indexType) : null;
+    }
+
+    /**
+     * Gets quick help related to the provided {@code nodeName}, {@code module}, {@code revision}. The information
+     * returned as the result is taken from the index and matches the given fields.
+     */
+    public static String getIndexedInfo(String nodeName, String module, String revision, ElementIndexType indexType) {
+        ElementIndexInfo[] search = YangModelManager.search(module, revision, nodeName, indexType, null, null);
+        if (indexType == ElementIndexType.TYPE && search.length == 0) {
+            search = YangModelManager.search(module, revision, nodeName, ElementIndexType.IDENTITY, null, null);
+        }
+        if (search.length == 0)
+            return null;
+
+        ElementIndexInfo info = search[0];
+        StringBuffer buffer = new StringBuffer();
+        HTMLPrinter.addSmallHeader(buffer, info.getName());
+        if (info.getDescription() != null) {
+            HTMLPrinter.addParagraph(buffer, formatValue(info.getDescription()));
+        }
+        buffer.append("<dl>");
+        if (info.getType() != ElementIndexType.MODULE && info.getType() != ElementIndexType.SUBMODULE) {
+            addValue(buffer, "Module", info.getModule());
+        }
+        addValue(buffer, "Reference", info.getReference());
+        addValue(buffer, "Status", info.getStatus());
+        addValue(buffer, "Revision", info.getRevision());
+        addValue(buffer, "Namespace", info.getNamespace());
+        addValue(buffer, "Organization", info.getOrganization());
+        addValue(buffer, "Contact", info.getContact());
+        buffer.append("</dl>");
+        return finish(buffer);
+    }
+
+    /**
+     * Gets quick help related to the provided {@code node}. The information
+     * returned as the result is retrieved from the node itself.
+     */
+    public static String getLocalInfo(ASTNode node) {
+        StringBuffer buffer = new StringBuffer();
+        String name = node.getNodeName();
+
+        if (node instanceof ASTNamedNode) {
+            name += ":" + ((ASTNamedNode) node).getName();
+        }
+        HTMLPrinter.addSmallHeader(buffer, name);
+        HTMLPrinter.addParagraph(buffer, formatValue(node.getDescription()));
+        buffer.append("<dl>");
+        if (node instanceof Module) {
+            Module module = (Module) node;
+            addValue(buffer, "Namespace", module.getNamespace() != null ? module.getNamespace() : null);
+            addValue(buffer, "Organization", module.getOrganization() != null ? module.getOrganization().getValue()
+                    : null);
+            addValue(buffer, "Contact", module.getContact() != null ? module.getContact().getValue() : null);
+        }
+        addValue(buffer, "Reference", node.getReference());
+        addValue(buffer, "Status", node.getStatus());
+        buffer.append("</dl>");
+        return finish(buffer);
+    }
+
+    public static String getLanguageHelp(ASTNode node) {
+        if (node instanceof TypeReference)
+            return new LanguageProposalHelpGenerator(((TypeReference) node).getName(), DefinitionKind.TYPE).get(null);
+        else
+            return new LanguageProposalHelpGenerator(node.getNodeName(), DefinitionKind.KEYWORD).get(null);
+    }
+    
+    /**
+     * Adds standard HTML header and footer to a partial HTML given in {@code text}.
+     * Adds the given {@code title} if one is specified. 
+     *
+     * @param text  the wrapped HTML text
+     * @param title  an optional title
+     * @return  a String that contains fully equipped HTML text 
+     */
+    public static String wrapHtmlText(String text, String title)
+    {
+        Objects.requireNonNull(text, "The wrapped HTML content must not be null");
+        StringBuffer buffer = new StringBuffer();
+        if (title != null && !title.isEmpty()) {
+            HTMLPrinter.addSmallHeader(buffer, title);
+        }
+        if (text.contains("<")) // has formatting
+            buffer.append(text);
+        else
+            HTMLPrinter.addParagraph(buffer, text);
+        return finish(buffer);
+    }
+
+    private static String formatValue(String source) {
+        return source.replaceAll("\\n", "<br>");
+    }
+
+    private static void addValue(StringBuffer buffer, String key, String value) {
+        if (value != null && value.length() > 0) {
+            HTMLPrinter.addParagraph(buffer, "<dt>" + key + ":</dt><dd>" + formatValue(value) + "</dd>");
+        }
+    }
+
+    private static String finish(StringBuffer buffer) {
+        HTMLPrinter.insertPageProlog(buffer, 0, getStyleSheet());
+        HTMLPrinter.addPageEpilog(buffer);
+        return buffer.toString();
+    }
+
+    /**
+     * Returns a stylesheet used among quick-help infopopups. 
+     */
+    private static String getStyleSheet() {
+        if (styleSheet == null) {
+            styleSheet = YangEditorPlugin.getDefault().getBundleFileContent(
+                    "/resources/HoverStyleSheet.css");
+        }
+        String css = styleSheet;
+        if (css != null) {
+            FontData fontData = JFaceResources.getFontRegistry().getFontData(
+                    PreferenceConstants.APPEARANCE_JAVADOC_FONT)[0];
+            css = HTMLPrinter.convertTopLevelFont(css, fontData);
+        }
+
+        return css;
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/help/IProposalHelpGenerator.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/help/IProposalHelpGenerator.java
new file mode 100644 (file)
index 0000000..9272de9
--- /dev/null
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors.text.help;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * Interface for generators of additional information for {@link YangCompletionProposal}s.
+ * Given an instance of a proposal an implementor of the interface must generate additional
+ * information that should assist user in his choice. The additional information is
+ * displayed in a separate window attached to list of proposals.
+ *
+ * @author Kirill Karmakulov
+ * date:   Oct 13, 2014
+ */
+public interface IProposalHelpGenerator {
+    String getAdditionalInfo(YangCompletionProposal proposal, IProgressMonitor monitor);
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/help/IndexInfoProposalHelpGenerator.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/help/IndexInfoProposalHelpGenerator.java
new file mode 100644 (file)
index 0000000..c398474
--- /dev/null
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors.text.help;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+
+import com.cisco.yangide.core.indexing.ElementIndexInfo;
+import com.cisco.yangide.core.indexing.ElementIndexType;
+
+/**
+ * Contains factory methods that create generators of additional information for a proposal backed
+ * by an indexed element.
+ *
+ * @author Kirill Karmakulov
+ * date: Oct 13, 2014
+ */
+public class IndexInfoProposalHelpGenerator implements IProposalHelpGenerator {
+
+    protected final ElementIndexInfo info;
+    protected final ElementIndexType type;
+
+    protected IndexInfoProposalHelpGenerator(ElementIndexInfo info, ElementIndexType type) {
+        this.info = info;
+        this.type = type;
+    }
+
+    /**
+     * @see HelpCompositionUtils#getIndexedInfo(String, String, String, ElementIndexType)
+     */
+    @Override
+    public String getAdditionalInfo(YangCompletionProposal proposal, IProgressMonitor monitor) {
+        return HelpCompositionUtils.getIndexedInfo(info.getName(), info.getModule(), info.getRevision(), type);
+    }
+
+    /**
+     * @return an implementation of {@link IProposalHelpGenerator} that generates quick help for
+     * YANG 'type' definition
+     */
+    public static IProposalHelpGenerator type(ElementIndexInfo info) {
+        return new IndexInfoProposalHelpGenerator(info, ElementIndexType.TYPE);
+    }
+
+    /**
+     * @return an implementation of {@link IProposalHelpGenerator} that generates quick help for
+     * YANG 'grouping' definition
+     */
+    public static IProposalHelpGenerator grouping(ElementIndexInfo info) {
+        return new IndexInfoProposalHelpGenerator(info, ElementIndexType.GROUPING);
+    }
+
+    /**
+     * @return an implementation of {@link IProposalHelpGenerator} that generates quick help for
+     * YANG 'identity' definition
+     */
+    public static IProposalHelpGenerator identity(ElementIndexInfo info) {
+        return new IndexInfoProposalHelpGenerator(info, ElementIndexType.IDENTITY);
+    }
+
+    /**
+     * @return an implementation of {@link IProposalHelpGenerator} that generates quick help for
+     * YANG module definition
+     */
+    public static IProposalHelpGenerator module(ElementIndexInfo info) {
+        return new IndexInfoProposalHelpGenerator(info, ElementIndexType.MODULE);
+    }
+
+    /**
+     * @return an implementation of {@link IProposalHelpGenerator} that generates quick help for
+     * YANG sub-module definition
+     */
+    public static IProposalHelpGenerator submodule(ElementIndexInfo info) {
+        return new IndexInfoProposalHelpGenerator(info, ElementIndexType.SUBMODULE);
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/help/LanguageProposalHelpGenerator.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/help/LanguageProposalHelpGenerator.java
new file mode 100644 (file)
index 0000000..7256570
--- /dev/null
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors.text.help;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+
+/**
+ * Generator of additional information for a proposal backed
+ * by YANG language types, keywords, etc.
+ *
+ * @author Kirill Karmakulov
+ * date: Oct 14, 2014
+ */
+public class LanguageProposalHelpGenerator extends YangLanguageHelpLoader implements IProposalHelpGenerator {
+
+    public LanguageProposalHelpGenerator(String definition, DefinitionKind kind) {
+        super(definition, kind);
+    }
+
+    @Override
+    public String getAdditionalInfo(YangCompletionProposal proposal, IProgressMonitor monitor) {
+        return get(monitor);
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/help/YangCompletionProposal.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/help/YangCompletionProposal.java
new file mode 100644 (file)
index 0000000..f30b6b3
--- /dev/null
@@ -0,0 +1,139 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors.text.help;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.CompletionProposal;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.contentassist.ICompletionProposalExtension5;
+import org.eclipse.jface.text.contentassist.IContextInformation;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+
+import com.cisco.yangide.editor.YangEditorPlugin;
+
+/**
+ * Copy-pasted from {@link CompletionProposal} and augmented for needs of YANG.
+ *
+ * @author Kirill Karmakulov
+ * date: 10 Oct 2014
+ */
+public class YangCompletionProposal implements ICompletionProposal, ICompletionProposalExtension5 {
+
+    /** The string to be displayed in the completion proposal popup. */
+    private final String fDisplayString;
+    /** The replacement string. */
+    private final String fReplacementString;
+    /** The replacement offset. */
+    private final int fReplacementOffset;
+    /** The replacement length. */
+    private final int fReplacementLength;
+    /** The cursor position after this proposal has been applied. */
+    private final int fCursorPosition;
+    /** The image to be displayed in the completion proposal popup. */
+    private final Image fImage;
+    /** Generator of the additional info of this proposal. */
+    private final IProposalHelpGenerator fAdditionalInfoGenerator;
+    private String cachedAdditionalInfo = null;
+
+    /**
+     * Constructor for {@link YangCompletionProposal} with a complex additional information, which
+     * is generated on demand by {@code additionalInfoGenerator}. This additional information is 
+     * generated on demand.
+     */
+    public YangCompletionProposal(String replacementString, int replacementOffset, int replacementLength,
+            int cursorPosition, Image image, String displayString, IProposalHelpGenerator additionalInfoGenerator) 
+    {
+        Assert.isNotNull(replacementString);
+        Assert.isTrue(replacementOffset >= 0);
+        Assert.isTrue(replacementLength >= 0);
+        Assert.isTrue(cursorPosition >= 0);
+
+        fReplacementString = replacementString;
+        fReplacementOffset = replacementOffset;
+        fReplacementLength = replacementLength;
+        fCursorPosition = cursorPosition;
+        fImage = image;
+        fDisplayString = displayString;
+        fAdditionalInfoGenerator = additionalInfoGenerator;
+    }
+
+    /**
+     * Constructor for {@link YangCompletionProposal} with a low-cost additional information.
+     */
+    public YangCompletionProposal(String replacementString, int replacementOffset, int replacementLength,
+            int cursorPosition, Image image, String displayString, String additionalInfo) 
+    {
+        this(replacementString, replacementOffset, replacementLength, cursorPosition, image, displayString,
+                (IProposalHelpGenerator) null);
+        // This is the catch of the constructor
+        this.cachedAdditionalInfo = additionalInfo;
+    }
+
+    /**
+     * Constructor for {@link YangCompletionProposal} with no additional information.
+     */
+    public YangCompletionProposal(String replacementString, int replacementOffset,
+            int replacementLength, int cursorPosition, Image image, String displayString) 
+    {
+        this(replacementString, replacementOffset, replacementLength, cursorPosition, image, displayString,
+                (IProposalHelpGenerator) null);
+    }
+
+    @Override
+    public Object getAdditionalProposalInfo(IProgressMonitor monitor) {
+        if (cachedAdditionalInfo == null && fAdditionalInfoGenerator != null) {
+            try {
+                cachedAdditionalInfo = fAdditionalInfoGenerator.getAdditionalInfo(this, monitor);
+            } catch (Exception ex) {
+                YangEditorPlugin.log(ex);
+            }
+        }
+        return cachedAdditionalInfo;
+    }
+
+    @Override
+    public void apply(IDocument document) {
+        try {
+            document.replace(fReplacementOffset, fReplacementLength, fReplacementString);
+        } catch (BadLocationException x) {
+            // ignore
+        }
+    }
+
+    @Override
+    public Point getSelection(IDocument document) {
+        return new Point(fReplacementOffset + fCursorPosition, 0);
+    }
+
+    @Override
+    public String getAdditionalProposalInfo() {
+        return getAdditionalProposalInfo(new NullProgressMonitor()).toString();
+    }
+
+    @Override
+    public String getDisplayString() {
+        if (fDisplayString != null)
+            return fDisplayString;
+        return fReplacementString;
+    }
+
+    @Override
+    public Image getImage() {
+        return fImage;
+    }
+
+    @Override
+    public IContextInformation getContextInformation() {
+        return null;
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/help/YangLanguageHelpLoader.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/help/YangLanguageHelpLoader.java
new file mode 100644 (file)
index 0000000..eac7270
--- /dev/null
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors.text.help;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.SubMonitor;
+import org.eclipse.osgi.util.NLS;
+
+import com.cisco.yangide.editor.YangEditorPlugin;
+
+/**
+ * Loader of help info for YANG language types, keywords, etc.
+ *
+ * @author Kirill Karmakulov
+ * date: Oct 16, 2014
+ */
+public class YangLanguageHelpLoader {
+
+    /**
+     * Possible kinds of YANG definitions
+     */
+    public enum DefinitionKind {
+
+        TYPE("types"), //$NON-NLS-1$
+        KEYWORD("keywords"); //$NON-NLS-1$
+
+        final String subdir;
+
+        DefinitionKind(String subdir) {
+            this.subdir = subdir;
+        }
+    }
+
+    protected final String definition;
+    protected final IPath path;
+
+    public YangLanguageHelpLoader(String definition, DefinitionKind kind) {
+        this.definition = definition;
+        path = new Path("help").append(kind.subdir).append(definition).addFileExtension("txt"); //$NON-NLS-1$ //$NON-NLS-2$
+    }
+
+    /**
+     * Reads an internal help file, packs it inside an HTML, and returns the result as a string.
+     */
+    public String get(IProgressMonitor monitor) {
+        SubMonitor subMonitor = SubMonitor.convert(monitor, 2); // There's no way to discover size
+                                                                // of the help file; so, the best
+                                                                // guess is a 2-step process: read
+                                                                // the file contents, construct an
+                                                                // HTML that contains it.
+        URL url = null;
+        try {
+            url = FileLocator.find(YangEditorPlugin.getDefault().getBundle(), path, null);
+            if (url != null) {
+                try (InputStream inputStream = url.openStream();
+                        BufferedReader r = new BufferedReader(
+                                new InputStreamReader(inputStream, StandardCharsets.UTF_8))) {
+                    StringBuilder sb = new StringBuilder();
+                    for (String str = null; (str = r.readLine()) != null;) {
+                        sb.append(str).append("\n"); // line breaks are important if the help file //$NON-NLS-1$
+                                                     // contains <pre> HTML tags
+                    }
+                    subMonitor.worked(1); // reading completed
+                    String wrapHtmlText = HelpCompositionUtils.wrapHtmlText(sb.toString(), definition);
+                    subMonitor.worked(1); // HTML construction completed
+                    return wrapHtmlText;
+                }
+            }
+        } catch (IOException e) {
+            YangEditorPlugin.logError("Failed to load help contents from " + url, e); //$NON-NLS-1$
+        } finally {
+            subMonitor.done();
+        }
+        return null;
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/help/YangSimpleCompletionProcessor.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/help/YangSimpleCompletionProcessor.java
new file mode 100644 (file)
index 0000000..f697f6f
--- /dev/null
@@ -0,0 +1,986 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors.text.help;
+
+import static com.cisco.yangide.editor.editors.text.help.YangLanguageHelpLoader.DefinitionKind.KEYWORD;
+import static com.cisco.yangide.editor.editors.text.help.YangLanguageHelpLoader.DefinitionKind.TYPE;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.contentassist.ContextInformation;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.jface.text.contentassist.IContextInformation;
+import org.eclipse.jface.text.contentassist.IContextInformationValidator;
+import org.eclipse.jface.text.templates.Template;
+import org.eclipse.jface.text.templates.TemplateCompletionProcessor;
+import org.eclipse.jface.text.templates.TemplateContext;
+import org.eclipse.jface.text.templates.TemplateContextType;
+import org.eclipse.jface.text.templates.TemplateException;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+import com.cisco.yangide.core.dom.ASTNode;
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.core.dom.ModuleImport;
+import com.cisco.yangide.core.dom.SimpleNode;
+import com.cisco.yangide.core.dom.SubModule;
+import com.cisco.yangide.core.dom.SubModuleInclude;
+import com.cisco.yangide.core.indexing.ElementIndexInfo;
+import com.cisco.yangide.core.indexing.ElementIndexType;
+import com.cisco.yangide.core.model.YangModelManager;
+import com.cisco.yangide.core.model.YangModelUtil;
+import com.cisco.yangide.core.parser.YangParserUtil;
+import com.cisco.yangide.editor.YangEditorPlugin;
+import com.cisco.yangide.editor.editors.YangScanner;
+import com.cisco.yangide.editor.editors.text.Symbols;
+import com.cisco.yangide.editor.editors.text.YangHeuristicScanner;
+import com.cisco.yangide.editor.editors.text.YangIndenter;
+import com.cisco.yangide.editor.templates.GeneralContextType;
+import com.cisco.yangide.editor.templates.YangTemplateAccess;
+import com.cisco.yangide.ui.internal.IYangUIConstants;
+import com.cisco.yangide.ui.internal.YangUIImages;
+
+/**
+ * @author Alexey Kholupko
+ *
+ * TODO: 'base' keyword completion proposals: existing 'identity' 
+ */
+public class YangSimpleCompletionProcessor extends TemplateCompletionProcessor implements IContentAssistProcessor {
+
+    private ITextEditor editor  = null;
+    
+    private final static ICompletionProposal[] NO_PROPOSALS = new ICompletionProposal[0];
+
+    public YangSimpleCompletionProcessor(ITextEditor editor) {
+        this.editor = editor;
+    }
+    
+    /**
+     * Simple content assist tip closer. The tip is valid in a range of 5 characters around its
+     * popup location.
+     */
+    protected static class Validator implements IContextInformationValidator {
+
+        protected int fInstallOffset;
+
+        /*
+         * @see IContextInformationValidator#isContextInformationValid(int)
+         */
+        @Override
+        public boolean isContextInformationValid(int offset) {
+            return Math.abs(fInstallOffset - offset) < 5;
+        }
+
+        /*
+         * @see IContextInformationValidator#install(IContextInformation, ITextViewer, int)
+         */
+        @Override
+        public void install(IContextInformation info, ITextViewer viewer, int offset) {
+            fInstallOffset = offset;
+        }
+    };
+
+    private Comparator<ICompletionProposal> proposalComparator = new Comparator<ICompletionProposal>() {
+        @Override
+        public int compare(ICompletionProposal o1, ICompletionProposal o2) {
+
+            String string1 = o1.getDisplayString();
+            String string2 = o2.getDisplayString();
+            return string1.compareToIgnoreCase(string2);
+        }
+    };
+
+    private static class TypedProposalsList {
+        List<ICompletionProposal> proposals;
+        CompletionKind type;
+    }
+
+    private final static String[] fgKeywordProposals = YangScanner.getKeywords();
+
+    private final static String[] fgBuiltinTypes = YangScanner.getTypes();
+
+    private final static Map<String, List<String>> keywordHierarchyMap = createKeywordHierarchyMap();
+
+    enum CompletionKind {
+        None, KeywordScope, Import, Type, Uses, Include, BelongsTo, Keyword
+    }
+
+    protected IContextInformationValidator fValidator = new Validator();
+
+    private ITextViewer viewer;
+
+    private int cursorPosition;
+
+    private int lineNumber;
+
+    private String currentPrefix = null;
+
+    /**
+     * The proposal mode for the current content assist
+     *
+     * @see #determineProposalMode(IDocument, int, String)
+     */
+    private CompletionKind currentProposalMode = CompletionKind.None;
+
+    private Module module = null;
+
+    /*
+     * (non-Javadoc) Method declared on IContentAssistProcessor
+     */
+    @Override
+    public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int documentOffset) {
+
+        this.viewer = viewer;
+
+        currentPrefix = null;
+
+        TypedProposalsList result = determineProposals();
+        if (result == null) {
+            return NO_PROPOSALS;
+        }
+        switch (result.type) {
+        case KeywordScope:
+            return mergeProposals(result.proposals, determineTemplateProposalsForContext(documentOffset));
+        default:
+            if (result.proposals == null) {
+                return NO_PROPOSALS;
+            }
+            return result.proposals.toArray(new ICompletionProposal[0]);
+        }
+
+    }
+
+    /**
+     * @return
+     */
+    private static Map<String, List<String>> createKeywordHierarchyMap() {
+        Map<String, List<String>> keywordHierarchyMap = new HashMap<String, List<String>>();
+
+        keywordHierarchyMap.put(
+                "module",
+                Arrays.asList(new String[] { "anyxml", "augment", "choice", "contact", "container", "description",
+                        "deviation", "extension", "feature", "grouping", "identity", "import", "include", "leaf",
+                        "leaf-list", "list", "namespace", "notification", "organization", "prefix", "reference",
+                        "revision", "rpc", "typedef", "uses", "yang-version" }));
+        keywordHierarchyMap.put("import", Arrays.asList(new String[] { "prefix", "revision-date" }));
+        keywordHierarchyMap.put("include", Arrays.asList(new String[] { "revision-date" }));
+        keywordHierarchyMap.put("revision", Arrays.asList(new String[] { "description", "reference" }));
+        keywordHierarchyMap.put(
+                "submodule",
+                Arrays.asList(new String[] { "anyxml", "augment", "belongs-to", "choice", "contact", "container",
+                        "description", "deviation", "extension", "feature", "grouping", "identity", "import",
+                        "include", "leaf", "leaf-list", "list", "notification", "organization", "reference",
+                        "revision", "rpc", "typedef", "uses", "yang-version" }));
+        keywordHierarchyMap.put("belongs-to", Arrays.asList(new String[] { "prefix" }));
+        keywordHierarchyMap.put("typedef",
+                Arrays.asList(new String[] { "default", "description", "reference", "status", "type", "units" }));
+        keywordHierarchyMap.put(
+                "type",
+                Arrays.asList(new String[] { "bit", "enum", "length", "path", "pattern", "range", "require",
+                        "instance", "type" }));
+        keywordHierarchyMap.put(
+                "container",
+                Arrays.asList(new String[] { "anyxml", "choice", "config", "container", "description", "grouping",
+                        "if-feature", "leaf", "leaf-list", "list", "must", "presence", "reference", "status",
+                        "typedef", "uses", "when" }));
+        keywordHierarchyMap.put("must",
+                Arrays.asList(new String[] { "description", "error-app-tag", "error-message", "reference" }));
+        keywordHierarchyMap.put(
+                "leaf",
+                Arrays.asList(new String[] { "config", "default", "description", "if-feature", "mandatory", "must",
+                        "reference", "status", "type", "units", "when" }));
+        keywordHierarchyMap.put(
+                "leaf-list",
+                Arrays.asList(new String[] { "config", "description", "if-feature", "max-elements", "min-elements",
+                        "must", "ordered-by", "reference", "status", "type", "units", "when" }));
+        keywordHierarchyMap.put(
+                "list",
+                Arrays.asList(new String[] { "anyxml", "choice", "config", "container", "description", "grouping",
+                        "if-feature", "key", "leaf", "leaf-list", "list", "max-elements", "min-elements", "must",
+                        "ordered-by", "reference", "status", "typedef", "unique", "uses", "when" }));
+        keywordHierarchyMap.put(
+                "choice",
+                Arrays.asList(new String[] { "anyxml", "case", "config", "container", "default", "description",
+                        "if-feature", "leaf", "leaf-list", "list", "mandatory", "reference", "status", "when" }));
+        keywordHierarchyMap.put(
+                "case",
+                Arrays.asList(new String[] { "anyxml", "choice", "container", "description", "if-feature", "leaf",
+                        "leaf-list", "list", "reference", "status", "uses", "when" }));
+        keywordHierarchyMap.put(
+                "anyxml",
+                Arrays.asList(new String[] { "config", "description", "if-feature", "mandatory", "must", "reference",
+                        "status", "when" }));
+        keywordHierarchyMap.put(
+                "grouping",
+                Arrays.asList(new String[] { "anyxml", "choice", "container", "description", "grouping", "leaf",
+                        "leaf-list", "list", "reference", "status", "typedef", "uses" }));
+        keywordHierarchyMap.put(
+                "uses",
+                Arrays.asList(new String[] { "augment", "description", "if-feature", "refine", "reference", "status",
+                        "when" }));
+        keywordHierarchyMap.put(
+                "rpc",
+                Arrays.asList(new String[] { "description", "grouping", "if-feature", "input", "output", "reference",
+                        "status", "typedef" }));
+        keywordHierarchyMap.put(
+                "input",
+                Arrays.asList(new String[] { "anyxml", "choice", "container", "grouping", "leaf", "leaf-list", "list",
+                        "typedef", "uses" }));
+        keywordHierarchyMap.put(
+                "output",
+                Arrays.asList(new String[] { "anyxml", "choice", "container", "grouping", "leaf", "leaf-list", "list",
+                        "typedef", "uses" }));
+        keywordHierarchyMap.put(
+                "notification",
+                Arrays.asList(new String[] { "anyxml", "choice", "container", "description", "grouping", "if-feature",
+                        "leaf", "leaf-list", "list", "reference", "status", "typedef", "uses" }));
+        keywordHierarchyMap.put(
+                "notification",
+                Arrays.asList(new String[] { "anyxml", "choice", "container", "description", "grouping", "if-feature",
+                        "leaf", "leaf-list", "list", "reference", "status", "typedef", "uses" }));
+        keywordHierarchyMap.put(
+                "augment",
+                Arrays.asList(new String[] { "anyxml", "case", "choice", "container", "description", "if-feature",
+                        "leaf", "leaf-list", "list", "reference", "status", "uses", "when" }));
+        keywordHierarchyMap.put("identity",
+                Arrays.asList(new String[] { "base", "description", "reference", "status" }));
+        keywordHierarchyMap.put("extension",
+                Arrays.asList(new String[] { "argument", "description", "reference", "status" }));
+        keywordHierarchyMap.put("argument", Arrays.asList(new String[] { "yin-element" }));
+        keywordHierarchyMap.put("feature",
+                Arrays.asList(new String[] { "description", "if-feature", "status", "reference" }));
+        keywordHierarchyMap
+                .put("deviation", Arrays.asList(new String[] { "description", "deviate", "n", "reference" }));
+        keywordHierarchyMap.put(
+                "deviate",
+                Arrays.asList(new String[] { "config", "default", "mandatory", "max-elements", "min-elements", "must",
+                        "type", "unique", "units" }));
+        keywordHierarchyMap.put("range",
+                Arrays.asList(new String[] { "description", "error-app-tag", "error-message", "reference" }));
+        keywordHierarchyMap.put("length",
+                Arrays.asList(new String[] { "description", "error-app-tag", "error-message", "reference" }));
+        keywordHierarchyMap.put("pattern",
+                Arrays.asList(new String[] { "description", "error-app-tag", "error-message", "reference" }));
+        keywordHierarchyMap.put("enum", Arrays.asList(new String[] { "description", "reference", "status", "value" }));
+        keywordHierarchyMap
+                .put("bit", Arrays.asList(new String[] { "description", "reference", "status", "position" }));
+
+        return keywordHierarchyMap;
+    }
+
+    private ICompletionProposal[] mergeProposals(List<ICompletionProposal> a, List<ICompletionProposal> b) {
+
+        List<ICompletionProposal> combinedProposals = new ArrayList<>();
+        if (a != null) {
+            combinedProposals.addAll(a);
+        }
+        if (b != null) {
+            combinedProposals.addAll(b);
+        }
+
+        // Collections.sort(combinedProposals, proposalComparator);
+        return combinedProposals.toArray(new ICompletionProposal[0]);
+    }
+
+    /*
+     * (non-Javadoc) Method declared on IContentAssistProcessor
+     */
+    @Override
+    public IContextInformation[] computeContextInformation(ITextViewer viewer, int documentOffset) {
+
+        IContextInformation[] result = new IContextInformation[5];
+        for (int i = 0; i < result.length; i++) {
+            result[i] = new ContextInformation(MessageFormat.format(
+                    "{0} {1}", new Object[] { new Integer(i), new Integer(documentOffset) }), //$NON-NLS-1$
+                    MessageFormat
+                            .format("{0} {1}", new Object[] { new Integer(i), new Integer(documentOffset - 5), new Integer(documentOffset + 5) })); //$NON-NLS-1$
+        }
+        return result;
+    }
+
+    @Override
+    public char[] getCompletionProposalAutoActivationCharacters() {
+        return new char[] { ':' };
+    }
+
+    @Override
+    public char[] getContextInformationAutoActivationCharacters() {
+        return new char[] { '#' };
+    }
+
+    @Override
+    public IContextInformationValidator getContextInformationValidator() {
+        return fValidator;
+    }
+
+    @Override
+    public String getErrorMessage() {
+        return null;
+    }
+
+    /**
+     * @return new determined proposals
+     */
+    private TypedProposalsList determineProposals() {
+        ITextSelection selection = (ITextSelection) viewer.getSelectionProvider().getSelection();
+        cursorPosition = selection.getOffset() + selection.getLength();
+
+        IDocument doc = viewer.getDocument();
+        try {
+            lineNumber = doc.getLineOfOffset(cursorPosition);
+
+            String prefix = getCurrentPrefix();
+            if (prefix == null || cursorPosition == -1) {
+                return null;
+            }
+
+            String previousWord = determinePreviousWord(doc, cursorPosition - prefix.length());
+
+            return getProposalsFromDocument(doc, prefix, previousWord);
+        } catch (BadLocationException e) {
+            YangEditorPlugin.log(e);
+        }
+        return null;
+    }
+
+    private String determinePreviousWord(IDocument doc, int offset) throws BadLocationException {
+        try {
+            String previousText = doc.get(doc.getLineOffset(lineNumber), offset - doc.getLineOffset(lineNumber)).trim();
+            String previousWord = null;
+            int lastPos = previousText.lastIndexOf(" ");
+            if (lastPos == -1) {
+                lastPos = previousText.lastIndexOf("\t");
+            }
+            if (lastPos != -1) {
+                previousWord = previousText.substring(lastPos);
+            } else {
+                previousWord = previousText;
+            }
+            return previousWord.trim();
+        } catch (Exception e) {
+            return "";
+        }
+    }
+
+    /**
+     * FIXME dirty and ugly
+     */
+    private String determineProposalScopeKeyword(IDocument doc, int offset) {
+        try {
+            YangHeuristicScanner yangHeuristicScanner = new YangHeuristicScanner(doc);
+
+            int blockStartPosition = yangHeuristicScanner.findOpeningPeer(offset, '{', '}');
+
+            int curPos = yangHeuristicScanner.findNonWhitespaceBackward(blockStartPosition - 1,
+                    YangHeuristicScanner.UNBOUND);
+
+            int currentToken = yangHeuristicScanner.previousToken(curPos, YangHeuristicScanner.UNBOUND);
+
+            // assuming identifier between keyword and {
+            int keywordEndPos = yangHeuristicScanner.getPosition();
+            int keywordStartPos = keywordEndPos;
+
+            if (currentToken == Symbols.TokenIDENT) {
+                yangHeuristicScanner.previousToken(keywordEndPos, YangHeuristicScanner.UNBOUND);
+                keywordStartPos = yangHeuristicScanner.getPosition();
+            }
+            // if there was no identifier (empty or string partition)
+            if (currentToken == Symbols.TokenKEYWORD) {
+                keywordEndPos = curPos + 1;
+            }
+
+            String keyword = doc.get(keywordStartPos, keywordEndPos - keywordStartPos).trim();
+
+            return keyword;
+
+        } catch (Exception e) {
+            return "";
+        }
+    }
+
+    /**
+     * @param document
+     * @param prefix
+     * @return proposals for the specified document
+     */
+    protected TypedProposalsList getProposalsFromDocument(IDocument document, String prefix, String previousWord) {
+        currentProposalMode = determineProposalMode(document, cursorPosition, prefix, previousWord);
+        return getProposalsByMode(prefix, currentProposalMode);
+    }
+
+    protected TypedProposalsList getProposalsByMode(String prefix, CompletionKind proposalMode) {
+        TypedProposalsList proposals = null;
+
+        // If the prefix contains a colon, get the module name corresponding to the prefix.
+        // Note that we're not changing the prefix, which will still include the Yang module prefix and
+        // the following colon.  We're only extracting the yang prefix so we can determine the name of
+        // the module imported by this module which that prefix corresponds to.  That "moduleFromPrefix" is
+        // sent on to limit the set of candidate nodes (if it's not null).  Remember that the yang prefix
+        // can be different from the module name.
+        String  moduleFromPrefix    = null;
+        if (prefix.indexOf(':') != -1) {
+            String[] pieces = prefix.split(":", 2);
+            if (pieces.length == 2) {
+                String          yangPrefix      = pieces[0].trim();
+                ModuleImport    moduleImport    = module.getImportByPrefix(yangPrefix);
+                if (moduleImport != null) {
+                    moduleFromPrefix   = moduleImport.getName();
+                }
+            }
+        }
+        
+        switch (proposalMode) {
+        case Import:
+            proposals = getImportProposals(prefix, true);
+            break;
+        case BelongsTo:
+            proposals = getImportProposals(prefix, false);
+            break;
+        case Type:
+            proposals = getTypeProposals(prefix, moduleFromPrefix);
+            break;
+        case Uses:
+            proposals = getUsesProposals(prefix, moduleFromPrefix);
+            break;
+        case Include:
+            proposals = getIncludeProposals(prefix);
+            break;
+        case KeywordScope:
+            proposals = getKeywordScopeProposals(prefix);
+            break;
+        default:
+            break;
+        }
+
+        return proposals;
+    }
+
+    /**
+     * @param prefix
+     * @param addModuleRevision
+     * @return importable module names
+     */
+    private TypedProposalsList getImportProposals(String prefix, boolean addModuleRevision) {
+        // FIXME KOS: need set current project to get correct proposal
+        ElementIndexInfo[] importModules = YangModelManager.search(null, null, null, ElementIndexType.MODULE, null,
+                null);
+
+        List<ICompletionProposal> moduleProposals = new ArrayList<ICompletionProposal>();
+
+        try {
+
+            // import, prefix or revision-date
+            String previousWord = determinePreviousWord(viewer.getDocument(), cursorPosition - prefix.length());
+
+            Map<String, String> usedImports = new HashMap<>();
+
+            for (int i = 0; i < importModules.length; i++) {
+                ElementIndexInfo info = importModules[i];
+
+                String usedRevision = usedImports.get(info.getName());
+
+                if (usedRevision == null || !usedRevision.equals(info.getRevision())) {
+                    usedImports.put(info.getName(), info.getRevision());
+                    ICompletionProposal proposal = generateImportProposal(previousWord, prefix, info, addModuleRevision);
+
+                    if (proposal != null) {
+                        moduleProposals.add(proposal);
+                    }
+
+                }
+            }
+
+            // TODO
+            // if (moduleProposals.isEmpty() && previousWord != "import" && previousWord !=
+            // "revision-date")
+            // return getProposalsByMode(prefix, CompletionKind.KeywordScope); //or
+            // CompletionKind.Keyword
+
+        } catch (BadLocationException e) {
+            YangEditorPlugin.log(e);
+        }
+
+        Collections.sort(moduleProposals, proposalComparator);
+        TypedProposalsList result = new TypedProposalsList();
+        result.proposals = moduleProposals;
+        result.type = CompletionKind.Import;
+        return result;
+
+    }
+
+    private ICompletionProposal generateImportProposal(String previousWord, String prefix, ElementIndexInfo info,
+            boolean addModuleRevision) {
+
+        ICompletionProposal resultProposal = null;
+
+        String importModuleName = info.getName();
+        String revision = info.getRevision();
+
+        String displayString = importModuleName;
+        String replacementString = importModuleName;
+
+        // default for "import"
+        int replacementOffset = cursorPosition - prefix.length();
+        int replacementLength = prefix.length();
+        int replCursorPosition = cursorPosition;
+
+        ASTNode nodeAtPos;
+        switch (previousWord) {
+        case "import":
+            if (revision != null && !revision.isEmpty()) {
+                String moduleRevision = "";
+                if (addModuleRevision) {
+                    moduleRevision = "revision-date " + revision + "; ";
+                }
+
+                String modulePrefix = YangModelUtil.retrieveModulePrefix(info);
+                replacementString = importModuleName + " { prefix " + modulePrefix + "; " + moduleRevision + "}";
+                displayString = importModuleName += " (" + revision + ")";
+                replCursorPosition = replacementString.length();
+                break;
+            }
+
+        case "revision-date":
+            nodeAtPos = module.getNodeAtPosition(cursorPosition);
+            if (nodeAtPos instanceof ModuleImport) {
+                if (importModuleName.equals(((ModuleImport) nodeAtPos).getName())) {
+                    replacementString = revision + "; ";
+                    displayString = revision;
+                    replCursorPosition = revision.length();
+                    break;
+                }
+            }
+
+        case "prefix":
+            nodeAtPos = module.getNodeAtPosition(cursorPosition);
+            if (nodeAtPos instanceof ModuleImport) {
+                if (importModuleName.equals(((ModuleImport) nodeAtPos).getName())) {
+                    String modulePrefix = YangModelUtil.retrieveModulePrefix(info);
+                    replacementString = modulePrefix + "; ";
+                    displayString = importModuleName;
+                    replCursorPosition = replacementString.length();
+                    break;
+                }
+            }
+
+        default:
+            return null;
+        }
+
+        if (prefix.length() == 0 || importModuleName.startsWith(prefix)) {
+            resultProposal = new YangCompletionProposal(replacementString, replacementOffset, replacementLength,
+                    replCursorPosition, YangUIImages.getImage(IYangUIConstants.IMG_IMPORT_PROPOSAL), displayString,
+                    IndexInfoProposalHelpGenerator.module(info));
+        }
+
+        return resultProposal;
+    }
+
+    /**
+     * @param prefix
+     * @return general keyword proposals
+     */
+    private TypedProposalsList getKeywordScopeProposals(String prefix) {
+
+        String scopeKeyword = determineProposalScopeKeyword(viewer.getDocument(), cursorPosition);
+
+        List<String> keywordProposals = YangSimpleCompletionProcessor.keywordHierarchyMap.get(scopeKeyword);
+
+        if (keywordProposals == null) {
+            keywordProposals = Arrays.asList(fgKeywordProposals);
+        }
+
+        List<ICompletionProposal> proposalsList = new ArrayList<ICompletionProposal>();
+        for (String proposal : keywordProposals) {
+            if (proposal.startsWith(prefix)) {
+                String replacement = proposal + ' ';
+                proposalsList.add(new YangCompletionProposal(replacement, cursorPosition - prefix.length(), prefix
+                        .length(), replacement.length(), YangUIImages.getImage(IYangUIConstants.IMG_KEYWORD_PROPOSAL),
+                        proposal, new LanguageProposalHelpGenerator(proposal, KEYWORD)));
+            }
+        }
+
+        Collections.sort(proposalsList, proposalComparator);
+
+        TypedProposalsList result = new TypedProposalsList();
+        result.proposals = proposalsList;
+        result.type = CompletionKind.KeywordScope;
+        return result;
+    }
+
+    private TypedProposalsList getTypeProposals(String prefix, String limitToModule) {
+        // bult-in types
+        List<ICompletionProposal> bltInTypesProposals = new ArrayList<ICompletionProposal>();
+        for (String proposal : fgBuiltinTypes) {
+            if (proposal.startsWith(prefix)) {
+                bltInTypesProposals.add(new YangCompletionProposal(proposal, cursorPosition - prefix.length(), prefix
+                        .length(), proposal.length(), YangUIImages.getImage(IYangUIConstants.IMG_TYPE_PROPOSAL),
+                        proposal, new LanguageProposalHelpGenerator(proposal, TYPE))); 
+            }
+        }
+        Collections.sort(bltInTypesProposals, proposalComparator);
+
+        IProject    project = null;
+        if (editor != null && editor.getEditorInput() instanceof FileEditorInput) {
+            project = ((FileEditorInput) editor.getEditorInput()).getFile().getProject();
+        }
+
+        // custom defined by user in typedef types
+        ElementIndexInfo[] customTypes =
+                YangModelManager.search(limitToModule, null, null, ElementIndexType.TYPE, project, null);
+
+        List<ICompletionProposal> customTypesProposals = new ArrayList<ICompletionProposal>();
+
+        Set<String> addedCustomType = new HashSet<>();
+        for (int i = 0; i < customTypes.length; i++) {
+            ElementIndexInfo info = customTypes[i];
+
+            if (addedCustomType.add(info.getName())) {
+
+                String proposal = computeProposalForElement(info);
+                if (proposal != null && (prefix.length() == 0 || proposal.startsWith(prefix))) {
+                    customTypesProposals.add(new YangCompletionProposal(proposal, cursorPosition - prefix.length(),
+                            prefix.length(), proposal.length(), YangUIImages
+                                    .getImage(IYangUIConstants.IMG_CUSTOM_TYPE_PROPOSAL), proposal,
+                            IndexInfoProposalHelpGenerator.type(info)));
+                }
+            }
+        }
+        Collections.sort(customTypesProposals, proposalComparator);
+
+        TypedProposalsList result = new TypedProposalsList();
+        result.proposals = new ArrayList<ICompletionProposal>(bltInTypesProposals.size() + customTypesProposals.size());
+        result.proposals.addAll(bltInTypesProposals);
+        result.proposals.addAll(customTypesProposals);
+
+        result.type = CompletionKind.Type;
+        return result;
+    }
+
+    /**
+     * @param prefix
+     * @return
+     */
+    private TypedProposalsList getUsesProposals(String prefix, String limitToModule) {
+        IProject    project = null;
+        if (editor != null && editor.getEditorInput() instanceof FileEditorInput) {
+            project = ((FileEditorInput) editor.getEditorInput()).getFile().getProject();
+        }
+        
+        ElementIndexInfo[] groupings =
+                YangModelManager.search(limitToModule, null, null, ElementIndexType.GROUPING, project, null);
+
+        List<ICompletionProposal> groupingProposals = new ArrayList<ICompletionProposal>();
+
+        Set<String> addedCustomType = new HashSet<>();
+        for (int i = 0; i < groupings.length; i++) {
+            ElementIndexInfo info = groupings[i];
+            if (addedCustomType.add(info.getName())) {
+
+                String proposal = computeProposalForElement(info);
+                if (proposal != null && (prefix.length() == 0 || proposal.startsWith(prefix))) {
+                    groupingProposals.add(new YangCompletionProposal(proposal, cursorPosition - prefix.length(), prefix
+                            .length(), proposal.length(),
+                            YangUIImages.getImage(IYangUIConstants.IMG_GROUPING_PROPOSAL), proposal,
+                            IndexInfoProposalHelpGenerator.grouping(info)));
+                }
+            }
+        }
+        Collections.sort(groupingProposals, proposalComparator);
+
+        TypedProposalsList result = new TypedProposalsList();
+        result.proposals = groupingProposals;
+
+        result.type = CompletionKind.Uses;
+        return result;
+    }
+
+    /**
+     * @param prefix
+     * @return
+     */
+    private TypedProposalsList getIncludeProposals(String prefix) {
+        ElementIndexInfo[] submodules = YangModelManager.search(null, null, null, ElementIndexType.SUBMODULE, null,
+                null);
+
+        List<ICompletionProposal> submoduleProposals = new ArrayList<ICompletionProposal>();
+
+        Set<String> addedCustomType = new HashSet<>();
+        for (int i = 0; i < submodules.length; i++) {
+            ElementIndexInfo info = submodules[i];
+            if (addedCustomType.add(info.getName())) {
+                String proposal = info.getName();
+
+                String revision = info.getRevision();
+                String displayString = proposal;
+                String replacementString = proposal;
+                if (revision != null && !revision.isEmpty()) {
+                    replacementString = proposal + " { revision-date " + revision + "; }";
+                    displayString = proposal += " (" + revision + ")";
+                }
+
+                if (prefix.length() == 0 || proposal.startsWith(prefix)) {
+                    submoduleProposals.add(new YangCompletionProposal(replacementString, cursorPosition
+                            - prefix.length(), prefix.length(), proposal.length(), YangUIImages
+                            .getImage(IYangUIConstants.IMG_GROUPING_PROPOSAL), displayString,
+                            IndexInfoProposalHelpGenerator.submodule(info)));
+                }
+            }
+        }
+        Collections.sort(submoduleProposals, proposalComparator);
+
+        TypedProposalsList result = new TypedProposalsList();
+        result.proposals = submoduleProposals;
+
+        result.type = CompletionKind.Include;
+        return result;
+    }
+
+    /**
+     * Generate proposals for types, groupings, etc. If element defined in other module, which is
+     * imported, adds respective prefix If element is neither imported nor local, returns null
+     *
+     * @param elementIndexInfo
+     * @return
+     */
+    protected String computeProposalForElement(ElementIndexInfo elementIndexInfo) {
+        String result = null;
+
+        if (module != null) {
+            if (module.getName().equals(elementIndexInfo.getModule())) {
+                result = elementIndexInfo.getName();
+            } else if (module instanceof SubModule) {
+                SimpleNode<String> pmNode = ((SubModule) module).getParentModule();
+                if (pmNode.getValue().equals(elementIndexInfo.getModule())) {
+                    result = ((SubModule) module).getParentPrefix() + ":" + elementIndexInfo.getName();
+                }
+            } else {
+
+                SubModuleInclude includedSubmodule = module.getIncludeByName(elementIndexInfo.getModule());
+                if (includedSubmodule != null) {
+                    result = elementIndexInfo.getName();
+                } else {
+
+                    ModuleImport importedModule = module.getImportByName(elementIndexInfo.getModule());
+
+                    if (importedModule != null) {
+                        result = importedModule.getPrefix() + ":" + elementIndexInfo.getName();
+                    }
+                }
+            }
+        }
+        return result;
+    }
+
+    /**
+     * returns proposal mode basing on current cursor position (context)
+     */
+    protected CompletionKind determineProposalMode(IDocument document, int cursorPosition, String prefix,
+            String previousWord) {
+
+        module = YangParserUtil.parseYangFile(viewer.getDocument().get().toCharArray());
+
+        if (module != null) {
+            ASTNode nodeAtPos = module.getNodeAtPosition(cursorPosition);
+
+            if (nodeAtPos instanceof ModuleImport
+                    && cursorPosition > nodeAtPos.getStartPosition() + nodeAtPos.getNodeName().length()) {
+                return CompletionKind.Import;
+            }
+        }
+
+        // Dirty previous word based determination
+
+        if ("import".equalsIgnoreCase(previousWord)) {
+            return CompletionKind.Import;
+        }
+        if ("belongs-to".equalsIgnoreCase(previousWord)) {
+            return CompletionKind.BelongsTo;
+        }
+        if ("type".equalsIgnoreCase(previousWord)) {
+            return CompletionKind.Type;
+        }
+        if ("uses".equalsIgnoreCase(previousWord)) {
+            return CompletionKind.Uses;
+        }
+        // TODO check if only current module
+        if ("include".equalsIgnoreCase(previousWord)) {
+            return CompletionKind.Include;
+        }
+
+        if (Arrays.asList(fgKeywordProposals).contains(previousWord)) {
+            return CompletionKind.Keyword;
+        }
+
+        return CompletionKind.KeywordScope;
+
+    }
+
+    /**
+     * @return current prefix that should be used for completion
+     */
+    private String getCurrentPrefix() {
+        if (currentPrefix != null) {
+            return currentPrefix;
+        }
+        ITextSelection selection = (ITextSelection) viewer.getSelectionProvider().getSelection();
+        IDocument doc = viewer.getDocument();
+        return getPrefixFromDocument(doc.get(), selection.getOffset() + selection.getLength()).toLowerCase();
+    }
+
+    /**
+     * @param aDocumentText the whole content of the edited file as String
+     * @param anOffset the cursor position
+     * @return prefix in the specified document text with respect to the specified offset
+     */
+    protected String getPrefixFromDocument(String aDocumentText, int anOffset) {
+        if (currentPrefix != null) {
+            return currentPrefix;
+        }
+        int startOfWordToken = anOffset;
+
+        char token = 'a';
+        if (startOfWordToken > 0) {
+            token = aDocumentText.charAt(startOfWordToken - 1);
+        }
+
+        while (startOfWordToken > 0
+                && (Character.isJavaIdentifierPart(token) || '.' == token || '-' == token || ';' == token || ':' == token)
+                && !('$' == token)) {
+            startOfWordToken--;
+            if (startOfWordToken == 0) {
+                break; // word goes right to the beginning of the doc
+            }
+            token = aDocumentText.charAt(startOfWordToken - 1);
+        }
+
+        if (startOfWordToken != anOffset) {
+            currentPrefix = aDocumentText.substring(startOfWordToken, anOffset).toLowerCase();
+        } else {
+            currentPrefix = "";
+        }
+        return currentPrefix;
+    }
+
+    private List<ICompletionProposal> determineTemplateProposalsForContext(int offset) {
+        ITextSelection selection = (ITextSelection) viewer.getSelectionProvider().getSelection();
+        // adjust offset to end of normalized selection
+        if (selection.getOffset() == offset) {
+            offset = selection.getOffset() + selection.getLength();
+        }
+
+        String prefix = extractPrefix(viewer, offset);
+        Region region = new Region(offset - prefix.length(), prefix.length());
+        TemplateContext context = createContext(viewer, region);
+        if (context == null) {
+            return null;
+        }
+
+        context.setVariable("selection", selection.getText()); // name of the selection variables {line, word_selection //$NON-NLS-1$
+
+        Template[] templates = getTemplates(context.getContextType().getId());
+        List<ICompletionProposal> matches = new ArrayList<ICompletionProposal>();
+        for (int i = 0; i < templates.length; i++) {
+            Template template = generateIndentedTemplate(templates[i]);
+
+            try {
+                context.getContextType().validate(template.getPattern());
+            } catch (TemplateException e) {
+                continue;
+            }
+            if ((template.getName().startsWith(prefix) && template.matches(prefix, context.getContextType().getId()))) {
+                matches.add(// ! all proposals should be treated
+                createProposal(template, context, (IRegion) region, getRelevance(template, prefix)));
+            }
+        }
+
+        Collections.sort(matches, proposalComparator);
+
+        return matches;
+    }
+
+    /**
+     * returns template with correctly indented pattern TODO should be invoked when pattern is being
+     * inserted, not computed (perfomance)
+     */
+    private Template generateIndentedTemplate(Template template) {
+
+        Template indentedTemplate = template;
+
+        String pattern = template.getPattern();
+
+        String[] patternLines = pattern.split("\n");
+        int linesCount = patternLines.length;
+
+        if (linesCount > 1) {
+
+            YangIndenter indenteter = new YangIndenter(viewer.getDocument(), new YangHeuristicScanner(
+                    viewer.getDocument()));
+            StringBuffer intendation = indenteter.computeIndentation(cursorPosition);
+
+            StringBuffer indentedPattern = new StringBuffer();
+            indentedPattern.append(patternLines[0]);
+            for (int i = 1; i < linesCount; i++) {
+                indentedPattern.append("\n" + intendation + patternLines[i]);
+            }
+
+            indentedTemplate = new Template(template.getName(), template.getDescription(), template.getContextTypeId(),
+                    indentedPattern.toString(), template.isAutoInsertable());
+
+        }
+
+        return indentedTemplate;
+    }
+
+    @Override
+    protected String extractPrefix(ITextViewer textViewer, int offset) {
+        return getPrefixFromDocument(textViewer.getDocument().get(), offset);
+    }
+
+    @Override
+    protected Template[] getTemplates(String contextTypeId) {
+        YangTemplateAccess access = YangTemplateAccess.getDefault();
+        return access.getTemplateStore().getTemplates();
+    }
+
+    @Override
+    protected TemplateContextType getContextType(ITextViewer viewer, IRegion region) {
+        YangTemplateAccess access = YangTemplateAccess.getDefault();
+        return access.getContextTypeRegistry().getContextType(GeneralContextType.CONTEXT_TYPE);
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see
+     * org.eclipse.jface.text.templates.TemplateCompletionProcessor#getImage(org.eclipse.jface.text
+     * .templates.Template)
+     */
+    @Override
+    protected Image getImage(Template template) {
+        return YangUIImages.getImage(IYangUIConstants.IMG_TEMPLATE_PROPOSAL);
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/hover/HoverControlCreator.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/hover/HoverControlCreator.java
new file mode 100644 (file)
index 0000000..50dc5d9
--- /dev/null
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors.text.hover;
+
+import org.eclipse.jface.internal.text.html.BrowserInformationControl;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.AbstractReusableInformationControlCreator;
+import org.eclipse.jface.text.DefaultInformationControl;
+import org.eclipse.jface.text.IInformationControl;
+import org.eclipse.jface.text.IInformationControlCreator;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.editors.text.EditorsUI;
+
+@SuppressWarnings("restriction")
+public final class HoverControlCreator extends AbstractReusableInformationControlCreator {
+
+    private final IInformationControlCreator fInformationPresenterControlCreator;
+
+    public HoverControlCreator(IInformationControlCreator informationPresenterControlCreator) {
+        this(informationPresenterControlCreator, false);
+    }
+
+    public HoverControlCreator(IInformationControlCreator informationPresenterControlCreator,
+            boolean additionalInfoAffordance) {
+        fInformationPresenterControlCreator = informationPresenterControlCreator;
+    }
+
+    @Override
+    public IInformationControl doCreateInformationControl(Shell parent) {
+        if (BrowserInformationControl.isAvailable(parent)) {
+            String font = JFaceResources.DEFAULT_FONT;
+            BrowserInformationControl iControl = new BrowserInformationControl(parent, font,
+                    EditorsUI.getTooltipAffordanceString()) {
+                @Override
+                public IInformationControlCreator getInformationPresenterControlCreator() {
+                    return fInformationPresenterControlCreator;
+                }
+            };
+            return iControl;
+        } else {
+            return new DefaultInformationControl(parent, EditorsUI.getTooltipAffordanceString());
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/hover/PresenterControlCreator.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/hover/PresenterControlCreator.java
new file mode 100644 (file)
index 0000000..94efdb5
--- /dev/null
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors.text.hover;
+
+import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.jface.internal.text.html.BrowserInformationControl;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.AbstractReusableInformationControlCreator;
+import org.eclipse.jface.text.DefaultInformationControl;
+import org.eclipse.jface.text.IInformationControl;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 23, 2014
+ */
+@SuppressWarnings("restriction")
+public final class PresenterControlCreator extends AbstractReusableInformationControlCreator {
+
+    @Override
+    public IInformationControl doCreateInformationControl(Shell parent) {
+        if (BrowserInformationControl.isAvailable(parent)) {
+            ToolBarManager tbm = new ToolBarManager(SWT.FLAT);
+            String font = JFaceResources.DEFAULT_FONT;
+            return new BrowserInformationControl(parent, font, tbm);
+        } else {
+            return new DefaultInformationControl(parent, true);
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/hover/YangTextHover.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/editors/text/hover/YangTextHover.java
new file mode 100644 (file)
index 0000000..ed96a80
--- /dev/null
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.editors.text.hover;
+
+import org.eclipse.jface.text.DefaultTextHover;
+import org.eclipse.jface.text.IInformationControlCreator;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextHoverExtension;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.ui.IEditorPart;
+
+import com.cisco.yangide.core.YangCorePlugin;
+import com.cisco.yangide.core.YangModelException;
+import com.cisco.yangide.core.dom.ASTNode;
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.editor.editors.YangEditor;
+import com.cisco.yangide.editor.editors.text.YangMarkerAnnotation;
+import com.cisco.yangide.editor.editors.text.YangSyntaxAnnotation;
+import com.cisco.yangide.editor.editors.text.help.HelpCompositionUtils;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 23, 2014
+ */
+public class YangTextHover extends DefaultTextHover implements ITextHoverExtension {
+
+    private IInformationControlCreator hoverControlCreator;
+    private IInformationControlCreator presenterCtrlCreator;
+    private IEditorPart editor;
+
+    public YangTextHover(ISourceViewer sourceViewer) {
+        super(sourceViewer);
+    }
+
+    /**
+     * @param editor the editor to set
+     */
+    public void setEditor(IEditorPart editor) {
+        this.editor = editor;
+    }
+
+    /**
+     * @return the editor
+     */
+    public IEditorPart getEditor() {
+        return editor;
+    }
+
+    @Override
+    public String getHoverInfo(ITextViewer textViewer, IRegion hoverRegion) {
+        @SuppressWarnings("deprecation")
+        String info = super.getHoverInfo(textViewer, hoverRegion);
+        if (info != null) {
+            return HelpCompositionUtils.wrapHtmlText(info, null);
+        }
+
+        String hoverInfo = null;
+        YangEditor editor = (YangEditor) getEditor();
+        if (editor != null) {
+            try {
+                Module module = editor.getModule();
+                if (module != null) {
+                    ASTNode node = module.getNodeAtPosition(hoverRegion.getOffset());
+                    hoverInfo = HelpCompositionUtils.getNodeHelp(node);
+                }
+            } catch (YangModelException e) {
+                YangCorePlugin.log(e);
+            }
+        }
+        return hoverInfo;
+    }
+
+    @Override
+    public IInformationControlCreator getHoverControlCreator() {
+        if (presenterCtrlCreator == null) {
+            presenterCtrlCreator = new PresenterControlCreator();
+        }
+        if (hoverControlCreator == null) {
+            hoverControlCreator = new HoverControlCreator(presenterCtrlCreator);
+        }
+        return hoverControlCreator;
+    }
+
+    @Override
+    protected boolean isIncluded(Annotation annotation) {
+        return YangSyntaxAnnotation.TYPE.equals(annotation.getType())
+                || YangMarkerAnnotation.TYPE.equals(annotation.getType());
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/preferences/AbstractConfigurationBlock.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/preferences/AbstractConfigurationBlock.java
new file mode 100644 (file)
index 0000000..22beb46
--- /dev/null
@@ -0,0 +1,460 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.preferences;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.layout.PixelConverter;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.forms.FormColors;
+import org.eclipse.ui.forms.events.ExpansionAdapter;
+import org.eclipse.ui.forms.events.ExpansionEvent;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.SharedScrolledComposite;
+
+import com.cisco.yangide.editor.dialogs.StatusInfo;
+import com.cisco.yangide.editor.dialogs.StatusUtil;
+import com.cisco.yangide.ui.preferences.OverlayPreferenceStore;
+
+/**
+ * Configures YANG Editor typing preferences.
+ *
+ * @author Alexey Kholupko
+ */
+abstract class AbstractConfigurationBlock implements IPreferenceConfigurationBlock {
+
+    protected final class SectionManager {
+        /** The preference setting for keeping no section open. */
+        private static final String __NONE = "__none"; //$NON-NLS-1$
+        private Set<ExpandableComposite> fSections = new HashSet<ExpandableComposite>();
+        private boolean fIsBeingManaged = false;
+        private ExpansionAdapter fListener = new ExpansionAdapter() {
+            @Override
+            public void expansionStateChanged(ExpansionEvent e) {
+                ExpandableComposite source = (ExpandableComposite) e.getSource();
+                updateSectionStyle(source);
+                if (fIsBeingManaged)
+                    return;
+                if (e.getState()) {
+                    try {
+                        fIsBeingManaged = true;
+                        for (Iterator<ExpandableComposite> iter = fSections.iterator(); iter.hasNext();) {
+                            ExpandableComposite composite = iter.next();
+                            if (composite != source)
+                                composite.setExpanded(false);
+                        }
+                    } finally {
+                        fIsBeingManaged = false;
+                    }
+                    if (fLastOpenKey != null && fDialogSettingsStore != null)
+                        fDialogSettingsStore.setValue(fLastOpenKey, source.getText());
+                } else {
+                    if (!fIsBeingManaged && fLastOpenKey != null && fDialogSettingsStore != null)
+                        fDialogSettingsStore.setValue(fLastOpenKey, __NONE);
+                }
+                ExpandableComposite exComp = getParentExpandableComposite(source);
+                if (exComp != null)
+                    exComp.layout(true, true);
+                ScrolledPageContent parentScrolledComposite = getParentScrolledComposite(source);
+                if (parentScrolledComposite != null) {
+                    parentScrolledComposite.reflow(true);
+                }
+            }
+        };
+        private Composite fBody;
+        private final String fLastOpenKey;
+        private final IPreferenceStore fDialogSettingsStore;
+        private ExpandableComposite fFirstChild = null;
+
+        /**
+         * Creates a new section manager.
+         */
+        public SectionManager() {
+            this(null, null);
+        }
+
+        /**
+         * Creates a new section manager.
+         *
+         * @param dialogSettingsStore the dialog store
+         * @param lastOpenKey the preference key
+         */
+        public SectionManager(IPreferenceStore dialogSettingsStore, String lastOpenKey) {
+            fDialogSettingsStore = dialogSettingsStore;
+            fLastOpenKey = lastOpenKey;
+        }
+
+        private void manage(ExpandableComposite section) {
+            if (section == null)
+                throw new NullPointerException();
+            if (fSections.add(section))
+                section.addExpansionListener(fListener);
+            makeScrollableCompositeAware(section);
+        }
+
+        public Composite createSectionComposite(Composite parent) {
+            Assert.isTrue(fBody == null);
+            boolean isNested = isNestedInScrolledComposite(parent);
+            Composite composite;
+            if (isNested) {
+                composite = new Composite(parent, SWT.NONE);
+                fBody = composite;
+            } else {
+                composite = new ScrolledPageContent(parent);
+                fBody = ((ScrolledPageContent) composite).getBody();
+            }
+
+            fBody.setLayout(new GridLayout());
+
+            return composite;
+        }
+
+        public Composite createSection(String label) {
+            Assert.isNotNull(fBody);
+            final ExpandableComposite excomposite = new ExpandableComposite(fBody, SWT.NONE,
+                    ExpandableComposite.TWISTIE | ExpandableComposite.CLIENT_INDENT | ExpandableComposite.COMPACT);
+            if (fFirstChild == null)
+                fFirstChild = excomposite;
+            excomposite.setText(label);
+            String last = null;
+            if (fLastOpenKey != null && fDialogSettingsStore != null)
+                last = fDialogSettingsStore.getString(fLastOpenKey);
+
+            if (fFirstChild == excomposite && !__NONE.equals(last) || label.equals(last)) {
+                excomposite.setExpanded(true);
+                if (fFirstChild != excomposite)
+                    fFirstChild.setExpanded(false);
+            } else {
+                excomposite.setExpanded(false);
+            }
+            excomposite.setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING, true, false));
+
+            updateSectionStyle(excomposite);
+            manage(excomposite);
+
+            Composite contents = new Composite(excomposite, SWT.NONE);
+            excomposite.setClient(contents);
+
+            return contents;
+        }
+    }
+
+    public class ScrolledPageContent extends SharedScrolledComposite {
+
+        private FormToolkit fToolkit;
+
+        public ScrolledPageContent(Composite parent) {
+            this(parent, SWT.V_SCROLL | SWT.H_SCROLL);
+        }
+
+        public ScrolledPageContent(Composite parent, int style) {
+            super(parent, style);
+
+            setFont(parent.getFont());
+
+            FormColors colors = new FormColors(Display.getCurrent());
+            colors.setBackground(null);
+            colors.setForeground(null);
+            fToolkit = new FormToolkit(colors);
+
+            setExpandHorizontal(true);
+            setExpandVertical(true);
+
+            Composite body = new Composite(this, SWT.NONE);
+            body.setFont(parent.getFont());
+            setContent(body);
+        }
+
+        public void adaptChild(Control childControl) {
+            fToolkit.adapt(childControl, true, true);
+        }
+
+        public Composite getBody() {
+            return (Composite) getContent();
+        }
+
+    }
+
+    protected static final int INDENT = 20;
+    private OverlayPreferenceStore fStore;
+
+    private Map<Button, String> fCheckBoxes = new HashMap<Button, String>();
+    private SelectionListener fCheckBoxListener = new SelectionListener() {
+        public void widgetDefaultSelected(SelectionEvent e) {
+        }
+
+        public void widgetSelected(SelectionEvent e) {
+            Button button = (Button) e.widget;
+            fStore.setValue(fCheckBoxes.get(button), button.getSelection());
+        }
+    };
+
+    private Map<Text, String> fTextFields = new HashMap<Text, String>();
+    private ModifyListener fTextFieldListener = new ModifyListener() {
+        public void modifyText(ModifyEvent e) {
+            Text text = (Text) e.widget;
+            fStore.setValue(fTextFields.get(text), text.getText());
+        }
+    };
+
+    private ArrayList<Text> fNumberFields = new ArrayList<Text>();
+    private ModifyListener fNumberFieldListener = new ModifyListener() {
+        public void modifyText(ModifyEvent e) {
+            numberFieldChanged((Text) e.widget);
+        }
+    };
+
+    /**
+     * List of master/slave listeners when there's a dependency.
+     *
+     * @see #createDependency(Button, Control)
+     */
+    private ArrayList<SelectionListener> fMasterSlaveListeners = new ArrayList<SelectionListener>();
+
+    private StatusInfo fStatus;
+    private final PreferencePage fMainPage;
+
+    public AbstractConfigurationBlock(OverlayPreferenceStore store) {
+        Assert.isNotNull(store);
+        fStore = store;
+        fMainPage = null;
+    }
+
+    public AbstractConfigurationBlock(OverlayPreferenceStore store, PreferencePage mainPreferencePage) {
+        Assert.isNotNull(store);
+        Assert.isNotNull(mainPreferencePage);
+        fStore = store;
+        fMainPage = mainPreferencePage;
+    }
+
+    protected final ScrolledPageContent getParentScrolledComposite(Control control) {
+        Control parent = control.getParent();
+        while (!(parent instanceof ScrolledPageContent) && parent != null) {
+            parent = parent.getParent();
+        }
+        if (parent instanceof ScrolledPageContent) {
+            return (ScrolledPageContent) parent;
+        }
+        return null;
+    }
+
+    private final ExpandableComposite getParentExpandableComposite(Control control) {
+        Control parent = control.getParent();
+        while (!(parent instanceof ExpandableComposite) && parent != null) {
+            parent = parent.getParent();
+        }
+        if (parent instanceof ExpandableComposite) {
+            return (ExpandableComposite) parent;
+        }
+        return null;
+    }
+
+    protected void updateSectionStyle(ExpandableComposite excomposite) {
+        excomposite.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT));
+    }
+
+    protected void makeScrollableCompositeAware(Control control) {
+        ScrolledPageContent parentScrolledComposite = getParentScrolledComposite(control);
+        if (parentScrolledComposite != null) {
+            parentScrolledComposite.adaptChild(control);
+        }
+    }
+
+    private boolean isNestedInScrolledComposite(Composite parent) {
+        return getParentScrolledComposite(parent) != null;
+    }
+
+    protected Button addCheckBox(Composite parent, String label, String key, int indentation) {
+        Button checkBox = new Button(parent, SWT.CHECK);
+        checkBox.setText(label);
+
+        GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+        gd.horizontalIndent = indentation;
+        gd.horizontalSpan = 2;
+        checkBox.setLayoutData(gd);
+        checkBox.addSelectionListener(fCheckBoxListener);
+        makeScrollableCompositeAware(checkBox);
+
+        fCheckBoxes.put(checkBox, key);
+
+        return checkBox;
+    }
+
+    /**
+     * Returns an array of size 2: - first element is of type <code>Label</code> - second element is
+     * of type <code>Text</code> Use <code>getLabelControl</code> and <code>getTextControl</code> to
+     * get the 2 controls.
+     */
+    protected Control[] addLabelledTextField(Composite composite, String label, String key, int textLimit,
+            int indentation, boolean isNumber) {
+
+        PixelConverter pixelConverter = new PixelConverter(composite);
+
+        Label labelControl = new Label(composite, SWT.NONE);
+        labelControl.setText(label);
+        GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+        gd.horizontalIndent = indentation;
+        labelControl.setLayoutData(gd);
+
+        Text textControl = new Text(composite, SWT.BORDER | SWT.SINGLE);
+        gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+        gd.widthHint = pixelConverter.convertWidthInCharsToPixels(textLimit + 1);
+        textControl.setLayoutData(gd);
+        textControl.setTextLimit(textLimit);
+        fTextFields.put(textControl, key);
+        if (isNumber) {
+            fNumberFields.add(textControl);
+            textControl.addModifyListener(fNumberFieldListener);
+        } else {
+            textControl.addModifyListener(fTextFieldListener);
+        }
+
+        return new Control[] { labelControl, textControl };
+    }
+
+    protected void createDependency(final Button master, final Control slave) {
+        Assert.isNotNull(slave);
+        indent(slave);
+        SelectionListener listener = new SelectionListener() {
+            public void widgetSelected(SelectionEvent e) {
+                boolean state = master.getSelection();
+                slave.setEnabled(state);
+            }
+
+            public void widgetDefaultSelected(SelectionEvent e) {
+            }
+        };
+        master.addSelectionListener(listener);
+        fMasterSlaveListeners.add(listener);
+    }
+
+    protected static void indent(Control control) {
+        ((GridData) control.getLayoutData()).horizontalIndent += 20;// LayoutUtil.getIndent();
+    }
+
+    public void initialize() {
+        initializeFields();
+    }
+
+    private void initializeFields() {
+
+        Iterator<Button> iter = fCheckBoxes.keySet().iterator();
+        while (iter.hasNext()) {
+            Button b = iter.next();
+            String key = fCheckBoxes.get(b);
+            b.setSelection(fStore.getBoolean(key));
+        }
+
+        Iterator<Text> iter2 = fTextFields.keySet().iterator();
+        while (iter2.hasNext()) {
+            Text t = iter2.next();
+            String key = fTextFields.get(t);
+            t.setText(fStore.getString(key));
+        }
+
+        // Update slaves
+        Iterator<SelectionListener> iter3 = fMasterSlaveListeners.iterator();
+        while (iter3.hasNext()) {
+            SelectionListener listener = iter3.next();
+            listener.widgetSelected(null);
+        }
+
+        updateStatus(new StatusInfo());
+    }
+
+    public void performOk() {
+    }
+
+    public void performDefaults() {
+        initializeFields();
+    }
+
+    IStatus getStatus() {
+        if (fStatus == null)
+            fStatus = new StatusInfo();
+        return fStatus;
+    }
+
+    /*
+     * @see com.cisco.yangide.editor.preferences.IPreferenceConfigurationBlock#dispose()
+     */
+    public void dispose() {
+    }
+
+    private void numberFieldChanged(Text textControl) {
+        String number = textControl.getText();
+        IStatus status = validatePositiveNumber(number);
+        if (!status.matches(IStatus.ERROR))
+            fStore.setValue(fTextFields.get(textControl), number);
+        updateStatus(status);
+    }
+
+    private IStatus validatePositiveNumber(String number) {
+        StatusInfo status = new StatusInfo();
+        if (number.length() == 0) {
+            status.setError(YangPreferencesMessages.YANGEditorPreferencePage_empty_input);
+        } else {
+            try {
+                int value = Integer.parseInt(number);
+                if (value < 0)
+                    status.setError(String.format(YangPreferencesMessages.YANGEditorPreferencePage_invalid_input,
+                            number));
+            } catch (NumberFormatException e) {
+                status.setError(String.format(YangPreferencesMessages.YANGEditorPreferencePage_invalid_input, number));
+            }
+        }
+        return status;
+    }
+
+    protected void updateStatus(IStatus status) {
+        if (fMainPage == null)
+            return;
+        fMainPage.setValid(status.isOK());
+        StatusUtil.applyToStatusLine(fMainPage, status);
+    }
+
+    protected final OverlayPreferenceStore getPreferenceStore() {
+        return fStore;
+    }
+
+    protected Composite createSubsection(Composite parent, SectionManager manager, String label) {
+        if (manager != null) {
+            return manager.createSection(label);
+        } else {
+            Group group = new Group(parent, SWT.SHADOW_NONE);
+            group.setText(label);
+            GridData data = new GridData(SWT.FILL, SWT.CENTER, true, false);
+            group.setLayoutData(data);
+            return group;
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/preferences/AbstractConfigurationBlockPreferencePage.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/preferences/AbstractConfigurationBlockPreferencePage.java
new file mode 100644 (file)
index 0000000..ed69c83
--- /dev/null
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.preferences;
+
+import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.PlatformUI;
+import org.osgi.service.prefs.BackingStoreException;
+
+import com.cisco.yangide.editor.YangEditorPlugin;
+import com.cisco.yangide.ui.preferences.OverlayPreferenceStore;
+
+/**
+ * @author Alexey Kholupko
+ */
+public abstract class AbstractConfigurationBlockPreferencePage extends PreferencePage implements
+        IWorkbenchPreferencePage {
+
+    private IPreferenceConfigurationBlock fConfigurationBlock;
+    private OverlayPreferenceStore fOverlayStore;
+
+    /**
+     * Creates a new preference page.
+     */
+    public AbstractConfigurationBlockPreferencePage() {
+        setDescription();
+        setPreferenceStore();
+        fOverlayStore = new OverlayPreferenceStore(getPreferenceStore(), new OverlayPreferenceStore.OverlayKey[] {});
+        fConfigurationBlock = createConfigurationBlock(fOverlayStore);
+    }
+
+    protected abstract IPreferenceConfigurationBlock createConfigurationBlock(
+            OverlayPreferenceStore overlayPreferenceStore);
+
+    protected abstract String getHelpId();
+
+    protected abstract void setDescription();
+
+    protected abstract void setPreferenceStore();
+
+    /*
+     * @see IWorkbenchPreferencePage#init()
+     */
+    public void init(IWorkbench workbench) {
+    }
+
+    /*
+     * @see PreferencePage#createControl(Composite)
+     */
+    @Override
+    public void createControl(Composite parent) {
+        super.createControl(parent);
+        PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), getHelpId());
+    }
+
+    /*
+     * @see PreferencePage#createContents(Composite)
+     */
+    @Override
+    protected Control createContents(Composite parent) {
+
+        fOverlayStore.load();
+        fOverlayStore.start();
+
+        Control content = fConfigurationBlock.createControl(parent);
+
+        initialize();
+
+        Dialog.applyDialogFont(content);
+        return content;
+    }
+
+    private void initialize() {
+        fConfigurationBlock.initialize();
+    }
+
+    /*
+     * @see PreferencePage#performOk()
+     */
+    @Override
+    public boolean performOk() {
+
+        fConfigurationBlock.performOk();
+
+        fOverlayStore.propagate();
+
+        // TODO etxract to plugin class
+
+        try {
+            InstanceScope.INSTANCE.getNode(YangEditorPlugin.PLUGIN_ID).flush();
+        } catch (BackingStoreException e) {
+            YangEditorPlugin.log(e);
+        }
+
+        return true;
+    }
+
+    /*
+     * @see PreferencePage#performDefaults()
+     */
+    @Override
+    public void performDefaults() {
+
+        fOverlayStore.loadDefaults();
+        fConfigurationBlock.performDefaults();
+
+        super.performDefaults();
+    }
+
+    /*
+     * @see DialogPage#dispose()
+     */
+    @Override
+    public void dispose() {
+
+        fConfigurationBlock.dispose();
+
+        if (fOverlayStore != null) {
+            fOverlayStore.stop();
+            fOverlayStore = null;
+        }
+
+        super.dispose();
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/preferences/IPreferenceConfigurationBlock.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/preferences/IPreferenceConfigurationBlock.java
new file mode 100644 (file)
index 0000000..f59d44e
--- /dev/null
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.preferences;
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/**
+ * Interface for preference configuration blocks which can either be wrapped by a
+ * {@link com.cisco.yangide.editor.preferences.AbstractConfigurationBlockPreferencePage} or be
+ * included some preference page.
+ * <p>
+ * Clients may implement this interface.
+ * </p>
+ *
+ * @author Alexey Kholupko
+ */
+public interface IPreferenceConfigurationBlock {
+
+    /**
+     * Creates the preference control.
+     */
+    Control createControl(Composite parent);
+
+    /**
+     * Called after creating the control. Implementations should load the preferences values and
+     * update the controls accordingly.
+     */
+    void initialize();
+
+    /**
+     * Called when the <code>OK</code> button is pressed on the preference page. Implementations
+     * should commit the configured preference settings into their form of preference storage.
+     */
+    void performOk();
+
+    /**
+     * Called when the <code>Defaults</code> button is pressed on the preference page.
+     * Implementation should reset any preference settings to their default values and adjust the
+     * controls accordingly.
+     */
+    void performDefaults();
+
+    /**
+     * Called when the preference page is being disposed. Implementations should free any resources
+     * they are holding on to.
+     */
+    void dispose();
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/preferences/YangDocumentSetupParticipant.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/preferences/YangDocumentSetupParticipant.java
new file mode 100644 (file)
index 0000000..1c24518
--- /dev/null
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.preferences;
+
+import org.eclipse.core.filebuffers.IDocumentSetupParticipant;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IDocumentExtension3;
+import org.eclipse.jface.text.IDocumentPartitioner;
+import org.eclipse.jface.text.rules.FastPartitioner;
+
+import com.cisco.yangide.editor.editors.YangPartitionScanner;
+
+/**
+ * @author Alexey Kholupko
+ */
+public class YangDocumentSetupParticipant implements IDocumentSetupParticipant {
+
+    public final static String YANG_PARTITIONING = "com.cisco.yangide.editor.ui.yangPartitioning"; //$NON-NLS-1$
+
+    public YangDocumentSetupParticipant() {
+    }
+
+    @Override
+    public void setup(IDocument document) {
+        if (document instanceof IDocumentExtension3) {
+            IDocumentExtension3 extension3 = (IDocumentExtension3) document;
+            IDocumentPartitioner partitioner = createDocumentPartitioner();
+            extension3.setDocumentPartitioner(YANG_PARTITIONING, partitioner);
+            partitioner.connect(document);
+        }
+    }
+
+    public static IDocumentPartitioner createDocumentPartitioner() {
+        return new FastPartitioner(new YangPartitionScanner(), new String[] { YangPartitionScanner.YANG_COMMENT,
+                YangPartitionScanner.YANG_STRING, YangPartitionScanner.YANG_STRING_SQ });
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/preferences/YangEditorColoringConfigurationBlock.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/preferences/YangEditorColoringConfigurationBlock.java
new file mode 100644 (file)
index 0000000..f5cd1e1
--- /dev/null
@@ -0,0 +1,743 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.preferences;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.jdt.ui.PreferenceConstants;
+import org.eclipse.jdt.ui.text.IColorManager;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.layout.PixelConverter;
+import org.eclipse.jface.preference.ColorSelector;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferenceConverter;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontMetrics;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.swt.widgets.ScrollBar;
+import org.eclipse.swt.widgets.Scrollable;
+import org.eclipse.ui.dialogs.PreferencesUtil;
+import org.eclipse.ui.editors.text.EditorsUI;
+import org.eclipse.ui.model.WorkbenchViewerComparator;
+import org.eclipse.ui.texteditor.ChainedPreferenceStore;
+
+import com.cisco.yangide.editor.YangEditorPlugin;
+import com.cisco.yangide.editor.editors.SemanticHighlighting;
+import com.cisco.yangide.editor.editors.SemanticHighlightingManager;
+import com.cisco.yangide.editor.editors.SemanticHighlightingManager.HighlightedRange;
+import com.cisco.yangide.editor.editors.SemanticHighlightings;
+import com.cisco.yangide.editor.editors.YangColorManager;
+import com.cisco.yangide.editor.editors.YangSourceViewer;
+import com.cisco.yangide.editor.editors.YangSourceViewerConfiguration;
+import com.cisco.yangide.ui.preferences.IYangColorConstants;
+import com.cisco.yangide.ui.preferences.OverlayPreferenceStore;
+import com.cisco.yangide.ui.preferences.OverlayPreferenceStore.OverlayKey;
+
+/**
+ * Configures YANG Editor hover preferences.
+ *
+ * @author Alexey Kholupko
+ */
+class YangEditorColoringConfigurationBlock extends AbstractConfigurationBlock {
+
+    /**
+     * Item in the highlighting color list.
+     */
+    private static class HighlightingColorListItem {
+        /** Display name */
+        private String fDisplayName;
+        /** Color preference key */
+        private String fColorKey;
+        /** Bold preference key */
+        private String fBoldKey;
+        /** Italic preference key */
+        private String fItalicKey;
+        /**
+         * Strikethrough preference key.
+         */
+        private String fStrikethroughKey;
+        /**
+         * Underline preference key.
+         */
+        private String fUnderlineKey;
+
+        /**
+         * Initialize the item with the given values.
+         */
+        public HighlightingColorListItem(String displayName, String colorKey, String boldKey, String italicKey,
+                String strikethroughKey, String underlineKey) {
+            fDisplayName = displayName;
+            fColorKey = colorKey;
+            fBoldKey = boldKey;
+            fItalicKey = italicKey;
+            fStrikethroughKey = strikethroughKey;
+            fUnderlineKey = underlineKey;
+        }
+
+        /**
+         * @return the bold preference key
+         */
+        public String getBoldKey() {
+            return fBoldKey;
+        }
+
+        public String getItalicKey() {
+            return fItalicKey;
+        }
+
+        public String getStrikethroughKey() {
+            return fStrikethroughKey;
+        }
+
+        public String getUnderlineKey() {
+            return fUnderlineKey;
+        }
+
+        public String getColorKey() {
+            return fColorKey;
+        }
+
+        public String getDisplayName() {
+            return fDisplayName;
+        }
+    }
+
+    private static class SemanticHighlightingColorListItem extends HighlightingColorListItem {
+
+        /** Enablement preference key */
+        private final String fEnableKey;
+
+        /**
+         * Initialize the item with the given values.
+         *
+         * @param displayName the display name
+         * @param colorKey the color preference key
+         * @param boldKey the bold preference key
+         * @param italicKey the italic preference key
+         * @param strikethroughKey the strikethroughKey preference key
+         * @param underlineKey the underlineKey preference key
+         * @param enableKey the enable preference key
+         */
+        public SemanticHighlightingColorListItem(String displayName, String colorKey, String boldKey, String italicKey,
+                String strikethroughKey, String underlineKey, String enableKey) {
+            super(displayName, colorKey, boldKey, italicKey, strikethroughKey, underlineKey);
+            fEnableKey = enableKey;
+        }
+
+        /**
+         * @return the enablement preference key
+         */
+        public String getEnableKey() {
+            return fEnableKey;
+        }
+    }
+
+    /**
+     * Color list label provider.
+     */
+    private class ColorListLabelProvider extends LabelProvider {
+        /*
+         * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
+         */
+        @Override
+        public String getText(Object element) {
+            if (element instanceof String) {
+                return (String) element;
+            }
+            return ((HighlightingColorListItem) element).getDisplayName();
+        }
+    }
+
+    /**
+     * Color list content provider.
+     */
+    private class ColorListContentProvider implements IStructuredContentProvider {
+
+        /*
+         * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+         */
+        @Override
+        @SuppressWarnings("rawtypes")
+        public Object[] getElements(Object inputElement) {
+            return ((java.util.List) inputElement).toArray();
+        }
+
+        @Override
+        public void dispose() {
+        }
+
+        @Override
+        public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+        }
+
+    }
+
+    /**
+     * Preference key suffix for bold preferences.
+     */
+    private static final String BOLD = PreferenceConstants.EDITOR_BOLD_SUFFIX;
+
+    private static final String ITALIC = PreferenceConstants.EDITOR_ITALIC_SUFFIX;
+
+    private static final String STRIKETHROUGH = PreferenceConstants.EDITOR_STRIKETHROUGH_SUFFIX;
+
+    private static final String UNDERLINE = PreferenceConstants.EDITOR_UNDERLINE_SUFFIX;
+
+    /**
+     * The keys of the overlay store.
+     */
+    private final String[][] fSyntaxColorListModel = new String[][] {
+
+    { YangPreferencesMessages.YANGEditorPreferencePage_strings, IYangColorConstants.YANG_STRING },
+            { YangPreferencesMessages.YANGEditorPreferencePage_keywords, IYangColorConstants.YANG_KEYWORD },
+            { YangPreferencesMessages.YANGEditorPreferencePage_comments, IYangColorConstants.YANG_COMMENT },
+            { YangPreferencesMessages.YANGEditorPreferencePage_identifiers, IYangColorConstants.YANG_IDENTIFIER },
+            { YangPreferencesMessages.YANGEditorPreferencePage_types, IYangColorConstants.YANG_TYPE },
+            { YangPreferencesMessages.YANGEditorPreferencePage_numbers, IYangColorConstants.YANG_NUMBER } };
+
+    private ColorSelector fSyntaxForegroundColorEditor;
+    private Label fColorEditorLabel;
+
+    /**
+     * Check box for bold preference.
+     */
+    private Button fBoldCheckBox;
+
+    private Button fItalicCheckBox;
+
+    private Button fStrikethroughCheckBox;
+
+    private Button fUnderlineCheckBox;
+    /**
+     * Highlighting color list
+     */
+    private final java.util.List<HighlightingColorListItem> fListModel = new ArrayList<HighlightingColorListItem>();
+
+    private TableViewer fHighlightingColorListViewer;
+
+    private SourceViewer fPreviewViewer;
+
+    private IColorManager fColorManager;
+
+    private FontMetrics fFontMetrics;
+
+    private SemanticHighlightingManager fSemanticHighlightingManager;
+
+    public YangEditorColoringConfigurationBlock(OverlayPreferenceStore store) {
+        super(store);
+
+        fColorManager = new YangColorManager(false);
+
+        for (int i = 0, n = fSyntaxColorListModel.length; i < n; i++) {
+            fListModel.add(new HighlightingColorListItem(fSyntaxColorListModel[i][0], fSyntaxColorListModel[i][1],
+                    fSyntaxColorListModel[i][1] + BOLD, fSyntaxColorListModel[i][1] + ITALIC,
+                    fSyntaxColorListModel[i][1] + STRIKETHROUGH, fSyntaxColorListModel[i][1] + UNDERLINE));
+        }
+
+        SemanticHighlighting[] semanticHighlightings = SemanticHighlightings.getSemanticHighlightings();
+        for (int i = 0, n = semanticHighlightings.length; i < n; i++) {
+            fListModel.add(new SemanticHighlightingColorListItem(semanticHighlightings[i].getDisplayName(),
+                    SemanticHighlightings.getColorPreferenceKey(semanticHighlightings[i]), SemanticHighlightings
+                    .getBoldPreferenceKey(semanticHighlightings[i]), SemanticHighlightings
+                    .getItalicPreferenceKey(semanticHighlightings[i]), SemanticHighlightings
+                    .getStrikethroughPreferenceKey(semanticHighlightings[i]), SemanticHighlightings
+                    .getUnderlinePreferenceKey(semanticHighlightings[i]), SemanticHighlightings
+                    .getEnabledPreferenceKey(semanticHighlightings[i])));
+        }
+
+        store.addKeys(createOverlayStoreKeys());
+    }
+
+    private OverlayPreferenceStore.OverlayKey[] createOverlayStoreKeys() {
+
+        ArrayList<OverlayKey> overlayKeys = new ArrayList<OverlayKey>();
+
+        for (int i = 0, n = fListModel.size(); i < n; i++) {
+            HighlightingColorListItem item = fListModel.get(i);
+            overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.STRING, item.getColorKey()));
+            overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, item.getBoldKey()));
+            overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, item.getItalicKey()));
+            overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, item
+                    .getStrikethroughKey()));
+            overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, item
+                    .getUnderlineKey()));
+
+            if (item instanceof SemanticHighlightingColorListItem) {
+                overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN,
+                        ((SemanticHighlightingColorListItem) item).getEnableKey()));
+            }
+
+        }
+
+        OverlayPreferenceStore.OverlayKey[] keys = new OverlayPreferenceStore.OverlayKey[overlayKeys.size()];
+        overlayKeys.toArray(keys);
+        return keys;
+    }
+
+    @Override
+    public Control createControl(Composite parent) {
+        initializeDialogUnits(parent);
+
+        ScrolledPageContent scrolled = new ScrolledPageContent(parent, SWT.H_SCROLL | SWT.V_SCROLL);
+        scrolled.setExpandHorizontal(true);
+        scrolled.setExpandVertical(true);
+
+        Control control = createSyntaxPage(scrolled);
+
+        scrolled.setContent(control);
+        final Point size = control.computeSize(SWT.DEFAULT, SWT.DEFAULT);
+        scrolled.setMinSize(size.x, size.y);
+
+        return scrolled;
+    }
+
+    /**
+     * Returns the number of pixels corresponding to the width of the given number of characters.
+     * This method may only be called after <code>initializeDialogUnits</code> has been called.
+     */
+    private int convertWidthInCharsToPixels(int chars) {
+        // test for failure to initialize for backward compatibility
+        if (fFontMetrics == null) {
+            return 0;
+        }
+        return Dialog.convertWidthInCharsToPixels(fFontMetrics, chars);
+    }
+
+    private int convertHeightInCharsToPixels(int chars) {
+        // test for failure to initialize for backward compatibility
+        if (fFontMetrics == null) {
+            return 0;
+        }
+        return Dialog.convertHeightInCharsToPixels(fFontMetrics, chars);
+    }
+
+    @Override
+    public void initialize() {
+        super.initialize();
+
+        fHighlightingColorListViewer.setInput(fListModel);
+        fHighlightingColorListViewer
+                .setSelection(new StructuredSelection(fHighlightingColorListViewer.getElementAt(0)));
+    }
+
+    @Override
+    public void performDefaults() {
+        super.performDefaults();
+
+        handleSyntaxColorListSelection();
+
+        uninstallSemanticHighlighting();
+        installSemanticHighlighting();
+
+        fPreviewViewer.invalidateTextPresentation();
+    }
+
+    /*
+     * @see com.cisco.yangide.editor.preferences.IPreferenceConfigurationBlock#dispose()
+     */
+    @Override
+    public void dispose() {
+
+        fColorManager.dispose();
+
+        super.dispose();
+    }
+
+    private void handleSyntaxColorListSelection() {
+        HighlightingColorListItem item = getHighlightingColorListItem();
+        if (item == null) {
+            fSyntaxForegroundColorEditor.getButton().setEnabled(false);
+            fColorEditorLabel.setEnabled(false);
+            fBoldCheckBox.setEnabled(false);
+            fItalicCheckBox.setEnabled(false);
+            fStrikethroughCheckBox.setEnabled(false);
+            fUnderlineCheckBox.setEnabled(false);
+            return;
+        }
+        RGB rgb = PreferenceConverter.getColor(getPreferenceStore(), item.getColorKey());
+        fSyntaxForegroundColorEditor.setColorValue(rgb);
+        fBoldCheckBox.setSelection(getPreferenceStore().getBoolean(item.getBoldKey()));
+        fItalicCheckBox.setSelection(getPreferenceStore().getBoolean(item.getItalicKey()));
+        fStrikethroughCheckBox.setSelection(getPreferenceStore().getBoolean(item.getStrikethroughKey()));
+        fUnderlineCheckBox.setSelection(getPreferenceStore().getBoolean(item.getUnderlineKey()));
+
+        fSyntaxForegroundColorEditor.getButton().setEnabled(true);
+        fColorEditorLabel.setEnabled(true);
+        fBoldCheckBox.setEnabled(true);
+        fItalicCheckBox.setEnabled(true);
+        fStrikethroughCheckBox.setEnabled(true);
+        fUnderlineCheckBox.setEnabled(true);
+
+    }
+
+    private Control createSyntaxPage(final Composite parent) {
+
+        Composite colorComposite = new Composite(parent, SWT.NONE);
+        GridLayout layout = new GridLayout();
+        layout.marginHeight = 0;
+        layout.marginWidth = 0;
+        colorComposite.setLayout(layout);
+
+        Link link = new Link(colorComposite, SWT.NONE);
+        link.setText(YangPreferencesMessages.YANGEditorColoringConfigurationBlock_link);
+        link.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                if ("org.eclipse.ui.preferencePages.GeneralTextEditor".equals(e.text)) {
+                    PreferencesUtil.createPreferenceDialogOn(parent.getShell(), e.text, null, null);
+                } else if ("org.eclipse.ui.preferencePages.ColorsAndFonts".equals(e.text)) {
+                    PreferencesUtil.createPreferenceDialogOn(parent.getShell(), e.text, null,
+                            "selectFont:org.eclipse.jdt.ui.editors.textfont"); //$NON-NLS-1$
+                }
+            }
+        });
+
+        GridData gridData = new GridData(SWT.FILL, SWT.BEGINNING, true, false);
+        gridData.widthHint = 150; // only expand further if anyone else requires it
+        gridData.horizontalSpan = 2;
+        link.setLayoutData(gridData);
+
+        addFiller(colorComposite, 1);
+
+        Label label;
+        label = new Label(colorComposite, SWT.LEFT);
+        label.setText(YangPreferencesMessages.YANGEditorPreferencePage_coloring_element);
+        label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+        Composite editorComposite = new Composite(colorComposite, SWT.NONE);
+        layout = new GridLayout();
+        layout.numColumns = 2;
+        layout.marginHeight = 0;
+        layout.marginWidth = 0;
+        editorComposite.setLayout(layout);
+        GridData gd = new GridData(SWT.FILL, SWT.BEGINNING, true, false);
+        editorComposite.setLayoutData(gd);
+
+        fHighlightingColorListViewer = new TableViewer(editorComposite, SWT.SINGLE | SWT.V_SCROLL | SWT.BORDER
+                | SWT.FULL_SELECTION);
+        fHighlightingColorListViewer.setLabelProvider(new ColorListLabelProvider());
+        fHighlightingColorListViewer.setContentProvider(new ColorListContentProvider());
+        fHighlightingColorListViewer.setComparator(new WorkbenchViewerComparator());
+        gd = new GridData(SWT.BEGINNING, SWT.BEGINNING, false, true);
+        gd.heightHint = convertHeightInCharsToPixels(9);
+        int maxWidth = 0;
+        for (Iterator<HighlightingColorListItem> it = fListModel.iterator(); it.hasNext();) {
+            HighlightingColorListItem item = it.next();
+            maxWidth = Math.max(maxWidth, convertWidthInCharsToPixels(item.getDisplayName().length()));
+        }
+        ScrollBar vBar = ((Scrollable) fHighlightingColorListViewer.getControl()).getVerticalBar();
+        if (vBar != null) {
+            maxWidth += vBar.getSize().x * 3; // scrollbars and tree indentation guess
+        }
+        gd.widthHint = maxWidth;
+
+        fHighlightingColorListViewer.getControl().setLayoutData(gd);
+
+        Composite stylesComposite = new Composite(editorComposite, SWT.NONE);
+        layout = new GridLayout();
+        layout.marginHeight = 0;
+        layout.marginWidth = 0;
+        layout.numColumns = 2;
+        stylesComposite.setLayout(layout);
+        stylesComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+        fColorEditorLabel = new Label(stylesComposite, SWT.LEFT);
+        fColorEditorLabel.setText(YangPreferencesMessages.YANGEditorPreferencePage_color);
+        gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+
+        gd.horizontalIndent = 20;
+        fColorEditorLabel.setLayoutData(gd);
+
+        fSyntaxForegroundColorEditor = new ColorSelector(stylesComposite);
+        Button foregroundColorButton = fSyntaxForegroundColorEditor.getButton();
+        gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+        foregroundColorButton.setLayoutData(gd);
+
+        fBoldCheckBox = new Button(stylesComposite, SWT.CHECK);
+        fBoldCheckBox.setText(YangPreferencesMessages.YANGEditorPreferencePage_bold);
+        gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+        gd.horizontalIndent = 20;
+        gd.horizontalSpan = 2;
+        fBoldCheckBox.setLayoutData(gd);
+
+        fItalicCheckBox = new Button(stylesComposite, SWT.CHECK);
+        fItalicCheckBox.setText(YangPreferencesMessages.YANGEditorPreferencePage_italic);
+        gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+        gd.horizontalIndent = 20;
+        gd.horizontalSpan = 2;
+        fItalicCheckBox.setLayoutData(gd);
+
+        fStrikethroughCheckBox = new Button(stylesComposite, SWT.CHECK);
+        fStrikethroughCheckBox.setText(YangPreferencesMessages.YANGEditorPreferencePage_strikethrough);
+        gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+        gd.horizontalIndent = 20;
+        gd.horizontalSpan = 2;
+        fStrikethroughCheckBox.setLayoutData(gd);
+
+        fUnderlineCheckBox = new Button(stylesComposite, SWT.CHECK);
+        fUnderlineCheckBox.setText(YangPreferencesMessages.YANGEditorPreferencePage_underline);
+        gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+        gd.horizontalIndent = 20;
+        gd.horizontalSpan = 2;
+        fUnderlineCheckBox.setLayoutData(gd);
+
+        label = new Label(colorComposite, SWT.LEFT);
+        label.setText(YangPreferencesMessages.YANGEditorPreferencePage_preview);
+        label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+        Control previewer = createPreviewer(colorComposite);
+        gd = new GridData(GridData.FILL_BOTH);
+        gd.widthHint = convertWidthInCharsToPixels(20);
+        gd.heightHint = convertHeightInCharsToPixels(5);
+        previewer.setLayoutData(gd);
+
+        fHighlightingColorListViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+            @Override
+            public void selectionChanged(SelectionChangedEvent event) {
+                handleSyntaxColorListSelection();
+            }
+        });
+
+        foregroundColorButton.addSelectionListener(new SelectionListener() {
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                // do nothing
+            }
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                HighlightingColorListItem item = getHighlightingColorListItem();
+                PreferenceConverter.setValue(getPreferenceStore(), item.getColorKey(),
+                        fSyntaxForegroundColorEditor.getColorValue());
+            }
+        });
+
+        fBoldCheckBox.addSelectionListener(new SelectionListener() {
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                // do nothing
+            }
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                HighlightingColorListItem item = getHighlightingColorListItem();
+                getPreferenceStore().setValue(item.getBoldKey(), fBoldCheckBox.getSelection());
+            }
+        });
+
+        fItalicCheckBox.addSelectionListener(new SelectionListener() {
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                // do nothing
+            }
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                HighlightingColorListItem item = getHighlightingColorListItem();
+                getPreferenceStore().setValue(item.getItalicKey(), fItalicCheckBox.getSelection());
+            }
+        });
+        fStrikethroughCheckBox.addSelectionListener(new SelectionListener() {
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                // do nothing
+            }
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                HighlightingColorListItem item = getHighlightingColorListItem();
+                getPreferenceStore().setValue(item.getStrikethroughKey(), fStrikethroughCheckBox.getSelection());
+            }
+        });
+
+        fUnderlineCheckBox.addSelectionListener(new SelectionListener() {
+            @Override
+            public void widgetDefaultSelected(SelectionEvent e) {
+                // do nothing
+            }
+
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                HighlightingColorListItem item = getHighlightingColorListItem();
+                getPreferenceStore().setValue(item.getUnderlineKey(), fUnderlineCheckBox.getSelection());
+            }
+        });
+
+        colorComposite.layout(false);
+
+        return colorComposite;
+    }
+
+    private void addFiller(Composite composite, int horizontalSpan) {
+        PixelConverter pixelConverter = new PixelConverter(composite);
+        Label filler = new Label(composite, SWT.LEFT);
+        GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+        gd.horizontalSpan = horizontalSpan;
+        gd.heightHint = pixelConverter.convertHeightInCharsToPixels(1) / 2;
+        filler.setLayoutData(gd);
+    }
+
+    private Control createPreviewer(Composite parent) {
+
+        fPreviewViewer = new YangSourceViewer(parent, null, null, false, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
+
+        YangSourceViewerConfiguration configuration = new YangSourceViewerConfiguration(YangEditorPlugin.getDefault()
+                .getCombinedPreferenceStore(), fColorManager, null);
+
+        fPreviewViewer.configure(configuration);
+        fPreviewViewer.setEditable(false);
+        Font font = JFaceResources.getFont(JFaceResources.TEXT_FONT);
+        fPreviewViewer.getTextWidget().setFont(font);
+
+        IPreferenceStore store = new ChainedPreferenceStore(new IPreferenceStore[] { getPreferenceStore(),
+                EditorsUI.getPreferenceStore() });
+
+        new YangPreviewerUpdater(fPreviewViewer, configuration, store);
+
+        String content = YangEditorPlugin.getDefault().getBundleFileContent("/resources/ColorSettingPreviewCode.txt"); //$NON-NLS-1$
+        IDocument document = new Document(content);
+        new YangDocumentSetupParticipant().setup(document);
+        fPreviewViewer.setDocument(document);
+
+        installSemanticHighlighting();
+
+        return fPreviewViewer.getControl();
+    }
+
+    /**
+     * Returns the current highlighting color list item.
+     *
+     * @return the current highlighting color list item
+     */
+    private HighlightingColorListItem getHighlightingColorListItem() {
+        IStructuredSelection selection = (IStructuredSelection) fHighlightingColorListViewer.getSelection();
+        Object element = selection.getFirstElement();
+        if (element instanceof String) {
+            return null;
+        }
+        return (HighlightingColorListItem) element;
+    }
+
+    /**
+     * Initializes the computation of horizontal and vertical dialog units based on the size of
+     * current font.
+     * <p>
+     * This method must be called before any of the dialog unit based conversion methods are called.
+     * </p>
+     *
+     * @param testControl a control from which to obtain the current font
+     */
+    private void initializeDialogUnits(Control testControl) {
+        // Compute and store a font metric
+        GC gc = new GC(testControl);
+        gc.setFont(JFaceResources.getDialogFont());
+        fFontMetrics = gc.getFontMetrics();
+        gc.dispose();
+    }
+
+    /**
+     * Install Semantic Highlighting on the previewer
+     */
+    private void installSemanticHighlighting() {
+        if (fSemanticHighlightingManager == null) {
+            fSemanticHighlightingManager = new SemanticHighlightingManager();
+            fSemanticHighlightingManager.install(fPreviewViewer, fColorManager, getPreferenceStore(),
+                    createPreviewerRanges());
+        }
+    }
+
+    /**
+     * Uninstall Semantic Highlighting from the previewer
+     */
+    private void uninstallSemanticHighlighting() {
+        if (fSemanticHighlightingManager != null) {
+            fSemanticHighlightingManager.uninstall();
+            fSemanticHighlightingManager = null;
+        }
+    }
+
+    /**
+     * Create the hard coded previewer ranges
+     *
+     * @return the hard coded previewer ranges
+     */
+    private SemanticHighlightingManager.HighlightedRange[][] createPreviewerRanges() {
+        return new SemanticHighlightingManager.HighlightedRange[][] {
+                { createHighlightedRange(35, 9, 11, SemanticHighlightings.GROUPING) },
+                { createHighlightedRange(77, 11, 11, SemanticHighlightings.GROUPING) },
+                { createHighlightedRange(53, 15, 4, SemanticHighlightings.PREFIX) },
+                { createHighlightedRange(56, 15, 4, SemanticHighlightings.PREFIX) },
+                { createHighlightedRange(59, 15, 4, SemanticHighlightings.PREFIX) },
+                { createHighlightedRange(70, 17, 4, SemanticHighlightings.PREFIX) },
+                { createHighlightedRange(82, 13, 4, SemanticHighlightings.PREFIX) },
+                { createHighlightedRange(92, 15, 4, SemanticHighlightings.PREFIX) },
+                { createHighlightedRange(96, 15, 4, SemanticHighlightings.PREFIX) },
+                { createHighlightedRange(104, 15, 4, SemanticHighlightings.PREFIX) },
+                { createHighlightedRange(109, 15, 4, SemanticHighlightings.PREFIX) },
+                { createHighlightedRange(53, 20, 10, SemanticHighlightings.TYPE) },
+                { createHighlightedRange(56, 20, 13, SemanticHighlightings.TYPE) },
+                { createHighlightedRange(59, 20, 13, SemanticHighlightings.TYPE) },
+                { createHighlightedRange(70, 22, 12, SemanticHighlightings.TYPE) },
+                { createHighlightedRange(82, 18, 9, SemanticHighlightings.TYPE) },
+                { createHighlightedRange(92, 20, 10, SemanticHighlightings.TYPE) },
+                { createHighlightedRange(96, 20, 10, SemanticHighlightings.TYPE) },
+                { createHighlightedRange(104, 20, 4, SemanticHighlightings.TYPE) },
+                { createHighlightedRange(109, 20, 11, SemanticHighlightings.TYPE) },
+
+        };
+    }
+
+    /**
+     * Create a highlighted range on the previewers document with the given line, column, length and
+     * key.
+     *
+     * @param line the line
+     * @param column the column
+     * @param length the length
+     * @param key the key
+     * @return the highlighted range
+     */
+    private HighlightedRange createHighlightedRange(int line, int column, int length, String key) {
+        try {
+            IDocument document = fPreviewViewer.getDocument();
+            int offset = document.getLineOffset(line) + column;
+            return new HighlightedRange(offset, length, key);
+        } catch (BadLocationException x) {
+            YangEditorPlugin.log(x);
+        }
+        return null;
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/preferences/YangEditorColoringPreferencePage.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/preferences/YangEditorColoringPreferencePage.java
new file mode 100644 (file)
index 0000000..5d6e612
--- /dev/null
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.preferences;
+
+import org.eclipse.ui.IWorkbenchPreferencePage;
+
+import com.cisco.yangide.editor.YangEditorPlugin;
+import com.cisco.yangide.ui.YangUIPlugin;
+import com.cisco.yangide.ui.preferences.OverlayPreferenceStore;
+
+/**
+ * @author Alexey Kholupko
+ */
+public class YangEditorColoringPreferencePage extends AbstractConfigurationBlockPreferencePage implements
+        IWorkbenchPreferencePage {
+
+    // TODO extarct to class ContextsIds @see IJavaHelpContextIds
+    public static final String PREFIX = YangEditorPlugin.PLUGIN_ID + '.';
+    public static final String YANG_EDITOR_PREFERENCE_PAGE = PREFIX + "yang_editor_preference_page_context"; //$NON-NLS-1$
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see
+     * com.cisco.yangide.editor.preferences.AbstractConfigurationBlockPreferencePage#setPreferenceStore
+     * ()
+     */
+    @Override
+    protected void setPreferenceStore() {
+        setPreferenceStore(YangUIPlugin.getDefault().getPreferenceStore());
+
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see
+     * com.cisco.yangide.editor.preferences.YangEditorColoringPreferencePage#createConfigurationBlock
+     * (com.cisco.yangide.editor.preferences.OverlayPreferenceStore)
+     */
+    @Override
+    protected IPreferenceConfigurationBlock createConfigurationBlock(OverlayPreferenceStore overlayPreferenceStore) {
+        return new YangEditorColoringConfigurationBlock(overlayPreferenceStore);
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see
+     * com.cisco.yangide.editor.preferences.AbstractConfigurationBlockPreferencePage#getHelpId()
+     */
+    @Override
+    protected String getHelpId() {
+        // TODO
+        return YangEditorColoringPreferencePage.YANG_EDITOR_PREFERENCE_PAGE;
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see
+     * com.cisco.yangide.editor.preferences.AbstractConfigurationBlockPreferencePage#setDescription
+     * ()
+     */
+    @Override
+    protected void setDescription() {
+        String description = YangPreferencesMessages.YANGEditorPreferencePage_colors;
+        setDescription(description);
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/preferences/YangFormatterPreferencePage.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/preferences/YangFormatterPreferencePage.java
new file mode 100644 (file)
index 0000000..ccd1d9a
--- /dev/null
@@ -0,0 +1,248 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.preferences;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.TextUtilities;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.editors.text.EditorsUI;
+import org.eclipse.ui.texteditor.ChainedPreferenceStore;
+
+import com.cisco.yangide.core.parser.YangFormattingPreferences;
+import com.cisco.yangide.core.parser.YangParserUtil;
+import com.cisco.yangide.editor.YangEditorPlugin;
+import com.cisco.yangide.editor.editors.YangColorManager;
+import com.cisco.yangide.editor.editors.YangSourceViewerConfiguration;
+import com.cisco.yangide.ui.YangUIPlugin;
+import com.cisco.yangide.ui.preferences.YangPreferenceConstants;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 22, 2014
+ */
+public class YangFormatterPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
+
+    private SourceViewer previewViewer;
+    private YangColorManager colorManager;
+    private Button useTabs;
+    private Text tabSizeTxt;
+    private Text lineWidthTxt;
+    private Button formatString;
+    private Button formatComments;
+    private Button collapseImport;
+    private String content;
+
+    public YangFormatterPreferencePage() {
+        colorManager = new YangColorManager(false);
+    }
+
+    @Override
+    public void init(IWorkbench workbench) {
+        this.setPreferenceStore(YangUIPlugin.getDefault().getPreferenceStore());
+    }
+
+    @Override
+    public void dispose() {
+        super.dispose();
+        colorManager.dispose();
+    }
+
+    @Override
+    protected Control createContents(Composite parent) {
+        initializeDialogUnits(parent);
+        Composite content = new Composite(parent, SWT.NONE);
+        GridLayout layout = new GridLayout();
+        layout.marginHeight = 0;
+        layout.marginWidth = 0;
+        content.setLayout(layout);
+
+        Group indentationGroup = createGroup(2, content, "Indentation");
+
+        new Label(indentationGroup, SWT.NONE).setText("Tab size:");
+        tabSizeTxt = new Text(indentationGroup, SWT.BORDER);
+
+        useTabs = new Button(indentationGroup, SWT.CHECK);
+        useTabs.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1));
+        useTabs.setText("Use tab character instead of space");
+
+        Group wrappingGroup = createGroup(2, content, "Line Wrapping");
+
+        new Label(wrappingGroup, SWT.NONE).setText("Maximum line width (characters):");
+        lineWidthTxt = new Text(wrappingGroup, SWT.BORDER);
+
+        formatString = new Button(wrappingGroup, SWT.CHECK);
+        formatString.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1));
+        formatString.setText("Wrap long strings (description, references, etc)");
+
+        formatComments = new Button(wrappingGroup, SWT.CHECK);
+        formatComments.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1));
+        formatComments.setText("Wrap long block comments");
+
+        collapseImport = new Button(wrappingGroup, SWT.CHECK);
+        collapseImport.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1));
+        collapseImport.setText("Collapse import statement in single line");
+
+        Label previewLabel = new Label(content, SWT.LEFT);
+        previewLabel.setText("Preview:");
+        previewLabel.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+        Control previewer = createPreviewer(content);
+        GridData gd = new GridData(GridData.FILL_BOTH);
+        gd.widthHint = convertWidthInCharsToPixels(20);
+        gd.heightHint = convertHeightInCharsToPixels(5);
+        previewer.setLayoutData(gd);
+
+        initializeFields();
+
+        applyDialogFont(content);
+        updatePreview();
+        return content;
+    }
+
+    private void initializeFields() {
+        tabSizeTxt.setText(String.valueOf(getPreferenceStore().getInt(YangPreferenceConstants.FMT_INDENT_WIDTH)));
+        useTabs.setSelection(!getPreferenceStore().getBoolean(YangPreferenceConstants.FMT_INDENT_SPACE));
+        lineWidthTxt.setText(String.valueOf(getPreferenceStore().getInt(YangPreferenceConstants.FMT_MAX_LINE_LENGTH)));
+        formatComments.setSelection(getPreferenceStore().getBoolean(YangPreferenceConstants.FMT_COMMENT));
+        formatString.setSelection(getPreferenceStore().getBoolean(YangPreferenceConstants.FMT_STRING));
+        collapseImport.setSelection(getPreferenceStore().getBoolean(YangPreferenceConstants.FMT_COMPACT_IMPORT));
+
+        tabSizeTxt.addModifyListener(new ModifyListener() {
+            @Override
+            public void modifyText(ModifyEvent e) {
+                updatePreview();
+            }
+        });
+        useTabs.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                updatePreview();
+            }
+        });
+        lineWidthTxt.addModifyListener(new ModifyListener() {
+            @Override
+            public void modifyText(ModifyEvent e) {
+                updatePreview();
+            }
+        });
+        formatComments.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                updatePreview();
+            }
+        });
+        formatString.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                updatePreview();
+            }
+        });
+        collapseImport.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                updatePreview();
+            }
+        });
+    }
+
+    @Override
+    public boolean performOk() {
+        IPreferenceStore store = getPreferenceStore();
+        store.setValue(YangPreferenceConstants.FMT_INDENT_SPACE, !useTabs.getSelection());
+        store.setValue(YangPreferenceConstants.FMT_INDENT_WIDTH, Integer.parseInt(tabSizeTxt.getText()));
+        store.setValue(YangPreferenceConstants.FMT_MAX_LINE_LENGTH, Integer.parseInt(lineWidthTxt.getText()));
+        store.setValue(YangPreferenceConstants.FMT_COMMENT, formatComments.getSelection());
+        store.setValue(YangPreferenceConstants.FMT_STRING, formatString.getSelection());
+        store.setValue(YangPreferenceConstants.FMT_COMPACT_IMPORT, collapseImport.getSelection());
+        return true;
+    }
+
+    @Override
+    protected void performDefaults() {
+        IPreferenceStore store = getPreferenceStore();
+        tabSizeTxt.setText(String.valueOf(store.getDefaultInt(YangPreferenceConstants.FMT_INDENT_WIDTH)));
+        useTabs.setSelection(!store.getDefaultBoolean(YangPreferenceConstants.FMT_INDENT_SPACE));
+        lineWidthTxt.setText(String.valueOf(store.getDefaultInt(YangPreferenceConstants.FMT_MAX_LINE_LENGTH)));
+        formatComments.setSelection(store.getDefaultBoolean(YangPreferenceConstants.FMT_COMMENT));
+        formatString.setSelection(store.getDefaultBoolean(YangPreferenceConstants.FMT_STRING));
+        collapseImport.setSelection(store.getDefaultBoolean(YangPreferenceConstants.FMT_COMPACT_IMPORT));
+        super.performDefaults();
+    }
+
+    private void updatePreview() {
+        YangFormattingPreferences preferences = new YangFormattingPreferences();
+        preferences.setSpaceForTabs(!useTabs.getSelection());
+        preferences.setIndentSize(Integer.parseInt(tabSizeTxt.getText()));
+        preferences.setMaxLineLength(Integer.parseInt(lineWidthTxt.getText()));
+        preferences.setCompactImport(collapseImport.getSelection());
+        preferences.setFormatComment(formatComments.getSelection());
+        preferences.setFormatStrings(formatString.getSelection());
+
+        String str = YangParserUtil.formatYangSource(preferences, content.toCharArray(), 0,
+                TextUtilities.getDefaultLineDelimiter(previewViewer.getDocument()));
+        previewViewer.getDocument().set(str);
+    }
+
+    private Group createGroup(int numColumns, Composite parent, String text) {
+        final Group group = new Group(parent, SWT.NONE);
+        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+        gd.horizontalSpan = numColumns;
+        gd.widthHint = 0;
+        group.setLayoutData(gd);
+        group.setFont(parent.getFont());
+
+        final GridLayout layout = new GridLayout(numColumns, false);
+        group.setLayout(layout);
+        group.setText(text);
+        return group;
+    }
+
+    private Control createPreviewer(Composite parent) {
+        previewViewer = new SourceViewer(parent, null, null, false, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
+
+        YangSourceViewerConfiguration configuration = new YangSourceViewerConfiguration(YangEditorPlugin.getDefault()
+                .getCombinedPreferenceStore(), colorManager, null);
+
+        previewViewer.configure(configuration);
+        previewViewer.setEditable(false);
+        Font font = JFaceResources.getFont(JFaceResources.TEXT_FONT);
+        previewViewer.getTextWidget().setFont(font);
+
+        IPreferenceStore store = new ChainedPreferenceStore(new IPreferenceStore[] { getPreferenceStore(),
+                EditorsUI.getPreferenceStore() });
+
+        new YangPreviewerUpdater(previewViewer, configuration, store);
+
+        content = YangEditorPlugin.getDefault().getBundleFileContent("/resources/FormatterSettingPreviewCode.txt");
+        IDocument document = new Document(content);
+        new YangDocumentSetupParticipant().setup(document);
+        previewViewer.setDocument(document);
+
+        return previewViewer.getControl();
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/preferences/YangPreferencesMessages.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/preferences/YangPreferencesMessages.java
new file mode 100644 (file)
index 0000000..5a30a00
--- /dev/null
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.preferences;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * @author Alexey Kholupko
+ */
+public class YangPreferencesMessages extends NLS {
+    private static final String BUNDLE_NAME = "com.cisco.yangide.editor.preferences.YangPreferencesMessages";//$NON-NLS-1$    
+
+    public static String YANGEditorPreferencePage_strings;
+    public static String YANGEditorPreferencePage_keywords;
+    public static String YANGEditorPreferencePage_comments;
+    public static String YANGEditorPreferencePage_identifiers;
+    public static String YANGEditorPreferencePage_types;
+    public static String YANGEditorPreferencePage_numbers;
+
+    public static String YANGEditorPreferencePage_color;
+    public static String YANGEditorPreferencePage_bold;
+    public static String YANGEditorPreferencePage_italic;
+    public static String YANGEditorPreferencePage_strikethrough;
+    public static String YANGEditorPreferencePage_underline;
+    public static String YANGEditorPreferencePage_enable;
+    public static String YANGEditorPreferencePage_preview;
+    public static String YANGEditorPreferencePage_highlightMatchingBrackets;
+    
+    public static String SemanticHighlighting_type;
+    public static String SemanticHighlighting_grouping;
+    public static String SemanticHighlighting_prefix;
+
+    public static String YANGEditorColoringConfigurationBlock_link;
+    public static String YANGEditorPreferencePage_coloring_element;
+    public static String YANGEditorPreferencePage_colors;
+
+    public static String YANGEditorPreferencePage_invalid_input;
+    public static String YANGEditorPreferencePage_empty_input;
+
+    static {
+        // load message values from bundle file
+        NLS.initializeMessages(BUNDLE_NAME, YangPreferencesMessages.class);
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/preferences/YangPreferencesMessages.properties b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/preferences/YangPreferencesMessages.properties
new file mode 100644 (file)
index 0000000..2db2fa0
--- /dev/null
@@ -0,0 +1,31 @@
+###############################################################################
+# Copyright (c) 2014, 2015 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
+#  
+###############################################################################
+
+YANGEditorPreferencePage_strings=Strings
+YANGEditorPreferencePage_keywords=Keywords
+YANGEditorPreferencePage_comments=Comments
+YANGEditorPreferencePage_identifiers=Identifiers
+YANGEditorPreferencePage_types=Built-in types
+YANGEditorPreferencePage_numbers=Numbers
+YANGEditorPreferencePage_color=C&olor:
+YANGEditorPreferencePage_bold=&Bold
+YANGEditorPreferencePage_italic=&Italic
+YANGEditorPreferencePage_strikethrough=&Strikethrough
+YANGEditorPreferencePage_underline=&Underline
+YANGEditorPreferencePage_enable=Enab&le
+YANGEditorPreferencePage_preview=Previe&w:
+YANGEditorPreferencePage_highlightMatchingBrackets=Highlight &matching brackets
+YANGEditorColoringConfigurationBlock_link= Default colors and font can be configured on the <a href=\"org.eclipse.ui.preferencePages.GeneralTextEditor\">'Text Editors'</a> and on the <a href=\"org.eclipse.ui.preferencePages.ColorsAndFonts\">'Colors and Fonts'</a> preference page.
+YANGEditorPreferencePage_coloring_element=&Element:
+YANGEditorPreferencePage_colors=Synta&x
+YANGEditorPreferencePage_invalid_input=''{0}'' is not a valid input.
+YANGEditorPreferencePage_empty_input=Empty input
+SemanticHighlighting_type=Custom types
+SemanticHighlighting_grouping=Groupings
+SemanticHighlighting_prefix=Module prefixes
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/preferences/YangPreviewerUpdater.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/preferences/YangPreviewerUpdater.java
new file mode 100644 (file)
index 0000000..e0295d9
--- /dev/null
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.preferences;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jdt.ui.PreferenceConstants;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.graphics.Font;
+
+import com.cisco.yangide.editor.editors.YangSourceViewerConfiguration;
+
+/**
+ * @author Alexey Kholupko
+ */
+public class YangPreviewerUpdater {
+
+    /**
+     * Creates a Java source preview updater for the given viewer, configuration and preference
+     * store.
+     *
+     * @param viewer the viewer
+     * @param configuration the configuration
+     * @param preferenceStore the preference store
+     */
+    public YangPreviewerUpdater(final SourceViewer viewer, final YangSourceViewerConfiguration configuration,
+            final IPreferenceStore preferenceStore) {
+        Assert.isNotNull(viewer);
+        Assert.isNotNull(configuration);
+        Assert.isNotNull(preferenceStore);
+        final IPropertyChangeListener fontChangeListener = new IPropertyChangeListener() {
+            /*
+             * @see
+             * org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util
+             * .PropertyChangeEvent)
+             */
+            public void propertyChange(PropertyChangeEvent event) {
+                if (event.getProperty().equals(PreferenceConstants.EDITOR_TEXT_FONT)) {
+                    Font font = JFaceResources.getFont(PreferenceConstants.EDITOR_TEXT_FONT);
+                    viewer.getTextWidget().setFont(font);
+                }
+            }
+        };
+        final IPropertyChangeListener propertyChangeListener = new IPropertyChangeListener() {
+            /*
+             * @see
+             * org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util
+             * .PropertyChangeEvent)
+             */
+            public void propertyChange(PropertyChangeEvent event) {
+                if (configuration.affectsTextPresentation(event)) {
+                    configuration.handlePropertyChangeEvent(event);
+                    viewer.invalidateTextPresentation();
+                }
+            }
+        };
+        viewer.getTextWidget().addDisposeListener(new DisposeListener() {
+            /*
+             * @see
+             * org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent
+             * )
+             */
+            public void widgetDisposed(DisposeEvent e) {
+                preferenceStore.removePropertyChangeListener(propertyChangeListener);
+                JFaceResources.getFontRegistry().removeListener(fontChangeListener);
+            }
+        });
+        JFaceResources.getFontRegistry().addListener(fontChangeListener);
+        preferenceStore.addPropertyChangeListener(propertyChangeListener);
+    }
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/templates/GeneralContextType.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/templates/GeneralContextType.java
new file mode 100644 (file)
index 0000000..89174ef
--- /dev/null
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.templates;
+
+import org.eclipse.jface.text.templates.GlobalTemplateVariables;
+import org.eclipse.jface.text.templates.TemplateContextType;
+
+/**
+ * @author Alexey Kholupko
+ */
+public class GeneralContextType extends TemplateContextType {
+
+    public GeneralContextType() {
+        addGlobalResolvers();
+    }
+
+    /** This context's id */
+    public static final String CONTEXT_TYPE = "com.cisco.yangide.editor.templates.general"; //$NON-NLS-1$
+
+    /**
+     * Creates a new YANG context type.
+     */
+
+    private void addGlobalResolvers() {
+        addResolver(new GlobalTemplateVariables.Cursor());
+        addResolver(new GlobalTemplateVariables.WordSelection());
+        addResolver(new GlobalTemplateVariables.LineSelection());
+        addResolver(new GlobalTemplateVariables.Dollar());
+        addResolver(new GlobalTemplateVariables.Date());
+        addResolver(new GlobalTemplateVariables.Year());
+        addResolver(new GlobalTemplateVariables.Time());
+        addResolver(new GlobalTemplateVariables.User());
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/templates/YangEditorTemplatesPage.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/templates/YangEditorTemplatesPage.java
new file mode 100644 (file)
index 0000000..f056685
--- /dev/null
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.templates;
+
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.jface.text.templates.Template;
+import org.eclipse.jface.text.templates.persistence.TemplatePersistenceData;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.texteditor.templates.TemplatePreferencePage;
+
+import com.cisco.yangide.ui.YangUIPlugin;
+
+/**
+ * @author Alexey Kholupko
+ */
+public class YangEditorTemplatesPage extends TemplatePreferencePage {
+
+    public YangEditorTemplatesPage() {
+        setPreferenceStore(YangUIPlugin.getDefault().getPreferenceStore());
+        setTemplateStore(YangTemplateAccess.getDefault().getTemplateStore());
+        setContextTypeRegistry(YangTemplateAccess.getDefault().getContextTypeRegistry());
+    }
+
+    /*
+     * @see org.eclipse.ui.texteditor.templates.TemplatePreferencePage#updateViewerInput()
+     */
+    protected void updateViewerInput() {
+        IStructuredSelection selection = (IStructuredSelection) getTableViewer().getSelection();
+        SourceViewer viewer = getViewer();
+
+        if (selection.size() == 1 && selection.getFirstElement() instanceof TemplatePersistenceData) {
+            TemplatePersistenceData data = (TemplatePersistenceData) selection.getFirstElement();
+            Template template = data.getTemplate();
+            viewer.getDocument().set(template.getPattern());
+
+        } else {
+            viewer.getDocument().set("");
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see org.eclipse.ui.texteditor.templates.TemplatePreferencePage#isShowFormatterSetting()
+     */
+    protected boolean isShowFormatterSetting() {
+        return false;
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/templates/YangTemplateAccess.java b/plugins/com.cisco.yangide.editor/src/com/cisco/yangide/editor/templates/YangTemplateAccess.java
new file mode 100644 (file)
index 0000000..6fad17a
--- /dev/null
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.editor.templates;
+
+import java.io.IOException;
+
+import org.eclipse.jface.text.templates.ContextTypeRegistry;
+import org.eclipse.jface.text.templates.persistence.TemplateStore;
+import org.eclipse.ui.editors.text.templates.ContributionContextTypeRegistry;
+import org.eclipse.ui.editors.text.templates.ContributionTemplateStore;
+
+import com.cisco.yangide.editor.YangEditorPlugin;
+import com.cisco.yangide.ui.YangUIPlugin;
+
+/**
+ * @author Alexey Kholupko
+ */
+public class YangTemplateAccess {
+
+    private static final String CUSTOM_TEMPLATES_KEY = "com.cisco.yangide.editor.customtemplates"; //$NON-NLS-1$
+
+    private static YangTemplateAccess fgInstance;
+
+    private TemplateStore fStore;
+
+    private ContributionContextTypeRegistry fRegistry;
+
+    private YangTemplateAccess() {
+    }
+
+    /**
+     * Returns the shared instance.
+     */
+    public static YangTemplateAccess getDefault() {
+        if (fgInstance == null) {
+            fgInstance = new YangTemplateAccess();
+        }
+        return fgInstance;
+    }
+
+    public TemplateStore getTemplateStore() {
+        if (fStore == null) {
+            fStore = new ContributionTemplateStore(getContextTypeRegistry(), YangUIPlugin.getDefault()
+                    .getPreferenceStore(), CUSTOM_TEMPLATES_KEY);
+            try {
+                fStore.load();
+            } catch (IOException e) {
+                YangEditorPlugin.log(e);
+            }
+        }
+        return fStore;
+    }
+
+    /**
+     * Returns this plug-in's context type registry.
+     */
+    public ContextTypeRegistry getContextTypeRegistry() {
+        if (fRegistry == null) {
+            // create and configure the contexts available in the template editor
+            fRegistry = new ContributionContextTypeRegistry();
+            fRegistry.addContextType(GeneralContextType.CONTEXT_TYPE);
+        }
+        return fRegistry;
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.editor/templates/yang.xml b/plugins/com.cisco.yangide.editor/templates/yang.xml
new file mode 100644 (file)
index 0000000..4ce394c
--- /dev/null
@@ -0,0 +1,114 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!--
+    Copyright (c) 2014, 2015 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
+     
+ -->
+<!--                                                                                -->
+<!-- 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                  -->
+<!-- ============================================================================== -->
+<templates>
+       <template autoinsert="true"
+               context="com.cisco.yangide.editor.templates.general"
+               description="new container declaration"
+               enabled="true"
+               id="com.cisco.yangide.editor.templates.container"
+               name="container">container ${name} {
+       ${cursor}
+}
+       </template>
+       <template autoinsert="true"
+               context="com.cisco.yangide.editor.templates.general" 
+               description="leaf template"
+               enabled="true"
+               id="com.cisco.yangide.editor.templates.leaf"
+               name="leaf">leaf ${name} {
+       type ${type};
+}
+       </template>
+       <template autoinsert="true" context="com.cisco.yangide.editor.templates.general" 
+               description="Module default structure"
+               enabled="true"
+               id="com.cisco.yangide.editor.templates.module"
+               name="module">module ${name} {
+       namespace "${namespace}";
+       prefix "${prefix}";
+       organization "${organization}";
+       description "${description}";
+       revision ${revision} {
+               description "${description}";
+       }
+       ${cursor}
+}
+       </template>
+       <template autoinsert="true" context="com.cisco.yangide.editor.templates.general" 
+               description="organization declaration"
+               enabled="true"
+               id="com.cisco.yangide.editor.templates.organization"
+               name="organization">organization "${name}";
+       </template>
+
+       <template autoinsert="true" context="com.cisco.yangide.editor.templates.general" 
+               description="prefix declaration"
+               enabled="true"
+               id="com.cisco.yangide.editor.templates.prefix"
+               name="prefix">prefix "${name}";
+       </template>
+
+       <template autoinsert="true" context="com.cisco.yangide.editor.templates.general" 
+               description="revision declaration"
+               enabled="true"
+               id="com.cisco.yangide.editor.templates.revision"
+               name="revision">revision ${revision} {
+       "${description}";
+}
+       </template>
+       <template
+               autoinsert="true"
+               context="com.cisco.yangide.editor.templates.general" 
+               description="rpc declaration"
+               enabled="true"
+               id="com.cisco.yangide.editor.templates.rpc"
+               name="rpc">rpc ${name} {
+       input {
+               leaf ${name}{
+                       type ${name};
+               }
+       }
+       output {
+               leaf ${name} {
+                       type ${name};
+                       }
+       }
+}
+       </template>
+
+       <template
+               autoinsert="true"
+               context="com.cisco.yangide.editor.templates.general" 
+               description="new submodule container"
+               enabled="true"
+               id="com.cisco.yangide.editor.templates.submodule"
+               name="submodule">submodule ${name} {
+       ${cursor}
+}
+       </template>
+
+       <template
+               autoinsert="true"
+               context="com.cisco.yangide.editor.templates.general" 
+               description="typedef declaration"
+               enabled="true"
+               id="com.cisco.yangide.editor.templates.typedef"
+               name="typedef">typedef ${name} {
+       type ${type};
+       default ${value};
+       description ${description};
+}
+       </template>
+</templates>
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.ext.model.editor/.gitignore b/plugins/com.cisco.yangide.ext.model.editor/.gitignore
new file mode 100644 (file)
index 0000000..b77461b
--- /dev/null
@@ -0,0 +1,3 @@
+/target/
+/.settings/
+.classpath
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.ext.model.editor/.project b/plugins/com.cisco.yangide.ext.model.editor/.project
new file mode 100644 (file)
index 0000000..c3f6acc
--- /dev/null
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>com.cisco.yangide.ext.model.editor</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.m2e.core.maven2Builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.m2e.core.maven2Nature</nature>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/plugins/com.cisco.yangide.ext.model.editor/META-INF/MANIFEST.MF b/plugins/com.cisco.yangide.ext.model.editor/META-INF/MANIFEST.MF
new file mode 100644 (file)
index 0000000..8486bcd
--- /dev/null
@@ -0,0 +1,36 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Editor
+Bundle-SymbolicName: com.cisco.yangide.ext.model.editor;singleton:=true
+Bundle-Version: 1.1.1.qualifier
+Bundle-Activator: com.cisco.yangide.ext.model.editor.Activator
+Bundle-Vendor: CISCO
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.graphiti,
+ org.eclipse.graphiti.ui,
+ org.eclipse.graphiti.pattern,
+ org.eclipse.gef,
+ org.eclipse.ui.views,
+ org.eclipse.emf.edit,
+ org.eclipse.emf.transaction,
+ org.eclipse.ui.views.properties.tabbed,
+ com.cisco.yangide.ext.model;bundle-version="0.1.0",
+ org.eclipse.emf.ecore,
+ org.eclipse.core.resources,
+ com.cisco.yangide.core;bundle-version="1.1.0",
+ org.eclipse.ui.ide,
+ com.cisco.yangide.editor,
+ org.eclipse.jface.text,
+ org.eclipse.ui.editors,
+ org.eclipse.emf.compare,
+ org.eclipse.ltk.core.refactoring,
+ com.cisco.yangide.ui,
+ com.cisco.yangide.ext.refactoring,
+ org.eclipse.ltk.ui.refactoring,
+ org.eclipse.jface.databinding,
+ org.eclipse.core.databinding,
+ org.eclipse.core.databinding.property,
+ org.eclipse.emf.databinding
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-ActivationPolicy: lazy
diff --git a/plugins/com.cisco.yangide.ext.model.editor/build.properties b/plugins/com.cisco.yangide.ext.model.editor/build.properties
new file mode 100644 (file)
index 0000000..1995660
--- /dev/null
@@ -0,0 +1,17 @@
+###############################################################################
+# Copyright (c) 2014, 2015 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
+#  
+###############################################################################
+source.. = src/
+output.. = bin/
+bin.includes = icons/,\
+               plugin.xml,\
+               META-INF/,\
+               .,\
+               templates/,\
+               .options
+src.includes = icons/
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/etool16/add_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/etool16/add_obj.gif
new file mode 100644 (file)
index 0000000..252d7eb
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/etool16/add_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/etool16/collapseall_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/etool16/collapseall_obj.gif
new file mode 100644 (file)
index 0000000..a2d80a9
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/etool16/collapseall_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/etool16/delete_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/etool16/delete_obj.gif
new file mode 100644 (file)
index 0000000..b6922ac
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/etool16/delete_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/etool16/editor_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/etool16/editor_obj.gif
new file mode 100644 (file)
index 0000000..4b6b768
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/etool16/editor_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/anyxml_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/anyxml_obj.gif
new file mode 100644 (file)
index 0000000..8f73ccb
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/anyxml_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/augment_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/augment_obj.gif
new file mode 100644 (file)
index 0000000..a751669
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/augment_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/choice_case_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/choice_case_obj.gif
new file mode 100644 (file)
index 0000000..ec4ff45
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/choice_case_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/choice_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/choice_obj.gif
new file mode 100644 (file)
index 0000000..27c7cbb
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/choice_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/container_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/container_obj.gif
new file mode 100644 (file)
index 0000000..2556b45
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/container_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/custom_type_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/custom_type_obj.gif
new file mode 100644 (file)
index 0000000..5ba5b91
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/custom_type_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/deviation_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/deviation_obj.gif
new file mode 100644 (file)
index 0000000..8535665
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/deviation_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/error_alt_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/error_alt_obj.gif
new file mode 100644 (file)
index 0000000..eb6b8da
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/error_alt_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/error_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/error_obj.gif
new file mode 100644 (file)
index 0000000..0bc6068
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/error_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/extension_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/extension_obj.gif
new file mode 100644 (file)
index 0000000..27d5648
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/extension_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/feature_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/feature_obj.gif
new file mode 100644 (file)
index 0000000..450515f
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/feature_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/grouping_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/grouping_obj.gif
new file mode 100644 (file)
index 0000000..27bf10e
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/grouping_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/identity_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/identity_obj.gif
new file mode 100644 (file)
index 0000000..fdde5fb
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/identity_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/import_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/import_obj.gif
new file mode 100644 (file)
index 0000000..b0e9130
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/import_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/include_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/include_obj.gif
new file mode 100644 (file)
index 0000000..de0e6f9
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/include_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/key_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/key_obj.gif
new file mode 100644 (file)
index 0000000..0f2c308
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/key_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/keyword_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/keyword_obj.gif
new file mode 100644 (file)
index 0000000..bb84c7b
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/keyword_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/leaf_list_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/leaf_list_obj.gif
new file mode 100644 (file)
index 0000000..dda8bae
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/leaf_list_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/leaf_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/leaf_obj.gif
new file mode 100644 (file)
index 0000000..c88284a
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/leaf_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/list_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/list_obj.gif
new file mode 100644 (file)
index 0000000..0dc862c
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/list_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/module_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/module_obj.gif
new file mode 100644 (file)
index 0000000..bf043f9
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/module_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/notification_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/notification_obj.gif
new file mode 100644 (file)
index 0000000..d11c996
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/notification_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/rpc_input_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/rpc_input_obj.gif
new file mode 100644 (file)
index 0000000..d38085a
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/rpc_input_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/rpc_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/rpc_obj.gif
new file mode 100644 (file)
index 0000000..30c5c10
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/rpc_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/rpc_output_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/rpc_output_obj.gif
new file mode 100644 (file)
index 0000000..5a0837d
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/rpc_output_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/submodule_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/submodule_obj.gif
new file mode 100644 (file)
index 0000000..f4a1ea1
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/submodule_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/template_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/template_obj.gif
new file mode 100644 (file)
index 0000000..fdde5fb
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/template_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/type_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/type_obj.gif
new file mode 100644 (file)
index 0000000..d4848c0
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/type_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/uses_obj.gif b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/uses_obj.gif
new file mode 100644 (file)
index 0000000..695e5a5
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/full/obj16/uses_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/icons/yang_file.png b/plugins/com.cisco.yangide.ext.model.editor/icons/yang_file.png
new file mode 100644 (file)
index 0000000..9a69984
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.model.editor/icons/yang_file.png differ
diff --git a/plugins/com.cisco.yangide.ext.model.editor/plugin.xml b/plugins/com.cisco.yangide.ext.model.editor/plugin.xml
new file mode 100644 (file)
index 0000000..2e3e94f
--- /dev/null
@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<!--
+    Copyright (c) 2014, 2015 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
+     
+ -->
+
+<plugin>
+
+   <extension
+         point="org.eclipse.graphiti.ui.diagramTypes">
+      <diagramType
+            name="Editor Diagram Type"
+            type="yang"
+            id="com.cisco.yangide.ext.model.editor.EditorDiagramType">
+      </diagramType>
+   </extension>
+   <extension
+         point="org.eclipse.graphiti.ui.diagramTypeProviders">
+      <diagramTypeProvider
+            name="Editor Diagram Type Provider"
+            class="com.cisco.yangide.ext.model.editor.diagram.EditorDiagramTypeProvider"
+            id="com.cisco.yangide.ext.model.editor.editorDiagramTypeProvider">
+         <diagramType
+               id="com.cisco.yangide.ext.model.editor.EditorDiagramType">
+         </diagramType>
+         <imageProvider
+            id="com.cisco.yangide.ext.model.editor.ImageProvider">
+        </imageProvider>
+      </diagramTypeProvider>
+   </extension>
+   <extension
+         point="org.eclipse.ui.editors">
+      <editor
+            class="com.cisco.yangide.ext.model.editor.YangMultiPageEditorPart"
+            default="true"
+            contributorClass="com.cisco.yangide.ext.model.editor.YangMutiPageEditorActionContributor"
+            icon="icons/yang_file.png"
+            extensions="yang"
+            id="com.cisco.yangide.ext.model.editor.YangMultiPageEditor"
+            name="YANG Model Editor">
+            <contentTypeBinding contentTypeId="com.cisco.yangide.core.yangFile"/>
+      </editor>
+   </extension>
+   <extension
+         point="org.eclipse.graphiti.ui.imageProviders">
+      <imageProvider
+            class="com.cisco.yangide.ext.model.editor.util.YangDiagramImageProvider"
+            id="com.cisco.yangide.ext.model.editor.ImageProvider">
+      </imageProvider>
+   </extension>
+   <extension
+         point="org.eclipse.ui.views.properties.tabbed.propertyContributor">
+      <propertyContributor
+            contributorId="yang.PropertyContributor">
+         <propertyCategory
+               category="Graphiti"></propertyCategory>
+      </propertyContributor>
+   </extension>
+   <extension
+         point="org.eclipse.ui.views.properties.tabbed.propertyTabs">
+      <propertyTabs
+            contributorId="yang.PropertyContributor">
+         <propertyTab
+               category="Graphiti"
+               id="com.cisco.yangide.ext.model.editor.TypeTab"
+               label="Type">
+         </propertyTab>
+         <propertyTab
+               category="Graphiti"
+               id="com.cisco.yangide.ext.model.editor.AttributesTab"
+               label="Attributes">
+         </propertyTab>
+         <propertyTab
+               category="Graphiti"
+               id="com.cisco.yangide.ext.model.editor.GeneralTab"
+               label="General">
+         </propertyTab>
+      </propertyTabs>
+   </extension>
+   <extension
+         point="org.eclipse.ui.views.properties.tabbed.propertySections">
+      <propertySections
+            contributorId="yang.PropertyContributor">
+         <propertySection
+               class="com.cisco.yangide.ext.model.editor.property.GeneralTabReferenceSection"
+               filter="com.cisco.yangide.ext.model.editor.property.GeneralTabReferenceFilter"
+               id="com.cisco.yangide.ext.model.editor.GeneralTabReference"
+               tab="com.cisco.yangide.ext.model.editor.GeneralTab">
+         </propertySection>
+         <propertySection
+               class="com.cisco.yangide.ext.model.editor.property.GeneralTabNameSection"
+               filter="com.cisco.yangide.ext.model.editor.property.GeneralTabNameFilter"
+               id="com.cisco.yangide.ext.model.editor.GeneralTabName"
+               tab="com.cisco.yangide.ext.model.editor.GeneralTab">
+         </propertySection>
+         <propertySection
+               class="com.cisco.yangide.ext.model.editor.property.GeneralTabTypeSection"
+               filter="com.cisco.yangide.ext.model.editor.property.GeneralTabTypeFilter"
+               id="com.cisco.yangide.ext.model.editor.GeneralTabType"
+               tab="com.cisco.yangide.ext.model.editor.GeneralTab">
+         </propertySection>
+         <propertySection
+               class="org.eclipse.ui.views.properties.tabbed.AdvancedPropertySection"
+               filter="com.cisco.yangide.ext.model.editor.property.AttributesTabContentFilter"
+               id="com.cisco.yangide.ext.model.editor.AttributesTabSection"
+               tab="com.cisco.yangide.ext.model.editor.AttributesTab">
+         </propertySection>
+         <propertySection
+               class="com.cisco.yangide.ext.model.editor.property.TypeTabSection"
+               filter="com.cisco.yangide.ext.model.editor.property.TypeTabFilter"
+               id="com.cisco.yangide.ext.model.editor.TypeTabSection"
+               afterSection="com.cisco.yangide.ext.model.editor.GeneralTabName"
+               tab="com.cisco.yangide.ext.model.editor.GeneralTab">
+         </propertySection>
+         <propertySection
+               class="com.cisco.yangide.ext.model.editor.property.GeneralTabDescriptionSection"
+               filter="com.cisco.yangide.ext.model.editor.property.GeneralTabDescriptionFilter"
+               id="com.cisco.yangide.ext.model.editor.GeneralTabDescriptionSection"
+               afterSection="com.cisco.yangide.ext.model.editor.TypeTabSection"
+               tab="com.cisco.yangide.ext.model.editor.GeneralTab">
+         </propertySection>
+      </propertySections>
+   </extension>
+   
+   <extension point="org.eclipse.ui.preferencePages">
+      <page
+            category="com.cisco.yangide.ui.preferences.YANGBasePreferencePage"
+            class="com.cisco.yangide.ext.model.editor.preferences.ModelEditorPreferencePage"
+            id="com.cisco.yangide.ext.model.editor.preferences.ModelEditorPreferencePage"
+            name="Model Editor">
+      </page>
+   </extension>
+   
+   <extension
+         point="org.eclipse.core.runtime.adapters">
+      <factory
+            adaptableType="org.eclipse.graphiti.ui.platform.GraphitiShapeEditPart"
+            class="com.cisco.yangide.ext.model.editor.property.GraphitiEditPartToIPropertySourceAdapterFactory">
+         <adapter
+               type="org.eclipse.ui.views.properties.IPropertySource">
+         </adapter>
+      </factory>
+   </extension>
+
+    <extension point="org.eclipse.ui.bindings">
+        <key
+            sequence="DEL"
+            commandId="org.eclipse.ui.edit.delete"
+            contextId="org.eclipse.graphiti.ui.diagramEditor"
+            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/> 
+    </extension>
+    
+     <extension point="org.eclipse.ui.actionSetPartAssociations">
+       <actionSetPartAssociation targetID="com.cisco.yangide.editor.CodingActionSet">
+          <part id="com.cisco.yangide.ext.model.editor.YangMultiPageEditor"/>
+       </actionSetPartAssociation>
+    </extension>
+</plugin>
diff --git a/plugins/com.cisco.yangide.ext.model.editor/pom.xml b/plugins/com.cisco.yangide.ext.model.editor/pom.xml
new file mode 100644 (file)
index 0000000..88c7241
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2014, 2015 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
+     
+ -->
+<!-- ============================================================================== -->
+<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">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>com.cisco.yangide</groupId>
+    <artifactId>com.cisco.yangide.parent</artifactId>
+    <version>1.1.1-SNAPSHOT</version>
+    <relativePath>../..</relativePath>
+  </parent>
+
+  <artifactId>com.cisco.yangide.ext.model.editor</artifactId>
+  <packaging>eclipse-plugin</packaging>
+  <build>
+    <sourceDirectory>src</sourceDirectory>
+  </build>
+</project>
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/Activator.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/Activator.java
new file mode 100644 (file)
index 0000000..f145437
--- /dev/null
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+import com.cisco.yangide.core.YangModelException;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+    // The plug-in ID
+    public static final String PLUGIN_ID = "com.cisco.yangide.ext.model.editor"; //$NON-NLS-1$
+
+    // The shared instance
+    private static Activator plugin;
+
+    /**
+     * The constructor
+     */
+    public Activator() {
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+     */
+    @Override
+    public void start(BundleContext context) throws Exception {
+        super.start(context);
+        plugin = this;
+    }
+
+    /*
+     * (non-Javadoc)
+     *
+     * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+     */
+    @Override
+    public void stop(BundleContext context) throws Exception {
+        plugin = null;
+        super.stop(context);
+    }
+
+    /**
+     * Returns the shared instance
+     *
+     * @return the shared instance
+     */
+    public static Activator getDefault() {
+        return plugin;
+    }
+
+    /**
+     * Returns an image descriptor for the image file at the given plug-in relative path
+     *
+     * @param path the path
+     * @return the image descriptor
+     */
+    public static ImageDescriptor getImageDescriptor(String path) {
+        return imageDescriptorFromPlugin(PLUGIN_ID, path);
+    }
+
+    /**
+     * Reports log to Error Log view.
+     *
+     * @param statusErrorID plugin related error ID
+     * @param message error message
+     */
+    public static void log(Throwable e, String message) {
+        Throwable nestedException;
+        if (e instanceof YangModelException && (nestedException = ((YangModelException) e).getException()) != null) {
+            e = nestedException;
+        }
+        log(new Status(IStatus.ERROR, PLUGIN_ID, IStatus.ERROR, message, e));
+    }
+
+    /**
+     * Reports log to Error Log view.
+     *
+     * @param message error message
+     */
+    public static void logError(String message) {
+        log(new Status(Status.ERROR, PLUGIN_ID, message));
+    }
+
+    /**
+     * Reports log to Error Log view.
+     *
+     * @param status status
+     */
+    public static void log(IStatus status) {
+        getDefault().getLog().log(status);
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/YangMultiPageEditorPart.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/YangMultiPageEditorPart.java
new file mode 100644 (file)
index 0000000..0e47062
--- /dev/null
@@ -0,0 +1,197 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.part.MultiPageEditorPart;
+import org.eclipse.ui.part.MultiPageEditorSite;
+
+import com.cisco.yangide.core.YangCorePlugin;
+import com.cisco.yangide.editor.YangEditorPlugin;
+import com.cisco.yangide.editor.editors.IYangEditor;
+import com.cisco.yangide.editor.editors.YangEditor;
+import com.cisco.yangide.editor.editors.YangSourceViewer;
+import com.cisco.yangide.ext.model.Module;
+import com.cisco.yangide.ext.model.editor.editors.YangDiagramEditor;
+import com.cisco.yangide.ext.model.editor.editors.YangDiagramEditorInput;
+import com.cisco.yangide.ext.model.editor.sync.ModelSynchronizer;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 7, 2014
+ */
+public class YangMultiPageEditorPart extends MultiPageEditorPart implements IYangEditor {
+
+    private YangEditor yangSourceEditor;
+    private YangSourceViewer yangSourceViewer;
+    private YangDiagramEditor yangDiagramEditor;
+    private ModelSynchronizer modelSynchronizer;
+
+    @Override
+    protected void createPages() {
+        yangSourceEditor = new YangEditor();
+        yangDiagramEditor = new YangDiagramEditor(yangSourceEditor);
+        modelSynchronizer = new ModelSynchronizer(yangSourceEditor, yangDiagramEditor);
+        initSourcePage();
+        initDiagramPage();
+        modelSynchronizer.init();
+        modelSynchronizer.enableNotification();
+    }
+
+    @Override
+    public void doSave(IProgressMonitor monitor) {
+        yangSourceEditor.doSave(monitor);
+    }
+
+    @Override
+    public void doSaveAs() {
+        yangSourceEditor.doSaveAs();
+    }
+
+    @Override
+    public boolean isSaveAsAllowed() {
+        return yangSourceEditor.isSaveAsAllowed();
+    }
+
+    @Override
+    public boolean isDirty() {
+        return yangSourceEditor.isDirty();
+    }
+
+    @Override
+    protected IEditorSite createSite(IEditorPart editor) {
+        return new MultiPageEditorSite(this, editor) {
+            @Override
+            protected void handlePostSelectionChanged(SelectionChangedEvent event) {
+                if ((event.getSelection() instanceof StructuredSelection && getActivePage() == 1)
+                        || (getActivePage() == 0 && !(event.getSelection() instanceof StructuredSelection))) {
+                    super.handlePostSelectionChanged(event);
+                }
+            }
+        };
+    }
+
+    private void initDiagramPage() {
+        try {
+            Module diagModule = modelSynchronizer.getDiagramModule();
+            YangDiagramEditorInput input = new YangDiagramEditorInput(URI.createURI("tmp:/local"), getFile(),
+                    "com.cisco.yangide.ext.model.editor.editorDiagramTypeProvider", diagModule);
+            addPage(1, yangDiagramEditor, input);
+            setPageText(1, "Diagram");
+
+            yangDiagramEditor.setSourceModelManager(modelSynchronizer.getSourceModelManager());
+        } catch (PartInitException e) {
+            YangEditorPlugin.log(e);
+        }
+    }
+
+    private IFile getFile() {
+        if (null != yangSourceEditor && null != yangSourceEditor.getEditorInput()) {
+            if (yangSourceEditor.getEditorInput() instanceof IFileEditorInput) {
+                IFileEditorInput fileEI = (IFileEditorInput) yangSourceEditor.getEditorInput();
+                return fileEI.getFile();
+            }
+        }
+        return null;
+    }
+
+    private void initSourcePage() {
+        try {
+            addPage(0, yangSourceEditor, getEditorInput());
+            setPageText(0, "Source");
+            yangSourceViewer = (YangSourceViewer) yangSourceEditor.getViewer();
+        } catch (PartInitException e) {
+            YangEditorPlugin.log(e);
+        }
+        setPartName(yangSourceEditor.getPartName());
+    }
+
+    @Override
+    protected void pageChange(int newPageIndex) {
+        if (newPageIndex == 1) {
+            modelSynchronizer.syncWithSource();
+            if (modelSynchronizer.isSourceInvalid()) {
+                MessageDialog.openWarning(getSite().getShell(), "Yang source is invalid",
+                        "Yang source has syntax error and diagram view cannot be synchronized correctly.\n"
+                                + "Please correct syntax error first.");
+            }
+            yangSourceViewer.disableProjection();
+            if (yangSourceViewer.getReconciler() != null) {
+                yangSourceViewer.getReconciler().uninstall();
+            }
+            yangSourceViewer.disableTextListeners();
+            try {
+                getEditorSite().getPage().showView("org.eclipse.ui.views.PropertySheet");
+            } catch (PartInitException e) {
+                YangEditorPlugin.log(e);
+            }
+            yangDiagramEditor.startSourceSelectionUpdater();
+        } else {
+            yangDiagramEditor.stopSourceSelectionUpdater();
+            IRegion highlightRange = yangSourceEditor.getHighlightRange();
+            yangSourceViewer.enableTextListeners();
+            yangSourceViewer.updateDocument();
+
+            yangSourceViewer.enableProjection();
+            if (yangSourceViewer.getReconciler() != null) {
+                yangSourceViewer.getReconciler().install(yangSourceEditor.getViewer());
+            }
+            setSourceSelection(highlightRange);
+        }
+        super.pageChange(newPageIndex);
+    }
+
+    private void setSourceSelection(IRegion highlightRange) {
+        if (highlightRange != null) {
+            Point selectedRange = yangSourceViewer.getSelectedRange();
+            if (selectedRange.x != highlightRange.getOffset() && selectedRange.y != highlightRange.getLength()) {
+                yangSourceEditor.selectAndReveal(highlightRange.getOffset(), highlightRange.getLength());
+            }
+        }
+    }
+
+    /**
+     * @return the yangSourceEditor
+     */
+    public YangEditor getYangSourceEditor() {
+        return yangSourceEditor;
+    }
+
+    /**
+     * @return the yangDiagramEditor
+     */
+    public YangDiagramEditor getYangDiagramEditor() {
+        return yangDiagramEditor;
+    }
+
+    @Override
+    public void dispose() {
+        try {
+            modelSynchronizer.dispose();
+        } catch (Exception e) {
+            YangCorePlugin.log(e);
+        }
+        super.dispose();
+    }
+
+    @Override
+    public void selectAndReveal(int offset, int length) {
+        yangSourceEditor.selectAndReveal(offset, length);
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/YangMutiPageEditorActionContributor.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/YangMutiPageEditorActionContributor.java
new file mode 100644 (file)
index 0000000..c82f516
--- /dev/null
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor;
+
+import org.eclipse.ui.IEditorPart;
+
+import com.cisco.yangide.editor.editors.YangEditorActionContributor;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 27, 2014
+ */
+public class YangMutiPageEditorActionContributor extends YangEditorActionContributor {
+    @Override
+    public void setActiveEditor(IEditorPart part) {
+        if (part instanceof YangMultiPageEditorPart) {
+            super.setActiveEditor((IEditorPart) ((YangMultiPageEditorPart) part).getSelectedPage());
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/diagram/EditorDiagramTypeProvider.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/diagram/EditorDiagramTypeProvider.java
new file mode 100644 (file)
index 0000000..16a2cb9
--- /dev/null
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.diagram;
+
+import org.eclipse.graphiti.dt.AbstractDiagramTypeProvider;
+import org.eclipse.graphiti.platform.ga.IGraphicsAlgorithmRendererFactory;
+import org.eclipse.graphiti.tb.IToolBehaviorProvider;
+
+public class EditorDiagramTypeProvider extends AbstractDiagramTypeProvider {
+
+    private IToolBehaviorProvider[] toolBehaviorProviders;
+
+    public EditorDiagramTypeProvider() {
+        super();
+        setFeatureProvider(new EditorFeatureProvider(this));
+    }
+
+    @Override
+    public IGraphicsAlgorithmRendererFactory getGraphicsAlgorithmRendererFactory() {
+        return new YangDiagramGraphicsAlgorithmRendererFactory(this);
+    }
+
+    @Override
+    public IToolBehaviorProvider[] getAvailableToolBehaviorProviders() {
+        if (null == toolBehaviorProviders) {
+            toolBehaviorProviders = new IToolBehaviorProvider[] { new YangDiagramToolBehaviorProvider(this) };
+        }
+        return toolBehaviorProviders;
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/diagram/EditorFeatureProvider.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/diagram/EditorFeatureProvider.java
new file mode 100644 (file)
index 0000000..5f00505
--- /dev/null
@@ -0,0 +1,248 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.diagram;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.graphiti.dt.IDiagramTypeProvider;
+import org.eclipse.graphiti.features.IAddFeature;
+import org.eclipse.graphiti.features.ICreateFeature;
+import org.eclipse.graphiti.features.IDirectEditingFeature;
+import org.eclipse.graphiti.features.ILayoutFeature;
+import org.eclipse.graphiti.features.IRemoveFeature;
+import org.eclipse.graphiti.features.IUpdateFeature;
+import org.eclipse.graphiti.features.context.IAddConnectionContext;
+import org.eclipse.graphiti.features.context.IAddContext;
+import org.eclipse.graphiti.features.context.ICreateContext;
+import org.eclipse.graphiti.features.context.ICustomContext;
+import org.eclipse.graphiti.features.context.IDirectEditingContext;
+import org.eclipse.graphiti.features.context.ILayoutContext;
+import org.eclipse.graphiti.features.context.IRemoveContext;
+import org.eclipse.graphiti.features.context.IUpdateContext;
+import org.eclipse.graphiti.features.custom.ICustomFeature;
+import org.eclipse.graphiti.mm.algorithms.Text;
+import org.eclipse.graphiti.mm.pictograms.Connection;
+import org.eclipse.graphiti.mm.pictograms.Diagram;
+import org.eclipse.graphiti.mm.pictograms.Shape;
+import org.eclipse.graphiti.pattern.CreateFeatureForPattern;
+import org.eclipse.graphiti.pattern.DefaultFeatureProviderWithPatterns;
+import org.eclipse.graphiti.pattern.IPattern;
+import org.eclipse.swt.graphics.Point;
+
+import com.cisco.yangide.core.YangCorePlugin;
+import com.cisco.yangide.ext.model.ContainingNode;
+import com.cisco.yangide.ext.model.editor.Activator;
+import com.cisco.yangide.ext.model.editor.editors.ISourceModelManager;
+import com.cisco.yangide.ext.model.editor.editors.YangDiagramBehavior;
+import com.cisco.yangide.ext.model.editor.features.AddReferenceConnectionFeature;
+import com.cisco.yangide.ext.model.editor.features.DiagramLayoutFeature;
+import com.cisco.yangide.ext.model.editor.features.ExtractGroupingCustomFeature;
+import com.cisco.yangide.ext.model.editor.features.RemoveConnectionFeature;
+import com.cisco.yangide.ext.model.editor.features.TextDirectEditingFeature;
+import com.cisco.yangide.ext.model.editor.features.UpdateTextFeature;
+import com.cisco.yangide.ext.model.editor.patterns.objects.AnyxmlPattern;
+import com.cisco.yangide.ext.model.editor.patterns.objects.AugmentPattern;
+import com.cisco.yangide.ext.model.editor.patterns.objects.ChoiceCasePattern;
+import com.cisco.yangide.ext.model.editor.patterns.objects.ChoicePattern;
+import com.cisco.yangide.ext.model.editor.patterns.objects.ContainerPattern;
+import com.cisco.yangide.ext.model.editor.patterns.objects.DeviationPattern;
+import com.cisco.yangide.ext.model.editor.patterns.objects.ExtensionPattern;
+import com.cisco.yangide.ext.model.editor.patterns.objects.FeaturePattern;
+import com.cisco.yangide.ext.model.editor.patterns.objects.GroupingPattern;
+import com.cisco.yangide.ext.model.editor.patterns.objects.IdentityPattern;
+import com.cisco.yangide.ext.model.editor.patterns.objects.LeafListPattern;
+import com.cisco.yangide.ext.model.editor.patterns.objects.LeafPattern;
+import com.cisco.yangide.ext.model.editor.patterns.objects.ListKeyPattern;
+import com.cisco.yangide.ext.model.editor.patterns.objects.ListPattern;
+import com.cisco.yangide.ext.model.editor.patterns.objects.NotificationPattern;
+import com.cisco.yangide.ext.model.editor.patterns.objects.RpcIOPattern;
+import com.cisco.yangide.ext.model.editor.patterns.objects.RpcPattern;
+import com.cisco.yangide.ext.model.editor.patterns.objects.TypedefPattern;
+import com.cisco.yangide.ext.model.editor.patterns.objects.UsesPattern;
+import com.cisco.yangide.ext.model.editor.util.YangModelUIUtil;
+
+public class EditorFeatureProvider extends DefaultFeatureProviderWithPatterns {
+    private static Map<String, String> TEMPLATES = new HashMap<>();
+
+    private ISourceModelManager sourceModelManager;
+
+    private int diagramWidth;
+
+    private int diagramHeight;
+
+    public EditorFeatureProvider(IDiagramTypeProvider dtp) {
+        super(dtp);
+        // objects
+        addPattern(new GroupingPattern());
+        addPattern(new LeafPattern());
+        addPattern(new ContainerPattern());
+        addPattern(new AnyxmlPattern());
+        addPattern(new RpcPattern());
+        addPattern(new RpcIOPattern(true));
+        addPattern(new RpcIOPattern(false));
+        addPattern(new UsesPattern());
+        addPattern(new NotificationPattern());
+        addPattern(new AugmentPattern());
+        addPattern(new DeviationPattern());
+        addPattern(new ExtensionPattern());
+        addPattern(new FeaturePattern());
+        addPattern(new IdentityPattern());
+        addPattern(new LeafListPattern());
+        addPattern(new ListPattern());
+        addPattern(new ChoicePattern());
+        addPattern(new ChoiceCasePattern());
+        addPattern(new TypedefPattern());
+        addPattern(new ListKeyPattern());
+    }
+
+    @Override
+    public IAddFeature getAddFeature(IAddContext context) {
+        if (context instanceof IAddConnectionContext) {
+            return new AddReferenceConnectionFeature(this);
+        }
+        return super.getAddFeature(context);
+    }
+
+    @Override
+    public IDirectEditingFeature getDirectEditingFeature(IDirectEditingContext context) {
+        if (context.getPictogramElement() instanceof Shape
+                && ((Shape) context.getPictogramElement()).getGraphicsAlgorithm() instanceof Text) {
+            return new TextDirectEditingFeature(this);
+        }
+        return super.getDirectEditingFeature(context);
+    }
+
+    @Override
+    public IUpdateFeature getUpdateFeature(IUpdateContext context) {
+        if (context.getPictogramElement() instanceof Shape
+                && ((Shape) context.getPictogramElement()).getGraphicsAlgorithm() instanceof Text) {
+            return new UpdateTextFeature(this);
+        }
+        return super.getUpdateFeature(context);
+    }
+
+    @Override
+    public ILayoutFeature getLayoutFeature(ILayoutContext context) {
+        if (context.getPictogramElement() instanceof Diagram) {
+            return new DiagramLayoutFeature(this);
+        }
+        return super.getLayoutFeature(context);
+    }
+
+    @Override
+    public ICustomFeature[] getCustomFeatures(ICustomContext context) {
+        return new ICustomFeature[] { new ExtractGroupingCustomFeature(this, sourceModelManager) };
+    }
+
+    @Override
+    public ICreateFeature[] getCreateFeatures() {
+        ICreateFeature[] ret = new ICreateFeature[0];
+        List<ICreateFeature> retList = new ArrayList<ICreateFeature>();
+
+        for (final IPattern pattern : getPatterns()) {
+            if (pattern.isPaletteApplicable()) {
+                retList.add(new CreateFeatureForPattern(this, pattern) {
+
+                    @Override
+                    public boolean canCreate(ICreateContext context) {
+                        return pattern.canCreate(context);
+                    }
+
+                    @Override
+                    public Object[] create(ICreateContext context) {
+                        YangDiagramBehavior behavior = (YangDiagramBehavior) EditorFeatureProvider.this
+                                .getDiagramTypeProvider().getDiagramBehavior();
+                        behavior.setCreatePosition(new Point(context.getX(), context.getY()));
+                        String name = this.getPattern().getCreateName();
+                        if (!TEMPLATES.containsKey(name)) {
+                            TEMPLATES.put(name, getTemplateContent(name));
+                        }
+                        EObject parent = (EObject) getBusinessObjectForPictogramElement(context.getTargetContainer());
+                        int position = YangModelUIUtil.getPositionInParent(context.getTargetContainer(), context.getY(),
+                                EditorFeatureProvider.this);
+                        if (parent instanceof ContainingNode) {
+                            ContainingNode node = (ContainingNode) parent;
+                            String template = TEMPLATES.get(name);
+                            template = template.replaceAll("@name@",
+                                    name.replaceAll("\\W", "-") + node.getChildren().size());
+                            sourceModelManager.createSourceElement(node, position, template);
+                        }
+
+                        return new Object[0];
+                    }
+                });
+            }
+        }
+
+        ICreateFeature[] a = getCreateFeaturesAdditional();
+        for (ICreateFeature element : a) {
+            retList.add(element);
+        }
+
+        return retList.toArray(ret);
+    }
+
+    @Override
+    public IRemoveFeature getRemoveFeature(IRemoveContext context) {
+        if (context.getPictogramElement() instanceof Connection) {
+            return new RemoveConnectionFeature(this);
+        }
+        return super.getRemoveFeature(context);
+    }
+
+    /**
+     * @param sourceModelManager the sourceModelManager to set
+     */
+    public void setSourceModelManager(ISourceModelManager sourceModelManager) {
+        this.sourceModelManager = sourceModelManager;
+    }
+
+    /**
+     * @return InputStream of template with replaced placeholders.
+     * @throws IOException read errors
+     */
+    private String getTemplateContent(String name) {
+        StringBuilder sb = new StringBuilder();
+
+        char[] buff = new char[1024];
+        int len = 0;
+        Path templatePath = new Path("templates/nodes/" + name + ".txt");
+        try (InputStreamReader in = new InputStreamReader(
+                FileLocator.openStream(Activator.getDefault().getBundle(), templatePath, false), "UTF-8")) {
+            while ((len = in.read(buff)) > 0) {
+                sb.append(buff, 0, len);
+            }
+        } catch (IOException e) {
+            YangCorePlugin.log(e);
+        }
+
+        return sb.toString();
+    }
+
+    public void updateDiagramSize(int x, int y) {
+        this.diagramWidth = x;
+        this.diagramHeight = y;
+    }
+
+    public int getDiagramHeight() {
+        return diagramHeight;
+    }
+
+    public int getDiagramWidth() {
+        return diagramWidth;
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/diagram/YangDiagramGraphicsAlgorithmRendererFactory.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/diagram/YangDiagramGraphicsAlgorithmRendererFactory.java
new file mode 100644 (file)
index 0000000..3bc37fb
--- /dev/null
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.diagram;
+
+import org.eclipse.graphiti.platform.ga.IGraphicsAlgorithmRenderer;
+import org.eclipse.graphiti.platform.ga.IGraphicsAlgorithmRendererFactory;
+import org.eclipse.graphiti.platform.ga.IRendererContext;
+
+import com.cisco.yangide.ext.model.editor.figures.FeedbackFigure;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 22, 2014
+ */
+public class YangDiagramGraphicsAlgorithmRendererFactory implements IGraphicsAlgorithmRendererFactory {
+
+    public YangDiagramGraphicsAlgorithmRendererFactory(EditorDiagramTypeProvider editorDiagramTypeProvider) {
+    }
+
+    @Override
+    public IGraphicsAlgorithmRenderer createGraphicsAlgorithmRenderer(IRendererContext rendererContext) {
+        return new FeedbackFigure(rendererContext.getGraphicsAlgorithm());
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/diagram/YangDiagramToolBehaviorProvider.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/diagram/YangDiagramToolBehaviorProvider.java
new file mode 100644 (file)
index 0000000..35bf0ab
--- /dev/null
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.diagram;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.graphiti.dt.IDiagramTypeProvider;
+import org.eclipse.graphiti.features.ICreateFeature;
+import org.eclipse.graphiti.features.context.IDoubleClickContext;
+import org.eclipse.graphiti.features.context.IPictogramElementContext;
+import org.eclipse.graphiti.features.custom.ICustomFeature;
+import org.eclipse.graphiti.palette.IPaletteCompartmentEntry;
+import org.eclipse.graphiti.palette.impl.ObjectCreationToolEntry;
+import org.eclipse.graphiti.palette.impl.PaletteCompartmentEntry;
+import org.eclipse.graphiti.pattern.CreateFeatureForPattern;
+import org.eclipse.graphiti.tb.DefaultToolBehaviorProvider;
+import org.eclipse.graphiti.tb.IContextButtonPadData;
+
+import com.cisco.yangide.ext.model.editor.features.DirectEditingOnDoubleClickFeature;
+import com.cisco.yangide.ext.model.editor.patterns.objects.DomainObjectPattern;
+import com.cisco.yangide.ext.model.editor.util.PropertyUtil;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+public class YangDiagramToolBehaviorProvider extends DefaultToolBehaviorProvider {
+
+    private List<EClass> excludeFromPalette = Arrays.asList(YangModelUtil.MODEL_PACKAGE.getListKey());
+
+    private IPaletteCompartmentEntry[] result;
+
+    public YangDiagramToolBehaviorProvider(IDiagramTypeProvider diagramTypeProvider) {
+        super(diagramTypeProvider);
+    }
+
+    @Override
+    public IContextButtonPadData getContextButtonPad(IPictogramElementContext context) {
+        // remove button pads over diagram elements
+        return null;
+    }
+
+    @Override
+    public IPaletteCompartmentEntry[] getPalette() {
+        if (null == result) {
+            List<IPaletteCompartmentEntry> resultList = new ArrayList<IPaletteCompartmentEntry>();
+            PaletteCompartmentEntry containers = new PaletteCompartmentEntry("Container", null);
+
+            PaletteCompartmentEntry data = new PaletteCompartmentEntry("Data node", null);
+
+            for (ICreateFeature cf : getFeatureProvider().getCreateFeatures()) {
+                if (cf instanceof CreateFeatureForPattern
+                        && ((CreateFeatureForPattern) cf).getPattern() instanceof DomainObjectPattern) {
+                    DomainObjectPattern pattern = (DomainObjectPattern) ((CreateFeatureForPattern) cf).getPattern();
+                    if (!excludeFromPalette.contains(pattern.getObjectEClass())) {
+                        ObjectCreationToolEntry objectCreationToolEntry = new ObjectCreationToolEntry(
+                                cf.getCreateName(), cf.getCreateDescription(), cf.getCreateImageId(),
+                                cf.getCreateLargeImageId(), cf);
+                        if (YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getContainingNode(),
+                                pattern.getObjectEClass())) {
+                            containers.getToolEntries().add(objectCreationToolEntry);
+                        } else {
+                            data.getToolEntries().add(objectCreationToolEntry);
+                        }
+                    }
+                }
+            }
+
+            resultList.add(containers);
+            resultList.add(data);
+            result = resultList.toArray(new IPaletteCompartmentEntry[resultList.size()]);
+        }
+
+        return result;
+    }
+
+    @Override
+    public ICustomFeature getDoubleClickFeature(IDoubleClickContext context) {
+        if (PropertyUtil.isObjectShapeProp(context.getInnerPictogramElement(), PropertyUtil.EDITABLE_SHAPE)) {
+            return new DirectEditingOnDoubleClickFeature(getFeatureProvider());
+        }
+        return super.getDoubleClickFeature(context);
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/dialog/AddImportDialog.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/dialog/AddImportDialog.java
new file mode 100644 (file)
index 0000000..bbc5b22
--- /dev/null
@@ -0,0 +1,303 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.dialog;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.graphiti.ui.services.GraphitiUi;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.dialogs.ElementListSelectionDialog;
+
+import com.cisco.yangide.core.YangCorePlugin;
+import com.cisco.yangide.core.YangModelException;
+import com.cisco.yangide.core.dom.SimpleNode;
+import com.cisco.yangide.core.indexing.ElementIndexInfo;
+import com.cisco.yangide.core.indexing.ElementIndexType;
+import com.cisco.yangide.core.model.YangModelManager;
+import com.cisco.yangide.ext.model.Import;
+import com.cisco.yangide.ext.model.ModelFactory;
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Module;
+import com.cisco.yangide.ext.model.Node;
+import com.cisco.yangide.ext.model.editor.Activator;
+import com.cisco.yangide.ext.model.editor.util.Strings;
+import com.cisco.yangide.ext.model.editor.util.YangDiagramImageProvider;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+/**
+ * This class is a dialog in which user can choose a module to import and its prefix. <br>
+ * The existing modules are shown in a list, while the prefix is given by a text box. The first
+ * module in the list is chosen by default. When user changes selection in the list, the dialog
+ * automatically sets the prefix field to the value defined in the selected module. Value of prefix
+ * is examined against the empty value and prefixes already present in the edited module. <br>
+ * The resulting {@link Import} object may be obtained from {@link #getResultImport()} if dialog was
+ * closed with OK button.
+ *
+ * @author Kirill Karmakulov
+ * date: 09 Oct 2014
+ */
+public class AddImportDialog extends ElementListSelectionDialog {
+
+    private Text prefix;
+    private ModifyListener prefixModifyListener;
+
+    // Prefixes that are already used by the edited module
+    private final Set<String> importPrefixes;
+
+    // Keeps track of parent's Status
+    private IStatus fLastStatus;
+
+    private Import result;
+
+    /**
+     * Creates a new {@link AddImportDialog}
+     *
+     * @param parent the parent shell
+     * @param module the edited {@link Module}
+     * @param file file to get an {@link IProject} from; the existing modules are taken from this
+     * project
+     */
+    public AddImportDialog(Shell parent, Module module, IFile file) {
+        super(parent, new ModuleLabelProvider());
+        setAllowDuplicates(false);
+        List<Import> imports = getImports(module);
+        importPrefixes = getImportData(imports, ModelPackage.Literals.IMPORT__PREFIX);
+        setElements(getModuleList(module, file, imports));
+        setTitle("Select imported module");
+        setImage(GraphitiUi.getImageService().getImageForId(YangDiagramImageProvider.DIAGRAM_TYPE_PROVIDER_ID,
+                YangDiagramImageProvider.IMG_IMPORT_PROPOSAL));
+    }
+
+    /**
+     * Creates an area and a text field to enter prefix of the imported module into
+     */
+    @Override
+    protected Control createDialogArea(Composite parent) {
+        Composite content = new Composite(parent, SWT.NONE);
+        GridDataFactory.fillDefaults().grab(true, true).applyTo(content);
+        GridLayoutFactory.fillDefaults().numColumns(1).applyTo(content);
+        super.createDialogArea(content);
+        createPrefixArea(content);
+        return content;
+    }
+
+    private void createPrefixArea(Composite content) {
+        Composite appendix = new Composite(content, SWT.NONE);
+        GridLayout layout = new GridLayout();
+        layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
+        layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
+        layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
+        layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
+        layout.numColumns = 2;
+        appendix.setLayout(layout);
+        appendix.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+        CLabel label = new CLabel(appendix, SWT.NONE);
+        label.setText("Prefix");
+        prefix = new Text(appendix, SWT.BORDER);
+        prefixModifyListener = new ModifyListener() {
+            @Override
+            public void modifyText(ModifyEvent e) {
+                updateStatus(getOverallStatus());
+            }
+        };
+        prefix.addModifyListener(prefixModifyListener);
+        prefix.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+    }
+
+    /**
+     * If prefix field contains an invalid value, returns an error {@link IStatus}. Otherwise
+     * returns parent's status.
+     *
+     * @return an {@link IStatus} object
+     */
+    private IStatus getOverallStatus() {
+        String value = prefix.getText();
+        IStatus status;
+        if (value.isEmpty()) {
+            status = new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+                    String.format("Empty prefix is not allowed", value));
+        } else if (importPrefixes.contains(value)) {
+            status = new Status(IStatus.ERROR, Activator.PLUGIN_ID,
+                    String.format("Prefix \"%s\" is already used", value), null);
+        } else
+            status = fLastStatus;
+        return status;
+    }
+
+    /**
+     * Saves parent's status internally for use by {@link #getOverallStatus()}.
+     */
+    @Override
+    protected void updateStatus(IStatus status) {
+        if (!Activator.PLUGIN_ID.equals(status.getPlugin()))
+            // The Status wasn't generated by this class
+            fLastStatus = status;
+        super.updateStatus(status);
+    }
+
+    /**
+     * Updates prefix field from the module selected by user. Then updates status of the window if
+     * prefix is invalid.
+     */
+    @Override
+    protected void handleSelectionChanged() {
+        setDefaultPrefix();
+        super.handleSelectionChanged();
+        IStatus status = getOverallStatus();
+        if (status.getSeverity() != IStatus.OK)
+            updateStatus(status);
+    }
+
+    /**
+     * Updates prefix field from the module selected by user. If the prefix is invalid, fails the
+     * default selection and update status of the window. Otherwise behaves just lake parent.
+     */
+    @Override
+    protected void handleDefaultSelected() {
+        setDefaultPrefix();
+        IStatus status = getOverallStatus();
+        if (status.getSeverity() == IStatus.OK)
+            super.handleDefaultSelected();
+    }
+
+    private void setDefaultPrefix() {
+        String defaultPrefix = Strings.EMPTY_STRING;
+        Object[] selectedElements = getSelectedElements();
+        if (selectedElements.length > 0) // it's a single selection list dialog
+        {
+            ElementIndexInfo info = (ElementIndexInfo) selectedElements[0];
+            try {
+                com.cisco.yangide.core.dom.Module importedModule = YangCorePlugin.createYangFile(info.getPath())
+                        .getModule();
+                SimpleNode<String> prefixNode = importedModule.getPrefix();
+                if (prefixNode != null)
+                    defaultPrefix = prefixNode.getValue();
+            } catch (YangModelException ex) {
+                Activator.log(ex, "Yang source file could not be loaded.");
+            }
+        }
+        // There's no need in checking the default prefix, since this is done by hand in
+        // handleSelectionChanged() and handleDefaultSelected()
+        prefix.removeModifyListener(prefixModifyListener);
+        prefix.setText(defaultPrefix);
+        prefix.addModifyListener(prefixModifyListener);
+    }
+
+    /**
+     * Creates the resulting {@link Import} object returned by {@link #getResultImport()}
+     */
+    @Override
+    protected void computeResult() {
+        super.computeResult();
+        ElementIndexInfo choosen = (ElementIndexInfo) getFirstResult();
+        result = ModelFactory.eINSTANCE.createImport();
+        result.setPrefix(prefix.getText());
+        result.setRevisionDate(choosen.getRevision());
+        result.setModule(choosen.getModule());
+    }
+
+    public Import getResultImport() {
+        return result;
+    }
+
+    /**
+     * Returns a list of {@link Import} objects defined by the given {@code module}
+     */
+    private static List<Import> getImports(Module module) {
+        List<Import> result = new ArrayList<Import>();
+        for (Node _import : YangModelUtil.filter(module.getChildren(), ModelPackage.Literals.IMPORT))
+            result.add((Import) _import);
+        return result;
+    }
+
+    /**
+     * Iterates over {@code imports}, and from each object gets a value of the field defined by
+     * {@code feature}. The values are put in the resulting {@link Set}.
+     *
+     * @param imports source of objects
+     * @param feature field of object
+     * @return a {@link Set}
+     */
+    @SuppressWarnings("unchecked")
+    private static <T> Set<T> getImportData(List<Import> imports, EStructuralFeature feature) {
+        Set<T> result = new HashSet<T>(imports.size());
+        for (Import _import : imports)
+            result.add((T) ((Import) _import).eGet(feature));
+        return result;
+    }
+
+    /**
+     * Builds a list of modules that the current module can import. <br>
+     * Retrieves yang modules that exist in the current project. Then filters out the {@code module}
+     * itself and the modules that are already imported. <br>
+     * Current project is determined from to the given {@code file}
+     *
+     * @param file a file from the current project
+     * @param imports a collection of imports of the module
+     * @return List of modules that
+     */
+    private static ElementIndexInfo[] getModuleList(Module module, IFile file, List<Import> imports) {
+        ElementIndexInfo[] allModules = YangModelManager.search(null, null, null, ElementIndexType.MODULE,
+                null == file ? null : file.getProject(), null);
+        List<ElementIndexInfo> result = new ArrayList<ElementIndexInfo>(allModules.length - 1);
+
+        Set<String> importSet = getImportData(imports, ModelPackage.Literals.IMPORT__MODULE);
+        String name = module.getName();
+        for (ElementIndexInfo info : allModules) {
+            String moduleName = info.getModule();
+            if (Objects.equals(name, moduleName))
+                continue;
+            if (importSet.contains(moduleName))
+                continue;
+            result.add(info);
+        }
+        return result.toArray(new ElementIndexInfo[result.size()]);
+    }
+
+    /**
+     * Label provider for {@link Module}
+     */
+    private static final class ModuleLabelProvider extends LabelProvider {
+        public String getText(Object element) {
+            if (element instanceof ElementIndexInfo) {
+                return ((ElementIndexInfo) element).getName() + " {" + ((ElementIndexInfo) element).getRevision() + "}";
+            }
+            return null;
+        }
+
+        @Override
+        public Image getImage(Object element) {
+            return GraphitiUi.getImageService().getImageForId(YangDiagramImageProvider.DIAGRAM_TYPE_PROVIDER_ID,
+                    YangDiagramImageProvider.IMG_MODULE_PROPOSAL);
+        }
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/dialog/ChooseParentModuleDialog.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/dialog/ChooseParentModuleDialog.java
new file mode 100644 (file)
index 0000000..4180197
--- /dev/null
@@ -0,0 +1,145 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.dialog;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.graphiti.ui.services.GraphitiUi;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.dialogs.ElementListSelectionDialog;
+
+import com.cisco.yangide.core.indexing.ElementIndexInfo;
+import com.cisco.yangide.core.indexing.ElementIndexType;
+import com.cisco.yangide.core.model.YangModelManager;
+import com.cisco.yangide.ext.model.BelongsTo;
+import com.cisco.yangide.ext.model.ModelFactory;
+import com.cisco.yangide.ext.model.Module;
+import com.cisco.yangide.ext.model.Submodule;
+import com.cisco.yangide.ext.model.editor.util.YangDiagramImageProvider;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+import com.cisco.yangide.ext.model.editor.util.YangTag;
+
+/**
+ * @author Victor Kachesov
+ * date: Oct 08, 2014
+ */
+public class ChooseParentModuleDialog extends ElementListSelectionDialog {
+
+    private Text prefix;
+    private Submodule subModule;
+    private ElementIndexInfo[] list;
+
+    public ChooseParentModuleDialog(Shell parent, Submodule subModule, IFile file) {
+        super(parent, new LabelProvider() {
+            public String getText(Object element) {
+                if (element instanceof ElementIndexInfo) {
+                    return ((ElementIndexInfo) element).getName();
+                }
+                return null;
+            }
+
+            @Override
+            public Image getImage(Object element) {
+                return GraphitiUi.getImageService().getImageForId(YangDiagramImageProvider.DIAGRAM_TYPE_PROVIDER_ID,
+                        YangDiagramImageProvider.IMG_MODULE_PROPOSAL);
+            }
+
+        });
+        setAllowDuplicates(false);
+        this.subModule = subModule;
+        list = YangModelManager.search(null, null, null, ElementIndexType.MODULE,
+                null == file ? null : file.getProject(), null);
+        setElements(list);
+        setTitle("Select parent module");
+        setImage(GraphitiUi.getImageService().getImageForId(YangDiagramImageProvider.DIAGRAM_TYPE_PROVIDER_ID,
+                YangDiagramImageProvider.IMG_IMPORT_PROPOSAL));
+    }
+
+    @Override
+    protected Control createDialogArea(Composite parent) {
+        Composite content = new Composite(parent, SWT.NONE);
+        GridDataFactory.fillDefaults().grab(true, true).applyTo(content);
+        GridLayoutFactory.fillDefaults().numColumns(1).applyTo(content);
+        super.createDialogArea(content);
+
+        Composite appendix = new Composite(content, SWT.NONE);
+        GridLayout layout = new GridLayout();
+        layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
+        layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
+        layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
+        layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
+        layout.numColumns = 2;
+        appendix.setLayout(layout);
+        appendix.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+        CLabel label = new CLabel(appendix, SWT.NONE);
+        label.setText("Prefix");
+        prefix = new Text(appendix, SWT.BORDER);
+        prefix.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+        init();
+
+        return content;
+    }
+
+    @Override
+    protected void okPressed() {
+        computeResult();
+        if (null == getFirstResult()) {
+            MessageDialog.openWarning(getShell(), "Warning", "No module was choosen");
+        } else if (null == prefix.getText() || prefix.getText().isEmpty()) {
+            MessageDialog.openWarning(getShell(), "Warning", "Prefix is not defined");
+        } else {
+            setResultObject();
+            super.okPressed();
+        }
+    }
+
+    private void init() {
+        BelongsTo belongsTo = subModule.getBelongsTo();
+        if (belongsTo != null) {
+            Module parentModule = belongsTo.getOwnerModule();
+            if (parentModule != null) {
+                prefix.setText((String) YangModelUtil.getValue(YangTag.PREFIX, parentModule));
+                ElementIndexInfo current = findByName(parentModule.getName());
+                setSelection(new Object[] { current });
+            }
+        }
+    }
+
+    private ElementIndexInfo findByName(String moduleName) {
+        for (ElementIndexInfo info : list) {
+            if (info.getModule().equals(moduleName)) {
+                return info;
+            }
+        }
+        return null;
+    }
+
+    private void setResultObject() {
+        ElementIndexInfo choosen = (ElementIndexInfo) getFirstResult();
+
+        BelongsTo result = ModelFactory.eINSTANCE.createBelongsTo();
+        Module parentModule = ModelFactory.eINSTANCE.createModule();
+        parentModule.setName(choosen.getName());
+        YangModelUtil.setValue(YangTag.PREFIX, parentModule, prefix.getText());
+        result.setOwnerModule(parentModule);
+        subModule.setBelongsTo(result);
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/dialog/ElementLabelProvider.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/dialog/ElementLabelProvider.java
new file mode 100644 (file)
index 0000000..ff3feed
--- /dev/null
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.dialog;
+
+import org.eclipse.graphiti.ui.services.GraphitiUi;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.swt.graphics.Image;
+
+import com.cisco.yangide.core.indexing.ElementIndexInfo;
+import com.cisco.yangide.core.indexing.ElementIndexType;
+import com.cisco.yangide.ext.model.Module;
+import com.cisco.yangide.ext.model.editor.dialog.YangElementListSelectionDialog.Transformer;
+import com.cisco.yangide.ext.model.editor.util.Strings;
+import com.cisco.yangide.ext.model.editor.util.YangDiagramImageProvider;
+
+public class ElementLabelProvider extends LabelProvider {
+
+    protected Transformer transformer;
+    protected Module module;
+
+    public ElementLabelProvider(Transformer transformer) {
+        this.transformer = transformer;
+    }
+
+    public ElementLabelProvider(Module module) {
+        this.module = module;
+        this.transformer = new Transformer() {
+
+            @Override
+            public String transform(ElementIndexInfo info) {
+                if (getModule().getName().equals(info.getModule())) {
+                    return info.getName();
+                } else {
+                    return info.getModule() + " : " + info.getName();
+                }
+            }
+
+        };
+    }
+
+    @Override
+    public Image getImage(Object element) {
+        if (element instanceof ElementIndexInfo) {
+            ElementIndexInfo info = (ElementIndexInfo) element;
+            if (ElementIndexType.GROUPING.equals(info.getType())) {
+                return GraphitiUi.getImageService().getImageForId(YangDiagramImageProvider.DIAGRAM_TYPE_PROVIDER_ID,
+                        YangDiagramImageProvider.IMG_GROUPING_PROPOSAL);
+            }
+            if (ElementIndexType.TYPE.equals(info.getType())) {
+                return GraphitiUi.getImageService().getImageForId(YangDiagramImageProvider.DIAGRAM_TYPE_PROVIDER_ID,
+                        YangDiagramImageProvider.IMG_CUSTOM_TYPE_PROPOSAL);
+            }
+            if (ElementIndexType.IDENTITY.equals(info.getType())) {
+                return GraphitiUi.getImageService().getImageForId(YangDiagramImageProvider.DIAGRAM_TYPE_PROVIDER_ID,
+                        YangDiagramImageProvider.IMG_IDENTITY_PROPOSAL);
+            }
+        } else {
+            return GraphitiUi.getImageService().getImageForId(YangDiagramImageProvider.DIAGRAM_TYPE_PROVIDER_ID,
+                    YangDiagramImageProvider.IMG_TYPE_PROPOSAL);
+        }
+        return super.getImage(element);
+    }
+
+    @Override
+    public String getText(Object element) {
+        if (element instanceof ElementIndexInfo) {
+            return transformer.transform((ElementIndexInfo) element);
+        }
+        return Strings.getAsString(element);
+    }
+
+    private Module getModule() {
+        return module;
+    }
+
+    public void setModule(Module module) {
+        this.module = module;
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/dialog/MultilineTextDialog.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/dialog/MultilineTextDialog.java
new file mode 100644 (file)
index 0000000..9fc21fe
--- /dev/null
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.dialog;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+public class MultilineTextDialog extends Dialog {
+    private Composite composite;
+    private String originalValue;
+    private String value;
+    private String title;
+    private Text textControl;
+
+    public MultilineTextDialog(Shell parentShell, final String originalValue, String title) {
+        super(parentShell);
+        setShellStyle(SWT.RESIZE | SWT.TOOL | SWT.TITLE);
+
+        this.originalValue = originalValue;
+        this.title = title;
+    }
+
+    @Override
+    protected void configureShell(Shell shell) {
+        super.configureShell(shell);
+        shell.setText(title);
+    }
+
+    @Override
+    protected Control createDialogArea(Composite parent) {
+        GridLayoutFactory.swtDefaults().applyTo(parent);
+
+        composite = new Composite(parent, SWT.NONE);
+        GridLayoutFactory.swtDefaults().applyTo(composite);
+
+        Label label = new Label(composite, SWT.WRAP);
+        label.setText("Specify " + title + " value");
+
+        GridDataFactory.fillDefaults().grab(true, true).applyTo(composite);
+
+        textControl = new Text(composite, SWT.BORDER | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL | SWT.BORDER_SOLID);
+
+        textControl.setText(originalValue);
+        GridDataFactory.fillDefaults().grab(true, true).hint(300, 200).applyTo(textControl);
+
+        return parent;
+    }
+
+    @Override
+    protected void okPressed() {
+        // store the value from the spinners so it can be set in the text control
+        value = textControl.getText();
+        super.okPressed();
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/dialog/YangElementListSelectionDialog.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/dialog/YangElementListSelectionDialog.java
new file mode 100644 (file)
index 0000000..dff0eae
--- /dev/null
@@ -0,0 +1,198 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.dialog;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.graphiti.ui.services.GraphitiUi;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.dialogs.ElementListSelectionDialog;
+
+import com.cisco.yangide.core.indexing.ElementIndexInfo;
+import com.cisco.yangide.core.indexing.ElementIndexType;
+import com.cisco.yangide.core.model.YangModelManager;
+import com.cisco.yangide.editor.editors.YangScanner;
+import com.cisco.yangide.ext.model.Import;
+import com.cisco.yangide.ext.model.Module;
+import com.cisco.yangide.ext.model.editor.util.Strings;
+import com.cisco.yangide.ext.model.editor.util.YangDiagramImageProvider;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+public class YangElementListSelectionDialog extends ElementListSelectionDialog {
+
+    protected class ElementComparator implements Comparator<Object> {
+
+        @Override
+        public int compare(Object o1, Object o2) {
+            if (null == o1 && null == o2) {
+                return 0;
+            }
+            if (null != o1 && null == o2) {
+                return 1;
+            }
+            if (null == o1 && null != o2) {
+                return -1;
+            }
+            if (o1 instanceof String && o2 instanceof String) {
+                return ((String) o1).compareTo((String) o2);
+            }
+            if (o1 instanceof String && !(o2 instanceof String)) {
+                return -1;
+            }
+            if (!(o1 instanceof String) && o2 instanceof String) {
+                return 1;
+            }
+            if (o1 instanceof ElementIndexInfo && o2 instanceof ElementIndexInfo) {
+                if (((ElementIndexInfo) o1).getModule().equals(((ElementIndexInfo) o2).getModule())) {
+                    return ((ElementIndexInfo) o1).getName().compareTo(((ElementIndexInfo) o2).getName());
+                } else {
+                    return ((ElementIndexInfo) o1).getModule().compareTo(((ElementIndexInfo) o2).getModule());
+                }
+            }
+            return o1.toString().compareTo(o2.toString());
+        }
+
+    }
+
+    private Module module;
+    private HashMap<String, String> imports = new HashMap<String, String>();
+    private String value;
+
+    public interface Transformer {
+        public String transform(ElementIndexInfo info);
+    }
+
+    protected List<Object> list;
+
+    public YangElementListSelectionDialog(Shell parent, ElementIndexType indexType, IFile file, String imageId,
+            Module module, Transformer transformer, String initialValue) {
+        super(parent, new ElementLabelProvider(transformer));
+        reset(indexType, file, imageId, module, initialValue);
+    }
+
+    public YangElementListSelectionDialog(Shell parent, ElementIndexType indexType, IFile file, String imageId,
+            Module module, String initialValue) {
+        super(parent, new ElementLabelProvider(module));
+        reset(indexType, file, imageId, module, initialValue);
+    }
+
+    public void reset(ElementIndexType indexType, IFile file, String imageId, Module m, String initialValue) {
+        setTitle("Select element");
+        setAllowDuplicates(false);
+        setModule(m);
+        setList(indexType, file, m);
+        setImage(
+                GraphitiUi.getImageService().getImageForId(YangDiagramImageProvider.DIAGRAM_TYPE_PROVIDER_ID, imageId));
+        setInitialSelections(new Object[] { getElementByValue(initialValue) });
+    }
+
+    private Object getElementByValue(String initialValue) {
+        if (list.contains(initialValue)) {
+            return initialValue;
+        } else if (null != initialValue) {
+            String test = initialValue.replaceAll(" ", "");
+            for (Object el : list) {
+                if (el instanceof ElementIndexInfo) {
+                    if (test.equals(((ElementIndexInfo) el).getName())
+                            || (imports.containsKey(((ElementIndexInfo) el).getModule())
+                                    && test.equals(imports.get(((ElementIndexInfo) el).getModule()) + ":"
+                                            + ((ElementIndexInfo) el).getName()))) {
+                        return el;
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
+    public void setList(ElementIndexType indexType, IFile file, Module module) {
+        List<Object> result = new ArrayList<Object>();
+        if (ElementIndexType.TYPE.equals(indexType)) {
+            result.addAll(Arrays.asList(YangScanner.getTypes()));
+        }
+        result.addAll(Arrays.asList(
+                YangModelManager.search(null, null, null, indexType, null == file ? null : file.getProject(), null)));
+        list = filterElements(result);
+        setElements(list.toArray());
+
+    }
+
+    @Override
+    protected void okPressed() {
+        computeResult();
+        if (null == getFirstResult()) {
+
+            MessageDialog.openWarning(getShell(), "Warning", "No element was choosen");
+        } else {
+            setResultObject();
+            super.okPressed();
+        }
+    }
+
+    protected List<Object> filterElements(List<Object> elements) {
+        List<Object> result = new ArrayList<Object>();
+        for (Object element : elements) {
+            if (!(element instanceof ElementIndexInfo) || hasImport(element)) {
+                result.add(element);
+            }
+        }
+        return result;
+    }
+
+    protected boolean hasImport(Object element) {
+        if (element instanceof ElementIndexInfo) {
+            return imports.containsKey(((ElementIndexInfo) element).getModule())
+                    || ((ElementIndexInfo) element).getModule().equals(module.getName());
+        }
+        return false;
+    }
+
+    protected void setResultObject() {
+        Object result = getFirstResult();
+        if (result instanceof ElementIndexInfo) {
+            ElementIndexInfo choosen = (ElementIndexInfo) result;
+            if (null == getModule() || choosen.getModule().equals(getModule().getName())) {
+                value = choosen.getName();
+            } else {
+                value = (imports.containsKey(choosen.getModule()) ? imports.get(choosen.getModule()) + ":" : "")
+                        + choosen.getName();
+            }
+        } else {
+            value = Strings.getAsString(result);
+        }
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    protected void setModule(Module module) {
+        this.module = module;
+        for (EObject i : YangModelUtil.filter(module.getChildren(), YangModelUtil.MODEL_PACKAGE.getImport())) {
+            imports.put(((Import) i).getModule(), ((Import) i).getPrefix());
+        }
+    }
+
+    protected Module getModule() {
+        return module;
+    }
+
+    protected void setSelection(String initialValue) {
+        if (null != initialValue) {
+            setSelection(new Object[] { initialValue });
+        }
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/editors/IModelChangeHandler.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/editors/IModelChangeHandler.java
new file mode 100644 (file)
index 0000000..f680c7a
--- /dev/null
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.editors;
+
+import org.eclipse.emf.ecore.EObject;
+
+import com.cisco.yangide.ext.model.Node;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 11, 2014
+ */
+public interface IModelChangeHandler {
+    /**
+     * Fired when node created and added to parent element at specific position
+     *
+     * @param parent parent composite node
+     * @param child child node
+     * @param position position in <code>children</code> list
+     */
+    void nodeAdded(Node parent, Node child, int position);
+
+    /**
+     * Fired when node removed from model.
+     *
+     * @param node node
+     */
+    void nodeRemoved(Node node);
+
+    /**
+     * Fired when nodes attributes was changed
+     *
+     * @param node node
+     * @param object object references
+     * @param newValue new value
+     */
+    void nodeChanged(Node node, EObject object, Object newValue);
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/editors/ISourceModelManager.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/editors/ISourceModelManager.java
new file mode 100644 (file)
index 0000000..828c02d
--- /dev/null
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.editors;
+
+import java.util.List;
+
+import com.cisco.yangide.core.dom.ASTNode;
+import com.cisco.yangide.ext.model.Node;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 13, 2014
+ */
+public interface ISourceModelManager {
+    /**
+     * Creates a new elements in source model
+     *
+     * @param parent parent node to insert created element
+     * @param position position in the parent node
+     * @param content string content of the element
+     */
+    void createSourceElement(Node parent, int position, String content);
+
+    /**
+     * Invokes Extract Grouping refactoring for selected nodes.
+     *
+     * @param nodes nodes to be extracted
+     */
+    void extractGrouping(List<Node> nodes);
+
+    ASTNode getModuleNode(Node node);
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/editors/YangDiagramBehavior.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/editors/YangDiagramBehavior.java
new file mode 100644 (file)
index 0000000..c8ec420
--- /dev/null
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.editors;
+
+import org.eclipse.gef.ContextMenuProvider;
+import org.eclipse.graphiti.ui.editor.DefaultPaletteBehavior;
+import org.eclipse.graphiti.ui.editor.DefaultPersistencyBehavior;
+import org.eclipse.graphiti.ui.editor.DefaultRefreshBehavior;
+import org.eclipse.graphiti.ui.editor.DiagramBehavior;
+import org.eclipse.graphiti.ui.editor.DiagramEditorContextMenuProvider;
+import org.eclipse.graphiti.ui.editor.IDiagramContainerUI;
+import org.eclipse.graphiti.ui.internal.action.RemoveAction;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.swt.graphics.Point;
+
+@SuppressWarnings("restriction")
+public class YangDiagramBehavior extends DiagramBehavior {
+    private Point createPosition;
+
+    public YangDiagramBehavior(IDiagramContainerUI diagramContainer) {
+        super(diagramContainer);
+    }
+
+    @Override
+    protected DefaultPersistencyBehavior createPersistencyBehavior() {
+        return new YangDiagramPersistencyBehavior(this);
+    }
+
+    /**
+     * @return the createPosition
+     */
+    public Point getCreatePosition() {
+        return createPosition;
+    }
+
+    /**
+     * @param createPosition the createPosition to set
+     */
+    public void setCreatePosition(Point createPosition) {
+        this.createPosition = createPosition;
+    }
+
+    @Override
+    protected DefaultRefreshBehavior createRefreshBehavior() {
+        return new YangDiagramRefreshBehavior(this);
+    }
+
+    @Override
+    protected ContextMenuProvider createContextMenuProvider() {
+        return new DiagramEditorContextMenuProvider(getDiagramContainer().getGraphicalViewer(),
+                getDiagramContainer().getActionRegistry(), getConfigurationProvider()) {
+            @Override
+            protected void addActionToMenuIfAvailable(IMenuManager manager, String actionId, String menuGroup) {
+                if (RemoveAction.ACTION_ID.equals(actionId)) {
+                    return;
+                }
+                super.addActionToMenuIfAvailable(manager, actionId, menuGroup);
+            }
+        };
+    }
+
+    @Override
+    protected DefaultPaletteBehavior createPaletteBehaviour() {
+        return new YangPaletteBehavior(this);
+    }
+
+    public YangPaletteBehavior getYangPaletteBehavior() {
+        return (YangPaletteBehavior) getPaletteBehavior();
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/editors/YangDiagramEditor.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/editors/YangDiagramEditor.java
new file mode 100644 (file)
index 0000000..73c50aa
--- /dev/null
@@ -0,0 +1,329 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.editors;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.util.EContentAdapter;
+import org.eclipse.emf.transaction.RecordingCommand;
+import org.eclipse.gef.GraphicalViewer;
+import org.eclipse.graphiti.features.IRemoveFeature;
+import org.eclipse.graphiti.features.context.impl.RemoveContext;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
+import org.eclipse.graphiti.mm.pictograms.Diagram;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.services.Graphiti;
+import org.eclipse.graphiti.ui.editor.DiagramBehavior;
+import org.eclipse.graphiti.ui.editor.DiagramEditor;
+import org.eclipse.graphiti.ui.editor.IDiagramEditorInput;
+import org.eclipse.graphiti.ui.platform.GraphitiShapeEditPart;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.ControlListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IEditorInput;
+
+import com.cisco.yangide.core.dom.ASTNode;
+import com.cisco.yangide.editor.editors.YangEditor;
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Module;
+import com.cisco.yangide.ext.model.Node;
+import com.cisco.yangide.ext.model.editor.diagram.EditorFeatureProvider;
+import com.cisco.yangide.ext.model.editor.util.DiagramImportSupport;
+import com.cisco.yangide.ext.model.editor.util.LayoutUtil;
+import com.cisco.yangide.ext.model.editor.util.YangModelUIUtil;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+public class YangDiagramEditor extends DiagramEditor {
+
+    private Module module;
+    private YangDiagramModuleInfoPanel infoPane;
+    private ISourceModelManager sourceModelManager;
+    private final YangEditor sourceEditor;
+
+    public YangDiagramEditor(YangEditor sourceEditor) {
+        super();
+        this.sourceEditor = sourceEditor;
+    }
+
+    private IModelChangeHandler modelChangeHandler = new IModelChangeHandler() {
+
+        @Override
+        public void nodeRemoved(Node node) {
+            System.out.println("Removed " + node);
+            PictogramElement[] elements = getDiagramTypeProvider().getFeatureProvider()
+                    .getAllPictogramElementsForBusinessObject(node);
+            for (PictogramElement element : elements) {
+                RemoveContext context = new RemoveContext(element);
+                IRemoveFeature feature = getDiagramTypeProvider().getFeatureProvider().getRemoveFeature(context);
+                getDiagramBehavior().executeFeature(feature, context);
+            }
+            infoPane.update();
+        }
+
+        @Override
+        public void nodeChanged(Node node, EObject object, Object newValue) {
+            System.out.println("Changed " + node);
+            if (object instanceof EAttribute) {
+                PictogramElement pe = YangModelUIUtil.getBusinessObjectPropShape(
+                        getDiagramTypeProvider().getFeatureProvider(), node, (EAttribute) object);
+                if (null != pe) {
+                    YangModelUIUtil.updatePictogramElement(getDiagramTypeProvider().getFeatureProvider(), pe);
+                }
+            }
+            infoPane.update();
+        }
+
+        @Override
+        public void nodeAdded(Node parent, Node child, int position) {
+            System.out.println("Added " + child);
+            if (null == YangModelUIUtil.getBusinessObjectShape(getDiagramTypeProvider().getFeatureProvider(), child)) {
+                Point p = null;
+                if (parent instanceof Module) {
+                    p = ((YangDiagramBehavior) getDiagramBehavior()).getCreatePosition();
+                }
+                PictogramElement pe = YangModelUIUtil
+                        .getBusinessObjectShape(getDiagramTypeProvider().getFeatureProvider(), parent);
+                if (null != pe && pe instanceof ContainerShape) {
+                    YangModelUIUtil.drawObject(child, (ContainerShape) pe,
+                            getDiagramTypeProvider().getFeatureProvider(), null == p ? 0 : p.x, null == p ? 0 : p.y);
+                    if (pe instanceof Diagram && null == p) {
+                        getEditingDomain().getCommandStack().execute(new RecordingCommand(getEditingDomain()) {
+
+                            @Override
+                            protected void doExecute() {
+                                LayoutUtil.layoutDiagram(getDiagramTypeProvider().getFeatureProvider());
+                            }
+                        });
+
+                    }
+                }
+                ((YangDiagramBehavior) getDiagramBehavior()).setCreatePosition(null);
+                infoPane.update();
+            }
+
+        }
+    };
+    private URI uri;
+
+    @Override
+    protected DiagramBehavior createDiagramBehavior() {
+        return new YangDiagramBehavior(this);
+    }
+
+    private boolean layouted = false;
+    private Diagram diagram;
+    private Point diagramSize = new Point(1200, 200);
+    private SourceSelectionUpdater sourceSelectionUpdater;
+
+    @Override
+    public void createPartControl(final Composite parent) {
+        GridLayout layout = new GridLayout();
+        layout.numColumns = 1;
+        layout.makeColumnsEqualWidth = false;
+        layout.verticalSpacing = 0;
+        layout.marginTop = 0;
+        layout.marginBottom = 0;
+        layout.marginHeight = 0;
+        parent.setLayout(layout);
+
+        infoPane = new YangDiagramModuleInfoPanel(parent, module, getFile());
+
+        super.createPartControl(infoPane.getDiagram());
+
+        for (Control c : infoPane.getDiagram().getChildren()) {
+            if (!infoPane.equals(c)) {
+                c.setLayoutData(new GridData(GridData.FILL_BOTH));
+            }
+        }
+
+        final GraphicalViewer viewer = (GraphicalViewer) YangDiagramEditor.this.getAdapter(GraphicalViewer.class);
+        viewer.getControl().addControlListener(new ControlListener() {
+
+            @Override
+            public void controlResized(ControlEvent e) {
+                if (viewer.getControl().isDisposed()) {
+                    return;
+                }
+
+                diagramSize = viewer.getControl().getSize();
+
+                ((EditorFeatureProvider) getDiagramTypeProvider().getFeatureProvider()).updateDiagramSize(diagramSize.x,
+                        diagramSize.y);
+                if (!layouted && diagramSize.x != 0 && diagramSize.y != 0) {
+                    layouted = true;
+                    YangModelUIUtil.layoutPictogramElement(diagram, getDiagramTypeProvider().getFeatureProvider());
+                    viewer.select(viewer.getRootEditPart());
+                    viewer.reveal(viewer.getRootEditPart());
+                }
+            }
+
+            @Override
+            public void controlMoved(ControlEvent e) {
+            }
+        });
+        loadDiagram();
+    }
+
+    @Override
+    public void initializeGraphicalViewer() {
+        super.initializeGraphicalViewer();
+        GraphicalViewer graphicalViewer = getGraphicalViewer();
+        if (graphicalViewer != null) {
+            graphicalViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+                @Override
+                public void selectionChanged(SelectionChangedEvent event) {
+                    ((YangDiagramBehavior) getDiagramBehavior()).getYangPaletteBehavior()
+                            .updateSelection(event.getSelection());
+                }
+            });
+        }
+        sourceSelectionUpdater = new SourceSelectionUpdater();
+    }
+
+    @Override
+    protected void setInput(IEditorInput input) {
+        super.setInput(input);
+        uri = ((IDiagramEditorInput) input).getUri();
+        module = ((YangDiagramEditorInput) input).getModule();
+        // added self changes listener
+        module.eAdapters().add(new EContentAdapter() {
+            @Override
+            public void notifyChanged(Notification notification) {
+                if (notification.getNotifier() instanceof Node) {
+                    if (notification.getFeature() == ModelPackage.Literals.NAMED_NODE__NAME
+                            || notification.getFeature() == ModelPackage.Literals.USES__QNAME
+                            || notification.getFeature() == ModelPackage.Literals.REFERENCE_NODE__REFERENCE
+                            || notification.getFeature() == ModelPackage.Literals.SUBMODULE__BELONGS_TO) {
+                        if (notification.getNewValue() != null
+                                && !notification.getNewValue().equals(notification.getOldValue())) {
+                            modelChangeHandler.nodeChanged((Node) notification.getNotifier(),
+                                    (EObject) notification.getFeature(), notification.getNewValue());
+                            final EClass type = YangModelUtil
+                                    .getConnectionReferenceSubjectClass(notification.getNotifier());
+                            if (null != type) {
+                                getDiagramBehavior().getEditingDomain().getCommandStack()
+                                        .execute(new RecordingCommand(getDiagramBehavior().getEditingDomain()) {
+
+                                    @Override
+                                    protected void doExecute() {
+                                        YangModelUIUtil.updateConnections(type,
+                                                getDiagramTypeProvider().getFeatureProvider());
+                                    }
+                                });
+                            }
+                        }
+                    }
+                }
+                super.notifyChanged(notification);
+            }
+        });
+        loadDiagram();
+    }
+
+    private void loadDiagram() {
+        if (getGraphicalViewer() != null) {
+            getEditingDomain().getCommandStack().execute(new RecordingCommand(getEditingDomain()) {
+
+                @Override
+                protected void doExecute() {
+                    ensureDiagramResource(uri);
+                    importDiagram();
+                }
+            });
+        }
+    }
+
+    private void ensureDiagramResource(URI uri) {
+        final Resource resource = getEditingDomain().getResourceSet().createResource(uri);
+        getEditingDomain().getCommandStack().execute(new RecordingCommand(getEditingDomain()) {
+            @Override
+            protected void doExecute() {
+                resource.setTrackingModification(true);
+                resource.getContents().add(getDiagramTypeProvider().getDiagram());
+            }
+        });
+    }
+
+    private void importDiagram() {
+        if (null != module) {
+            diagram = getDiagramTypeProvider().getDiagram();
+            getDiagramTypeProvider().getFeatureProvider().link(diagram, module);
+
+            DiagramImportSupport.importDiagram(diagram, getDiagramTypeProvider().getFeatureProvider());
+
+        }
+
+    }
+
+    /**
+     * @return
+     */
+    public IModelChangeHandler getModelChangeHandler() {
+        return modelChangeHandler;
+    }
+
+    public void setSourceModelManager(ISourceModelManager sourceModelManager) {
+        ((EditorFeatureProvider) getDiagramTypeProvider().getFeatureProvider())
+                .setSourceModelManager(sourceModelManager);
+        this.sourceModelManager = sourceModelManager;
+    }
+
+    private IFile getFile() {
+        return ((YangDiagramEditorInput) getEditorInput()).getFile();
+    }
+
+    /**
+     * Enables selection of source code element that corresponds to the selected diagram shape.
+     */
+    public void startSourceSelectionUpdater() {
+        GraphicalViewer graphicalViewer = getGraphicalViewer();
+        if (graphicalViewer != null)
+            graphicalViewer.addSelectionChangedListener(sourceSelectionUpdater);
+    }
+
+    /**
+     * Disables selection of source code element that corresponds to the selected diagram shape.
+     */
+    public void stopSourceSelectionUpdater() {
+        GraphicalViewer graphicalViewer = getGraphicalViewer();
+        if (graphicalViewer != null)
+            graphicalViewer.removeSelectionChangedListener(sourceSelectionUpdater);
+    }
+
+    private class SourceSelectionUpdater implements ISelectionChangedListener {
+        @Override
+        public void selectionChanged(SelectionChangedEvent event) {
+            IStructuredSelection selection = (IStructuredSelection) event.getSelection();
+            Object object = selection.getFirstElement();
+            if (object instanceof GraphitiShapeEditPart) {
+                PictogramElement element = (PictogramElement) ((GraphitiShapeEditPart) object).getPictogramElement();
+                EObject node = Graphiti.getLinkService().getBusinessObjectForLinkedPictogramElement(element);
+                ASTNode moduleNode = sourceModelManager.getModuleNode((Node) node);
+                IRegion region = YangEditor.getSelectionRegion(moduleNode);
+                if (region != null) {
+                    sourceEditor.setHighlightRange(region.getOffset(), region.getLength(), true);
+                    // sourceEditor.selectAndReveal(...) doesn't work here since projection is
+                    // disabled
+                }
+            }
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/editors/YangDiagramEditorInput.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/editors/YangDiagramEditorInput.java
new file mode 100644 (file)
index 0000000..44d2b44
--- /dev/null
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.editors;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.graphiti.ui.editor.DiagramEditorInput;
+
+import com.cisco.yangide.ext.model.Module;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 7, 2014
+ */
+public class YangDiagramEditorInput extends DiagramEditorInput {
+
+    private Module module;
+    private IFile file;
+
+    /**
+     * @param diagramUri
+     * @param providerId
+     */
+    public YangDiagramEditorInput(URI diagramUri, IFile file, String providerId, Module m) {
+        super(diagramUri, providerId);
+        this.file = file;
+        this.module = m;
+    }
+
+    /**
+     * @return the module
+     */
+    public Module getModule() {
+        return module;
+    }
+
+    public IFile getFile() {
+        return file;
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/editors/YangDiagramModuleInfoPanel.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/editors/YangDiagramModuleInfoPanel.java
new file mode 100644 (file)
index 0000000..84da813
--- /dev/null
@@ -0,0 +1,838 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.editors;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.databinding.Binding;
+import org.eclipse.core.databinding.DataBindingContext;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.emf.databinding.EMFProperties;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.graphiti.ui.services.GraphitiUi;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.jface.databinding.swt.WidgetProperties;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.ControlListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.events.ExpansionAdapter;
+import org.eclipse.ui.forms.events.ExpansionEvent;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+import org.eclipse.ui.forms.widgets.Section;
+
+import com.cisco.yangide.ext.model.BelongsTo;
+import com.cisco.yangide.ext.model.Import;
+import com.cisco.yangide.ext.model.ModelFactory;
+import com.cisco.yangide.ext.model.Module;
+import com.cisco.yangide.ext.model.Submodule;
+import com.cisco.yangide.ext.model.Revision;
+import com.cisco.yangide.ext.model.TaggedNode;
+import com.cisco.yangide.ext.model.editor.dialog.AddImportDialog;
+import com.cisco.yangide.ext.model.editor.dialog.ChooseParentModuleDialog;
+import com.cisco.yangide.ext.model.editor.dialog.MultilineTextDialog;
+import com.cisco.yangide.ext.model.editor.util.BusinessObjectWrapper;
+import com.cisco.yangide.ext.model.editor.util.Strings;
+import com.cisco.yangide.ext.model.editor.util.YangDiagramImageProvider;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+import com.cisco.yangide.ext.model.editor.util.YangTag;
+import com.cisco.yangide.ext.model.editor.widget.DialogText;
+
+public class YangDiagramModuleInfoPanel implements BusinessObjectWrapper<Module> {
+
+    private Text nameText;
+    private TableViewer importTable;
+
+    private Module module;
+    private FormToolkit toolkit;
+    private IFile file;
+
+    private Composite diagram;
+    // private PropertyEdit editPropertyForm;
+
+    private Text namespaceText;
+    private DialogText parentModuleText;
+    private DialogText organizationText;
+    private DialogText contactText;
+    private Text prefixText;
+    private Text yangVersionText;
+    private DialogText descriptionText;
+    private DialogText referenceText;
+    private TableViewer revisionTable;
+    private SashForm infoPane;
+    private Composite leftPane;
+
+    private SashForm mainSashPanel;
+
+    private DataBindingContext bindingContext = new DataBindingContext();
+
+    protected class PropertyEdit extends SashForm {
+        private RevisionEdit editRevision;
+        private ImportEdit editImport;
+
+        protected class RevisionEdit implements BusinessObjectWrapper<Revision> {
+            private Text description;
+            private Text reference;
+            private Text name;
+            private Revision revision;
+            private Composite pane;
+            private List<Binding> dataBindigs = new ArrayList<Binding>();
+
+            public RevisionEdit() {
+                // pane = toolkit.createComposite(editPropertyForm, SWT.NONE);
+                createPane();
+            }
+
+            protected void createPane() {
+                GridDataFactory.fillDefaults().grab(true, false).applyTo(pane);
+                GridLayoutFactory.fillDefaults().numColumns(2).applyTo(pane);
+                toolkit.createLabel(pane, "Name: ");
+                name = toolkit.createText(pane, "");
+                GridDataFactory.fillDefaults().grab(true, false).applyTo(name);
+
+                toolkit.createLabel(pane, "Description: ");
+                description = toolkit.createText(pane, "", SWT.MULTI | SWT.WRAP);
+                GridDataFactory.fillDefaults().grab(true, true).applyTo(description);
+
+                toolkit.createLabel(pane, "Reference: ");
+                reference = toolkit.createText(pane, "", SWT.MULTI | SWT.WRAP);
+                GridDataFactory.fillDefaults().grab(true, true).applyTo(reference);
+
+            }
+
+            protected void addListeneres() {
+                removeBindings(dataBindigs);
+                dataBindigs.clear();
+                dataBindigs.add(addTextFieldListener(this, reference, YangTag.REFERENCE));
+                dataBindigs.add(addTextFieldListener(this, description, YangTag.DESCRIPTION));
+                dataBindigs.add(addTextFieldListener(this, name, YangModelUtil.MODEL_PACKAGE.getNamedNode_Name()));
+            }
+
+            public void updateData() {
+                if (null != revision) {
+                    name.setText(revision.getName());
+                    description.setText(Strings.getAsString(YangModelUtil.getValue(YangTag.DESCRIPTION, revision)));
+                    reference.setText(Strings.getAsString(YangModelUtil.getValue(YangTag.REFERENCE, revision)));
+                    addListeneres();
+                }
+            }
+
+            public Composite getPane(Revision revision) {
+                if (revision != this.revision) {
+                    this.revision = revision;
+                    updateData();
+                }
+                return pane;
+            }
+
+            @Override
+            public Revision getBusinessObject() {
+                return revision;
+            }
+
+        }
+
+        protected class ImportEdit implements BusinessObjectWrapper<Import> {
+            private Text name;
+            private Text prefix;
+            private Text revision;
+            private Import importObj;
+            private Composite pane;
+            private List<Binding> dataBindigs = new ArrayList<Binding>();
+
+            public ImportEdit() {
+                // pane = toolkit.createComposite(editPropertyForm, SWT.NONE);
+                createPane();
+            }
+
+            protected void createPane() {
+                GridLayoutFactory.fillDefaults().numColumns(2).applyTo(pane);
+                GridDataFactory.fillDefaults().grab(true, false).applyTo(pane);
+                toolkit.createLabel(pane, "Name: ");
+                name = toolkit.createText(pane, "");
+                name.setEditable(false);
+                name.setEnabled(false);
+                GridDataFactory.fillDefaults().grab(true, false).applyTo(name);
+
+                toolkit.createLabel(pane, "Prefix: ");
+                prefix = toolkit.createText(pane, "");
+                prefix.setEditable(false);
+                prefix.setEnabled(false);
+                GridDataFactory.fillDefaults().grab(true, false).applyTo(prefix);
+
+                toolkit.createLabel(pane, "Revision: ");
+                revision = toolkit.createText(pane, "");
+                revision.setEditable(false);
+                revision.setEnabled(false);
+                GridDataFactory.fillDefaults().grab(true, false).applyTo(revision);
+
+            }
+
+            protected void addListeneres() {
+                removeBindings(dataBindigs);
+                dataBindigs.clear();
+                dataBindigs.add(addTextFieldListener(this, prefix, YangModelUtil.MODEL_PACKAGE.getImport_Prefix()));
+                dataBindigs.add(
+                        addTextFieldListener(this, revision, YangModelUtil.MODEL_PACKAGE.getImport_RevisionDate()));
+            }
+
+            public void updateData() {
+                if (null != importObj) {
+                    name.setText(importObj.getModule());
+                    prefix.setText(Strings.getAsString(importObj.getPrefix()));
+                    revision.setText(Strings.getAsString(importObj.getRevisionDate()));
+                    addListeneres();
+                }
+            }
+
+            public Composite getPane(Import importObj) {
+                if (importObj != this.importObj) {
+                    this.importObj = importObj;
+                    updateData();
+                }
+                return pane;
+            }
+
+            @Override
+            public Import getBusinessObject() {
+                return importObj;
+            }
+
+        }
+
+        public PropertyEdit(Composite parent) {
+            super(parent, SWT.HORIZONTAL);
+            GridDataFactory.fillDefaults().grab(true, false).applyTo(this);
+            setLayout(new GridLayout(1, false));
+        }
+
+        public void setRevision(Revision revision) {
+            if (null == editRevision) {
+                editRevision = new RevisionEdit();
+            }
+            setMaximizedControl(editRevision.getPane(revision));
+        }
+
+        public void setImport(Import importObj) {
+            if (null == editImport) {
+                editImport = new ImportEdit();
+            }
+            setMaximizedControl(editImport.getPane(importObj));
+        }
+
+    }
+
+    public YangDiagramModuleInfoPanel(Composite parent, Module module, IFile file) {
+        this.module = module;
+        this.file = file;
+        mainSashPanel = new SashForm(parent, SWT.HORIZONTAL);
+        mainSashPanel.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));
+        mainSashPanel.setLayout(new GridLayout(1, false));
+
+        leftPane = new Composite(mainSashPanel, SWT.NONE);
+        diagram = new Composite(mainSashPanel, SWT.NONE);
+
+        GridLayoutFactory.fillDefaults().applyTo(diagram);
+        GridDataFactory.fillDefaults().grab(false, true).hint(200, -1).applyTo(leftPane);
+        GridLayoutFactory.fillDefaults().applyTo(leftPane);
+
+        createModuleInfoPanel(leftPane);
+
+        GridDataFactory.fillDefaults().grab(true, true).applyTo(diagram);
+
+        setPropertiesPaneVisible(false);
+        parent.layout();
+        final Point leftSize = leftPane.computeSize(-1, -1);
+
+        leftPane.addControlListener(new ControlListener() {
+            @Override
+            public void controlResized(ControlEvent e) {
+                Point size = leftPane.getSize();
+                if (Math.abs(leftSize.x - size.x) > 5) {
+                    leftSize.x = size.x;
+                }
+            }
+
+            @Override
+            public void controlMoved(ControlEvent e) {
+                // TODO Auto-generated method stub
+
+            }
+        });
+
+        mainSashPanel.addControlListener(new ControlListener() {
+            @Override
+            public void controlResized(ControlEvent e) {
+                Point area = mainSashPanel.getSize();
+                int x = Math.min(leftSize.x, leftPane.computeSize(leftSize.x, -1).x);
+                mainSashPanel.setWeights(new int[] { x, area.x - x });
+            }
+
+            @Override
+            public void controlMoved(ControlEvent e) {
+                // TODO Auto-generated method stub
+
+            }
+        });
+    }
+
+    protected void createModuleInfoPanel(Composite parent) {
+        toolkit = new FormToolkit(parent.getDisplay());
+        toolkit.adapt(parent);
+        ScrolledForm mainForm = toolkit.createScrolledForm(parent);
+        GridDataFactory.fillDefaults().grab(true, true).applyTo(mainForm);
+        mainForm.setText("Module Info");
+        toolkit.decorateFormHeading(mainForm.getForm());
+
+        GridLayoutFactory.swtDefaults().applyTo(mainForm.getBody());
+        infoPane = new SashForm(mainForm.getBody(), SWT.HORIZONTAL);
+        GridDataFactory.fillDefaults().grab(true, true).applyTo(infoPane);
+        toolkit.adapt(infoPane);
+
+        infoPane.setLayout(new FillLayout(SWT.VERTICAL));
+        // pane = toolkit.createScrolledForm(infoPane);
+        Composite pane = toolkit.createComposite(infoPane);
+        GridLayoutFactory.fillDefaults().applyTo(pane);
+        GridDataFactory.fillDefaults().grab(true, true).applyTo(pane);
+
+        // ScrolledForm editForm = toolkit.createScrolledForm(infoPane);
+        // GridDataFactory.fillDefaults().grab(true, true).applyTo(editForm);
+        //
+        // GridLayoutFactory.fillDefaults().applyTo(editForm.getBody());
+        // Section editSection = createSection(editForm, "Properties", Section.TITLE_BAR |
+        // Section.EXPANDED);
+        // GridDataFactory.fillDefaults().grab(true, false).applyTo(editSection);
+        // editPropertyForm = new PropertyEdit(editSection);
+        // toolkit.adapt(editPropertyForm);
+        // editSection.setClient(editPropertyForm);
+
+        createGeneralSection(pane);
+        if (module instanceof Submodule) {
+            createBelongsToSection(pane);
+        }
+        createRevisionSection(pane);
+        createImportSection(pane);
+        createMetaInfoSection(pane);
+        // infoPane.setWeights(new int[] { 1, 0 });
+        // infoPane.setMaximizedControl(pane);
+        // createPropertiesButtonToolbar(editSection, infoPane, pane);
+        // mainForm.pack();
+        // mainForm.reflow(true);
+    }
+
+    protected void setPropertiesPaneVisible(boolean set) {
+        // if (set) {
+        // infoPane.setWeights(new int[] { 1, 1 });
+        // infoPane.setMaximizedControl(null);
+        // mainSashPanel.setWeights(new int[] { 4, 6 });
+        //
+        // } else {
+        // infoPane.setWeights(new int[] { 1, 0 });
+        // infoPane.setMaximizedControl(pane);
+        // mainSashPanel.setWeights(new int[] { 2, 6 });
+        // }
+    }
+
+    protected void createPropertiesButtonToolbar(final Section editSection, final SashForm infoPane,
+            final ScrolledForm pane) {
+        ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT);
+        ToolBar toolbar = toolBarManager.createControl(editSection);
+        toolbar.setCursor(Display.getDefault().getSystemCursor(SWT.CURSOR_HAND));
+
+        Action closeButton = new Action("Close properties section", IAction.AS_CHECK_BOX) {
+
+            @Override
+            public void run() {
+                super.run();
+                setChecked(false);
+                setPropertiesPaneVisible(false);
+            }
+        };
+
+        closeButton.setImageDescriptor(
+                GraphitiUi.getImageService().getImageDescriptorForId(YangDiagramImageProvider.DIAGRAM_TYPE_PROVIDER_ID,
+                        YangDiagramImageProvider.IMG_COLLAPSE_ALL_TOOL_PROPOSAL));
+        closeButton.setEnabled(true);
+        toolBarManager.add(closeButton);
+        toolBarManager.update(true);
+        editSection.setTextClient(toolbar);
+    }
+
+    protected void createMetaInfoSection(Composite parent) {
+        Section section = createSection(parent, "Meta information");
+        Composite meta = toolkit.createComposite(section);
+        GridLayoutFactory.swtDefaults().numColumns(2).applyTo(meta);
+        GridDataFactory.fillDefaults().hint(100, -1).grab(true, false).applyTo(section);
+
+        toolkit.createLabel(meta, "Organization: ");
+        organizationText = new DialogText(meta, toolkit) {
+
+            @Override
+            protected Object openDialogBox(Text text) {
+                Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+                MultilineTextDialog dialog = new MultilineTextDialog(shell, Strings.getAsString(text.getText()),
+                        "Organization");
+                if (IStatus.OK == dialog.open()) {
+                    text.setText(dialog.getValue());
+                }
+                return null;
+            }
+        };
+
+        toolkit.createLabel(meta, "Contact: ");
+        contactText = new DialogText(meta, toolkit) {
+
+            @Override
+            protected Object openDialogBox(Text text) {
+                Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+                MultilineTextDialog dialog = new MultilineTextDialog(shell, Strings.getAsString(text.getText()),
+                        "Contact");
+                if (IStatus.OK == dialog.open()) {
+                    text.setText(dialog.getValue());
+                }
+                return null;
+            }
+        };
+
+        toolkit.createLabel(meta, "Description: ");
+        descriptionText = new DialogText(meta, toolkit) {
+
+            @Override
+            protected Object openDialogBox(Text text) {
+                Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+                MultilineTextDialog dialog = new MultilineTextDialog(shell, Strings.getAsString(text.getText()),
+                        "Description");
+                if (IStatus.OK == dialog.open()) {
+                    text.setText(dialog.getValue());
+                }
+                return null;
+            }
+        };
+
+        toolkit.createLabel(meta, "Reference: ");
+        referenceText = new DialogText(meta, toolkit) {
+
+            @Override
+            protected Object openDialogBox(Text text) {
+                Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+                MultilineTextDialog dialog = new MultilineTextDialog(shell, Strings.getAsString(text.getText()),
+                        "Reference");
+                if (IStatus.OK == dialog.open()) {
+                    text.setText(dialog.getValue());
+                }
+                return null;
+            }
+        };
+
+        updateMetaInfoSection();
+
+        addMetaInfoSectionListeners();
+        section.setClient(meta);
+    }
+
+    protected void createGeneralSection(Composite parent) {
+        Section section = createSection(parent, "General");
+        Composite header = toolkit.createComposite(section);
+        GridLayoutFactory.fillDefaults().numColumns(2).applyTo(header);
+        GridDataFactory.fillDefaults().grab(true, false).applyTo(section);
+
+        toolkit.createLabel(header, "Name: ");
+        nameText = toolkit.createText(header, "");
+        nameText.setEditable(true);
+        GridDataFactory.fillDefaults().hint(100, -1).grab(true, false).applyTo(nameText);
+
+        toolkit.createLabel(header, "Yang-version: ");
+        yangVersionText = toolkit.createText(header, "");
+        yangVersionText.setEditable(true);
+        GridDataFactory.fillDefaults().hint(100, -1).grab(true, false).applyTo(yangVersionText);
+
+        if (!(module instanceof Submodule)) {
+            toolkit.createLabel(header, "Namespace: ");
+            namespaceText = toolkit.createText(header, "");
+            namespaceText.setEditable(true);
+            GridDataFactory.fillDefaults().hint(100, -1).grab(true, false).applyTo(namespaceText);
+
+            toolkit.createLabel(header, "Prefix: ");
+            prefixText = toolkit.createText(header, "");
+            prefixText.setEditable(true);
+            GridDataFactory.fillDefaults().hint(100, -1).grab(true, false).applyTo(prefixText);
+        }
+
+        updateGeneralSection();
+        addGeneralSectionListeners();
+        section.setClient(header);
+    }
+
+    protected void updateMetaInfoSection() {
+        if (null != module) {
+            organizationText.setText(Strings.getAsString(YangModelUtil.getValue(YangTag.ORGANIZATION, module)));
+            contactText.setText(Strings.getAsString(YangModelUtil.getValue(YangTag.CONTACT, module)));
+            descriptionText.setText(Strings.getAsString(YangModelUtil.getValue(YangTag.DESCRIPTION, module)));
+            referenceText.setText(Strings.getAsString(YangModelUtil.getValue(YangTag.REFERENCE, module)));
+        }
+    }
+
+    protected void updateGeneralSection() {
+        if (null != module) {
+            nameText.setText(module.getName());
+            yangVersionText.setText(Strings.getAsString(YangModelUtil.getValue(YangTag.YANG_VERSION, module)));
+            if (!(module instanceof Submodule)) {
+                namespaceText.setText(Strings.getAsString(YangModelUtil.getValue(YangTag.NAMESPACE, module)));
+                prefixText.setText(Strings.getAsString(YangModelUtil.getValue(YangTag.PREFIX, module)));
+            }
+        }
+    }
+
+    protected void addMetaInfoSectionListeners() {
+        addTextFieldListener(this, organizationText.getTextControl(), YangTag.ORGANIZATION);
+        addTextFieldListener(this, contactText.getTextControl(), YangTag.CONTACT);
+        addTextFieldListener(this, descriptionText.getTextControl(), YangTag.DESCRIPTION);
+        addTextFieldListener(this, referenceText.getTextControl(), YangTag.REFERENCE);
+    }
+
+    protected void addGeneralSectionListeners() {
+        addTextFieldListener(this, nameText, YangModelUtil.MODEL_PACKAGE.getNamedNode_Name());
+        addTextFieldListener(this, yangVersionText, YangTag.YANG_VERSION);
+        if (!(module instanceof Submodule)) {
+            addTextFieldListener(this, namespaceText, YangTag.NAMESPACE);
+            addTextFieldListener(this, prefixText, YangTag.PREFIX);
+        }
+    }
+
+    protected void removeBindings(List<Binding> bindings) {
+        for (Binding b : bindings) {
+            b.updateTargetToModel();
+            bindingContext.removeBinding(b);
+        }
+    }
+
+    protected Binding addTextFieldListener(final BusinessObjectWrapper<? extends TaggedNode> node, Control text,
+            final YangTag tag) {
+        return bindingContext.bindValue(WidgetProperties.text(SWT.Modify).observeDelayed(200, text),
+                EMFProperties.value(YangModelUtil.MODEL_PACKAGE.getTag_Value())
+                        .observe(YangModelUtil.getTag(tag, node.getBusinessObject())));
+    }
+
+    protected Binding addTextFieldListener(final BusinessObjectWrapper<? extends EObject> node, final Text text,
+            final EStructuralFeature esf) {
+        return bindingContext.bindValue(WidgetProperties.text(SWT.Modify).observeDelayed(200, text),
+                EMFProperties.value(esf).observe(node.getBusinessObject()));
+    }
+
+    protected void createBelongsToSection(final Composite parent) {
+        Section section = createSection(parent, "Belongs to");
+        Composite belongsTo = toolkit.createComposite(section);
+
+        GridDataFactory.fillDefaults().grab(true, false).applyTo(belongsTo);
+        GridLayoutFactory.fillDefaults().numColumns(2).applyTo(belongsTo);
+
+        toolkit.createLabel(belongsTo, "Module: ");
+        parentModuleText = new DialogText(belongsTo, toolkit) {
+
+            @Override
+            protected Object openDialogBox(Text text) {
+                ChooseParentModuleDialog dialog = new ChooseParentModuleDialog(parent.getShell(), (Submodule) module,
+                        file);
+                if (IStatus.OK == dialog.open()) {
+                    updateBelongsTo();
+                }
+
+                return null;
+            }
+        };
+        GridDataFactory.fillDefaults().grab(true, true).applyTo(parentModuleText.getControl());
+
+        updateBelongsTo();
+        section.setClient(belongsTo);
+    }
+
+    protected void updateBelongsTo() {
+        if (null != module && module instanceof Submodule) {
+            Submodule submodule = ((Submodule) module);
+
+            String text = Strings.EMPTY_STRING;
+            BelongsTo belongsTo = submodule.getBelongsTo();
+            if (belongsTo != null) {
+                Module ownerModule = belongsTo.getOwnerModule();
+                if (ownerModule != null) {
+                    String parentModuleName = ownerModule.getName();
+                    String parentPrefix = Strings.getAsString(YangModelUtil.getValue(YangTag.PREFIX, ownerModule));
+                    text = parentPrefix + " : " + parentModuleName;
+                }
+            }
+            parentModuleText.setText(text);
+        }
+    }
+
+    protected void createRevisionSection(Composite parent) {
+        Section section = createSection(parent, "Revision");
+        Composite revisions = toolkit.createComposite(section);
+
+        // Temporary code
+        GridDataFactory.fillDefaults().grab(true, false).applyTo(revisions);
+        GridLayoutFactory.fillDefaults().numColumns(2).applyTo(revisions);
+        toolkit.createLabel(revisions, "Name: ");
+        Text name = toolkit.createText(revisions, "");
+        GridDataFactory.fillDefaults().grab(true, false).applyTo(name);
+
+        toolkit.createLabel(revisions, "Description: ");
+        final DialogText description = new DialogText(revisions, toolkit) {
+
+            @Override
+            protected Object openDialogBox(Text text) {
+                Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+                MultilineTextDialog dialog = new MultilineTextDialog(shell, Strings.getAsString(text.getText()),
+                        "Description");
+                if (IStatus.OK == dialog.open()) {
+                    text.setText(dialog.getValue());
+                }
+                return null;
+            }
+        };
+        GridDataFactory.fillDefaults().grab(true, true).applyTo(description.getControl());
+
+        toolkit.createLabel(revisions, "Reference: ");
+        DialogText reference = new DialogText(revisions, toolkit) {
+
+            @Override
+            protected Object openDialogBox(Text text) {
+                Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+                MultilineTextDialog dialog = new MultilineTextDialog(shell, Strings.getAsString(text.getText()),
+                        "Reference");
+                if (IStatus.OK == dialog.open()) {
+                    text.setText(dialog.getValue());
+                }
+                return null;
+            }
+        };
+        GridDataFactory.fillDefaults().grab(true, true).applyTo(reference.getControl());
+        if (null != module) {
+            if (module.getRevisions().isEmpty()) {
+                module.getRevisions().add(ModelFactory.eINSTANCE.createRevision());
+            }
+            Revision revision = module.getRevisions().get(0);
+            Binding binding = bindingContext.bindValue(WidgetProperties.text(SWT.Modify).observeDelayed(200, name),
+                    EMFProperties.value(YangModelUtil.MODEL_PACKAGE.getNamedNode_Name()).observe(revision));
+            binding.updateModelToTarget();
+            binding = bindingContext.bindValue(
+                    WidgetProperties.text(SWT.Modify).observeDelayed(200, description.getTextControl()),
+                    EMFProperties.value(YangModelUtil.MODEL_PACKAGE.getTag_Value())
+                            .observe(YangModelUtil.getTag(YangTag.DESCRIPTION, revision)));
+            binding.updateModelToTarget();
+            binding = bindingContext.bindValue(
+                    WidgetProperties.text(SWT.Modify).observeDelayed(200, reference.getTextControl()),
+                    EMFProperties.value(YangModelUtil.MODEL_PACKAGE.getTag_Value())
+                            .observe(YangModelUtil.getTag(YangTag.REFERENCE, revision)));
+            binding.updateModelToTarget();
+        }
+
+        // end of Temporary code
+
+        /*
+         * GridLayoutFactory.swtDefaults().applyTo(revisions);
+         * GridDataFactory.fillDefaults().grab(true, false).applyTo(section);
+         *
+         * createRevisionTable(revisions); refreshRevisionTable();
+         * revisionTable.addSelectionChangedListener(new ISelectionChangedListener() {
+         *
+         * @Override public void selectionChanged(SelectionChangedEvent event) { if
+         * (revisionTable.getSelection() instanceof IStructuredSelection) { Object selected =
+         * ((IStructuredSelection) revisionTable.getSelection()).getFirstElement(); if (null !=
+         * selected && selected instanceof Revision) { // editPropertyForm.setRevision((Revision)
+         * selected); setPropertiesPaneVisible(true); } }
+         *
+         * } });
+         */
+        section.setClient(revisions);
+    }
+
+    protected void createImportSection(Composite parent) {
+        final Section section = createSection(parent, "Imports");
+        Composite imports = toolkit.createComposite(section);
+        GridLayoutFactory.swtDefaults().applyTo(imports);
+        GridDataFactory.fillDefaults().grab(true, false).applyTo(section);
+        createImportTable(imports);
+        createImportButtonToolbar(section);
+        updateImportTable();
+        importTable.addSelectionChangedListener(new ISelectionChangedListener() {
+
+            @Override
+            public void selectionChanged(SelectionChangedEvent event) {
+                Object selected = ((IStructuredSelection) importTable.getSelection()).getFirstElement();
+                if (null != selected && selected instanceof Import) {
+                    // editPropertyForm.setImport((Import) selected);
+                    setPropertiesPaneVisible(true);
+                }
+
+            }
+        });
+        section.setClient(imports);
+    }
+
+    protected Composite createImportTable(Composite parent) {
+        final Table t = toolkit.createTable(parent, SWT.FULL_SELECTION | SWT.V_SCROLL);
+        t.setLinesVisible(false);
+        t.setHeaderVisible(false);
+        GridDataFactory.fillDefaults().grab(true, true).applyTo(t);
+        importTable = new TableViewer(t);
+        importTable.setContentProvider(new ArrayContentProvider());
+        final TableViewerColumn col = new TableViewerColumn(importTable, SWT.NONE);
+        col.setLabelProvider(new ColumnLabelProvider() {
+
+            @Override
+            public Image getImage(Object element) {
+                return GraphitiUi.getImageService().getImageForId(YangDiagramImageProvider.DIAGRAM_TYPE_PROVIDER_ID,
+                        YangDiagramImageProvider.IMG_IMPORT_PROPOSAL);
+            }
+
+            @Override
+            public String getText(Object element) {
+                if (YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getImport(), element)) {
+                    return ((Import) element).getPrefix() + " : " + ((Import) element).getModule();
+                }
+                return super.getText(element);
+            }
+        });
+        t.addControlListener(new ControlListener() {
+            @Override
+            public void controlResized(ControlEvent e) {
+                col.getColumn().setWidth(t.getSize().x - 30);
+            }
+
+            @Override
+            public void controlMoved(ControlEvent e) {
+            }
+        });
+        col.getColumn().setWidth(t.getSize().x - 30);
+        return t;
+    }
+
+    protected void createImportButtonToolbar(Section section) {
+        ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT);
+        ToolBar toolbar = toolBarManager.createControl(section);
+        toolbar.setCursor(Display.getDefault().getSystemCursor(SWT.CURSOR_HAND));
+
+        Action addButton = new Action("Add new import", IAction.AS_CHECK_BOX) {
+            @Override
+            public void run() {
+                super.run();
+                Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+                AddImportDialog dialog = new AddImportDialog(shell, module, file);
+                if (0 <= dialog.open()) {
+                    YangModelUtil.add(module, dialog.getResultImport(), module.getChildren().size());
+                    updateImportTable();
+                }
+                setChecked(false);
+            }
+        };
+
+        addButton.setImageDescriptor(GraphitiUi.getImageService().getImageDescriptorForId(
+                YangDiagramImageProvider.DIAGRAM_TYPE_PROVIDER_ID, YangDiagramImageProvider.IMG_ADD_TOOL_PROPOSAL));
+        addButton.setEnabled(true);
+        toolBarManager.add(addButton);
+
+        Action deleteButton = new Action("Delete selected import", IAction.AS_CHECK_BOX) {
+
+            @SuppressWarnings("unchecked")
+            @Override
+            public void run() {
+                super.run();
+                if (importTable.getSelection() instanceof IStructuredSelection) {
+                    Iterator<Object> iter = ((IStructuredSelection) importTable.getSelection()).iterator();
+                    while (iter.hasNext()) {
+                        module.getChildren().remove(iter.next());
+                    }
+                    updateImportTable();
+                    setChecked(false);
+                }
+            }
+        };
+
+        deleteButton.setImageDescriptor(GraphitiUi.getImageService().getImageDescriptorForId(
+                YangDiagramImageProvider.DIAGRAM_TYPE_PROVIDER_ID, YangDiagramImageProvider.IMG_DELETE_TOOL_PROPOSAL));
+        deleteButton.setEnabled(true);
+        toolBarManager.add(deleteButton);
+        toolBarManager.update(true);
+        section.setTextClient(toolbar);
+    }
+
+    public void update() {
+        updateImportTable();
+        updateBelongsTo();
+    }
+
+    protected void updateImportTable() {
+        if (null != module) {
+            importTable.setInput(YangModelUtil.filter(module.getChildren(), YangModelUtil.MODEL_PACKAGE.getImport()));
+        }
+    }
+
+    protected void refreshRevisionTable() {
+        if (null != module) {
+            revisionTable.setInput(module.getRevisions());
+        }
+    }
+
+    protected Section createSection(Composite parent, String title) {
+        return createSection(parent, title, Section.TITLE_BAR | Section.TWISTIE | Section.EXPANDED);
+    }
+
+    protected Section createSection(final Composite parent, String title, int styles) {
+        Section section = toolkit.createSection(parent, styles);
+        GridLayoutFactory.fillDefaults().applyTo(section);
+        GridDataFactory.fillDefaults().grab(true, false).applyTo(section);
+        section.setText(title);
+        section.addExpansionListener(new ExpansionAdapter() {
+            @Override
+            public void expansionStateChanged(ExpansionEvent e) {
+                parent.layout();
+            }
+        });
+        return section;
+    }
+
+    public Composite getDiagram() {
+        return diagram;
+    }
+
+    @Override
+    public Module getBusinessObject() {
+        return module;
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/editors/YangDiagramPersistencyBehavior.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/editors/YangDiagramPersistencyBehavior.java
new file mode 100644 (file)
index 0000000..fc6172f
--- /dev/null
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.editors;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.graphiti.mm.pictograms.Diagram;
+import org.eclipse.graphiti.services.Graphiti;
+import org.eclipse.graphiti.ui.editor.DefaultPersistencyBehavior;
+import org.eclipse.graphiti.ui.editor.DiagramBehavior;
+
+public class YangDiagramPersistencyBehavior extends DefaultPersistencyBehavior {
+
+    private String DIAGRAM_TYPE_ID = "yang";
+
+    public YangDiagramPersistencyBehavior(DiagramBehavior diagramBehavior) {
+        super(diagramBehavior);
+    }
+
+    @Override
+    public Diagram loadDiagram(URI uri) {
+        Diagram diagram = super.loadDiagram(uri);
+        if (null == diagram) {
+            diagram = Graphiti.getPeCreateService().createDiagram(DIAGRAM_TYPE_ID, uri.lastSegment(), false);
+        }
+        return diagram;
+    }
+
+    @Override
+    public void saveDiagram(IProgressMonitor monitor) {
+        // super.saveDiagram(monitor);
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/editors/YangDiagramRefreshBehavior.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/editors/YangDiagramRefreshBehavior.java
new file mode 100644 (file)
index 0000000..ab12cec
--- /dev/null
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.editors;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
+import org.eclipse.graphiti.ui.editor.DefaultRefreshBehavior;
+import org.eclipse.graphiti.ui.editor.DiagramBehavior;
+
+import com.cisco.yangide.ext.model.editor.figures.FeedbackFigure;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 22, 2014
+ */
+public class YangDiagramRefreshBehavior extends DefaultRefreshBehavior {
+
+    /**
+     * @param diagramBehavior
+     */
+    public YangDiagramRefreshBehavior(DiagramBehavior diagramBehavior) {
+        super(diagramBehavior);
+    }
+
+    @Override
+    public boolean shouldRefresh(Object obj) {
+        if (obj instanceof AbstractGraphicalEditPart) {
+            IFigure figure = ((AbstractGraphicalEditPart) obj).getFigure();
+            for (Object child : figure.getChildren()) {
+                if (child instanceof FeedbackFigure) {
+                    FeedbackFigure f = (FeedbackFigure) child;
+                    if (f.getEditPart() == null) {
+                        f.setEditPart((AbstractGraphicalEditPart) obj);
+                    }
+                    break;
+                }
+            }
+        }
+        return super.shouldRefresh(obj);
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/editors/YangPaletteBehavior.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/editors/YangPaletteBehavior.java
new file mode 100644 (file)
index 0000000..2ad433c
--- /dev/null
@@ -0,0 +1,189 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.editors;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.text.FlowPage;
+import org.eclipse.draw2d.text.TextFlow;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.KeyHandler;
+import org.eclipse.gef.Tool;
+import org.eclipse.gef.dnd.TemplateTransferDragSourceListener;
+import org.eclipse.gef.internal.ui.palette.editparts.DetailedLabelFigure;
+import org.eclipse.gef.tools.ConnectionCreationTool;
+import org.eclipse.gef.tools.CreationTool;
+import org.eclipse.gef.ui.palette.PaletteViewer;
+import org.eclipse.gef.ui.palette.PaletteViewerProvider;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.services.Graphiti;
+import org.eclipse.graphiti.ui.editor.DefaultPaletteBehavior;
+import org.eclipse.graphiti.ui.editor.DiagramBehavior;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 29, 2014
+ */
+@SuppressWarnings("restriction")
+public class YangPaletteBehavior extends DefaultPaletteBehavior {
+    private Map<String, EClass> toolEClassMap;
+    private IFigure rootFigure;
+
+    public YangPaletteBehavior(DiagramBehavior diagramBehavior) {
+        super(diagramBehavior);
+        toolEClassMap = new HashMap<>();
+        toolEClassMap.put("grouping", ModelPackage.Literals.GROUPING);
+        toolEClassMap.put("container", ModelPackage.Literals.CONTAINER);
+        toolEClassMap.put("rpc", ModelPackage.Literals.RPC);
+        toolEClassMap.put("input", ModelPackage.Literals.RPC_IO);
+        toolEClassMap.put("output", ModelPackage.Literals.RPC_IO);
+        toolEClassMap.put("notification", ModelPackage.Literals.NOTIFICATION);
+        toolEClassMap.put("augment", ModelPackage.Literals.AUGMENT);
+        toolEClassMap.put("list", ModelPackage.Literals.LIST);
+        toolEClassMap.put("choice", ModelPackage.Literals.CHOICE);
+        toolEClassMap.put("case", ModelPackage.Literals.CHOICE_CASE);
+        toolEClassMap.put("leaf", ModelPackage.Literals.LEAF);
+        toolEClassMap.put("anyxml", ModelPackage.Literals.ANYXML);
+        toolEClassMap.put("uses", ModelPackage.Literals.USES);
+        toolEClassMap.put("deviation", ModelPackage.Literals.DEVIATION);
+        toolEClassMap.put("extension", ModelPackage.Literals.EXTENSION);
+        toolEClassMap.put("feature", ModelPackage.Literals.FEATURE);
+        toolEClassMap.put("identity", ModelPackage.Literals.IDENTITY);
+        toolEClassMap.put("leaf list", ModelPackage.Literals.LEAF_LIST);
+        toolEClassMap.put("typedef", ModelPackage.Literals.TYPEDEF);
+    }
+
+    @Override
+    protected PaletteViewerProvider createPaletteViewerProvider() {
+        return new PaletteViewerProvider(diagramBehavior.getEditDomain()) {
+            private KeyHandler paletteKeyHandler = null;
+
+            @Override
+            public PaletteViewer createPaletteViewer(Composite parent) {
+                PaletteViewer pViewer = new PaletteViewer() {
+                    @Override
+                    protected void setRootFigure(IFigure figure) {
+                        super.setRootFigure(figure);
+                        rootFigure = figure;
+                    }
+                };
+                pViewer.createControl(parent);
+                configurePaletteViewer(pViewer);
+                hookPaletteViewer(pViewer);
+                return pViewer;
+            }
+
+            @Override
+            protected void configurePaletteViewer(PaletteViewer viewer) {
+                super.configurePaletteViewer(viewer);
+                viewer.getKeyHandler().setParent(getPaletteKeyHandler());
+                viewer.addDragSourceListener(new TemplateTransferDragSourceListener(viewer));
+            }
+
+            /**
+             * @return Palette Key Handler for the palette
+             */
+            private KeyHandler getPaletteKeyHandler() {
+                if (paletteKeyHandler == null) {
+                    paletteKeyHandler = new KeyHandler() {
+                        /**
+                         * Processes a <i>key released </i> event. This method is called by the Tool
+                         * whenever a key is released, and the Tool is in the proper state.
+                         * Overridden to support pressing the enter key to create a shape or
+                         * connection (between two selected shapes)
+                         *
+                         * @param event the KeyEvent
+                         * @return <code>true</code> if KeyEvent was handled in some way
+                         */
+                        @Override
+                        public boolean keyReleased(KeyEvent event) {
+                            if (event.keyCode == SWT.Selection) {
+                                Tool tool = getEditDomain().getPaletteViewer().getActiveTool().createTool();
+                                if (tool instanceof CreationTool || tool instanceof ConnectionCreationTool) {
+                                    tool.keyUp(event, diagramBehavior.getDiagramContainer().getGraphicalViewer());
+                                    // Deactivate current selection
+                                    getEditDomain().getPaletteViewer().setActiveTool(null);
+                                    return true;
+                                }
+                            }
+                            return super.keyReleased(event);
+                        }
+                    };
+                }
+                return paletteKeyHandler;
+            }
+        };
+    }
+
+    public void updateSelection(ISelection selection) {
+        EClass container = null;
+        if (selection != null && selection instanceof StructuredSelection
+                && ((StructuredSelection) selection).size() == 1) {
+            EditPart editPart = (EditPart) ((StructuredSelection) selection).getFirstElement();
+            if (editPart.getModel() != null && editPart.getModel() instanceof PictogramElement) {
+                PictogramElement model = (PictogramElement) editPart.getModel();
+                EObject eObject = Graphiti.getLinkService().getBusinessObjectForLinkedPictogramElement(model);
+                if (eObject != null) {
+                    container = eObject.eClass();
+                }
+            }
+        }
+
+        ArrayList<DetailedLabelFigure> list = new ArrayList<>();
+        aggregateToolFigures(rootFigure, list);
+        for (DetailedLabelFigure figure : list) {
+            if (container == null || getToolEClass(figure) == null) {
+                figure.setForegroundColor(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK));
+            } else {
+                if (YangModelUtil.compositeNodeMap.containsKey(container)
+                        && YangModelUtil.compositeNodeMap.get(container).contains(getToolEClass(figure))) {
+                    figure.setForegroundColor(Display.getCurrent().getSystemColor(SWT.COLOR_BLACK));
+                } else {
+                    figure.setForegroundColor(Display.getCurrent().getSystemColor(SWT.COLOR_GRAY));
+                }
+            }
+            figure.repaint();
+        }
+    }
+
+    private void aggregateToolFigures(IFigure parent, List<DetailedLabelFigure> list) {
+        if (parent instanceof DetailedLabelFigure) {
+            DetailedLabelFigure fig = (DetailedLabelFigure) parent;
+            if (fig.getChildren().size() == 2 && fig.getChildren().get(1) instanceof FlowPage) {
+                list.add(fig);
+            }
+            return;
+        }
+        if (parent.getChildren().size() > 0) {
+            for (Object obj : parent.getChildren()) {
+                aggregateToolFigures((IFigure) obj, list);
+            }
+        }
+    }
+
+    private EClass getToolEClass(DetailedLabelFigure figure) {
+        TextFlow textFlow = ((TextFlow) ((FlowPage) figure.getChildren().get(1)).getChildren().get(0));
+        String text = textFlow.getText();
+        return toolEClassMap.get(text);
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/features/AddReferenceConnectionFeature.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/features/AddReferenceConnectionFeature.java
new file mode 100644 (file)
index 0000000..e181d1b
--- /dev/null
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.features;
+
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.context.IAddConnectionContext;
+import org.eclipse.graphiti.features.context.IAddContext;
+import org.eclipse.graphiti.features.impl.AbstractAddFeature;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+
+import com.cisco.yangide.ext.model.editor.util.YangModelUIUtil;
+
+public class AddReferenceConnectionFeature extends AbstractAddFeature {
+
+    public AddReferenceConnectionFeature(IFeatureProvider fp) {
+        super(fp);
+    }
+
+    @Override
+    public boolean canAdd(IAddContext context) {
+        if (context instanceof IAddConnectionContext && null != context.getNewObject()) {
+            IAddConnectionContext acc = (IAddConnectionContext) context;
+            return null != acc.getSourceAnchor() && null != acc.getTargetAnchor();
+        }
+        return false;
+    }
+
+    @Override
+    public PictogramElement add(IAddContext context) {
+        return YangModelUIUtil.drawPictogramConnectionElement((IAddConnectionContext) context, getFeatureProvider());
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/features/DiagramLayoutFeature.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/features/DiagramLayoutFeature.java
new file mode 100644 (file)
index 0000000..f901a81
--- /dev/null
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.features;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.context.ILayoutContext;
+import org.eclipse.graphiti.features.impl.AbstractLayoutFeature;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
+import org.eclipse.graphiti.mm.pictograms.Diagram;
+import org.eclipse.graphiti.mm.pictograms.Shape;
+
+import com.cisco.yangide.ext.model.editor.util.LayoutUtil;
+
+public class DiagramLayoutFeature extends AbstractLayoutFeature {
+
+    public DiagramLayoutFeature(IFeatureProvider fp) {
+        super(fp);
+    }
+
+    @Override
+    public boolean canLayout(ILayoutContext context) {
+        return context.getPictogramElement() instanceof Diagram;
+    }
+
+    @Override
+    public boolean layout(ILayoutContext context) {
+        if (context.getPictogramElement() instanceof ContainerShape) {
+            EList<Shape> elements = ((ContainerShape) context.getPictogramElement()).getChildren();
+            for (Shape sh : elements) {
+                layoutPictogramElement(sh);
+            }
+            LayoutUtil.layoutDiagram(getFeatureProvider());
+            return true;
+        }
+        return false;
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/features/DirectEditingOnDoubleClickFeature.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/features/DirectEditingOnDoubleClickFeature.java
new file mode 100644 (file)
index 0000000..df973b6
--- /dev/null
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.features;
+
+import org.eclipse.graphiti.features.IDirectEditingInfo;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.context.ICustomContext;
+import org.eclipse.graphiti.features.custom.AbstractCustomFeature;
+import org.eclipse.graphiti.mm.pictograms.Shape;
+
+public class DirectEditingOnDoubleClickFeature extends AbstractCustomFeature {
+
+    public DirectEditingOnDoubleClickFeature(IFeatureProvider fp) {
+        super(fp);
+    }
+
+    @Override
+    public boolean canExecute(ICustomContext context) {
+        return true;
+    }
+
+    @Override
+    public void execute(ICustomContext context) {
+        final IDirectEditingInfo directEditingInfo = getFeatureProvider().getDirectEditingInfo();
+        directEditingInfo.setActive(true);
+        directEditingInfo.setMainPictogramElement(((Shape) context.getInnerPictogramElement()).getContainer());
+        directEditingInfo.setPictogramElement(context.getInnerPictogramElement());
+        directEditingInfo.setGraphicsAlgorithm(context.getInnerGraphicsAlgorithm());
+        getDiagramBehavior().refresh();
+
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/features/ExtractGroupingCustomFeature.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/features/ExtractGroupingCustomFeature.java
new file mode 100644 (file)
index 0000000..ce15406
--- /dev/null
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.features;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.context.ICustomContext;
+import org.eclipse.graphiti.features.custom.AbstractCustomFeature;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+
+import com.cisco.yangide.ext.model.Module;
+import com.cisco.yangide.ext.model.Node;
+import com.cisco.yangide.ext.model.editor.editors.ISourceModelManager;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 19, 2014
+ */
+public class ExtractGroupingCustomFeature extends AbstractCustomFeature {
+
+    private ISourceModelManager sourceModelManager;
+
+    public ExtractGroupingCustomFeature(IFeatureProvider fp, ISourceModelManager sourceModelManager) {
+        super(fp);
+        this.sourceModelManager = sourceModelManager;
+    }
+
+    @Override
+    public void execute(ICustomContext context) {
+        List<Node> nodes = new ArrayList<>();
+        PictogramElement[] elements = context.getPictogramElements();
+        for (PictogramElement element : elements) {
+            nodes.add((Node) getBusinessObjectForPictogramElement(element));
+        }
+        sourceModelManager.extractGrouping(nodes);
+    }
+
+    @Override
+    public boolean canExecute(ICustomContext context) {
+        PictogramElement[] elements = context.getPictogramElements();
+        if (elements.length == 0) {
+            return false;
+        }
+        Node parent = null;
+        for (PictogramElement element : elements) {
+            Object obj = getBusinessObjectForPictogramElement(element);
+            if (!(obj instanceof Node) || obj instanceof Module) {
+                return false;
+            }
+            if (parent != null && ((Node) obj).getParent() != parent) {
+                return false;
+            }
+            parent = ((Node) obj).getParent();
+        }
+        return true;
+    }
+
+    @Override
+    public String getName() {
+        return "Extract Grouping...";
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/features/RemoveConnectionFeature.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/features/RemoveConnectionFeature.java
new file mode 100644 (file)
index 0000000..ad2a021
--- /dev/null
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.features;
+
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.context.IRemoveContext;
+import org.eclipse.graphiti.features.impl.DefaultRemoveFeature;
+import org.eclipse.graphiti.mm.pictograms.Connection;
+import org.eclipse.graphiti.mm.pictograms.FreeFormConnection;
+
+public class RemoveConnectionFeature extends DefaultRemoveFeature {
+
+    public RemoveConnectionFeature(IFeatureProvider fp) {
+        super(fp);
+    }
+
+    @Override
+    public boolean canRemove(IRemoveContext context) {
+        return context.getPictogramElement() instanceof Connection;
+    }
+
+    @Override
+    public void preRemove(IRemoveContext context) {
+        if (context.getPictogramElement() instanceof Connection) {
+            Connection con = (Connection) context.getPictogramElement();
+            con.getConnectionDecorators().clear();
+            if (con instanceof FreeFormConnection) {
+                ((FreeFormConnection) con).getBendpoints().clear();
+            }
+        }
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/features/TextDirectEditingFeature.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/features/TextDirectEditingFeature.java
new file mode 100644 (file)
index 0000000..cd24bf2
--- /dev/null
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.features;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.context.IDirectEditingContext;
+import org.eclipse.graphiti.features.impl.AbstractDirectEditingFeature;
+import org.eclipse.graphiti.mm.pictograms.Shape;
+
+public class TextDirectEditingFeature extends AbstractDirectEditingFeature {
+    public TextDirectEditingFeature(IFeatureProvider fp) {
+        super(fp);
+    }
+
+    @Override
+    public int getEditingType() {
+        return TYPE_TEXT;
+    }
+
+    @Override
+    public String getInitialValue(IDirectEditingContext context) {
+        Object[] objects = getAllBusinessObjectsForPictogramElement(context.getPictogramElement());
+        if (null != objects && 2 == objects.length && objects[0] instanceof EObject
+                && objects[1] instanceof EStructuralFeature) {
+            return null == ((EObject) objects[0]).eGet((EStructuralFeature) objects[1]) ? null
+                    : ((EObject) objects[0]).eGet((EStructuralFeature) objects[1]).toString();
+        }
+        return null;
+    }
+
+    @Override
+    public boolean canDirectEdit(IDirectEditingContext context) {
+        Object[] objects = getAllBusinessObjectsForPictogramElement(context.getPictogramElement());
+        return null != objects && 2 == objects.length;
+    }
+
+    @Override
+    public void setValue(String value, IDirectEditingContext context) {
+        Object[] objects = getAllBusinessObjectsForPictogramElement(context.getPictogramElement());
+        if (null != objects && 2 == objects.length && objects[0] instanceof EObject
+                && objects[1] instanceof EStructuralFeature) {
+            ((EObject) objects[0]).eSet(((EStructuralFeature) objects[1]), value);
+        }
+        updatePictogramElement(((Shape) context.getPictogramElement()));
+    }
+
+    @Override
+    public boolean stretchFieldToFitText() {
+        return true;
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/features/UpdateTextFeature.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/features/UpdateTextFeature.java
new file mode 100644 (file)
index 0000000..439800f
--- /dev/null
@@ -0,0 +1,127 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.features;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.IReason;
+import org.eclipse.graphiti.features.context.IUpdateContext;
+import org.eclipse.graphiti.features.impl.AbstractUpdateFeature;
+import org.eclipse.graphiti.features.impl.Reason;
+import org.eclipse.graphiti.mm.algorithms.Text;
+import org.eclipse.graphiti.mm.pictograms.Shape;
+
+import com.cisco.yangide.ext.model.Node;
+import com.cisco.yangide.ext.model.TypedNode;
+import com.cisco.yangide.ext.model.editor.util.LayoutUtil;
+import com.cisco.yangide.ext.model.editor.util.PropertyUtil;
+import com.cisco.yangide.ext.model.editor.util.YangModelUIUtil;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+public class UpdateTextFeature extends AbstractUpdateFeature {
+
+    public UpdateTextFeature(IFeatureProvider fp) {
+        super(fp);
+    }
+
+    @Override
+    public boolean canUpdate(IUpdateContext context) {
+        Object[] objects = getAllBusinessObjectsForPictogramElement(context.getPictogramElement());
+        return PropertyUtil.isObjectShapeProp(context.getPictogramElement(), PropertyUtil.OBJECT_HEADER_TEXT_SHAPE_KEY)
+                || PropertyUtil.isObjectShapeProp(context.getPictogramElement(),
+                        PropertyUtil.BUSINESS_OBJECT_TYPE_SHAPE_KEY)
+                || (null != objects && 2 == objects.length && objects[0] instanceof EObject
+                        && objects[1] instanceof EStructuralFeature);
+
+    }
+
+    @Override
+    public IReason updateNeeded(IUpdateContext context) {
+        String pictogramValue = null;
+        String objectValue = null;
+        Object[] objects = getAllBusinessObjectsForPictogramElement(context.getPictogramElement());
+        if (null == objects || 0 >= objects.length
+                || !(context.getPictogramElement().getGraphicsAlgorithm() instanceof Text)) {
+            return Reason.createFalseReason();
+        }
+        pictogramValue = ((Text) context.getPictogramElement().getGraphicsAlgorithm()).getValue();
+
+        if (PropertyUtil.isObjectShapeProp(context.getPictogramElement(), PropertyUtil.OBJECT_HEADER_TEXT_SHAPE_KEY)) {
+            if (null != objects && 0 != objects.length) {
+                if (null != objects && 1 < objects.length) {
+                    if (null != objects && 2 == objects.length && objects[0] instanceof EObject
+                            && objects[1] instanceof EStructuralFeature) {
+                        objectValue = null == ((EObject) objects[0]).eGet((EStructuralFeature) objects[1]) ? null
+                                : ((EObject) objects[0]).eGet((EStructuralFeature) objects[1]).toString();
+                    }
+                } else if (YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getNode(), objects[0])) {
+                    objectValue = YangModelUtil.getQNamePresentation((Node) objects[0]);
+                }
+            }
+        } else if (PropertyUtil.isObjectShapeProp(context.getPictogramElement(),
+                PropertyUtil.BUSINESS_OBJECT_TYPE_SHAPE_KEY)) {
+            if (null != objects[0] && YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getTypedNode(), objects[0])) {
+                objectValue = YangModelUIUtil.getTypeText((TypedNode) objects[0]);
+            }
+        } else {
+            return Reason.createFalseReason();
+        }
+
+        if ((null == pictogramValue && null != objectValue)
+                || (null != pictogramValue && !pictogramValue.equals(objectValue))) {
+            return Reason.createTrueReason("Attribute is out of date"); //$NON-NLS-1$
+        } else {
+            return Reason.createFalseReason();
+        }
+    }
+
+    @Override
+    public boolean update(IUpdateContext context) {
+        Object[] objects = getAllBusinessObjectsForPictogramElement(context.getPictogramElement());
+        String objectValue = null;
+        if (null == objects || 0 >= objects.length
+                || !(context.getPictogramElement().getGraphicsAlgorithm() instanceof Text)) {
+            return false;
+        }
+        if (PropertyUtil.isObjectShapeProp(context.getPictogramElement(), PropertyUtil.OBJECT_HEADER_TEXT_SHAPE_KEY)) {
+            if (null != objects && 2 == objects.length && objects[0] instanceof EObject
+                    && objects[1] instanceof EStructuralFeature) {
+                objectValue = null == ((EObject) objects[0]).eGet((EStructuralFeature) objects[1]) ? null
+                        : ((EObject) objects[0]).eGet((EStructuralFeature) objects[1]).toString();
+
+            } else if (null != objects && 1 == objects.length
+                    && YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getNode(), objects[0])) {
+                objectValue = YangModelUtil.getQNamePresentation((Node) objects[0]);
+                YangModelUIUtil.updateConnections((Node) objects[0], getFeatureProvider());
+            }
+            if (context.getPictogramElement().getGraphicsAlgorithm() instanceof Text) {
+                ((Text) context.getPictogramElement().getGraphicsAlgorithm()).setValue(objectValue);
+                if (context.getPictogramElement() instanceof Shape) {
+                    LayoutUtil.layoutContainerShapeHeader(((Shape) context.getPictogramElement()).getContainer(),
+                            getFeatureProvider());
+                }
+                return true;
+            }
+        } else if (PropertyUtil.isObjectShapeProp(context.getPictogramElement(),
+                PropertyUtil.BUSINESS_OBJECT_TYPE_SHAPE_KEY)) {
+            if (null != objects[0] && YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getTypedNode(), objects[0])) {
+                objectValue = YangModelUIUtil.getTypeText((TypedNode) objects[0]);
+                if (context.getPictogramElement().getGraphicsAlgorithm() instanceof Text) {
+                    ((Text) context.getPictogramElement().getGraphicsAlgorithm()).setValue(objectValue);
+                    if (context.getPictogramElement() instanceof Shape) {
+                        LayoutUtil.layoutContainerShapeHeader(((Shape) context.getPictogramElement()).getContainer(),
+                                getFeatureProvider());
+                    }
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/figures/FeedbackEditPolicy.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/figures/FeedbackEditPolicy.java
new file mode 100644 (file)
index 0000000..81e4882
--- /dev/null
@@ -0,0 +1,123 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.figures;
+
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.RequestConstants;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.editpolicies.GraphicalEditPolicy;
+import org.eclipse.graphiti.features.context.IContext;
+import org.eclipse.graphiti.features.context.ITargetContext;
+import org.eclipse.graphiti.internal.command.CommandContainer;
+import org.eclipse.graphiti.internal.command.ICommand;
+import org.eclipse.graphiti.internal.command.MoveShapeFeatureCommandWithContext;
+import org.eclipse.graphiti.ui.internal.command.CreateModelObjectCommand;
+import org.eclipse.graphiti.ui.internal.command.GefCommandWrapper;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 22, 2014
+ */
+@SuppressWarnings("restriction")
+public class FeedbackEditPolicy extends GraphicalEditPolicy {
+
+    private FeedbackFigure feedbackFigure;
+    private EditPolicy editPolicy;
+
+    /**
+     * @param feedbackFigure
+     * @param editPolicy
+     */
+    public FeedbackEditPolicy(FeedbackFigure feedbackFigure, EditPolicy editPolicy) {
+        this.feedbackFigure = feedbackFigure;
+        this.editPolicy = editPolicy;
+    }
+
+    @Override
+    public EditPart getTargetEditPart(Request request) {
+        return editPolicy.getTargetEditPart(request);
+    }
+
+    @Override
+    public void eraseTargetFeedback(Request request) {
+        editPolicy.eraseTargetFeedback(request);
+        feedbackFigure.setVisible(false);
+    }
+
+    @Override
+    public void showTargetFeedback(Request request) {
+        if (request.getType().equals(RequestConstants.REQ_CREATE) || request.getType().equals(RequestConstants.REQ_ADD)
+                || request.getType().equals(RequestConstants.REQ_MOVE_CHILDREN)
+                || request.getType().equals(RequestConstants.REQ_MOVE)) {
+            if (request.getType().equals(RequestConstants.REQ_MOVE)) {
+                request.setType(RequestConstants.REQ_MOVE_CHILDREN);
+            }
+            Command command = getHost().getCommand(request);
+            if (command.canExecute()) {
+                int position = 0;
+                IContext context = getCommandContext(command);
+                EditPart container = getHost();
+                if (context instanceof ITargetContext) {
+                    while (!container.getModel().equals(((ITargetContext) context).getTargetContainer())) {
+                        container = container.getParent();
+                    }
+                }
+
+                if (null != context && null != context.getProperty("parent_position")) {
+                    position = (int) context.getProperty("parent_position");
+                }
+                EditPolicy policy = container.getEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE);
+                if (policy instanceof FeedbackEditPolicy) {
+                    ((FeedbackEditPolicy) policy).showFeedback(request, position);
+                }
+            } else {
+                hideFeedback();
+            }
+        }
+
+    }
+
+    public void showFeedback(Request request, int position) {
+        feedbackFigure.setPosition(position);
+        feedbackFigure.setVisible(true);
+        feedbackFigure.repaint();
+        editPolicy.showTargetFeedback(request);
+    }
+
+    public void hideFeedback() {
+        feedbackFigure.setVisible(false);
+        feedbackFigure.repaint();
+    }
+
+    protected IContext getCommandContext(Command command) {
+        if (command instanceof CreateModelObjectCommand) {
+            return ((CreateModelObjectCommand) command).getContext();
+        }
+        if (command instanceof GefCommandWrapper) {
+            return getCommandContext(((GefCommandWrapper) command).getCommand());
+        }
+        return null;
+    }
+
+    protected IContext getCommandContext(ICommand command) {
+        if (command instanceof MoveShapeFeatureCommandWithContext) {
+            return ((MoveShapeFeatureCommandWithContext) command).getContext();
+        }
+        if (command instanceof CommandContainer) {
+            for (ICommand c : ((CommandContainer) command).getCommands()) {
+                IContext result = getCommandContext(c);
+                if (null != result) {
+                    return result;
+                }
+            }
+        }
+        return null;
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/figures/FeedbackFigure.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/figures/FeedbackFigure.java
new file mode 100644 (file)
index 0000000..e22a62f
--- /dev/null
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.figures;
+
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Shape;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
+import org.eclipse.graphiti.platform.ga.IGraphicsAlgorithmRenderer;
+import org.eclipse.graphiti.ui.internal.figures.GFRectangleFigure;
+import org.eclipse.graphiti.ui.internal.figures.GFRoundedRectangle;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+
+@SuppressWarnings("restriction")
+public class FeedbackFigure extends Shape implements IGraphicsAlgorithmRenderer {
+
+    private EditPart editPart;
+    private int position;
+
+    public FeedbackFigure(GraphicsAlgorithm algorithm) {
+        position = 0;
+        setVisible(false);
+    }
+
+    /**
+     * @param editPart
+     */
+    public void setEditPart(EditPart editPart) {
+        this.editPart = editPart;
+        editPart.installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE,
+                new FeedbackEditPolicy(this, editPart.getEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE)));
+    }
+
+    /**
+     * @return the editPart
+     */
+    public EditPart getEditPart() {
+        return editPart;
+    }
+
+    public void setPosition(int position) {
+        if (position == 0) {
+            this.position = getParent().getBounds().y + 20;
+        } else {
+            int pos = 0;
+            IFigure figure = null;
+            for (Object child : getParent().getChildren()) {
+                if (child instanceof GFRectangleFigure || child instanceof GFRoundedRectangle) {
+                    figure = (IFigure) child;
+                    pos++;
+                    if (pos == position) {
+                        break;
+                    }
+                }
+            }
+            if (figure != null) {
+                this.position = figure.getBounds().getBottom().y;
+            }
+        }
+        setBounds(getParent().getBounds());
+    }
+
+    @Override
+    public void paint(Graphics graphics) {
+        super.paint(graphics);
+    }
+
+    @Override
+    public void repaint() {
+        super.repaint();
+    }
+
+    @Override
+    protected void fillShape(Graphics g) {
+    }
+
+    @Override
+    protected void outlineShape(Graphics g) {
+        int x = getParent().getBounds().x + 15;
+        int x2 = x + getParent().getBounds().width - 30;
+        g.setForegroundColor(Display.getDefault().getSystemColor(SWT.COLOR_BLUE));
+        g.drawPolyline(new int[] { x - 2, position - 2, x, position, x - 2, position + 2 });
+        g.drawPolyline(new int[] { x, position, x2, position });
+        g.drawPolyline(new int[] { x2 + 3, position - 3, x2, position, x2 + 2, position + 2 });
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/connections/DomainConnectionPattern.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/connections/DomainConnectionPattern.java
new file mode 100644 (file)
index 0000000..e93a8e7
--- /dev/null
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.patterns.connections;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.graphiti.features.context.IAddConnectionContext;
+import org.eclipse.graphiti.features.context.IAddContext;
+import org.eclipse.graphiti.features.context.ICreateConnectionContext;
+import org.eclipse.graphiti.mm.pictograms.Connection;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.pattern.AbstractConnectionPattern;
+import org.eclipse.graphiti.pattern.IConnectionPattern;
+
+import com.cisco.yangide.ext.model.editor.util.YangModelUIUtil;
+
+public abstract class DomainConnectionPattern extends AbstractConnectionPattern implements IConnectionPattern {
+
+    protected abstract EObject createEObject(ICreateConnectionContext context);
+
+    @Override
+    public Connection create(ICreateConnectionContext context) {
+        // create the domain object connection here
+        EObject newDomainObjectConnetion = createEObject(context);
+
+        return YangModelUIUtil.drawConnection(newDomainObjectConnetion, context.getSourceAnchor(),
+                context.getTargetAnchor(), getFeatureProvider());
+    }
+
+    @Override
+    public PictogramElement add(IAddContext context) {
+        IAddConnectionContext addConContext = (IAddConnectionContext) context;
+        return YangModelUIUtil.drawPictogramConnectionElement(addConContext, getFeatureProvider(), getCreateName());
+    }
+
+    @Override
+    public boolean canAdd(IAddContext context) {
+        return context instanceof IAddConnectionContext;
+    }
+
+    @Override
+    public String getCreateDescription() {
+        return "Creates new " + getCreateName() + " connection";
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/AnyxmlPattern.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/AnyxmlPattern.java
new file mode 100644 (file)
index 0000000..6d3abd3
--- /dev/null
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.patterns.objects;
+
+import org.eclipse.emf.ecore.EClass;
+
+import com.cisco.yangide.ext.model.editor.util.YangDiagramImageProvider;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+public class AnyxmlPattern extends DomainObjectPattern {
+
+    @Override
+    public EClass getObjectEClass() {
+        return YangModelUtil.MODEL_PACKAGE.getAnyxml();
+    }
+
+    @Override
+    public String getCreateImageId() {
+        return YangDiagramImageProvider.IMG_ANYXML_PROPOSAL;
+    }
+
+    @Override
+    public String getCreateName() {
+        return "anyxml";
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/AugmentPattern.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/AugmentPattern.java
new file mode 100644 (file)
index 0000000..3ea102d
--- /dev/null
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.patterns.objects;
+
+import org.eclipse.emf.ecore.EClass;
+
+import com.cisco.yangide.ext.model.editor.util.YangDiagramImageProvider;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+public class AugmentPattern extends DomainObjectPattern {
+
+    @Override
+    public EClass getObjectEClass() {
+        return YangModelUtil.MODEL_PACKAGE.getAugment();
+    }
+
+    @Override
+    public String getCreateImageId() {
+        return YangDiagramImageProvider.IMG_AUGMENT_PROPOSAL;
+    }
+
+    @Override
+    public String getCreateName() {
+        return "augment";
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/ChoiceCasePattern.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/ChoiceCasePattern.java
new file mode 100644 (file)
index 0000000..ce122c0
--- /dev/null
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.patterns.objects;
+
+import org.eclipse.emf.ecore.EClass;
+
+import com.cisco.yangide.ext.model.editor.util.YangDiagramImageProvider;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+public class ChoiceCasePattern extends DomainObjectPattern {
+
+    @Override
+    public String getCreateImageId() {
+        return YangDiagramImageProvider.IMG_CHOICE_CASE_PROPOSAL;
+    }
+
+    @Override
+    public String getCreateName() {
+        return "case";
+    }
+
+    @Override
+    public EClass getObjectEClass() {
+        return YangModelUtil.MODEL_PACKAGE.getChoiceCase();
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/ChoicePattern.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/ChoicePattern.java
new file mode 100644 (file)
index 0000000..ab34b97
--- /dev/null
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.patterns.objects;
+
+import org.eclipse.emf.ecore.EClass;
+
+import com.cisco.yangide.ext.model.editor.util.YangDiagramImageProvider;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+public class ChoicePattern extends DomainObjectPattern {
+
+    @Override
+    public String getCreateImageId() {
+        return YangDiagramImageProvider.IMG_CHOICE_PROPOSAL;
+    }
+
+    @Override
+    public String getCreateName() {
+        return "choice";
+    }
+
+    @Override
+    public EClass getObjectEClass() {
+        return YangModelUtil.MODEL_PACKAGE.getChoice();
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/ContainerPattern.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/ContainerPattern.java
new file mode 100644 (file)
index 0000000..a72a3e7
--- /dev/null
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.patterns.objects;
+
+import org.eclipse.emf.ecore.EClass;
+
+import com.cisco.yangide.ext.model.editor.util.YangDiagramImageProvider;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+public class ContainerPattern extends DomainObjectPattern {
+
+    @Override
+    public String getCreateName() {
+        return "container";
+    }
+
+    @Override
+    public String getCreateImageId() {
+        return YangDiagramImageProvider.IMG_CONTAINER_PROPOSAL;
+    }
+
+    @Override
+    public EClass getObjectEClass() {
+        return YangModelUtil.MODEL_PACKAGE.getContainer();
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/DeviationPattern.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/DeviationPattern.java
new file mode 100644 (file)
index 0000000..a0b6c84
--- /dev/null
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.patterns.objects;
+
+import org.eclipse.emf.ecore.EClass;
+
+import com.cisco.yangide.ext.model.editor.util.YangDiagramImageProvider;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+public class DeviationPattern extends DomainObjectPattern {
+
+    @Override
+    public EClass getObjectEClass() {
+        return YangModelUtil.MODEL_PACKAGE.getDeviation();
+    }
+
+    @Override
+    public String getCreateImageId() {
+        return YangDiagramImageProvider.IMG_DEVIATION_PROPOSAL;
+    }
+
+    @Override
+    public String getCreateName() {
+        return "deviation";
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/DomainObjectPattern.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/DomainObjectPattern.java
new file mode 100644 (file)
index 0000000..8a87746
--- /dev/null
@@ -0,0 +1,221 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.patterns.objects;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.graphiti.features.context.IAddContext;
+import org.eclipse.graphiti.features.context.ICreateContext;
+import org.eclipse.graphiti.features.context.ILayoutContext;
+import org.eclipse.graphiti.features.context.ILocationContext;
+import org.eclipse.graphiti.features.context.IMoveShapeContext;
+import org.eclipse.graphiti.features.context.IResizeShapeContext;
+import org.eclipse.graphiti.features.context.impl.AddContext;
+import org.eclipse.graphiti.features.context.impl.CreateContext;
+import org.eclipse.graphiti.features.context.impl.MoveShapeContext;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
+import org.eclipse.graphiti.mm.pictograms.Diagram;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.mm.pictograms.Shape;
+import org.eclipse.graphiti.pattern.AbstractPattern;
+import org.eclipse.graphiti.pattern.IPattern;
+
+import com.cisco.yangide.ext.model.ModelFactory;
+import com.cisco.yangide.ext.model.editor.util.LayoutUtil;
+import com.cisco.yangide.ext.model.editor.util.YangModelUIUtil;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+public abstract class DomainObjectPattern extends AbstractPattern implements IPattern {
+
+    public DomainObjectPattern() {
+        super(null);
+    }
+
+    @Override
+    public boolean canLayout(ILayoutContext context) {
+        return super.canLayout(context) && context.getPictogramElement() instanceof ContainerShape;
+    }
+
+    @Override
+    public boolean layout(ILayoutContext context) {
+        if (context.getPictogramElement() instanceof ContainerShape
+                && (!(context.getPictogramElement() instanceof Diagram))) {
+            LayoutUtil.layoutContainerShape((ContainerShape) context.getPictogramElement(), getFeatureProvider());
+            return true;
+        }
+        return false;
+    }
+
+    public abstract EClass getObjectEClass();
+
+    protected String getHeaderText(Object obj) {
+        return getCreateName();
+    }
+
+    @Override
+    public boolean canCreate(ICreateContext context) {
+        boolean canCreate = canCreateInitial(context);
+        while (!canCreate && !(context.getTargetContainer().getContainer() instanceof Diagram)) {
+            ((CreateContext) context).setY(context.getY() + context.getTargetContainer().getGraphicsAlgorithm().getY());
+            ((CreateContext) context).setTargetContainer(context.getTargetContainer().getContainer());
+            canCreate = canCreateInitial(context);
+        }
+        return canCreate;
+    }
+
+    public boolean canCreateInitial(ICreateContext context) {
+        return canContain(context, context.getTargetContainer());
+    }
+
+    @Override
+    protected boolean isPatternControlled(PictogramElement pictogramElement) {
+        Object domainObject = getBusinessObjectForPictogramElement(pictogramElement);
+        return isMainBusinessObjectApplicable(domainObject);
+    }
+
+    @Override
+    protected boolean isPatternRoot(PictogramElement pictogramElement) {
+        Object domainObject = getBusinessObjectForPictogramElement(pictogramElement);
+        return isMainBusinessObjectApplicable(domainObject);
+    }
+
+    protected EObject createEObject() {
+        return ModelFactory.eINSTANCE.create(getObjectEClass());
+    }
+
+    @Override
+    public Object[] create(ICreateContext context) {
+        EObject newDomainObject = createEObject();
+        ContainerShape con = context.getTargetContainer();
+        addGraphicalRepresentation(context, newDomainObject);
+        getDiagram().eResource().getContents().add(newDomainObject);
+        YangModelUtil.add(getBusinessObjectForPictogramElement(con), newDomainObject, YangModelUIUtil
+                .getPositionInParent(context.getTargetContainer(), context.getY(), getFeatureProvider()));
+        return new Object[] { newDomainObject };
+    }
+
+    protected boolean canContain(ILocationContext context, ContainerShape shape, Object n) {
+        Object parent = getBusinessObjectForPictogramElement(shape);
+        if (null != parent && YangModelUtil.canContain(parent) && YangModelUtil.canContain(parent, n)) {
+            setFeedBackPosition(context, shape);
+            return true;
+        }
+
+        return false;
+    }
+
+    protected boolean canContain(ILocationContext context, ContainerShape shape) {
+        Object parent = getBusinessObjectForPictogramElement(shape);
+        if (null != parent && YangModelUtil.canContain(parent) && parent instanceof EObject
+                && YangModelUtil.canContain(((EObject) parent).eClass(), getObjectEClass())) {
+            setFeedBackPosition(context, shape);
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean canMoveShape(IMoveShapeContext context) {
+        boolean canMove = canMoveInitial(context);
+        while (!canMove && !(context.getTargetContainer().getContainer() instanceof Diagram)) {
+            ((MoveShapeContext) context)
+                    .setY(context.getY() + context.getTargetContainer().getGraphicsAlgorithm().getY());
+            ((MoveShapeContext) context).setTargetContainer(context.getTargetContainer().getContainer());
+            canMove = canMoveInitial(context);
+        }
+        return canMove;
+    }
+
+    public boolean canMoveInitial(IMoveShapeContext context) {
+        if (context.getTargetContainer() == context.getSourceContainer()) {
+            setFeedBackPosition(context, context.getTargetContainer());
+            return true;
+        }
+        return canContain(context, context.getTargetContainer(),
+                getBusinessObjectForPictogramElement(context.getPictogramElement()));
+    }
+
+    @Override
+    public void moveShape(IMoveShapeContext context) {
+        super.moveShape(context);
+
+        if (!(context.getTargetContainer() instanceof Diagram && context.getSourceContainer() instanceof Diagram)) {
+            int pos = YangModelUtil.getPositionInParent(
+                    getBusinessObjectForPictogramElement(context.getSourceContainer()),
+                    getBusinessObjectForPictogramElement(context.getPictogramElement()));
+            int newPos = YangModelUIUtil.getPositionInParent(context.getTargetContainer(),
+                    (Shape) context.getPictogramElement(), getFeatureProvider());
+            if (context.getTargetContainer() != context.getSourceContainer() || pos != newPos) {
+                YangModelUtil.move(getBusinessObjectForPictogramElement(context.getSourceContainer()),
+                        getBusinessObjectForPictogramElement(context.getTargetContainer()),
+                        getBusinessObjectForPictogramElement(context.getPictogramElement()), newPos);
+                if (!(context.getTargetContainer() instanceof Diagram)) {
+                    layoutPictogramElement(context.getTargetContainer());
+                }
+            }
+        }
+        LayoutUtil.layoutDiagramConnections(getFeatureProvider());
+    }
+
+    @Override
+    public void resizeShape(IResizeShapeContext context) {
+        super.resizeShape(context);
+        layoutPictogramElement(context.getPictogramElement());
+        if (!(context.getShape().getContainer() instanceof Diagram)) {
+            layoutPictogramElement(context.getShape().getContainer());
+        }
+    }
+
+    @Override
+    public boolean isMainBusinessObjectApplicable(Object mainBusinessObject) {
+        return checkEClass(mainBusinessObject);
+    }
+
+    @Override
+    public boolean canAdd(IAddContext context) {
+        boolean canAdd = canAddInitial(context);
+        while (!canAdd && !(context.getTargetContainer().getContainer() instanceof Diagram)) {
+            ((AddContext) context).setY(context.getY() + context.getTargetContainer().getGraphicsAlgorithm().getY());
+            ((AddContext) context).setTargetContainer(context.getTargetContainer().getContainer());
+            canAdd = canAddInitial(context);
+        }
+        return canAdd;
+    }
+
+    public boolean canAddInitial(IAddContext context) {
+        Object parent = getBusinessObjectForPictogramElement(context.getTargetContainer());
+        return canContain(context, context.getTargetContainer(), context.getNewObject())
+                && checkEClass(context.getNewObject()) && null != parent
+                && YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getContainingNode(), parent);
+    }
+
+    @Override
+    public PictogramElement add(IAddContext context) {
+
+        PictogramElement result = YangModelUIUtil.drawPictogramElement(context, getFeatureProvider(),
+                getCreateImageId(), getHeaderText(context.getNewObject()));
+        YangModelUIUtil.updateConnections((EObject) context.getNewObject(), getFeatureProvider());
+        return result;
+    }
+
+    protected boolean checkEClass(Object obj) {
+        return obj instanceof EObject && getObjectEClass().isSuperTypeOf(((EObject) obj).eClass());
+    }
+
+    @Override
+    public String getCreateDescription() {
+        return "Creates new " + getCreateName() + " object";
+    }
+
+    protected void setFeedBackPosition(ILocationContext context, ContainerShape parent) {
+        context.putProperty("parent", parent);
+        context.putProperty("parent_position",
+                YangModelUIUtil.getPositionInParent(parent, context.getY(), getFeatureProvider()));
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/ExtensionPattern.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/ExtensionPattern.java
new file mode 100644 (file)
index 0000000..1d896be
--- /dev/null
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.patterns.objects;
+
+import org.eclipse.emf.ecore.EClass;
+
+import com.cisco.yangide.ext.model.editor.util.YangDiagramImageProvider;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+public class ExtensionPattern extends DomainObjectPattern {
+
+    @Override
+    public EClass getObjectEClass() {
+        return YangModelUtil.MODEL_PACKAGE.getExtension();
+    }
+
+    @Override
+    public String getCreateImageId() {
+        return YangDiagramImageProvider.IMG_EXTENSION_PROPOSAL;
+    }
+
+    @Override
+    public String getCreateName() {
+        return "extension";
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/FeaturePattern.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/FeaturePattern.java
new file mode 100644 (file)
index 0000000..7ec9fcd
--- /dev/null
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.patterns.objects;
+
+import org.eclipse.emf.ecore.EClass;
+
+import com.cisco.yangide.ext.model.editor.util.YangDiagramImageProvider;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+public class FeaturePattern extends DomainObjectPattern {
+
+    @Override
+    public EClass getObjectEClass() {
+        return YangModelUtil.MODEL_PACKAGE.getFeature();
+    }
+
+    @Override
+    public String getCreateImageId() {
+        return YangDiagramImageProvider.IMG_FEATURE_PROPOSAL;
+    }
+
+    @Override
+    public String getCreateName() {
+        return "feature";
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/GroupingPattern.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/GroupingPattern.java
new file mode 100644 (file)
index 0000000..2473919
--- /dev/null
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.patterns.objects;
+
+import org.eclipse.emf.ecore.EClass;
+
+import com.cisco.yangide.ext.model.editor.util.YangDiagramImageProvider;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+public class GroupingPattern extends DomainObjectPattern {
+
+    @Override
+    public String getCreateName() {
+        return "grouping";
+    }
+
+    @Override
+    public String getCreateImageId() {
+        return YangDiagramImageProvider.IMG_GROUPING_PROPOSAL;
+    }
+
+    @Override
+    public EClass getObjectEClass() {
+        return YangModelUtil.MODEL_PACKAGE.getGrouping();
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/IdentityPattern.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/IdentityPattern.java
new file mode 100644 (file)
index 0000000..a408139
--- /dev/null
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.patterns.objects;
+
+import org.eclipse.emf.ecore.EClass;
+
+import com.cisco.yangide.ext.model.editor.util.YangDiagramImageProvider;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+public class IdentityPattern extends DomainObjectPattern {
+
+    @Override
+    public EClass getObjectEClass() {
+        return YangModelUtil.MODEL_PACKAGE.getIdentity();
+    }
+
+    @Override
+    public String getCreateImageId() {
+        return YangDiagramImageProvider.IMG_IDENTITY_PROPOSAL;
+    }
+
+    @Override
+    public String getCreateName() {
+        return "identity";
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/LeafListPattern.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/LeafListPattern.java
new file mode 100644 (file)
index 0000000..75171cc
--- /dev/null
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.patterns.objects;
+
+import org.eclipse.emf.ecore.EClass;
+
+import com.cisco.yangide.ext.model.editor.util.YangDiagramImageProvider;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+public class LeafListPattern extends DomainObjectPattern {
+
+    @Override
+    public String getCreateImageId() {
+        return YangDiagramImageProvider.IMG_LEAF_LIST_PROPOSAL;
+    }
+
+    @Override
+    public String getCreateName() {
+        return "leaf list";
+    }
+
+    @Override
+    public EClass getObjectEClass() {
+        return YangModelUtil.MODEL_PACKAGE.getLeafList();
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/LeafPattern.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/LeafPattern.java
new file mode 100644 (file)
index 0000000..45b4ec8
--- /dev/null
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.patterns.objects;
+
+import org.eclipse.emf.ecore.EClass;
+
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.editor.util.YangDiagramImageProvider;
+
+public class LeafPattern extends DomainObjectPattern {
+
+    @Override
+    public String getCreateName() {
+        return "leaf";
+    }
+
+    @Override
+    public String getCreateImageId() {
+        return YangDiagramImageProvider.IMG_LEAF_PROPOSAL;
+    }
+
+    @Override
+    public EClass getObjectEClass() {
+        return ModelPackage.eINSTANCE.getLeaf();
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/ListKeyPattern.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/ListKeyPattern.java
new file mode 100644 (file)
index 0000000..6da634e
--- /dev/null
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.patterns.objects;
+
+import org.eclipse.emf.ecore.EClass;
+
+import com.cisco.yangide.ext.model.editor.util.YangDiagramImageProvider;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+public class ListKeyPattern extends DomainObjectPattern {
+
+    @Override
+    public String getCreateImageId() {
+        return YangDiagramImageProvider.IMG_LIST_KEY_PROPOSAL;
+    }
+
+    @Override
+    public String getCreateName() {
+        return "list key";
+    }
+
+    @Override
+    public EClass getObjectEClass() {
+        return YangModelUtil.MODEL_PACKAGE.getListKey();
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/ListPattern.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/ListPattern.java
new file mode 100644 (file)
index 0000000..cc11896
--- /dev/null
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.patterns.objects;
+
+import org.eclipse.emf.ecore.EClass;
+
+import com.cisco.yangide.ext.model.editor.util.YangDiagramImageProvider;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+public class ListPattern extends DomainObjectPattern {
+
+    @Override
+    public String getCreateImageId() {
+        return YangDiagramImageProvider.IMG_LIST_PROPOSAL;
+    }
+
+    @Override
+    public String getCreateName() {
+        return "list";
+    }
+
+    @Override
+    public EClass getObjectEClass() {
+        return YangModelUtil.MODEL_PACKAGE.getList();
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/ModulePattern.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/ModulePattern.java
new file mode 100644 (file)
index 0000000..fef5a2e
--- /dev/null
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.patterns.objects;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+
+import com.cisco.yangide.ext.model.editor.util.YangDiagramImageProvider;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+import com.cisco.yangide.ext.model.impl.ModelFactoryImpl;
+
+public class ModulePattern extends DomainObjectPattern {
+
+    @Override
+    public String getCreateName() {
+        return "module";
+    }
+
+    @Override
+    protected EObject createEObject() {
+        return ModelFactoryImpl.eINSTANCE.createModule();
+    }
+
+    @Override
+    public String getCreateImageId() {
+        return YangDiagramImageProvider.IMG_MODULE_PROPOSAL;
+    }
+
+    @Override
+    public EClass getObjectEClass() {
+        return YangModelUtil.MODEL_PACKAGE.getModule();
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/NotificationPattern.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/NotificationPattern.java
new file mode 100644 (file)
index 0000000..7b2aca1
--- /dev/null
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.patterns.objects;
+
+import org.eclipse.emf.ecore.EClass;
+
+import com.cisco.yangide.ext.model.editor.util.YangDiagramImageProvider;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+public class NotificationPattern extends DomainObjectPattern {
+
+    @Override
+    public String getCreateImageId() {
+        return YangDiagramImageProvider.IMG_NOTIFICATION_PROPOSAL;
+    }
+
+    @Override
+    public String getCreateName() {
+        return "notification";
+    }
+
+    @Override
+    public EClass getObjectEClass() {
+        return YangModelUtil.MODEL_PACKAGE.getNotification();
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/RpcIOPattern.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/RpcIOPattern.java
new file mode 100644 (file)
index 0000000..09a6a9c
--- /dev/null
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.patterns.objects;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.graphiti.features.context.IAddContext;
+import org.eclipse.graphiti.features.context.ICreateContext;
+import org.eclipse.graphiti.features.context.IMoveShapeContext;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+
+import com.cisco.yangide.ext.model.Node;
+import com.cisco.yangide.ext.model.Rpc;
+import com.cisco.yangide.ext.model.RpcIO;
+import com.cisco.yangide.ext.model.editor.util.YangDiagramImageProvider;
+import com.cisco.yangide.ext.model.editor.util.YangModelUIUtil;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+public class RpcIOPattern extends DomainObjectPattern {
+
+    private boolean input;
+
+    public RpcIOPattern(boolean input) {
+        super();
+        this.input = input;
+    }
+
+    @Override
+    public boolean canCreate(ICreateContext context) {
+        Object obj = getBusinessObjectForPictogramElement(context.getTargetContainer());
+        return super.canCreate(context) && null != obj
+                && YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getRpc(), obj) && check((Rpc) obj);
+    }
+
+    @Override
+    public String getCreateImageId() {
+        if (input) {
+            return YangDiagramImageProvider.IMG_RPC_INPUT_PROPOSAL;
+        } else {
+            return YangDiagramImageProvider.IMG_RPC_OUTPUT_PROPOSAL;
+        }
+    }
+
+    @Override
+    public String getCreateName() {
+        if (input) {
+            return "input";
+        } else {
+            return "output";
+        }
+    }
+
+    @Override
+    public boolean isMainBusinessObjectApplicable(Object mainBusinessObject) {
+        return super.isMainBusinessObjectApplicable(mainBusinessObject)
+                && input == ((RpcIO) mainBusinessObject).isInput();
+    }
+
+    @Override
+    public EClass getObjectEClass() {
+        return YangModelUtil.MODEL_PACKAGE.getRpcIO();
+    }
+
+    @Override
+    public boolean canAdd(IAddContext context) {
+        Object obj = getBusinessObjectForPictogramElement(context.getTargetContainer());
+        return super.canAdd(context) && null != obj
+                && YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getRpc(), obj)
+                && check((Rpc) obj, context.getNewObject());
+    }
+
+    private boolean check(Rpc rpc, Object obj) {
+        if (YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getRpcIO(), obj)) {
+            RpcIO cur = (RpcIO) obj;
+            for (Node n : YangModelUtil.filter(rpc.getChildren(), YangModelUtil.MODEL_PACKAGE.getRpcIO())) {
+                if (cur != n && cur.isInput() == ((RpcIO) n).isInput()) {
+                    return false;
+                }
+            }
+            return true;
+        }
+        return false;
+    }
+
+    private boolean check(Rpc rpc) {
+        for (Node n : YangModelUtil.filter(rpc.getChildren(), YangModelUtil.MODEL_PACKAGE.getRpcIO())) {
+            if (input == ((RpcIO) n).isInput()) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public boolean canMoveShape(IMoveShapeContext context) {
+        return context.getTargetContainer() == context.getSourceContainer();
+    }
+
+    @Override
+    public PictogramElement add(IAddContext context) {
+        return YangModelUIUtil.drawPictogramElement(context, getFeatureProvider(), getCreateImageId(), getCreateName());
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/RpcPattern.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/RpcPattern.java
new file mode 100644 (file)
index 0000000..405b105
--- /dev/null
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.patterns.objects;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.graphiti.features.context.IAddContext;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+
+import com.cisco.yangide.ext.model.Node;
+import com.cisco.yangide.ext.model.Rpc;
+import com.cisco.yangide.ext.model.RpcIO;
+import com.cisco.yangide.ext.model.editor.util.YangDiagramImageProvider;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+import com.cisco.yangide.ext.model.impl.ModelFactoryImpl;
+
+public class RpcPattern extends DomainObjectPattern {
+
+    @Override
+    public String getCreateImageId() {
+        return YangDiagramImageProvider.IMG_RPC_PROPOSAL;
+    }
+
+    @Override
+    public String getCreateName() {
+        return "rpc";
+    }
+
+    @Override
+    public EClass getObjectEClass() {
+        return YangModelUtil.MODEL_PACKAGE.getRpc();
+    }
+
+    @Override
+    public PictogramElement add(IAddContext context) {
+        ContainerShape cs = (ContainerShape) super.add(context);
+        Rpc rpc = (Rpc) context.getNewObject();
+        boolean input = false;
+        boolean output = false;
+        for (Node n : YangModelUtil.filter(rpc.getChildren(), YangModelUtil.MODEL_PACKAGE.getRpcIO())) {
+            if (((RpcIO) n).isInput()) {
+                input = true;
+            } else {
+                output = true;
+            }
+        }
+        if (!input) {
+            addIO(true, rpc, cs);
+        }
+        if (!output) {
+            addIO(false, rpc, cs);
+        }
+        layoutPictogramElement(cs);
+        return cs;
+    }
+
+    private void addIO(boolean isInput, Rpc rpc, ContainerShape cs) {
+        RpcIO o = ModelFactoryImpl.eINSTANCE.createRpcIO();
+        o.setInput(isInput);
+        YangModelUtil.add(rpc, o, rpc.getChildren().size());
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/SubmodulePattern.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/SubmodulePattern.java
new file mode 100644 (file)
index 0000000..ef6e5ee
--- /dev/null
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.patterns.objects;
+
+import org.eclipse.emf.ecore.EClass;
+
+import com.cisco.yangide.ext.model.editor.util.YangDiagramImageProvider;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+public class SubmodulePattern extends DomainObjectPattern {
+
+    @Override
+    public String getCreateName() {
+        return "submodule";
+    }
+
+    @Override
+    public String getCreateImageId() {
+        return YangDiagramImageProvider.IMG_SUBMODULE_PROPOSAL;
+    }
+
+    @Override
+    public EClass getObjectEClass() {
+        return YangModelUtil.MODEL_PACKAGE.getSubmodule();
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/TypedefPattern.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/TypedefPattern.java
new file mode 100644 (file)
index 0000000..db9b966
--- /dev/null
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.patterns.objects;
+
+import org.eclipse.emf.ecore.EClass;
+
+import com.cisco.yangide.ext.model.editor.util.YangDiagramImageProvider;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+public class TypedefPattern extends DomainObjectPattern {
+
+    @Override
+    public String getCreateImageId() {
+        return YangDiagramImageProvider.IMG_CUSTOM_TYPE_PROPOSAL;
+    }
+
+    @Override
+    public String getCreateName() {
+        return "typedef";
+    }
+
+    @Override
+    public EClass getObjectEClass() {
+        return YangModelUtil.MODEL_PACKAGE.getTypedef();
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/TyperefPattern.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/TyperefPattern.java
new file mode 100644 (file)
index 0000000..693c44d
--- /dev/null
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.patterns.objects;
+
+import org.eclipse.emf.ecore.EClass;
+
+import com.cisco.yangide.ext.model.editor.util.YangDiagramImageProvider;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+public class TyperefPattern extends DomainObjectPattern {
+
+    @Override
+    public String getCreateImageId() {
+        return YangDiagramImageProvider.IMG_TYPE_PROPOSAL;
+    }
+
+    @Override
+    public String getCreateName() {
+        return "type";
+    }
+
+    @Override
+    public EClass getObjectEClass() {
+        return YangModelUtil.MODEL_PACKAGE.getTyperef();
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/UsesPattern.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/patterns/objects/UsesPattern.java
new file mode 100644 (file)
index 0000000..9b773e2
--- /dev/null
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.patterns.objects;
+
+import org.eclipse.emf.ecore.EClass;
+
+import com.cisco.yangide.ext.model.Uses;
+import com.cisco.yangide.ext.model.editor.util.YangDiagramImageProvider;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+public class UsesPattern extends DomainObjectPattern {
+
+    @Override
+    public String getCreateImageId() {
+        return YangDiagramImageProvider.IMG_USES_PROPOSAL;
+    }
+
+    @Override
+    public String getCreateName() {
+        return "uses";
+    }
+
+    @Override
+    public EClass getObjectEClass() {
+        return YangModelUtil.MODEL_PACKAGE.getUses();
+    }
+
+    @Override
+    protected String getHeaderText(Object obj) {
+        if (YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getUses(), obj)) {
+            return YangModelUtil.getQNamePresentation((Uses) obj);
+        }
+        return super.getHeaderText(obj);
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/preferences/ModelEditorPreferencePage.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/preferences/ModelEditorPreferencePage.java
new file mode 100644 (file)
index 0000000..1ea149f
--- /dev/null
@@ -0,0 +1,148 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.preferences;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.layout.LayoutConstants;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.resource.StringConverter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.FontDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.PlatformUI;
+
+import com.cisco.yangide.ext.model.editor.Activator;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 29, 2014
+ */
+public class ModelEditorPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
+
+    private FontData[] fontData;
+    private Label preview;
+    private Font oldFont;
+
+    @Override
+    public void init(IWorkbench workbench) {
+        this.setPreferenceStore(Activator.getDefault().getPreferenceStore());
+    }
+
+    @Override
+    protected Control createContents(Composite parent) {
+        Composite pageArea = new Composite(parent, SWT.NONE);
+        GridLayoutFactory.fillDefaults().numColumns(3).spacing(LayoutConstants.getSpacing().x, 3).applyTo(pageArea);
+
+        Label label = new Label(pageArea, SWT.NONE);
+        label.setText("Diagram Editor Font: ");
+        GridDataFactory.swtDefaults().align(SWT.BEGINNING, SWT.TOP).span(1, 3).applyTo(label);
+
+        preview = new Label(pageArea, SWT.BORDER | SWT.SHADOW_NONE);
+        GridDataFactory.fillDefaults().grab(true, false).span(1, 2).applyTo(preview);
+
+        Button editBtn = new Button(pageArea, SWT.PUSH);
+        GridDataFactory.fillDefaults().hint(100, SWT.DEFAULT).applyTo(editBtn);
+        editBtn.setText("Edit...");
+        editBtn.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                FontDialog dialog = new FontDialog(getShell());
+                dialog.setFontList(fontData);
+                FontData fd = dialog.open();
+                if (fd != null) {
+                    fontData = new FontData[] { fd };
+                    update();
+                }
+            }
+        });
+        Button systemBtn = new Button(pageArea, SWT.PUSH);
+        GridDataFactory.fillDefaults().hint(100, SWT.DEFAULT).applyTo(systemBtn);
+        systemBtn.setText("Use System Font");
+        systemBtn.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                fontData = JFaceResources.getDefaultFont().getFontData();
+                update();
+            }
+        });
+
+        Composite note = createNoteComposite(JFaceResources.getDialogFont(), pageArea, "Note: ",
+                "Changing the font does not update open editors.");
+        GridDataFactory.fillDefaults().grab(true, false).span(2, 1).applyTo(note);
+
+        Dialog.applyDialogFont(pageArea);
+        load();
+        return pageArea;
+    }
+
+    private void load() {
+        fontData = toFontData(getPreferenceStore().getString(ModelEditorPreferences.DIAGRAM_EDITOR_FONT));
+        if (fontData == null) {
+            fontData = JFaceResources.getDefaultFont().getFontData();
+        }
+        update();
+    }
+
+    @Override
+    public boolean performOk() {
+        getPreferenceStore().setValue(ModelEditorPreferences.DIAGRAM_EDITOR_FONT, StringConverter.asString(fontData));
+        return true;
+    }
+
+    @Override
+    protected void performDefaults() {
+        fontData = toFontData(getPreferenceStore().getDefaultString(ModelEditorPreferences.DIAGRAM_EDITOR_FONT));
+        if (fontData == null) {
+            fontData = JFaceResources.getDefaultFont().getFontData();
+        }
+        update();
+        super.performDefaults();
+    }
+
+    private FontData[] toFontData(String str) {
+        return JFaceResources.getFontRegistry().filterData(StringConverter.asFontDataArray(str),
+                PlatformUI.getWorkbench().getDisplay());
+    }
+
+    private void update() {
+        if (fontData != null && fontData.length > 0) {
+            StringBuilder sb = new StringBuilder();
+            sb.append(" ").append(fontData[0].getName()).append(" ").append(fontData[0].getHeight()).append("\n");
+            sb.append(" The quick brown fox jumps over the lazy dog.");
+            Font newFont = new Font(Display.getCurrent(), fontData);
+            preview.setFont(newFont);
+            preview.setText(sb.toString());
+
+            if (oldFont != null) {
+                oldFont.dispose();
+            }
+            oldFont = newFont;
+        }
+    }
+
+    @Override
+    public void dispose() {
+        if (oldFont != null) {
+            oldFont.dispose();
+        }
+        super.dispose();
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/preferences/ModelEditorPreferences.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/preferences/ModelEditorPreferences.java
new file mode 100644 (file)
index 0000000..dfaeed5
--- /dev/null
@@ -0,0 +1,18 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.preferences;
+
+/**
+ * Preferences constants for Model Editor.
+ *
+ * @author Konstantin Zaitsev
+ * date: Aug 29, 2014
+ */
+public class ModelEditorPreferences {
+    public static String DIAGRAM_EDITOR_FONT = "diagram_editor_font";
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/AttributesTabContentFilter.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/AttributesTabContentFilter.java
new file mode 100644 (file)
index 0000000..c6d02dd
--- /dev/null
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.property;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.services.Graphiti;
+import org.eclipse.graphiti.ui.platform.AbstractPropertySectionFilter;
+
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+public class AttributesTabContentFilter extends AbstractPropertySectionFilter {
+
+    @Override
+    protected boolean accept(PictogramElement pictogramElement) {
+        EObject bo = Graphiti.getLinkService().getBusinessObjectForLinkedPictogramElement(pictogramElement);
+        return YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getTaggedNode(), bo);
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/AttributesTabContentSource.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/AttributesTabContentSource.java
new file mode 100644 (file)
index 0000000..0135f5b
--- /dev/null
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.property;
+
+import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+
+import com.cisco.yangide.ext.model.TaggedNode;
+import com.cisco.yangide.ext.model.editor.util.Strings;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+import com.cisco.yangide.ext.model.editor.util.YangTag;
+
+public class AttributesTabContentSource implements IPropertySource {
+
+    private TaggedNode node;
+    private IPropertyDescriptor[] descriptors;
+
+    public AttributesTabContentSource(TaggedNode node) {
+        super();
+        this.node = node;
+    }
+
+    @Override
+    public Object getEditableValue() {
+        return this;
+    }
+
+    @Override
+    public IPropertyDescriptor[] getPropertyDescriptors() {
+        if (null == descriptors) {
+            descriptors = YangModelUtil.getPropertyDescriptors(node.eClass()).toArray(new IPropertyDescriptor[0]);
+        }
+        return descriptors;
+    }
+
+    @Override
+    public Object getPropertyValue(Object id) {
+        YangTag tag = (YangTag) id;
+        Object result = YangModelUtil.getValue((YangTag) id, node);
+        if (tag.getPropertyDescriptor() instanceof ComboBoxPropertyDescriptor) {
+            if (null != tag.getPossibleValues() && tag.getPossibleValues().contains(result)) {
+                return tag.getPossibleValues().indexOf(result);
+            } else {
+                return 0;
+            }
+        }
+
+        if (!Strings.isEmpty(result)) {
+            return result.toString();
+        }
+        return Strings.EMPTY_STRING;
+    }
+
+    @Override
+    public boolean isPropertySet(Object id) {
+        return false;
+    }
+
+    @Override
+    public void resetPropertyValue(Object id) {
+
+    }
+
+    @Override
+    public void setPropertyValue(Object id, Object value) {
+        YangTag tag = (YangTag) id;
+        if (tag.getPropertyDescriptor() instanceof ComboBoxPropertyDescriptor && null != tag.getPossibleValues()
+                && value instanceof Integer) {
+            Integer pos = (Integer) value;
+            if (pos < tag.getPossibleValues().size()) {
+                YangModelUtil.setValue((YangTag) id, node, tag.getPossibleValues().get(pos));
+            }
+        } else {
+            YangModelUtil.setValue((YangTag) id, node, value);
+        }
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/DialogTextPropertyDescriptor.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/DialogTextPropertyDescriptor.java
new file mode 100644 (file)
index 0000000..fc3570f
--- /dev/null
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.property;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jface.viewers.DialogCellEditor;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+
+import com.cisco.yangide.ext.model.editor.dialog.MultilineTextDialog;
+import com.cisco.yangide.ext.model.editor.util.Strings;
+import com.cisco.yangide.ext.model.editor.util.YangTag;
+
+public class DialogTextPropertyDescriptor extends PropertyDescriptor {
+
+    private YangTag id;
+
+    public DialogTextPropertyDescriptor(Object id, String displayName) {
+        super(id, displayName);
+        this.id = (YangTag) id;
+    }
+
+    public DialogCellEditor createPropertyEditor(Composite parent) {
+        DialogCellEditor editor = new DialogCellEditor(parent) {
+
+            @Override
+            protected Object openDialogBox(Control cellEditorWindow) {
+                Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+                MultilineTextDialog dialog = new MultilineTextDialog(shell, Strings.getAsString(getValue()),
+                        id.getName());
+                if (IStatus.OK == dialog.open()) {
+                    setValue(dialog.getValue());
+                }
+                return null;
+            }
+
+        };
+        if (getValidator() != null) {
+            editor.setValidator(getValidator());
+        }
+        return editor;
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/GeneralTabDescriptionFilter.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/GeneralTabDescriptionFilter.java
new file mode 100644 (file)
index 0000000..8f74f8b
--- /dev/null
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.property;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.services.Graphiti;
+import org.eclipse.graphiti.ui.platform.AbstractPropertySectionFilter;
+
+import com.cisco.yangide.ext.model.TaggedNode;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+import com.cisco.yangide.ext.model.editor.util.YangTag;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 29, 2014
+ */
+public class GeneralTabDescriptionFilter extends AbstractPropertySectionFilter {
+
+    @Override
+    protected boolean accept(PictogramElement pictogramElement) {
+        EObject bo = Graphiti.getLinkService().getBusinessObjectForLinkedPictogramElement(pictogramElement);
+        return YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getTaggedNode(), bo)
+                && YangModelUtil.getTag(YangTag.DESCRIPTION, (TaggedNode) bo) != null;
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/GeneralTabDescriptionSection.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/GeneralTabDescriptionSection.java
new file mode 100644 (file)
index 0000000..47172a2
--- /dev/null
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.property;
+
+import org.eclipse.core.databinding.Binding;
+import org.eclipse.core.databinding.DataBindingContext;
+import org.eclipse.emf.databinding.EMFProperties;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.databinding.swt.WidgetProperties;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
+import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
+import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
+
+import com.cisco.yangide.ext.model.TaggedNode;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+import com.cisco.yangide.ext.model.editor.util.YangTag;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 29, 2014
+ */
+public class GeneralTabDescriptionSection extends YangPropertySection implements ITabbedPropertyConstants {
+    private Text descriptionText;
+
+    @Override
+    public void createControls(Composite parent, TabbedPropertySheetPage tabbedPropertySheetPage) {
+        super.createControls(parent, tabbedPropertySheetPage);
+
+        TabbedPropertySheetWidgetFactory factory = getWidgetFactory();
+        Composite composite = factory.createFlatFormComposite(parent);
+        GridLayoutFactory.swtDefaults().numColumns(2).applyTo(composite);
+        CLabel valueLabel = factory.createCLabel(composite, "Description:");
+        GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.TOP).hint(STANDARD_LABEL_WIDTH, SWT.DEFAULT)
+                .applyTo(valueLabel);
+        descriptionText = factory.createText(composite, "", SWT.MULTI | SWT.WRAP);
+        GridDataFactory.swtDefaults().hint(200, 100).applyTo(descriptionText);
+    }
+
+    @Override
+    protected boolean isApplied(Object bo) {
+        return YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getTaggedNode(), bo)
+                && YangModelUtil.getTag(YangTag.DESCRIPTION, (TaggedNode) bo) != null;
+    }
+
+    @Override
+    protected Binding createBinding(DataBindingContext bindingContext, EObject obj) {
+        return bindingContext.bindValue(WidgetProperties.text(SWT.Modify).observeDelayed(150, descriptionText),
+                EMFProperties.value(YangModelUtil.MODEL_PACKAGE.getTag_Value())
+                        .observe(YangModelUtil.getTag(YangTag.DESCRIPTION, (TaggedNode) obj)));
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/GeneralTabNameFilter.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/GeneralTabNameFilter.java
new file mode 100644 (file)
index 0000000..8269132
--- /dev/null
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.property;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.services.Graphiti;
+import org.eclipse.graphiti.ui.platform.AbstractPropertySectionFilter;
+
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+public class GeneralTabNameFilter extends AbstractPropertySectionFilter {
+
+    @Override
+    protected boolean accept(PictogramElement pictogramElement) {
+        EObject bo = Graphiti.getLinkService().getBusinessObjectForLinkedPictogramElement(pictogramElement);
+        return YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getNamedNode(), bo);
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/GeneralTabNameSection.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/GeneralTabNameSection.java
new file mode 100644 (file)
index 0000000..e7f3fce
--- /dev/null
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.property;
+
+import org.eclipse.core.databinding.Binding;
+import org.eclipse.core.databinding.DataBindingContext;
+import org.eclipse.emf.databinding.EMFProperties;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.databinding.swt.WidgetProperties;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
+import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
+import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
+
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+public class GeneralTabNameSection extends YangPropertySection implements ITabbedPropertyConstants {
+    private Text nameText;
+
+    @Override
+    public void createControls(Composite parent, TabbedPropertySheetPage tabbedPropertySheetPage) {
+        super.createControls(parent, tabbedPropertySheetPage);
+
+        TabbedPropertySheetWidgetFactory factory = getWidgetFactory();
+        Composite composite = factory.createFlatFormComposite(parent);
+        GridLayoutFactory.swtDefaults().numColumns(2).applyTo(composite);
+        CLabel valueLabel = factory.createCLabel(composite, "Name:");
+        GridDataFactory.fillDefaults().hint(STANDARD_LABEL_WIDTH, SWT.DEFAULT).applyTo(valueLabel);
+        nameText = factory.createText(composite, "");
+        GridDataFactory.swtDefaults().hint(200, SWT.DEFAULT).applyTo(nameText);
+    }
+
+    @Override
+    protected boolean isApplied(Object bo) {
+        return YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getNamedNode(), bo);
+    }
+
+    @Override
+    protected Binding createBinding(DataBindingContext bindingContext, EObject obj) {
+        return bindingContext.bindValue(WidgetProperties.text(SWT.Modify).observeDelayed(150, nameText),
+                EMFProperties.value(YangModelUtil.MODEL_PACKAGE.getNamedNode_Name()).observe(obj));
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/GeneralTabReferenceFilter.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/GeneralTabReferenceFilter.java
new file mode 100644 (file)
index 0000000..759538c
--- /dev/null
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.property;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.services.Graphiti;
+import org.eclipse.graphiti.ui.platform.AbstractPropertySectionFilter;
+
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+public class GeneralTabReferenceFilter extends AbstractPropertySectionFilter {
+
+    @Override
+    protected boolean accept(PictogramElement pictogramElement) {
+        EObject bo = Graphiti.getLinkService().getBusinessObjectForLinkedPictogramElement(pictogramElement);
+        return YangModelUtil.hasReference(bo);
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/GeneralTabReferenceSection.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/GeneralTabReferenceSection.java
new file mode 100644 (file)
index 0000000..ffe4a97
--- /dev/null
@@ -0,0 +1,114 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.property;
+
+import org.eclipse.core.databinding.Binding;
+import org.eclipse.core.databinding.DataBindingContext;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.emf.databinding.EMFProperties;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.databinding.swt.WidgetProperties;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
+import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
+import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
+
+import com.cisco.yangide.core.indexing.ElementIndexType;
+import com.cisco.yangide.ext.model.Module;
+import com.cisco.yangide.ext.model.editor.dialog.YangElementListSelectionDialog;
+import com.cisco.yangide.ext.model.editor.util.YangDiagramImageProvider;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+import com.cisco.yangide.ext.model.editor.widget.DialogText;
+
+public class GeneralTabReferenceSection extends YangPropertySection implements ITabbedPropertyConstants {
+
+    private DialogText text;
+    private CLabel valueLabel;
+    YangElementListSelectionDialog dialog;
+
+    @Override
+    public void createControls(Composite parent, TabbedPropertySheetPage tabbedPropertySheetPage) {
+        super.createControls(parent, tabbedPropertySheetPage);
+
+        TabbedPropertySheetWidgetFactory factory = getWidgetFactory();
+        Composite composite = factory.createFlatFormComposite(parent);
+        GridLayoutFactory.swtDefaults().numColumns(2).applyTo(composite);
+        valueLabel = factory.createCLabel(composite, "Reference:");
+        GridDataFactory.fillDefaults().hint(STANDARD_LABEL_WIDTH, SWT.DEFAULT).applyTo(valueLabel);
+        text = new DialogText(composite, tabbedPropertySheetPage.getWidgetFactory()) {
+
+            @Override
+            protected Object openDialogBox(Text text) {
+                if (null != dialog) {
+                    if (IStatus.OK == dialog.open()) {
+                        setValue(dialog.getValue());
+                    }
+                }
+                return null;
+            }
+        };
+        GridDataFactory.fillDefaults().hint(200, SWT.DEFAULT).applyTo(text.getControl());
+    }
+
+    @Override
+    public void setInput(IWorkbenchPart part, ISelection selection) {
+        super.setInput(part, selection);
+        if (getEObject() != null && getDiagramTypeProvider() != null) {
+            EClass reference = YangModelUtil.getConnectionReferenceObjectClass(getEObject());
+            ElementIndexType indexType = ElementIndexType.GROUPING;
+            String imageId = YangDiagramImageProvider.IMG_GROUPING_PROPOSAL;
+            if (YangModelUtil.MODEL_PACKAGE.getIdentity().equals(reference)) {
+                valueLabel.setText("Base:");
+                indexType = ElementIndexType.IDENTITY;
+                imageId = YangDiagramImageProvider.IMG_IDENTITY_PROPOSAL;
+            } else {
+                valueLabel.setText(reference.getName() + ":");
+            }
+            Module module = (Module) getDiagramTypeProvider().getFeatureProvider()
+                    .getBusinessObjectForPictogramElement(getDiagram());
+            if (null == dialog) {
+                Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+                dialog = new YangElementListSelectionDialog(shell, indexType, null, imageId, module, text.getText());
+            } else {
+                dialog.reset(indexType, null, imageId, module, text.getText());
+            }
+        }
+    }
+
+    private void setValue(String firstResult) {
+        text.setText(firstResult);
+    }
+
+    @Override
+    protected Binding createBinding(DataBindingContext bindingContext, EObject obj) {
+        if (YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getUses(), obj)) {
+            return bindingContext.bindValue(
+                    WidgetProperties.text(SWT.Modify).observeDelayed(1000, text.getTextControl()),
+                    EMFProperties.value(YangModelUtil.MODEL_PACKAGE.getUses_QName()).observe(obj));
+        }
+        return bindingContext.bindValue(WidgetProperties.text(SWT.Modify).observeDelayed(1000, text.getTextControl()),
+                EMFProperties.value(YangModelUtil.MODEL_PACKAGE.getReferenceNode_Reference()).observe(obj));
+    }
+
+    @Override
+    protected boolean isApplied(Object bo) {
+        return YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getUses(), bo)
+                || YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getReferenceNode(), bo);
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/GeneralTabTypeFilter.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/GeneralTabTypeFilter.java
new file mode 100644 (file)
index 0000000..8cb39f3
--- /dev/null
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.property;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.services.Graphiti;
+import org.eclipse.graphiti.ui.platform.AbstractPropertySectionFilter;
+
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+public class GeneralTabTypeFilter extends AbstractPropertySectionFilter {
+
+    @Override
+    protected boolean accept(PictogramElement pictogramElement) {
+        EObject bo = Graphiti.getLinkService().getBusinessObjectForLinkedPictogramElement(pictogramElement);
+        return YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getNode(), bo);
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/GeneralTabTypeSection.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/GeneralTabTypeSection.java
new file mode 100644 (file)
index 0000000..5e0ea19
--- /dev/null
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.property;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.services.Graphiti;
+import org.eclipse.graphiti.ui.platform.GFPropertySection;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
+import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
+import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
+
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+public class GeneralTabTypeSection extends GFPropertySection implements ITabbedPropertyConstants {
+
+    private CLabel typeText;
+
+    @Override
+    public void createControls(Composite parent, TabbedPropertySheetPage tabbedPropertySheetPage) {
+        super.createControls(parent, tabbedPropertySheetPage);
+
+        TabbedPropertySheetWidgetFactory factory = getWidgetFactory();
+        Composite composite = factory.createFlatFormComposite(parent);
+
+        GridLayoutFactory.swtDefaults().numColumns(2).applyTo(composite);
+
+        CLabel label = factory.createCLabel(composite, "Type:");
+        GridDataFactory.fillDefaults().hint(STANDARD_LABEL_WIDTH, SWT.DEFAULT).applyTo(label);
+        typeText = factory.createCLabel(composite, "");
+
+    }
+
+    @Override
+    public void refresh() {
+        PictogramElement pe = getSelectedPictogramElement();
+        if (pe != null) {
+            Object bo = Graphiti.getLinkService().getBusinessObjectForLinkedPictogramElement(pe);
+            if (bo == null || !YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getNode(), bo)) {
+                return;
+            }
+            typeText.setText(((EObject) bo).eClass().getName());
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/GraphitiEditPartToIPropertySourceAdapterFactory.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/GraphitiEditPartToIPropertySourceAdapterFactory.java
new file mode 100644 (file)
index 0000000..585bf35
--- /dev/null
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.property;
+
+import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.ui.platform.GraphitiShapeEditPart;
+import org.eclipse.ui.views.properties.IPropertySource;
+
+import com.cisco.yangide.ext.model.TaggedNode;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+@SuppressWarnings("rawtypes")
+public class GraphitiEditPartToIPropertySourceAdapterFactory implements IAdapterFactory {
+
+    public GraphitiEditPartToIPropertySourceAdapterFactory() {
+        super();
+    }
+
+    public Object getAdapter(Object adaptableObject, Class adapterType) {
+        if (IPropertySource.class.equals(adapterType)) {
+            if (adaptableObject instanceof GraphitiShapeEditPart) {
+                GraphitiShapeEditPart editPart = (GraphitiShapeEditPart) adaptableObject;
+                PictogramElement pictogramElement = editPart.getPictogramElement();
+                Object object = editPart.getFeatureProvider().getBusinessObjectForPictogramElement(pictogramElement);
+                if (YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getTaggedNode(), object)) {
+                    return new AttributesTabContentSource((TaggedNode) object);
+                }
+            }
+        }
+        return null;
+    }
+
+    public Class[] getAdapterList() {
+        return new Class[] { IPropertySource.class };
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/TypeTabFilter.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/TypeTabFilter.java
new file mode 100644 (file)
index 0000000..60e647c
--- /dev/null
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.property;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.services.Graphiti;
+import org.eclipse.graphiti.ui.platform.AbstractPropertySectionFilter;
+
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+
+public class TypeTabFilter extends AbstractPropertySectionFilter {
+
+    @Override
+    protected boolean accept(PictogramElement pictogramElement) {
+        EObject bo = Graphiti.getLinkService().getBusinessObjectForLinkedPictogramElement(pictogramElement);
+        return YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getTypedNode(), bo);
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/TypeTabSection.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/TypeTabSection.java
new file mode 100644 (file)
index 0000000..15daf13
--- /dev/null
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.property;
+
+import org.eclipse.core.databinding.Binding;
+import org.eclipse.core.databinding.DataBindingContext;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.emf.databinding.EMFProperties;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.databinding.swt.WidgetProperties;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.views.properties.tabbed.ITabbedPropertyConstants;
+import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
+import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetWidgetFactory;
+
+import com.cisco.yangide.core.indexing.ElementIndexType;
+import com.cisco.yangide.ext.model.Module;
+import com.cisco.yangide.ext.model.TypedNode;
+import com.cisco.yangide.ext.model.editor.dialog.YangElementListSelectionDialog;
+import com.cisco.yangide.ext.model.editor.util.YangDiagramImageProvider;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+import com.cisco.yangide.ext.model.editor.widget.DialogText;
+
+public class TypeTabSection extends YangPropertySection implements ITabbedPropertyConstants {
+    private DialogText type;
+
+    @Override
+    public void createControls(Composite parent, TabbedPropertySheetPage tabbedPropertySheetPage) {
+        super.createControls(parent, tabbedPropertySheetPage);
+
+        TabbedPropertySheetWidgetFactory factory = getWidgetFactory();
+        Composite composite = factory.createFlatFormComposite(parent);
+
+        GridLayoutFactory.swtDefaults().numColumns(2).applyTo(composite);
+        CLabel valueLabel = factory.createCLabel(composite, "Type:");
+        GridDataFactory.fillDefaults().hint(STANDARD_LABEL_WIDTH, SWT.DEFAULT).applyTo(valueLabel);
+        type = new DialogText(composite, tabbedPropertySheetPage.getWidgetFactory()) {
+
+            @Override
+            protected Object openDialogBox(Text text) {
+                Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+                Module module = (Module) getDiagramTypeProvider().getFeatureProvider()
+                        .getBusinessObjectForPictogramElement(getDiagram());
+                YangElementListSelectionDialog dialog = new YangElementListSelectionDialog(shell, ElementIndexType.TYPE,
+                        null, YangDiagramImageProvider.IMG_CUSTOM_TYPE_PROPOSAL, module, type.getText());
+                if (IStatus.OK == dialog.open()) {
+                    setType(dialog.getValue());
+                }
+                return null;
+            }
+        };
+        GridDataFactory.fillDefaults().hint(200, SWT.DEFAULT).grab(false, false).applyTo(type.getControl());
+    }
+
+    private void setType(String firstResult) {
+        type.setText(firstResult);
+    }
+
+    @Override
+    protected Binding createBinding(DataBindingContext bindingContext, EObject obj) {
+        return bindingContext.bindValue(WidgetProperties.text(SWT.Modify).observeDelayed(150, type.getTextControl()),
+                EMFProperties.value(YangModelUtil.MODEL_PACKAGE.getNamedNode_Name())
+                        .observe(((TypedNode) obj).getType()));
+    }
+
+    @Override
+    protected boolean isApplied(Object bo) {
+        return YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getTypedNode(), bo);
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/YangPropertySection.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/property/YangPropertySection.java
new file mode 100644 (file)
index 0000000..d46d057
--- /dev/null
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.property;
+
+import org.eclipse.core.databinding.Binding;
+import org.eclipse.core.databinding.DataBindingContext;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.services.Graphiti;
+import org.eclipse.graphiti.ui.platform.GFPropertySection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IWorkbenchPart;
+
+import com.cisco.yangide.ext.model.Node;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 28, 2014
+ */
+public abstract class YangPropertySection extends GFPropertySection {
+    private EObject obj;
+    private DataBindingContext bindingContext = new DataBindingContext();
+    private Binding binding;
+
+    @Override
+    public void setInput(IWorkbenchPart part, ISelection selection) {
+        super.setInput(part, selection);
+
+        PictogramElement pe = getSelectedPictogramElement();
+        if (pe != null) {
+            Object bo = Graphiti.getLinkService().getBusinessObjectForLinkedPictogramElement(pe);
+            if (bo == null || !isApplied(bo)) {
+                removeBinding();
+                return;
+            }
+            if (obj != ((Node) bo)) {
+                removeBinding();
+                obj = ((Node) bo);
+
+                binding = createBinding(bindingContext, obj);
+                binding.updateModelToTarget();
+            }
+        } else {
+            removeBinding();
+        }
+    }
+
+    @Override
+    public void aboutToBeHidden() {
+        obj = null;
+        removeBinding();
+    }
+
+    private void removeBinding() {
+        if (binding != null && !binding.isDisposed()) {
+            binding.updateTargetToModel();
+            bindingContext.removeBinding(binding);
+            binding.dispose();
+        }
+    }
+
+    /**
+     * @return the obj
+     */
+    protected EObject getEObject() {
+        return obj;
+    }
+
+    protected abstract Binding createBinding(DataBindingContext bindingContext, EObject obj);
+
+    protected abstract boolean isApplied(Object bo);
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/sync/ChoicePropertyUpdater.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/sync/ChoicePropertyUpdater.java
new file mode 100644 (file)
index 0000000..3e316a9
--- /dev/null
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.sync;
+
+import com.cisco.yangide.core.dom.ContrainerSchemaNode;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 28, 2014
+ */
+public class ChoicePropertyUpdater extends SourceNodePropertyUpdater<ContrainerSchemaNode> {
+
+    public ChoicePropertyUpdater(DiagramModelAdapter adapter) {
+        super(adapter);
+    }
+
+    @Override
+    protected boolean isHandleProperty(String name) {
+        return "config".equals(name) || "default".equals(name) || "mandatory".equals(name) || "status".equals(name);
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/sync/ContainerPropertyUpdater.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/sync/ContainerPropertyUpdater.java
new file mode 100644 (file)
index 0000000..728e6eb
--- /dev/null
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.sync;
+
+import com.cisco.yangide.core.dom.ContrainerSchemaNode;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 28, 2014
+ */
+public class ContainerPropertyUpdater extends SourceNodePropertyUpdater<ContrainerSchemaNode> {
+
+    public ContainerPropertyUpdater(DiagramModelAdapter adapter) {
+        super(adapter);
+    }
+
+    @Override
+    protected boolean isHandleProperty(String name) {
+        return "config".equals(name) || "presence".equals(name);
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/sync/DiagramModelAdapter.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/sync/DiagramModelAdapter.java
new file mode 100644 (file)
index 0000000..438f954
--- /dev/null
@@ -0,0 +1,391 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.sync;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.WeakHashMap;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.util.EContentAdapter;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.RewriteSessionEditProcessor;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.text.edits.DeleteEdit;
+import org.eclipse.text.edits.InsertEdit;
+import org.eclipse.text.edits.MalformedTreeException;
+import org.eclipse.text.edits.MultiTextEdit;
+import org.eclipse.text.edits.ReplaceEdit;
+import org.eclipse.text.edits.TextEdit;
+
+import com.cisco.yangide.core.YangCorePlugin;
+import com.cisco.yangide.core.dom.ASTCompositeNode;
+import com.cisco.yangide.core.dom.ASTNamedNode;
+import com.cisco.yangide.core.dom.ASTNode;
+import com.cisco.yangide.core.dom.BaseReference;
+import com.cisco.yangide.core.dom.IdentitySchemaNode;
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.core.dom.ModuleImport;
+import com.cisco.yangide.core.dom.SimpleNode;
+import com.cisco.yangide.core.dom.SubModule;
+import com.cisco.yangide.core.parser.YangFormattingPreferences;
+import com.cisco.yangide.core.parser.YangParserUtil;
+import com.cisco.yangide.editor.editors.YangEditor;
+import com.cisco.yangide.editor.editors.YangSourceViewer;
+import com.cisco.yangide.ext.model.BelongsTo;
+import com.cisco.yangide.ext.model.Import;
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Node;
+import com.cisco.yangide.ext.model.Tag;
+import com.cisco.yangide.ext.model.editor.Activator;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+import com.cisco.yangide.ext.model.editor.util.YangTag;
+import com.cisco.yangide.ext.refactoring.RefactorUtil;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 13, 2014
+ */
+final class DiagramModelAdapter extends EContentAdapter {
+    private final ModelSynchronizer modelSynchronizer;
+    private Map<Node, String> removedBlock = new WeakHashMap<>();
+    private YangEditor yangSourceEditor;
+    private Map<Node, ASTNode> mapping;
+    private Map<EClass, SourceNodePropertyUpdater<? extends ASTNode>> propertyUpdaters;
+
+    /**
+     * @param modelSynchronizer
+     */
+    DiagramModelAdapter(ModelSynchronizer modelSynchronizer, YangEditor yangSourceEditor, Map<Node, ASTNode> mapping) {
+        this.modelSynchronizer = modelSynchronizer;
+        this.yangSourceEditor = yangSourceEditor;
+        this.mapping = mapping;
+        this.propertyUpdaters = new HashMap<>();
+        // init property updaters
+        this.propertyUpdaters.put(ModelPackage.Literals.NODE, new SourceNodePropertyUpdater<ASTNode>(this));
+        this.propertyUpdaters.put(ModelPackage.Literals.MODULE, new ModulePropertyUpdater(this));
+        this.propertyUpdaters.put(ModelPackage.Literals.SUBMODULE, new ModulePropertyUpdater(this));
+        this.propertyUpdaters.put(ModelPackage.Literals.CONTAINER, new ContainerPropertyUpdater(this));
+        this.propertyUpdaters.put(ModelPackage.Literals.LIST, new ListPropertyUpdater(this));
+        this.propertyUpdaters.put(ModelPackage.Literals.LEAF_LIST, new ListPropertyUpdater(this));
+        this.propertyUpdaters.put(ModelPackage.Literals.CHOICE, new ChoicePropertyUpdater(this));
+        this.propertyUpdaters.put(ModelPackage.Literals.TYPEDEF, new TypedefPropertyUpdater(this));
+        this.propertyUpdaters.put(ModelPackage.Literals.LEAF, new LeafPropertyUpdater(this));
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public synchronized void notifyChanged(Notification notification) {
+        super.notifyChanged(notification);
+
+        if (notification.getEventType() != Notification.REMOVING_ADAPTER) {
+            if (this.modelSynchronizer.isNotificationEnabled()) {
+                try {
+                    this.modelSynchronizer.disableNotification();
+                    if (Activator.getDefault().isDebugging()) {
+                        System.out.println("from diag: " + notification);
+                    }
+                    switch (notification.getEventType()) {
+                    case Notification.ADD:
+                        ASTNode node = mapping.get(notification.getNotifier());
+                        if (notification.getNewValue() instanceof Node) {
+                            Node newValue = (Node) notification.getNewValue();
+                            String content = null;
+                            if (removedBlock.containsKey(newValue)) { // block moved from another
+                                // location
+                                if (Activator.getDefault().isDebugging()) {
+                                    System.out.println("block moved");
+                                }
+                                content = removedBlock.remove(newValue);
+                                add(node, content, notification.getPosition());
+                            }
+                            if (newValue.eClass() == ModelPackage.Literals.IMPORT) {
+                                addImport((Module) node, newValue);
+                            }
+                            break;
+                        } else if (notification.getNewValue() instanceof Tag) {
+                            if (((Tag) notification.getNewValue()).getValue() != null) {
+                                Activator.logError("tag added with value: " + notification);
+                            }
+                        } else {
+                            Activator.logError("unknown notification : " + notification);
+                        }
+                    case Notification.SET:
+                        if (notification.getFeature() != ModelPackage.Literals.NODE__PARENT) {
+                            // skip notification if value not changed
+                            if (notification.getNewValue() != null && notification.getOldValue() != null
+                                    && notification.getOldValue().equals(notification.getNewValue())) {
+                                break;
+                            }
+                            if (notification.getFeature() == ModelPackage.Literals.NAMED_NODE__NAME
+                                    || notification.getFeature() == ModelPackage.Literals.USES__QNAME) {
+                                updateName((Node) notification.getNotifier(), (EAttribute) notification.getFeature(),
+                                        notification.getNewValue());
+                            } else if (notification.getFeature() == ModelPackage.Literals.REFERENCE_NODE__REFERENCE) {
+                                updateIdentityReference((Node) notification.getNotifier(), notification.getNewValue());
+                            } else if (notification.getFeature() == ModelPackage.Literals.SUBMODULE__BELONGS_TO) {
+                                updateBelongsTo((Node) notification.getNotifier(), notification.getOldValue(),
+                                        notification.getNewValue());
+                            }
+
+                            if (notification.getNotifier() instanceof Tag) {
+                                Tag tag = (Tag) notification.getNotifier();
+                                Node parent = (Node) tag.eContainer();
+                                ASTNode astNode = mapping.get(parent);
+                                if (astNode == null) {
+                                    throw new RuntimeException(
+                                            "Cannot find references source block from diagram editor");
+                                }
+                                if (propertyUpdaters.containsKey(parent.eClass())) {
+                                    SourceNodePropertyUpdater<ASTNode> updater = (SourceNodePropertyUpdater<ASTNode>) propertyUpdaters
+                                            .get(parent.eClass());
+                                    updater.updateProperty(astNode, tag.getName(), notification.getNewValue(),
+                                            astNode.getBodyStartPosition() + 1);
+                                } else {
+                                    SourceNodePropertyUpdater<ASTNode> updater = (SourceNodePropertyUpdater<ASTNode>) propertyUpdaters
+                                            .get(ModelPackage.Literals.NODE);
+                                    updater.updateProperty(astNode, tag.getName(), notification.getNewValue(),
+                                            astNode.getBodyStartPosition() + 1);
+                                }
+                            }
+                        }
+
+                        break;
+                    case Notification.REMOVE:
+                        if (notification.getOldValue() != null && notification.getOldValue() instanceof Node
+                                && mapping.containsKey(notification.getOldValue())) {
+                            delete((Node) notification.getOldValue());
+                        }
+                        break;
+                    case Notification.MOVE:
+                        if (notification.getFeature() == ModelPackage.Literals.CONTAINING_NODE__CHILDREN) {
+                            move((Node) notification.getNotifier(), (Node) notification.getNewValue(),
+                                    (Integer) notification.getOldValue(), notification.getPosition());
+                        }
+                    default:
+                        break;
+                    }
+                } finally {
+                    this.modelSynchronizer.enableNotification();
+                }
+            }
+        }
+    }
+
+    private void addImport(Module module, Node newValue) {
+        int position = 0;
+        if (module.getImports().isEmpty()) {
+            if (module.getPrefix() != null) {
+                position = module.getPrefix().getEndPosition() + 1;
+            } else {
+                position = module.getBodyStartPosition() + 1;
+            }
+        } else {
+            for (ASTNode astNode : module.getChildren()) {
+                if (astNode instanceof ModuleImport) {
+                    position = astNode.getEndPosition() + 1;
+                }
+            }
+        }
+
+        performEdit(new InsertEdit(position, System.lineSeparator() + formatImport((Import) newValue)));
+    }
+
+    /**
+     * @param notifier
+     * @param newValue
+     * @param oldIntValue
+     * @param position
+     */
+    private void move(Node notifier, Node newValue, int oldPosition, int position) {
+        ASTNode node = mapping.get(notifier);
+        ASTNode child = mapping.get(newValue);
+        if (!(node instanceof ASTCompositeNode)) {
+            throw new RuntimeException("Parent node should be composite");
+        }
+        ASTCompositeNode parent = (ASTCompositeNode) node;
+
+        int insertPosition = parent.getBodyStartPosition() + 2;
+        if (0 != position && parent.getChildren().size() > 0) {
+            int size = parent.getChildren().size();
+            insertPosition = position < 0 || position >= size ? parent.getChildren().get(size - 1).getEndPosition() + 2
+                    : parent.getChildren().get(
+                            parent.getChildren().contains(child) && position < oldPosition ? position - 1 : position)
+                            .getEndPosition() + 2;
+        }
+
+        try {
+            String content = yangSourceEditor.getDocument().get(child.getStartPosition(), child.getLength() + 1);
+
+            TextEdit composite = new MultiTextEdit();
+            composite.addChild(new DeleteEdit(child.getStartPosition(), child.getLength() + 1));
+            composite.addChild(new InsertEdit(insertPosition, content));
+            performEdit(composite);
+        } catch (BadLocationException e) {
+            YangCorePlugin.log(e);
+        }
+
+    }
+
+    public void add(ASTNode node, String content, int position) {
+
+        if (!(node instanceof ASTCompositeNode)) {
+            throw new RuntimeException("Parent node should be composite");
+        }
+        ASTCompositeNode parent = (ASTCompositeNode) node;
+
+        int insertPosition = parent.getBodyStartPosition() + 2;
+        if (0 != position && parent.getChildren().size() > 0) {
+            int size = parent.getChildren().size();
+            insertPosition = position < 0 || position >= size ? parent.getChildren().get(size - 1).getEndPosition() + 2
+                    : parent.getChildren().get(position - 1).getEndPosition() + 2;
+        }
+
+        if (node instanceof Module || node instanceof SubModule) {
+            insertPosition = parent.getBodyEndPosition() - 1;
+        }
+        String formattedContent = YangParserUtil.formatYangSource(new YangFormattingPreferences(),
+                content.toCharArray(), getIndentLevel(node), System.getProperty("line.separator"));
+        performEdit(new InsertEdit(insertPosition, formattedContent));
+    }
+
+    void delete(Node node) {
+        ASTNode astNode = mapping.get(node);
+        try {
+            removedBlock.put(node,
+                    yangSourceEditor.getDocument().get(astNode.getStartPosition(), astNode.getLength() + 1));
+        } catch (BadLocationException e) {
+            // ignore exception
+        }
+        performEdit(new DeleteEdit(astNode.getStartPosition(), astNode.getLength() + 1));
+    }
+
+    void updateName(Node node, EAttribute feature, Object newValue) {
+        ASTNode astNode = mapping.get(node);
+        if (astNode == null) {
+            throw new RuntimeException("Cannot find references source block from diagram editor");
+        }
+
+        if (!(astNode instanceof ASTNamedNode)) {
+            throw new RuntimeException("Source block is not named element");
+        }
+        ASTNamedNode nnode = (ASTNamedNode) astNode;
+
+        performEdit(new ReplaceEdit(nnode.getNameStartPosition(), nnode.getNameLength(), (String) newValue));
+    }
+
+    private void updateIdentityReference(Node node, Object newValue) {
+        ASTNode astNode = mapping.get(node);
+        if (astNode == null) {
+            throw new RuntimeException("Cannot find references source block from diagram editor");
+        }
+
+        BaseReference base = ((IdentitySchemaNode) astNode).getBase();
+        if (base == null && newValue != null) {
+            performEdit(new InsertEdit(astNode.getBodyStartPosition() + 1, formatBase(astNode, (String) newValue)));
+        } else if (base != null) {
+            if (newValue != null && !((String) newValue).trim().isEmpty()) {
+                performEdit(new ReplaceEdit(base.getNameStartPosition(), base.getNameLength(), (String) newValue));
+            } else {
+                performEdit(new DeleteEdit(base.getStartPosition(), base.getLength() + 1));
+            }
+        }
+    }
+
+    private void updateBelongsTo(Node node, Object oldValue, Object newValue) {
+        ASTNode astNode = mapping.get(node);
+        if (astNode == null) {
+            throw new RuntimeException("Cannot find references source block from diagram editor");
+        }
+
+        com.cisco.yangide.core.dom.SubModule subModule = (com.cisco.yangide.core.dom.SubModule) astNode;
+        SimpleNode<String> btNode = subModule.getParentModule();
+        if (btNode != null) {
+            performEdit(new ReplaceEdit(btNode.getStartPosition(), btNode.getLength() + 1,
+                    formatBelongsTo((BelongsTo) newValue)));
+        } else {
+            performEdit(new InsertEdit(subModule.getBodyStartPosition() + 1,
+                    System.lineSeparator() + formatBelongsTo((BelongsTo) newValue)));
+        }
+    }
+
+    synchronized void performEdit(final TextEdit edit) {
+        Display display = Display.getCurrent();
+        if (display == null) {
+            display = Display.getDefault();
+        }
+        display.syncExec(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    YangSourceViewer viewer = (YangSourceViewer) yangSourceEditor.getViewer();
+                    MultiTextEdit mt = new MultiTextEdit();
+                    mt.addChild(edit);
+                    new RewriteSessionEditProcessor(viewer.getDocument(), mt, TextEdit.CREATE_UNDO).performEdits();
+                    viewer.updateDocument();
+                } catch (MalformedTreeException | BadLocationException e) {
+                    Activator.log(e, e.getMessage());
+                }
+            }
+        });
+        char[] content = yangSourceEditor.getDocument().get().toCharArray();
+        com.cisco.yangide.core.dom.Module module = YangParserUtil.parseYangFile(content);
+        modelSynchronizer.updateFromSource(module, true);
+        yangSourceEditor.reconcileModel();
+    }
+
+    public int getIndentLevel(ASTNode node) {
+        int level = 0;
+        ASTNode parent = node;
+        while (parent != null) {
+            parent = parent.getParent();
+            level++;
+        }
+        return level;
+    }
+
+    private String formatBase(ASTNode node, String value) {
+        return trimTrailingSpaces(
+                RefactorUtil.formatCodeSnipped("\nbase " + empty2Quote(value) + ";", getIndentLevel(node)));
+    }
+
+    private String formatImport(Import newValue) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("import ").append(newValue.getModule()).append(" {\n");
+        sb.append("prefix ").append(newValue.getPrefix()).append(";\n");
+        sb.append("revision-date \"").append(newValue.getRevisionDate()).append("\";\n");
+        sb.append("}");
+        return trimTrailingSpaces(RefactorUtil.formatCodeSnipped(sb.toString(), 1));
+    }
+
+    private String formatBelongsTo(BelongsTo belongsTo) {
+        com.cisco.yangide.ext.model.Module parentModule = belongsTo.getOwnerModule();
+        String prefix = (String) YangModelUtil.getValue(YangTag.PREFIX, parentModule);
+        StringBuilder sb = new StringBuilder();
+        sb.append("belongs-to ").append(parentModule.getName()).append(" {\n");
+        sb.append("prefix ").append(prefix).append(";\n");
+        sb.append("}");
+        return trimTrailingSpaces(RefactorUtil.formatCodeSnipped(sb.toString(), 0));
+    }
+
+    private String trimTrailingSpaces(String str) {
+        int len = str.length();
+        char[] val = str.toCharArray();
+
+        while ((len > 0) && (val[len - 1] <= ' ')) {
+            len--;
+        }
+        return (len < str.length()) ? str.substring(0, len) : str;
+    }
+
+    private String empty2Quote(String str) {
+        return str == null || str.trim().isEmpty() ? ("\"" + str + "\"") : str;
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/sync/DiagramModelMergeAdapter.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/sync/DiagramModelMergeAdapter.java
new file mode 100644 (file)
index 0000000..2795030
--- /dev/null
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.sync;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.util.EContentAdapter;
+import org.eclipse.ui.progress.UIJob;
+
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Node;
+import com.cisco.yangide.ext.model.editor.editors.IModelChangeHandler;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 13, 2014
+ */
+final class DiagramModelMergeAdapter extends EContentAdapter {
+    private IModelChangeHandler modelChangeHandler;
+
+    /**
+     * @param modelSynchronizer
+     */
+    DiagramModelMergeAdapter(IModelChangeHandler modelChangeHandler) {
+        this.modelChangeHandler = modelChangeHandler;
+    }
+
+    @Override
+    public void notifyChanged(final Notification notification) {
+        if (notification.getEventType() != Notification.REMOVING_ADAPTER
+                && notification.getFeature() != ModelPackage.Literals.NODE__PARENT) {
+            switch (notification.getEventType()) {
+            case Notification.ADD:
+                if (notification.getFeature() == ModelPackage.Literals.CONTAINING_NODE__CHILDREN) {
+                    final Node node = (Node) notification.getNewValue();
+                    final Node parent = (Node) notification.getNotifier();
+                    new UIJob("Update diagram from source") {
+                        @Override
+                        public IStatus runInUIThread(IProgressMonitor monitor) {
+                            modelChangeHandler.nodeAdded(parent, node, notification.getPosition());
+                            return Status.OK_STATUS;
+                        }
+                    }.schedule();
+                }
+                break;
+            case Notification.REMOVE:
+                if (notification.getOldValue() instanceof Node && notification.getOldValue() != null) {
+                    final Node node = (Node) notification.getOldValue();
+                    new UIJob("Update diagram from source") {
+                        @Override
+                        public IStatus runInUIThread(IProgressMonitor monitor) {
+                            modelChangeHandler.nodeRemoved(node);
+                            return Status.OK_STATUS;
+                        }
+                    }.schedule();
+                }
+                break;
+            case Notification.SET:
+                if (notification.getNotifier() instanceof Node && notification.getFeature() instanceof EAttribute) {
+                    final Node node = (Node) notification.getNotifier();
+                    new UIJob("Update diagram from source") {
+                        @Override
+                        public IStatus runInUIThread(IProgressMonitor monitor) {
+                            modelChangeHandler.nodeChanged(node, (EAttribute) notification.getFeature(),
+                                    notification.getNewValue());
+                            return Status.OK_STATUS;
+                        }
+                    }.schedule();
+                }
+                break;
+            default:
+                break;
+            }
+        }
+        super.notifyChanged(notification);
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/sync/LeafPropertyUpdater.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/sync/LeafPropertyUpdater.java
new file mode 100644 (file)
index 0000000..2454a28
--- /dev/null
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.sync;
+
+import com.cisco.yangide.core.dom.ContrainerSchemaNode;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 28, 2014
+ */
+public class LeafPropertyUpdater extends SourceNodePropertyUpdater<ContrainerSchemaNode> {
+
+    public LeafPropertyUpdater(DiagramModelAdapter adapter) {
+        super(adapter);
+    }
+
+    @Override
+    protected boolean isHandleProperty(String name) {
+        return "config".equals(name) || "default".equals(name) || "mandatory".equals(name) || "units".equals(name);
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/sync/ListPropertyUpdater.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/sync/ListPropertyUpdater.java
new file mode 100644 (file)
index 0000000..8fdeee6
--- /dev/null
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.sync;
+
+import com.cisco.yangide.core.dom.ContrainerSchemaNode;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 28, 2014
+ */
+public class ListPropertyUpdater extends SourceNodePropertyUpdater<ContrainerSchemaNode> {
+
+    public ListPropertyUpdater(DiagramModelAdapter adapter) {
+        super(adapter);
+    }
+
+    @Override
+    protected boolean isHandleProperty(String name) {
+        return "config".equals(name) || "max-elements".equals(name) || "min-elements".equals(name)
+                || "ordered-by".equals(name) || "units".equals(name);
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/sync/ModelSynchronizer.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/sync/ModelSynchronizer.java
new file mode 100644 (file)
index 0000000..656a480
--- /dev/null
@@ -0,0 +1,276 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.sync;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.WeakHashMap;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.emf.compare.Comparison;
+import org.eclipse.emf.compare.Diff;
+import org.eclipse.emf.compare.EMFCompare;
+import org.eclipse.emf.compare.Match;
+import org.eclipse.emf.compare.merge.BatchMerger;
+import org.eclipse.emf.compare.merge.IBatchMerger;
+import org.eclipse.emf.compare.merge.IMerger;
+import org.eclipse.emf.compare.merge.ReferenceChangeMerger;
+import org.eclipse.emf.compare.scope.DefaultComparisonScope;
+import org.eclipse.emf.compare.scope.IComparisonScope;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.text.undo.DocumentUndoEvent;
+import org.eclipse.text.undo.DocumentUndoManagerRegistry;
+import org.eclipse.text.undo.IDocumentUndoListener;
+import org.eclipse.ui.IFileEditorInput;
+
+import com.cisco.yangide.core.YangCorePlugin;
+import com.cisco.yangide.core.YangModelException;
+import com.cisco.yangide.core.dom.ASTNode;
+import com.cisco.yangide.core.parser.YangParserUtil;
+import com.cisco.yangide.editor.editors.IReconcileHandler;
+import com.cisco.yangide.editor.editors.YangEditor;
+import com.cisco.yangide.ext.model.Module;
+import com.cisco.yangide.ext.model.Node;
+import com.cisco.yangide.ext.model.editor.Activator;
+import com.cisco.yangide.ext.model.editor.editors.IModelChangeHandler;
+import com.cisco.yangide.ext.model.editor.editors.ISourceModelManager;
+import com.cisco.yangide.ext.model.editor.editors.YangDiagramEditor;
+import com.cisco.yangide.ext.model.editor.util.YangModelUtil;
+import com.cisco.yangide.ext.refactoring.code.ExtractGroupingRefactoring;
+import com.cisco.yangide.ext.refactoring.ui.ExtractGroupingRefactoringWizard;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 13, 2014
+ */
+public class ModelSynchronizer implements IDocumentUndoListener, IReconcileHandler {
+    private YangEditor yangSourceEditor;
+
+    // modules to sync
+    private com.cisco.yangide.core.dom.Module astModule;
+    private Module diagModule;
+
+    // source to diag notifier
+    private IModelChangeHandler modelChangeHandler;
+    private DiagramModelMergeAdapter diagModelMergeAdapter;
+
+    /** Diag node to AST node mapping. */
+    private Map<Node, ASTNode> mapping = new WeakHashMap<>();
+    private boolean notification;
+    private boolean sourceInvalid;
+
+    private DiagramModelAdapter diagModelAdapter;
+
+    private ISourceModelManager sourceModelManager = new ISourceModelManager() {
+
+        @Override
+        public void createSourceElement(Node parent, int position, String content) {
+            ASTNode node = mapping.get(parent);
+            diagModelAdapter.add(node, content + System.lineSeparator(), position);
+            syncWithSource();
+        }
+
+        @Override
+        public void extractGrouping(List<Node> nodes) {
+            int startPosition = Integer.MAX_VALUE;
+            int endPosition = Integer.MIN_VALUE;
+            for (Node node : nodes) {
+                ASTNode astNode = mapping.get(node);
+                startPosition = Math.min(startPosition, astNode.getStartPosition());
+                endPosition = Math.max(endPosition, astNode.getEndPosition() + 1);
+            }
+
+            IFile file = ((IFileEditorInput) yangSourceEditor.getEditorInput()).getFile();
+
+            try {
+                ExtractGroupingRefactoring refactoring = new ExtractGroupingRefactoring(file,
+                        yangSourceEditor.getModule(), startPosition, endPosition - startPosition);
+                ExtractGroupingRefactoringWizard wizard = new ExtractGroupingRefactoringWizard(refactoring);
+
+                RefactoringWizardOpenOperation op = new RefactoringWizardOpenOperation(wizard);
+                op.run(Display.getDefault().getActiveShell(), "Extract Grouping");
+                syncWithSource();
+            } catch (InterruptedException | YangModelException e) {
+                // do nothing
+            }
+        }
+
+        @Override
+        public ASTNode getModuleNode(Node node) {
+            return mapping.get(node);
+        }
+    };
+
+    public ModelSynchronizer(YangEditor yangSourceEditor, YangDiagramEditor yangDiagramEditor) {
+        this.yangSourceEditor = yangSourceEditor;
+        this.modelChangeHandler = yangDiagramEditor.getModelChangeHandler();
+
+        this.diagModelMergeAdapter = new DiagramModelMergeAdapter(modelChangeHandler);
+        this.diagModelAdapter = new DiagramModelAdapter(this, yangSourceEditor, mapping);
+    }
+
+    public void init() {
+        this.yangSourceEditor.addReconcileHandler(this);
+        DocumentUndoManagerRegistry.getDocumentUndoManager(yangSourceEditor.getDocument())
+                .addDocumentUndoListener(this);
+    }
+
+    public void dispose() {
+        this.yangSourceEditor.removeReconcileHandler(this);
+    }
+
+    public void disableNotification() {
+        notification = false;
+    }
+
+    public void enableNotification() {
+        notification = true;
+    }
+
+    public boolean isNotificationEnabled() {
+        return notification;
+    }
+
+    public void syncWithSource(com.cisco.yangide.core.dom.Module module) {
+        if (isNotificationEnabled()) {
+            try {
+                disableNotification();
+                updateFromSource(module, true);
+            } finally {
+                enableNotification();
+            }
+        }
+    }
+
+    public void syncWithSource() {
+        if (isNotificationEnabled()) {
+            try {
+                disableNotification();
+                char[] content = yangSourceEditor.getDocument().get().toCharArray();
+                com.cisco.yangide.core.dom.Module module = YangParserUtil.parseYangFile(content);
+                setSourceInvalid(!module.isSyntaxValid());
+                if (module.isSyntaxValid()) {
+                    updateFromSource(module, true);
+                }
+            } finally {
+                enableNotification();
+            }
+        }
+    }
+
+    public ISourceModelManager getSourceModelManager() {
+        return sourceModelManager;
+    }
+
+    void updateFromSource(com.cisco.yangide.core.dom.Module module, boolean notify) {
+        if (Activator.getDefault().isDebugging()) {
+            System.out.println("from source");
+        }
+        final Map<Node, ASTNode> newMapping = new HashMap<>();
+
+        astModule = module;
+        Module moduleNew = YangModelUtil.exportModel(module, newMapping);
+        IComparisonScope scope = new DefaultComparisonScope(diagModule, moduleNew, diagModule);
+        Comparison comparison = EMFCompare.builder().build().compare(scope);
+
+        updateMappings(newMapping, comparison.getMatches());
+        List<Diff> differences = comparison.getDifferences();
+        IMerger.Registry mergerRegistry = IMerger.RegistryImpl.createStandaloneInstance();
+        ReferenceChangeMerger refMerger = new ReferenceChangeMerger() {
+            @Override
+            protected EObject createCopy(EObject referenceObject) {
+                EObject copy = super.createCopy(referenceObject);
+                if (newMapping.containsKey(referenceObject) && copy instanceof Node) {
+                    mapping.put((Node) copy, newMapping.remove(referenceObject));
+                }
+                return copy;
+            }
+        };
+        refMerger.setRanking(20); // highest rank then default
+        mergerRegistry.add(refMerger);
+        IBatchMerger merger = new BatchMerger(mergerRegistry);
+        if (notify) {
+            diagModule.eAdapters().add(diagModelMergeAdapter);
+        }
+        merger.copyAllRightToLeft(differences, null);
+        if (notify) {
+            diagModule.eAdapters().remove(diagModelMergeAdapter);
+        }
+    }
+
+    private void updateMappings(Map<Node, ASTNode> newMapping, Iterable<Match> matches) {
+        for (Match match : matches) {
+            if (newMapping.containsKey(match.getRight())) {
+                mapping.put((Node) match.getLeft(), newMapping.get(match.getRight()));
+            }
+            updateMappings(newMapping, match.getAllSubmatches());
+        }
+    }
+
+    /**
+     * @return
+     */
+    public Module getDiagramModule() {
+        if (diagModule == null) {
+            diagModule = YangModelUtil.exportModel(getSourceModule(), mapping);
+            diagModule.eAdapters().add(diagModelAdapter);
+        }
+        return diagModule;
+    }
+
+    public com.cisco.yangide.core.dom.Module getSourceModule() {
+        if (astModule == null) {
+            try {
+                astModule = yangSourceEditor.getModule();
+                if (astModule == null) {
+                    astModule = new com.cisco.yangide.core.dom.Module();
+                    astModule.setName("module");
+                }
+            } catch (YangModelException e) {
+                YangCorePlugin.log(e);
+            }
+        }
+        return astModule;
+    }
+
+    /**
+     * @return the sourceInvalid
+     */
+    public boolean isSourceInvalid() {
+        return sourceInvalid;
+    }
+
+    /**
+     * @param sourceInvalid the sourceInvalid to set
+     */
+    public void setSourceInvalid(boolean sourceInvalid) {
+        this.sourceInvalid = sourceInvalid;
+    }
+
+    @Override
+    public void reconcile() {
+        YangEditor editor = ModelSynchronizer.this.yangSourceEditor;
+        try {
+            com.cisco.yangide.core.dom.Module module = editor.getModule();
+            sourceInvalid = module.getFlags() == ASTNode.MALFORMED;
+            if (!isSourceInvalid()) {
+                syncWithSource(module);
+            }
+        } catch (YangModelException e) {
+            YangCorePlugin.log(e);
+        }
+    }
+
+    @Override
+    public void documentUndoNotification(DocumentUndoEvent event) {
+        reconcile();
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/sync/ModulePropertyUpdater.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/sync/ModulePropertyUpdater.java
new file mode 100644 (file)
index 0000000..3972311
--- /dev/null
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.sync;
+
+import org.eclipse.text.edits.InsertEdit;
+import org.eclipse.text.edits.ReplaceEdit;
+
+import com.cisco.yangide.core.dom.ASTNode;
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.core.dom.SimpleNode;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 28, 2014
+ */
+public class ModulePropertyUpdater extends SourceNodePropertyUpdater<Module> {
+
+    public ModulePropertyUpdater(DiagramModelAdapter adapter) {
+        super(adapter);
+    }
+
+    @Override
+    public void updateProperty(Module node, String name, Object newValue, int startPosition) {
+        Module module = node;
+        SimpleNode<String> prop = null;
+        boolean handle = false;
+
+        switch (name) {
+        case "namespace":
+            prop = module.getNamespaceNode();
+            handle = true;
+            break;
+        case "prefix":
+            prop = module.getPrefix();
+            handle = true;
+            break;
+        case "yang-version":
+            prop = module.getYangVersion();
+            handle = true;
+            break;
+        }
+
+        if (handle) {
+            if (prop == null) { // insert new property
+                int pos = node.getBodyStartPosition() + 1;
+                adapter.performEdit(
+                        new InsertEdit(pos, System.lineSeparator() + formatTag(node, name, (String) newValue)));
+            } else { // update property
+                adapter.performEdit(new ReplaceEdit(prop.getStartPosition(), prop.getLength() + 1,
+                        formatTag(node, name, (String) newValue).trim()));
+            }
+        }
+        ASTNode beforeRevisionNode = getAboveChildNode(module, module.getRevisionNode());
+        int beforeRevision = beforeRevisionNode != null ? beforeRevisionNode.getEndPosition() + 1
+                : node.getBodyStartPosition() + 1;
+
+        super.updateDefaultProperty(node, name, newValue, beforeRevision);
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/sync/SourceNodePropertyUpdater.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/sync/SourceNodePropertyUpdater.java
new file mode 100644 (file)
index 0000000..d2f303e
--- /dev/null
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.sync;
+
+import org.eclipse.text.edits.DeleteEdit;
+import org.eclipse.text.edits.InsertEdit;
+import org.eclipse.text.edits.ReplaceEdit;
+
+import com.cisco.yangide.core.dom.ASTCompositeNode;
+import com.cisco.yangide.core.dom.ASTNode;
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.core.dom.SimpleNode;
+import com.cisco.yangide.ext.model.editor.Activator;
+import com.cisco.yangide.ext.refactoring.RefactorUtil;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 28, 2014
+ */
+public class SourceNodePropertyUpdater<T extends ASTNode> {
+    protected final DiagramModelAdapter adapter;
+
+    public SourceNodePropertyUpdater(DiagramModelAdapter adapter) {
+        this.adapter = adapter;
+    }
+
+    public void updateProperty(T node, String name, Object newValue, int startPosition) {
+        if (isHandleProperty(name)) {
+            SimpleNode<Object> prop = getProperty(node, name);
+            if (prop == null) { // insert new property
+                int pos = node.getBodyStartPosition() + 1;
+                adapter.performEdit(
+                        new InsertEdit(pos, System.lineSeparator() + formatTag(node, name, (String) newValue)));
+            } else { // update property
+                adapter.performEdit(new ReplaceEdit(prop.getStartPosition(), prop.getLength() + 1,
+                        formatTag(node, name, (String) newValue).trim()));
+            }
+        } else {
+            updateDefaultProperty(node, name, newValue, startPosition);
+        }
+    }
+
+    protected boolean isHandleProperty(String name) {
+        return false;
+    }
+
+    protected void updateDefaultProperty(ASTNode node, String name, Object newValue, int startPosition) {
+        SimpleNode<String> prop = null;
+
+        switch (name) {
+        case "description":
+            prop = node.getDescriptionNode();
+            break;
+        case "reference":
+            prop = node.getReferenceNode();
+            break;
+        case "status":
+            prop = node.getStatusNode();
+            break;
+        case "organization":
+            prop = ((Module) node).getOrganization();
+            break;
+        case "contact":
+            prop = ((Module) node).getContact();
+            break;
+        default:
+            Activator.logError("unknoun tag: " + name);
+            return;
+        }
+
+        if (prop == null) { // insert new property
+            int pos = startPosition;
+            if (name.equals("status")) {
+                if (node.getReferenceNode() != null) {
+                    pos = node.getReferenceNode().getEndPosition() + 1;
+                } else if (node.getDescriptionNode() != null) {
+                    pos = node.getDescriptionNode().getEndPosition() + 1;
+                }
+            } else if (name.equals("reference") && node.getDescriptionNode() != null) {
+                pos = node.getDescriptionNode().getEndPosition() + 1;
+            }
+            adapter.performEdit(new InsertEdit(pos, System.lineSeparator() + formatTag(node, name, (String) newValue)));
+        } else if (newValue == null || ((String) newValue).isEmpty()) { // delete property
+            if (prop != null) {
+                adapter.performEdit(new DeleteEdit(prop.getStartPosition(), prop.getLength() + 1));
+            }
+        } else { // update property
+            if (prop != null) {
+                adapter.performEdit(new ReplaceEdit(prop.getStartPosition(), prop.getLength() + 1,
+                        formatTag(node, name, (String) newValue).trim()));
+            }
+        }
+    }
+
+    protected ASTNode getAboveChildNode(ASTCompositeNode parent, ASTNode node) {
+        ASTNode result = null;
+        for (ASTNode child : parent.getChildren()) {
+            if (child == node) {
+                return result;
+            }
+            result = child;
+        }
+        return null;
+    }
+
+    protected String formatTag(ASTNode node, String name, String value) {
+        return trimTrailingSpaces(
+                RefactorUtil.formatCodeSnipped(name + " \"" + value + "\";", adapter.getIndentLevel(node)));
+    }
+
+    protected String trimTrailingSpaces(String str) {
+        int len = str.length();
+        char[] val = str.toCharArray();
+
+        while ((len > 0) && (val[len - 1] <= ' ')) {
+            len--;
+        }
+        return (len < str.length()) ? str.substring(0, len) : str;
+    }
+
+    protected String empty2Quote(String str) {
+        return str == null || str.trim().isEmpty() ? ("\"" + str + "\"") : str;
+    }
+
+    @SuppressWarnings("unchecked")
+    protected SimpleNode<Object> getProperty(ASTNode node, String name) {
+        if (node instanceof ASTCompositeNode) {
+            for (ASTNode child : ((ASTCompositeNode) node).getChildren()) {
+                if (child instanceof SimpleNode && child.getNodeName().equals(name)) {
+                    return (SimpleNode<Object>) child;
+                }
+            }
+        }
+        return null;
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/sync/TypedefPropertyUpdater.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/sync/TypedefPropertyUpdater.java
new file mode 100644 (file)
index 0000000..d1ea450
--- /dev/null
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.sync;
+
+import com.cisco.yangide.core.dom.ContrainerSchemaNode;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 28, 2014
+ */
+public class TypedefPropertyUpdater extends SourceNodePropertyUpdater<ContrainerSchemaNode> {
+
+    public TypedefPropertyUpdater(DiagramModelAdapter adapter) {
+        super(adapter);
+    }
+
+    @Override
+    protected boolean isHandleProperty(String name) {
+        return "default".equals(name) || "units".equals(name);
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/BusinessObjectWrapper.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/BusinessObjectWrapper.java
new file mode 100644 (file)
index 0000000..1670040
--- /dev/null
@@ -0,0 +1,12 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.util;
+
+public interface BusinessObjectWrapper<T> {
+    public T getBusinessObject();
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/DiagramImportSupport.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/DiagramImportSupport.java
new file mode 100644 (file)
index 0000000..ea4cdbc
--- /dev/null
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.util;
+
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
+import org.eclipse.graphiti.mm.pictograms.Diagram;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.services.Graphiti;
+
+import com.cisco.yangide.ext.model.ContainingNode;
+import com.cisco.yangide.ext.model.ModelFactory;
+import com.cisco.yangide.ext.model.Module;
+import com.cisco.yangide.ext.model.Node;
+
+public class DiagramImportSupport {
+    public static void importDiagram(Diagram diagram, IFeatureProvider fp) {
+        EObject obj = Graphiti.getLinkService().getBusinessObjectForLinkedPictogramElement(diagram);
+        if (null == obj) {
+            obj = ModelFactory.eINSTANCE.createModule();
+            fp.link(diagram, obj);
+        }
+        if (YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getModule(), obj)) {
+            drawShapes(((Module) obj).getChildren(), diagram, fp);
+            drawLines(((Module) obj).getChildren(), fp);
+            // YangModelUIUtil.layoutPictogramElement(diagram, fp);
+        }
+    }
+
+    public static void drawShapes(List<Node> list, ContainerShape cs, IFeatureProvider fp) {
+        for (Node n : list) {
+            int pos = cs.getGraphicsAlgorithm().getHeight();
+            if (cs instanceof Diagram) {
+                pos = 0;
+            }
+            PictogramElement pe = YangModelUIUtil.drawObject(n, cs, fp, 0, pos);
+            if (YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getContainingNode(), n) && null != pe
+                    && pe instanceof ContainerShape) {
+                drawShapes(((ContainingNode) n).getChildren(), (ContainerShape) pe, fp);
+            }
+        }
+    }
+
+    public static void drawLines(List<Node> list, IFeatureProvider fp) {
+        for (Node n : list) {
+            YangModelUIUtil.updateConnections(n, fp);
+            if (YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getContainingNode(), n)) {
+                drawLines(((ContainingNode) n).getChildren(), fp);
+            }
+        }
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/LayoutUtil.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/LayoutUtil.java
new file mode 100644 (file)
index 0000000..03ae420
--- /dev/null
@@ -0,0 +1,427 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.util;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.graphiti.datatypes.IDimension;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.context.impl.AddBendpointContext;
+import org.eclipse.graphiti.features.context.impl.LayoutContext;
+import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
+import org.eclipse.graphiti.mm.algorithms.Polyline;
+import org.eclipse.graphiti.mm.algorithms.Text;
+import org.eclipse.graphiti.mm.algorithms.styles.Point;
+import org.eclipse.graphiti.mm.pictograms.Connection;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
+import org.eclipse.graphiti.mm.pictograms.FreeFormConnection;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.mm.pictograms.Shape;
+import org.eclipse.graphiti.services.Graphiti;
+import org.eclipse.graphiti.ui.services.GraphitiUi;
+
+import com.cisco.yangide.ext.model.editor.diagram.EditorFeatureProvider;
+import com.cisco.yangide.ext.model.editor.util.connection.Position;
+import com.cisco.yangide.ext.model.editor.util.connection.RectilinearAvoidObstaclesPathFinder;
+import com.cisco.yangide.ext.model.editor.util.connection.RoutePath;
+
+public class LayoutUtil {
+
+    private LayoutUtil() {
+        super();
+    }
+
+    public static final double DEFAULT_DIAGRAM_LAYOUT_V_SHIFT = 10;
+    protected static final Comparator<YangDiagramNode> COMPARATOR = new LayoutEntityOrderComparator();
+
+    private static void updateGraphCoordinates(List<YangDiagramNode> nodes) {
+        for (YangDiagramNode node : nodes) {
+            node.updateRealObject();
+        }
+    }
+
+    private static List<YangDiagramNode> getLayoutEntities(IFeatureProvider fp) {
+        EList<Shape> children = fp.getDiagramTypeProvider().getDiagram().getChildren();
+        List<YangDiagramNode> result = new ArrayList<YangDiagramNode>();
+        for (Shape shape : children) {
+            Object bo = fp.getBusinessObjectForPictogramElement(shape);
+            if (null != bo) {
+                int pos = YangModelUtil.getPositionInParent(
+                        fp.getBusinessObjectForPictogramElement(fp.getDiagramTypeProvider().getDiagram()), bo);
+                YangDiagramNode currentEntity = new YangDiagramNode(shape, pos);
+                result.add(currentEntity);
+            }
+        }
+        return result;
+    }
+
+    private static double[] getAreaSizeAndArrangeLayout(List<YangDiagramNode> entities,
+            YangDiagramLayoutAlgorithm layout, int width, int height) {
+        double maxW = 0D;
+        double maxH = 0D;
+        double fullW = 0D;
+        double fullH = 0D;
+
+        for (YangDiagramNode node : entities) {
+            fullW += node.getWidth();
+            if (maxW < node.getWidth()) {
+                maxW = node.getWidth();
+            }
+            fullH += node.getHeight();
+            if (maxH < node.getHeight()) {
+                maxH = node.getHeight();
+            }
+        }
+        layout.setMaxElementSizes(maxW, maxH);
+        layout.setFullElementSizes(fullW, fullH);
+        double h = Math.max(1, Math.ceil(entities.size() / (width / maxW))) * maxH;
+        return new double[] { width, h };
+    }
+
+    public static class YangDiagramNode {
+        protected int pos;
+        protected Shape realObject;
+        protected double x, y, width, height;
+
+        public YangDiagramNode(Shape realObject, int pos) {
+            this.realObject = realObject;
+            this.x = realObject.getGraphicsAlgorithm().getX();
+            this.y = realObject.getGraphicsAlgorithm().getY();
+            this.height = realObject.getGraphicsAlgorithm().getHeight();
+            this.width = realObject.getGraphicsAlgorithm().getWidth();
+            this.pos = pos;
+        }
+
+        public int getPositionInParent() {
+            return pos;
+        }
+
+        public double getX() {
+            return x;
+        }
+
+        public double getY() {
+            return y;
+        }
+
+        public void setLocation(double x, double y) {
+            this.x = x;
+            this.y = y;
+        }
+
+        public double getWidth() {
+            return width;
+        }
+
+        public double getHeight() {
+            return height;
+        }
+
+        public void updateRealObject() {
+            realObject.getGraphicsAlgorithm().setX((int) x);
+            realObject.getGraphicsAlgorithm().setY((int) y);
+        }
+    }
+
+    public static class YangCompositeSimpleNode extends YangDiagramNode {
+        private List<YangCompositeSimpleNode> children;
+
+        public YangCompositeSimpleNode(ContainerShape realObject, int pos) {
+            super(realObject, pos);
+        }
+
+        @Override
+        public int getPositionInParent() {
+            return pos;
+        }
+
+        public List<YangCompositeSimpleNode> getChildren() {
+            if (null == children) {
+                children = new ArrayList<YangCompositeSimpleNode>();
+            }
+            return children;
+        }
+
+        public void addChild(YangCompositeSimpleNode child) {
+            getChildren().add(child);
+        }
+
+        public void setSize(int width, int height) {
+            this.width = width;
+            this.height = height;
+        }
+
+        public void updateRealObject(IFeatureProvider fp) {
+            realObject.getGraphicsAlgorithm().setX((int) x);
+            realObject.getGraphicsAlgorithm().setY((int) y);
+            realObject.getGraphicsAlgorithm().setHeight((int) height);
+            realObject.getGraphicsAlgorithm().setWidth((int) width);
+            layoutContainerShapeHeader((ContainerShape) realObject, fp);
+            for (YangCompositeSimpleNode child : getChildren()) {
+                child.updateRealObject(fp);
+            }
+        }
+
+    }
+
+    private static class LayoutEntityOrderComparator implements Comparator<YangDiagramNode> {
+
+        @Override
+        public int compare(YangDiagramNode o1, YangDiagramNode o2) {
+            if (null == o1 && null == o2) {
+                return 0;
+            }
+            if (null != o1 && null == o2) {
+                return 1;
+            }
+            if (null == o1 && null != o2) {
+                return -1;
+            }
+            return o1.getPositionInParent() > o2.getPositionInParent() ? 1
+                    : o1.getPositionInParent() == o2.getPositionInParent() ? 0 : -1;
+        }
+
+    }
+
+    protected static int layoutCompositeSimpleNode(YangCompositeSimpleNode element, int boundsWidth) {
+
+        int y = YangModelUIUtil.DEFAULT_TEXT_HEIGHT;
+        for (YangCompositeSimpleNode sn : element.getChildren()) {
+            int elementHeight = layoutCompositeSimpleNode(sn,
+                    Math.max(0, boundsWidth - 2 * YangModelUIUtil.DEFAULT_V_ALIGN))
+                    + 2 * YangModelUIUtil.DEFAULT_H_ALIGN;
+            int xmove = YangModelUIUtil.DEFAULT_V_ALIGN;
+            int ymove = y + YangModelUIUtil.DEFAULT_H_ALIGN;
+            sn.setLocation(xmove, ymove);
+            sn.setSize(Math.max(0, boundsWidth - 2 * YangModelUIUtil.DEFAULT_V_ALIGN),
+                    (int) Math.max(elementHeight, sn.getHeight()));
+            y = (int) (y + sn.getHeight() + YangModelUIUtil.DEFAULT_H_ALIGN);
+
+        }
+        element.setSize(boundsWidth, (int) Math.max(y + 2 * YangModelUIUtil.DEFAULT_H_ALIGN, element.getHeight()));
+        return y;
+    }
+
+    private static class YangDiagramLayoutAlgorithm {
+
+        protected double maxW = YangModelUIUtil.DEFAULT_WIDTH;
+        @SuppressWarnings("unused")
+        protected double maxH = YangModelUIUtil.DEFAULT_COMPOSITE_HEIGHT;
+        protected int cols;
+        protected int rows;
+
+        @SuppressWarnings("unused")
+        protected double fullW = YangModelUIUtil.DEFAULT_WIDTH;
+        protected double fullH = YangModelUIUtil.DEFAULT_COMPOSITE_HEIGHT;
+        public static final int OFFSET = 40;
+
+        protected int[] calculateNumberOfRowsAndCols(int numChildren, double boundX, double boundY, double boundWidth,
+                double boundHeight) {
+            cols = Math.max(1, (int) Math.min(numChildren, boundWidth / (getMaxW() + OFFSET)));
+            rows = Math.max(1, (int) Math.ceil(numChildren / cols)) + 1;
+
+            return new int[] { cols, rows };
+        }
+
+        public void applyLayout(List<YangDiagramNode> entitiesToLayout, double boundX, double boundY, double boundWidth,
+                double boundHeight) {
+            Collections.sort(entitiesToLayout, COMPARATOR);
+            calculateNumberOfRowsAndCols(entitiesToLayout.size(), boundX, boundY, boundWidth, boundHeight);
+            int index = 0;
+            double averageH = fullH / cols;
+            double leftH = fullH;
+            if (cols >= entitiesToLayout.size()) {
+                leftH = 0;
+            }
+            for (int j = 0; j < cols; j++) {
+                double y = 0;
+                do { // set at least one element in the row
+                    if (index < entitiesToLayout.size()) {
+                        YangDiagramNode sn = entitiesToLayout.get(index++);
+                        double xmove = boundX + j * (getMaxW() + OFFSET) + OFFSET;
+                        double ymove = boundY + y + OFFSET;
+                        sn.setLocation(xmove, ymove);
+                        y += sn.getHeight() + OFFSET;
+                        leftH -= sn.getHeight();
+                    }
+                } while ((j == cols - 1
+                        || (leftH / (cols - j - 1) > averageH && cols - j - 1 < entitiesToLayout.size() - index))
+                        && index < entitiesToLayout.size());
+
+            }
+        }
+
+        public double getMaxW() {
+            return maxW;
+        }
+
+        public void setMaxElementSizes(double maxW, double maxH) {
+            this.maxW = maxW;
+            this.maxH = maxH;
+        }
+
+        public void setFullElementSizes(double fullW, double fullH) {
+            this.fullW = fullW;
+            this.fullH = fullH;
+        }
+
+    }
+
+    private static void setShapes(Shape cs, Rectangle r, Map<GraphicsAlgorithm, Rectangle> map) {
+        map.put(cs.getGraphicsAlgorithm(), r);
+        if (cs instanceof ContainerShape) { // connect inner shapes with outer rectangles on diagram
+            for (Shape shape : ((ContainerShape) cs).getChildren()) {
+                setShapes(shape, r, map);
+            }
+        }
+    }
+
+    public static void layoutDiagramConnections(IFeatureProvider fp) {
+        RectilinearAvoidObstaclesPathFinder finder = new RectilinearAvoidObstaclesPathFinder();
+        Map<GraphicsAlgorithm, Rectangle> map = new HashMap<GraphicsAlgorithm, Rectangle>();
+        for (Shape shape : fp.getDiagramTypeProvider().getDiagram().getChildren()) {
+            Rectangle r = new Rectangle(shape.getGraphicsAlgorithm().getX(), shape.getGraphicsAlgorithm().getY(),
+                    shape.getGraphicsAlgorithm().getWidth(), shape.getGraphicsAlgorithm().getHeight());
+            finder.addObstacle(r);
+            setShapes(shape, r, map);
+        }
+        for (Connection connection : fp.getDiagramTypeProvider().getDiagram().getConnections()) {
+            // remove all bendpoints
+            ((FreeFormConnection) connection).getBendpoints().clear();
+            org.eclipse.draw2d.geometry.Point start, end;
+            Rectangle source = map.get(connection.getStart().getReferencedGraphicsAlgorithm());
+            Rectangle target = map.get(connection.getEnd().getReferencedGraphicsAlgorithm());
+
+            // start always with right side because of box relative anchor
+            start = new org.eclipse.draw2d.geometry.Point(source.x + source.width,
+                    Graphiti.getLayoutService().getLocationRelativeToDiagram(connection.getStart()).getY() - 3);
+            if (source.x < target.x) {
+                end = new org.eclipse.draw2d.geometry.Point(target.x, target.y + target.height / 2);
+            } else {
+                end = new org.eclipse.draw2d.geometry.Point(target.x + target.width, target.y + target.height / 2);
+            }
+            RoutePath route = finder.find(
+                    Position.create(map.get(connection.getStart().getReferencedGraphicsAlgorithm()), start),
+                    Position.create(map.get(connection.getEnd().getReferencedGraphicsAlgorithm()), end), false);
+            if (null != route && null != route.path) {
+                for (int i = 0; i < route.path.size(); i++) {
+                    AddBendpointContext context = new AddBendpointContext((FreeFormConnection) connection,
+                            route.path.getPoint(i).x, route.path.getPoint(i).y, i);
+                    fp.getAddBendpointFeature(context).addBendpoint(context);
+                }
+            }
+        }
+    }
+
+    public static void layoutDiagram(IFeatureProvider fp) {
+
+        // get the chosen LayoutAlgorithmn instance
+        YangDiagramLayoutAlgorithm layoutAlgorithm = new YangDiagramLayoutAlgorithm();
+
+        // Setup the array of Shape LayoutEntity
+        List<YangDiagramNode> diagramEntities = getLayoutEntities(fp);
+        int diagramWidth = ((EditorFeatureProvider) fp).getDiagramWidth();
+        int diagramHeight = ((EditorFeatureProvider) fp).getDiagramHeight();
+        double[] preferedSize = getAreaSizeAndArrangeLayout(diagramEntities, layoutAlgorithm, diagramWidth,
+                diagramHeight);
+
+        // Apply the LayoutAlgorithmn
+        layoutAlgorithm.applyLayout(diagramEntities, 0D, 0D, preferedSize[0], preferedSize[1]);
+
+        updateGraphCoordinates(diagramEntities);
+
+        layoutDiagramConnections(fp);
+    }
+
+    public static void layoutContainerShapeHeader(ContainerShape cs, IFeatureProvider fp) {
+        GraphicsAlgorithm text = YangModelUIUtil.getObjectPropGA(cs, PropertyUtil.OBJECT_HEADER_TEXT_SHAPE_KEY);
+        GraphicsAlgorithm type = YangModelUIUtil.getObjectPropGA(cs, PropertyUtil.BUSINESS_OBJECT_TYPE_SHAPE_KEY);
+        GraphicsAlgorithm number = YangModelUIUtil.getObjectPropGA(cs, PropertyUtil.OBJECT_NUMBER_SHAPE_KEY);
+        int textWidth = Math.max(0, cs.getGraphicsAlgorithm().getWidth() - YangModelUIUtil.DEFAULT_TEXT_HEIGHT);
+
+        if (null != number) {
+            IDimension dim = GraphitiUi.getUiLayoutService().calculateTextSize(((Text) number).getValue(),
+                    number.getStyle().getFont());
+            number.setX(Math.max(0,
+                    cs.getGraphicsAlgorithm().getWidth() - YangModelUIUtil.DEFAULT_OBJECT_NUMBER_IND - dim.getWidth()));
+            textWidth = Math.max(0, textWidth - number.getWidth());
+        }
+        int typeWidth = 0;
+        if (null != type && type instanceof Text) {
+            IDimension size = GraphitiUi.getUiLayoutService().calculateTextSize(((Text) type).getValue(),
+                    type.getStyle().getFont());
+            if (size != null) {
+                typeWidth = size.getWidth();
+                textWidth += YangModelUIUtil.DEFAULT_TEXT_HEIGHT;
+            }
+        }
+        int nameWidth = 0;
+        if (null != text && text instanceof Text) {
+            nameWidth = GraphitiUi.getUiLayoutService()
+                    .calculateTextSize(((Text) text).getValue(), text.getStyle().getFont()).getWidth();
+            if (0 != typeWidth && typeWidth + nameWidth + YangModelUIUtil.DEFAULT_H_ALIGN > textWidth) {
+                nameWidth = (int) Math.min(nameWidth, (0.5 * Math.max(0, textWidth)));
+            }
+            text.setWidth(Math.min(nameWidth, textWidth));
+        }
+
+        if (null != type && type instanceof Text) {
+            Text ga = (Text) type;
+            ga.setX(nameWidth + YangModelUIUtil.DEFAULT_TEXT_HEIGHT + YangModelUIUtil.DEFAULT_H_ALIGN);
+            ga.setWidth(Math.max(0, textWidth - ga.getX()));
+        }
+
+        Polyline line = YangModelUIUtil.getPolyline(cs);
+        if (null != line) {
+            EList<Point> points = line.getPoints();
+            if (1 < points.size()) {
+                points.get(1).setX(cs.getGraphicsAlgorithm().getWidth());
+            }
+        }
+
+    }
+
+    protected static YangCompositeSimpleNode createCompositeSimpleNode(ContainerShape cs, IFeatureProvider fp) {
+        Object bo = fp.getBusinessObjectForPictogramElement(cs);
+        YangCompositeSimpleNode result = new YangCompositeSimpleNode(cs,
+                YangModelUtil.getPositionInParent(fp.getBusinessObjectForPictogramElement(cs.getContainer()), bo));
+        for (Shape shape : YangModelUIUtil.filterBusinessObjectShapes(cs.getChildren())) {
+            if (shape instanceof ContainerShape) {
+                result.addChild(createCompositeSimpleNode((ContainerShape) shape, fp));
+            }
+        }
+        Collections.sort(result.getChildren(), COMPARATOR);
+        return result;
+    }
+
+    public static void layoutContainerShape(ContainerShape cs, IFeatureProvider fp) {
+        YangCompositeSimpleNode node = createCompositeSimpleNode(cs, fp);
+        layoutCompositeSimpleNode(node, cs.getGraphicsAlgorithm().getWidth());
+        node.updateRealObject(fp);
+        layoutDiagramConnections(fp);
+    }
+
+    /**
+     * calls layout feature for {@link PictogramElement}
+     *
+     * @param pe
+     * @param fp
+     */
+    public static void layoutPictogramElement(PictogramElement pe, IFeatureProvider fp) {
+        LayoutContext context = new LayoutContext(pe);
+        fp.layoutIfPossible(context);
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/PropertyUtil.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/PropertyUtil.java
new file mode 100644 (file)
index 0000000..3ae02f5
--- /dev/null
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.util;
+
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.services.Graphiti;
+
+public class PropertyUtil {
+    private PropertyUtil() {
+        super();
+    }
+
+    public static final String OBJECT_NUMBER_SHAPE_KEY = "object-number-shape-id";
+    public static final String OBJECT_HEADER_TEXT_SHAPE_KEY = "object-header-shape-id";
+    public static final String OBJECT_IMAGE_SHAPE_KEY = "object-image-shape-id";
+    public static final String BUSINESS_OBJECT_SHAPE_KEY = "business-object-shape-id";
+    public static final String BUSINESS_OBJECT_TYPE_SHAPE_KEY = "business-object-type-shape-id";
+
+    public static final String EDITABLE_SHAPE = "editable-shape";
+
+    public static final void setObjectShapeProp(PictogramElement pe, String prop, boolean set) {
+        Graphiti.getPeService().setPropertyValue(pe, prop, set ? Boolean.TRUE.toString() : Boolean.FALSE.toString());
+    }
+
+    public static boolean isObjectShapeProp(PictogramElement pe, String prop) {
+        return Boolean.TRUE.toString().equals(Graphiti.getPeService().getPropertyValue(pe, prop));
+    }
+
+    public static boolean isBusinessObjectShape(PictogramElement pe) {
+        return isObjectShapeProp(pe, BUSINESS_OBJECT_SHAPE_KEY);
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/Strings.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/Strings.java
new file mode 100644 (file)
index 0000000..cc7e343
--- /dev/null
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.util;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+public class Strings {
+
+    private Strings() {
+        super();
+    }
+
+    private static final SimpleDateFormat DEFAULT_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
+    public static final String EMPTY_STRING = "";
+
+    public static String getAsString(Object obj) {
+        if (null != obj && null != obj.toString()) {
+            return obj.toString();
+        }
+        return EMPTY_STRING;
+    }
+
+    public static String toString(Date obj) {
+        if (null != obj) {
+            return DEFAULT_DATE_FORMAT.format(obj);
+        }
+        return EMPTY_STRING;
+    }
+
+    public static boolean isEmpty(Object obj) {
+        return null == obj || null == obj.toString() || obj.toString().isEmpty();
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/StyleUtil.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/StyleUtil.java
new file mode 100644 (file)
index 0000000..a55d2e7
--- /dev/null
@@ -0,0 +1,177 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.util;
+
+import org.eclipse.graphiti.mm.algorithms.styles.Orientation;
+import org.eclipse.graphiti.mm.algorithms.styles.Style;
+import org.eclipse.graphiti.mm.pictograms.Diagram;
+import org.eclipse.graphiti.services.Graphiti;
+import org.eclipse.graphiti.services.IGaService;
+import org.eclipse.graphiti.util.ColorConstant;
+import org.eclipse.graphiti.util.IColorConstant;
+import org.eclipse.graphiti.util.PredefinedColoredAreas;
+import org.eclipse.jface.resource.DataFormatException;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.jface.resource.StringConverter;
+import org.eclipse.swt.graphics.FontData;
+
+import com.cisco.yangide.ext.model.editor.Activator;
+import com.cisco.yangide.ext.model.editor.preferences.ModelEditorPreferences;
+
+@SuppressWarnings("restriction")
+public class StyleUtil {
+
+    private StyleUtil() {
+        super();
+    }
+
+    public static final IColorConstant DOMAIN_OBJECT_TEXT_FOREGROUND = new ColorConstant(0, 0, 0);
+    public static final IColorConstant DOMAIN_OBJECT_FOREGROUND = new ColorConstant(137, 173, 213);// new
+    // ColorConstant(98,
+    // 131,
+    // 167);
+    public static final IColorConstant DOMAIN_OBJECT_BACKGROUND = new ColorConstant(187, 218, 247);
+
+    public static final IColorConstant DOMAIN_OBJECT_TYPE_TEXT_COLOR = new ColorConstant(149, 125, 71);
+
+    public static Style getStyleForCommonValues(Diagram diagram) {
+        final String styleId = "COMMON-VALUES";
+        IGaService gaService = Graphiti.getGaService();
+
+        // Is style already persisted?
+        Style style = gaService.findStyle(diagram, styleId);
+
+        if (style == null) { // style not found - create new style
+            style = gaService.createPlainStyle(diagram, styleId);
+            setCommonValues(style);
+        }
+        return style;
+    }
+
+    public static Style getStyleForDomainObject(Diagram diagram) {
+        final String styleId = "DOMAIL-OBJECT";
+        IGaService gaService = Graphiti.getGaService();
+
+        // this is a child style of the common-values-style
+        Style parentStyle = getStyleForCommonValues(diagram);
+        Style style = gaService.findStyle(parentStyle, styleId);
+
+        if (style == null) { // style not found - create new style
+            style = gaService.createPlainStyle(parentStyle, styleId);
+            style.setFilled(true);
+            style.setForeground(gaService.manageColor(diagram, DOMAIN_OBJECT_FOREGROUND));
+
+            // no background color here, we have a gradient instead
+            gaService.setRenderingStyle(style, PredefinedColoredAreas.getBlueWhiteGlossAdaptions());
+        }
+        return style;
+
+    }
+
+    public static Style getStyleForDomainObjectText(Diagram diagram) {
+        final String styleId = "DOMAIL-OBJECT-TEXT";
+        IGaService gaService = Graphiti.getGaService();
+
+        // this is a child style of the common-values-style
+        Style parentStyle = getStyleForCommonValues(diagram);
+        Style style = gaService.findStyle(parentStyle, styleId);
+
+        if (style == null) { // style not found - create new style
+            style = gaService.createPlainStyle(parentStyle, styleId);
+            setCommonTextValues(diagram, gaService, style);
+            FontData font = getDefaultFont();
+            style.setFont(gaService.manageFont(diagram, font.getName(), font.getHeight(), false, false));
+        }
+        return style;
+    }
+
+    public static Style getStyleForDomainObjectTypeText(Diagram diagram) {
+        final String styleId = "DOMAIL-OBJECT-TYPE-TEXT";
+        IGaService gaService = Graphiti.getGaService();
+
+        // this is a child style of the common-values-style
+        Style parentStyle = getStyleForCommonValues(diagram);
+        Style style = gaService.findStyle(parentStyle, styleId);
+
+        if (style == null) { // style not found - create new style
+            style = gaService.createPlainStyle(parentStyle, styleId);
+            setCommonTextValues(diagram, gaService, style);
+            FontData font = getDefaultFont();
+            style.setFont(gaService.manageFont(diagram, font.getName(), font.getHeight(), false, false));
+            style.setForeground(gaService.manageColor(diagram, DOMAIN_OBJECT_TYPE_TEXT_COLOR));
+        }
+        return style;
+    }
+
+    public static Style getStyleForDomainObjectNumberText(Diagram diagram) {
+        final String styleId = "DOMAIL-OBJECT-NUMBER-TEXT";
+        IGaService gaService = Graphiti.getGaService();
+
+        // this is a child style of the common-values-style
+        Style parentStyle = getStyleForCommonValues(diagram);
+        Style style = gaService.findStyle(parentStyle, styleId);
+
+        if (style == null) { // style not found - create new style
+            style = gaService.createPlainStyle(parentStyle, styleId);
+            setCommonTextValues(diagram, gaService, style);
+            FontData font = getDefaultFont();
+            style.setFont(gaService.manageFont(diagram, font.getName(), font.getHeight() - 2, false, false));
+        }
+        return style;
+    }
+
+    public static Style getStyleForTextDecorator(Diagram diagram) {
+        final String styleId = "TEXT-DECORATOR-TEXT";
+        IGaService gaService = Graphiti.getGaService();
+
+        // this is a child style of the common-values-style
+        Style parentStyle = getStyleForCommonValues(diagram);
+        Style style = gaService.findStyle(parentStyle, styleId);
+
+        if (style == null) { // style not found - create new style
+            style = gaService.createPlainStyle(parentStyle, styleId);
+            setCommonTextValues(diagram, gaService, style);
+            FontData font = getDefaultFont();
+            style.setFont(gaService.manageFont(diagram, font.getName(), font.getHeight(), true, false));
+        }
+        return style;
+    }
+
+    private static void setCommonTextValues(Diagram diagram, IGaService gaService, Style style) {
+        style.setFilled(false);
+        style.setHorizontalAlignment(Orientation.ALIGNMENT_LEFT);
+        style.setVerticalAlignment(Orientation.ALIGNMENT_CENTER);
+        style.setForeground(gaService.manageColor(diagram, DOMAIN_OBJECT_TEXT_FOREGROUND));
+    }
+
+    private static void setCommonValues(Style style) {
+        // style.setLineStyle(LineStyle.SOLID);
+        style.setLineVisible(true);
+        // style.setLineWidth(2);
+        style.setTransparency(0.0);
+    }
+
+    private static FontData getDefaultFont() {
+        FontData fontData = null;
+        try {
+            fontData = StringConverter.asFontData(
+                    Activator.getDefault().getPreferenceStore().getString(ModelEditorPreferences.DIAGRAM_EDITOR_FONT));
+        } catch (DataFormatException e) {
+            // ignore incorrect format
+        }
+        if (fontData == null) {
+            FontData fd = JFaceResources.getDefaultFont().getFontData()[0];
+            // workaround for issue with MacOS fonts
+            if ("Helvetica Neue Deskinterface".equals(fd.getName()) && fd.getHeight() == 11) {
+                fd.setName("Helvetica");
+            }
+            return fd;
+        }
+        return fontData;
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/YangDiagramImageProvider.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/YangDiagramImageProvider.java
new file mode 100644 (file)
index 0000000..40e76f1
--- /dev/null
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.util;
+
+import org.eclipse.graphiti.ui.platform.AbstractImageProvider;
+
+public class YangDiagramImageProvider extends AbstractImageProvider {
+
+    public static final String PLUGIN_ID = "com.cisco.yangide.ext.model.editor";
+    public static final String DIAGRAM_TYPE_PROVIDER_ID = "com.cisco.yangide.ext.model.editor.editorDiagramTypeProvider";
+
+    // public static final String IMG_TEMPLATE_PROPOSAL = PLUGIN_ID + ".template_obj"; //$NON-NLS-1$
+    public static final String IMG_IMPORT_PROPOSAL = PLUGIN_ID + ".import_obj";
+    // public static final String IMG_KEYWORD_PROPOSAL = PLUGIN_ID + ".keyword_obj";
+    public static final String IMG_TYPE_PROPOSAL = PLUGIN_ID + ".type_obj";
+    public static final String IMG_CUSTOM_TYPE_PROPOSAL = PLUGIN_ID + ".custom_type_obj";
+    public static final String IMG_GROUPING_PROPOSAL = PLUGIN_ID + ".grouping_obj";
+    public static final String IMG_CONTAINER_PROPOSAL = PLUGIN_ID + ".container_obj";
+    public static final String IMG_LEAF_PROPOSAL = PLUGIN_ID + ".leaf_obj";
+    public static final String IMG_LEAF_LIST_PROPOSAL = PLUGIN_ID + ".leaf_list_obj";
+    public static final String IMG_LIST_PROPOSAL = PLUGIN_ID + ".list_obj";
+    public static final String IMG_LIST_KEY_PROPOSAL = PLUGIN_ID + ".key_obj";
+    public static final String IMG_CHOICE_PROPOSAL = PLUGIN_ID + ".choice_obj";
+    public static final String IMG_CHOICE_CASE_PROPOSAL = PLUGIN_ID + ".choice_case_obj";
+    public static final String IMG_MODULE_PROPOSAL = PLUGIN_ID + ".module_obj";
+    public static final String IMG_SUBMODULE_PROPOSAL = PLUGIN_ID + ".submodule_obj";
+    public static final String IMG_USES_PROPOSAL = PLUGIN_ID + ".uses_obj";
+    public static final String IMG_INCLUDE_PROPOSAL = PLUGIN_ID + ".include_obj";
+    public static final String IMG_AUGMENT_PROPOSAL = PLUGIN_ID + ".augment_obj";
+    public static final String IMG_DEVIATION_PROPOSAL = PLUGIN_ID + ".deviation_obj";
+    public static final String IMG_EXTENSION_PROPOSAL = PLUGIN_ID + ".extension_obj";
+    public static final String IMG_IDENTITY_PROPOSAL = PLUGIN_ID + ".identity_obj";
+    public static final String IMG_NOTIFICATION_PROPOSAL = PLUGIN_ID + ".notification_obj";
+    public static final String IMG_RPC_INPUT_PROPOSAL = PLUGIN_ID + ".rpc_input_obj";
+    public static final String IMG_RPC_OUTPUT_PROPOSAL = PLUGIN_ID + ".rpc_output_obj";
+    public static final String IMG_RPC_PROPOSAL = PLUGIN_ID + ".rpc_obj";
+    public static final String IMG_ANYXML_PROPOSAL = PLUGIN_ID + ".anyxml_obj";
+    public static final String IMG_FEATURE_PROPOSAL = PLUGIN_ID + ".feature_obj";
+
+    public static final String IMG_ADD_TOOL_PROPOSAL = PLUGIN_ID + ".add_tool_obj";
+    public static final String IMG_DELETE_TOOL_PROPOSAL = PLUGIN_ID + ".delete_tool_obj";
+    public static final String IMG_COLLAPSE_ALL_TOOL_PROPOSAL = PLUGIN_ID + ".collapseall_tool_obj";
+
+    private static final String PATH_OBJ = "icons/full/obj16/";
+    private static final String PATH_TOOL = "icons/full/etool16/";
+
+    @Override
+    protected void addAvailableImages() {
+        addImageFilePath(IMG_IMPORT_PROPOSAL, PATH_OBJ + "import_obj.gif"); //$NON-NLS-1$
+        addImageFilePath(IMG_TYPE_PROPOSAL, PATH_OBJ + "type_obj.gif"); //$NON-NLS-1$
+        addImageFilePath(IMG_CUSTOM_TYPE_PROPOSAL, PATH_OBJ + "custom_type_obj.gif"); //$NON-NLS-1$
+        addImageFilePath(IMG_GROUPING_PROPOSAL, PATH_OBJ + "grouping_obj.gif"); //$NON-NLS-1$
+        addImageFilePath(IMG_CONTAINER_PROPOSAL, PATH_OBJ + "container_obj.gif"); //$NON-NLS-1$
+        addImageFilePath(IMG_LEAF_PROPOSAL, PATH_OBJ + "leaf_obj.gif"); //$NON-NLS-1$
+        addImageFilePath(IMG_LEAF_LIST_PROPOSAL, PATH_OBJ + "leaf_list_obj.gif"); //$NON-NLS-1$
+        addImageFilePath(IMG_LIST_PROPOSAL, PATH_OBJ + "list_obj.gif"); //$NON-NLS-1$
+        addImageFilePath(IMG_LIST_KEY_PROPOSAL, PATH_OBJ + "key_obj.gif"); //$NON-NLS-1$
+        addImageFilePath(IMG_CHOICE_PROPOSAL, PATH_OBJ + "choice_obj.gif"); //$NON-NLS-1$
+        addImageFilePath(IMG_CHOICE_CASE_PROPOSAL, PATH_OBJ + "choice_case_obj.gif"); //$NON-NLS-1$
+        addImageFilePath(IMG_MODULE_PROPOSAL, PATH_OBJ + "module_obj.gif"); //$NON-NLS-1$
+        addImageFilePath(IMG_SUBMODULE_PROPOSAL, PATH_OBJ + "submodule_obj.gif"); //$NON-NLS-1$
+        addImageFilePath(IMG_USES_PROPOSAL, PATH_OBJ + "uses_obj.gif"); //$NON-NLS-1$
+        addImageFilePath(IMG_INCLUDE_PROPOSAL, PATH_OBJ + "include_obj.gif"); //$NON-NLS-1$
+        addImageFilePath(IMG_AUGMENT_PROPOSAL, PATH_OBJ + "augment_obj.gif"); //$NON-NLS-1$
+        addImageFilePath(IMG_DEVIATION_PROPOSAL, PATH_OBJ + "deviation_obj.gif"); //$NON-NLS-1$
+        addImageFilePath(IMG_EXTENSION_PROPOSAL, PATH_OBJ + "extension_obj.gif"); //$NON-NLS-1$
+        addImageFilePath(IMG_IDENTITY_PROPOSAL, PATH_OBJ + "identity_obj.gif"); //$NON-NLS-1$
+        addImageFilePath(IMG_NOTIFICATION_PROPOSAL, PATH_OBJ + "notification_obj.gif"); //$NON-NLS-1$
+        addImageFilePath(IMG_RPC_INPUT_PROPOSAL, PATH_OBJ + "rpc_input_obj.gif"); //$NON-NLS-1$
+        addImageFilePath(IMG_RPC_OUTPUT_PROPOSAL, PATH_OBJ + "rpc_output_obj.gif"); //$NON-NLS-1$
+        addImageFilePath(IMG_RPC_PROPOSAL, PATH_OBJ + "rpc_obj.gif"); //$NON-NLS-1$
+        addImageFilePath(IMG_ANYXML_PROPOSAL, PATH_OBJ + "anyxml_obj.gif"); //$NON-NLS-1$
+        addImageFilePath(IMG_FEATURE_PROPOSAL, PATH_OBJ + "feature_obj.gif"); //$NON-NLS-1$
+
+        addImageFilePath(IMG_ADD_TOOL_PROPOSAL, PATH_TOOL + "add_obj.gif"); //$NON-NLS-1$
+        addImageFilePath(IMG_DELETE_TOOL_PROPOSAL, PATH_TOOL + "delete_obj.gif"); //$NON-NLS-1$
+        addImageFilePath(IMG_COLLAPSE_ALL_TOOL_PROPOSAL, PATH_TOOL + "collapseall_obj.gif"); //$NON-NLS-1$
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/YangModelUIUtil.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/YangModelUIUtil.java
new file mode 100644 (file)
index 0000000..1107c47
--- /dev/null
@@ -0,0 +1,548 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.util;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.emf.common.util.ECollections;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.graphiti.datatypes.IDimension;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.graphiti.features.IRemoveFeature;
+import org.eclipse.graphiti.features.context.IAddConnectionContext;
+import org.eclipse.graphiti.features.context.IAddContext;
+import org.eclipse.graphiti.features.context.impl.AddConnectionContext;
+import org.eclipse.graphiti.features.context.impl.AddContext;
+import org.eclipse.graphiti.features.context.impl.LayoutContext;
+import org.eclipse.graphiti.features.context.impl.RemoveContext;
+import org.eclipse.graphiti.features.context.impl.UpdateContext;
+import org.eclipse.graphiti.mm.algorithms.Ellipse;
+import org.eclipse.graphiti.mm.algorithms.GraphicsAlgorithm;
+import org.eclipse.graphiti.mm.algorithms.Image;
+import org.eclipse.graphiti.mm.algorithms.Polyline;
+import org.eclipse.graphiti.mm.algorithms.RoundedRectangle;
+import org.eclipse.graphiti.mm.algorithms.Text;
+import org.eclipse.graphiti.mm.pictograms.Anchor;
+import org.eclipse.graphiti.mm.pictograms.AnchorContainer;
+import org.eclipse.graphiti.mm.pictograms.BoxRelativeAnchor;
+import org.eclipse.graphiti.mm.pictograms.ChopboxAnchor;
+import org.eclipse.graphiti.mm.pictograms.Connection;
+import org.eclipse.graphiti.mm.pictograms.ConnectionDecorator;
+import org.eclipse.graphiti.mm.pictograms.ContainerShape;
+import org.eclipse.graphiti.mm.pictograms.Diagram;
+import org.eclipse.graphiti.mm.pictograms.PictogramElement;
+import org.eclipse.graphiti.mm.pictograms.Shape;
+import org.eclipse.graphiti.services.Graphiti;
+import org.eclipse.graphiti.services.IGaService;
+import org.eclipse.graphiti.services.IPeCreateService;
+import org.eclipse.graphiti.ui.services.GraphitiUi;
+
+import com.cisco.yangide.ext.model.ContainingNode;
+import com.cisco.yangide.ext.model.NamedNode;
+import com.cisco.yangide.ext.model.TypedNode;
+import com.cisco.yangide.ext.model.Typeref;
+
+public class YangModelUIUtil {
+
+    private YangModelUIUtil() {
+        super();
+    }
+
+    public static final int DEFAULT_WIDTH = 225;
+    public static final int DEFAULT_TEXT_HEIGHT = 18;
+    public static final int DEFAULT_V_ALIGN = 5;
+    public static final int DEFAULT_H_ALIGN = 2;
+    public static final int DEFAULT_OBJECT_NUMBER_IND = 2;
+
+    public static final int DEFAULT_BOX_ANCHOR_RADIUS = 2;
+
+    public static final int DEFAULT_COMPOSITE_HEIGHT = 30;
+
+    private static final ShapeVerticalComparator COMPARATOR = new ShapeVerticalComparator();
+
+    private static Map<EAttribute, String> attributeShapes = new HashMap<EAttribute, String>();
+
+    static {
+        attributeShapes.put(YangModelUtil.MODEL_PACKAGE.getNamedNode_Name(), PropertyUtil.OBJECT_HEADER_TEXT_SHAPE_KEY);
+        attributeShapes.put(YangModelUtil.MODEL_PACKAGE.getUses_QName(), PropertyUtil.OBJECT_HEADER_TEXT_SHAPE_KEY);
+    }
+
+    private static class ShapeVerticalComparator implements Comparator<Shape> {
+
+        @Override
+        public int compare(Shape o1, Shape o2) {
+            if (null == o1 && null == o2) {
+                return 0;
+            }
+            if (null != o1 && null == o2) {
+                return 1;
+            }
+            if (null == o1 && null != o2) {
+                return -1;
+            }
+            if (PropertyUtil.isBusinessObjectShape(o1) && PropertyUtil.isBusinessObjectShape(o2)) {
+                return o1.getGraphicsAlgorithm().getY() > o2.getGraphicsAlgorithm().getY() ? 1
+                        : o1.getGraphicsAlgorithm().getY() == o2.getGraphicsAlgorithm().getY() ? 0 : -1;
+            }
+            return o1.getGraphicsAlgorithm().getY()
+                    + o1.getGraphicsAlgorithm().getHeight() > o2.getGraphicsAlgorithm().getY()
+                            + o2.getGraphicsAlgorithm().getHeight()
+                                    ? 1
+                                    : o1.getGraphicsAlgorithm().getY()
+                                            + o1.getGraphicsAlgorithm().getHeight() == o2.getGraphicsAlgorithm().getY()
+                                                    + o2.getGraphicsAlgorithm().getHeight() ? 0 : -1;
+        }
+
+    }
+
+    public static void sortPictogramElements(EList<Shape> elements) {
+        ECollections.sort(elements, COMPARATOR);
+    }
+
+    public static void sortPictogramElements(List<Shape> elements) {
+        Collections.sort(elements, COMPARATOR);
+    }
+
+    public static int getPositionInParent(ContainerShape parent, Shape child, IFeatureProvider fp) {
+        EList<Shape> elements = parent.getChildren();
+        sortPictogramElements(elements);
+        int pos = 0;
+        for (Shape shape : elements) {
+            if (child == shape) {
+                return pos;
+            }
+            if (null != fp.getBusinessObjectForPictogramElement(shape)
+                    && YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getContainingNode(),
+                            fp.getBusinessObjectForPictogramElement(parent))
+                    && ((ContainingNode) fp.getBusinessObjectForPictogramElement(parent)).getChildren()
+                            .contains(fp.getBusinessObjectForPictogramElement(shape))) {
+                pos++;
+            }
+        }
+        return pos;
+    }
+
+    public static int getPositionInParent(ContainerShape parent, int y, IFeatureProvider fp) {
+        List<Shape> elements = filterBusinessObjectShapes(parent.getChildren());
+        sortPictogramElements(elements);
+        int pos = 0;
+        for (Shape shape : elements) {
+            if (null != fp.getBusinessObjectForPictogramElement(shape)
+                    && YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getContainingNode(),
+                            fp.getBusinessObjectForPictogramElement(parent))
+                    && ((ContainingNode) fp.getBusinessObjectForPictogramElement(parent)).getChildren()
+                            .contains(fp.getBusinessObjectForPictogramElement(shape))) {
+                if (y < shape.getGraphicsAlgorithm().getY()) {
+                    return pos;
+                }
+                pos++;
+            }
+        }
+        return pos;
+    }
+
+    public static void layoutPictogramElement(PictogramElement diagram, IFeatureProvider fp) {
+        LayoutContext lc = new LayoutContext(diagram);
+
+        fp.layoutIfPossible(lc);
+    }
+
+    public static Anchor getChopboxAnchor(AnchorContainer ac) {
+        if (null != ac) {
+            return Graphiti.getPeService().getChopboxAnchor(ac);
+        }
+        return null;
+    }
+
+    public static Anchor getBoxRelativeAnchor(AnchorContainer ac) {
+        if (null != ac) {
+            for (Anchor a : ac.getAnchors()) {
+                if (a instanceof BoxRelativeAnchor) {
+                    return a;
+                }
+            }
+        }
+        return null;
+    }
+
+    public static List<Shape> filterBusinessObjectShapes(List<Shape> shapes) {
+        List<Shape> result = new ArrayList<Shape>();
+        for (Shape shape : shapes) {
+            if (PropertyUtil.isBusinessObjectShape(shape)) {
+                result.add(shape);
+            }
+        }
+        return result;
+    }
+
+    public static Shape getBusinessObjectPropShape(ContainerShape parent, String prop) {
+        for (Shape shape : parent.getChildren()) {
+            if (PropertyUtil.isObjectShapeProp(shape, prop)) {
+                return shape;
+            }
+        }
+        return null;
+    }
+
+    public static PictogramElement getBusinessObjectShape(IFeatureProvider fp, EObject obj) {
+        PictogramElement[] pe = fp.getAllPictogramElementsForBusinessObject(obj);
+        for (PictogramElement shape : pe) {
+            if (shape instanceof Diagram || PropertyUtil.isBusinessObjectShape(shape)) {
+                return shape;
+            }
+        }
+        return null;
+    }
+
+    public static PictogramElement getBusinessObjectPropShape(IFeatureProvider fp, EObject obj, String prop) {
+        PictogramElement[] pe = fp.getAllPictogramElementsForBusinessObject(obj);
+        for (PictogramElement shape : pe) {
+            if (PropertyUtil.isObjectShapeProp(shape, prop)) {
+                return shape;
+            }
+        }
+        return null;
+    }
+
+    public static PictogramElement getBusinessObjectPropShape(IFeatureProvider fp, EObject obj, EAttribute attr) {
+        if (attributeShapes.containsKey(attr)) {
+            return getBusinessObjectPropShape(fp, obj, attributeShapes.get(attr));
+        }
+        return null;
+    }
+
+    public static Polyline getPolyline(ContainerShape cs) {
+        for (Shape shape : cs.getChildren()) {
+            if (shape.getGraphicsAlgorithm() instanceof Polyline) {
+                return (Polyline) shape.getGraphicsAlgorithm();
+            }
+        }
+        return null;
+
+    }
+
+    public static GraphicsAlgorithm getObjectPropGA(ContainerShape cs, String prop) {
+        Shape shape = getBusinessObjectPropShape(cs, prop);
+        if (null != shape) {
+            return shape.getGraphicsAlgorithm();
+        }
+        return null;
+
+    }
+
+    public static void deletePictogramElement(IFeatureProvider fp, PictogramElement pe) {
+
+        RemoveContext removeContext = new RemoveContext(pe);
+        IRemoveFeature f = fp.getRemoveFeature(removeContext);
+        f.remove(removeContext);
+    }
+
+    public static void updatePictogramElement(IFeatureProvider fp, PictogramElement pe) {
+        UpdateContext context = new UpdateContext(pe);
+        fp.updateIfPossible(context);
+    }
+
+    public static boolean updateConnections(EObject obj, IFeatureProvider fp) {
+        if (YangModelUtil.hasReference(obj)) {
+            EObject ref = YangModelUtil.getReferencedObject(fp, obj);
+            PictogramElement startPE = YangModelUIUtil.getBusinessObjectShape(fp, obj);
+            Anchor start = YangModelUIUtil.getBoxRelativeAnchor((AnchorContainer) startPE);
+            Connection con = null;
+            if (null != start && null != start.getOutgoingConnections() && !start.getOutgoingConnections().isEmpty()) {
+                con = start.getOutgoingConnections().get(0);
+            }
+            if (null == ref) {
+                if (null != con) {
+                    deletePictogramElement(fp, con);
+                    // RemoveContext removeContext = new RemoveContext(con);
+                    // fp.getRemoveFeature(removeContext).remove(removeContext);
+                    return true;
+                }
+            } else {
+                PictogramElement finishPE = YangModelUIUtil.getBusinessObjectShape(fp, ref);
+                if (null != finishPE) {
+                    Anchor finish = YangModelUIUtil.getChopboxAnchor((AnchorContainer) finishPE);
+                    if (null != con && con.getEnd().equals(finish)) {
+                        return false;
+                    }
+                    if (null != con) {
+                        con.setEnd(finish);
+                    } else {
+                        YangModelUIUtil.drawConnection(obj, start, finish, fp);
+                    }
+                    LayoutUtil.layoutDiagramConnections(fp);
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    public static boolean updateConnections(EClass type, IFeatureProvider fp) {
+        Object module = fp.getBusinessObjectForPictogramElement(fp.getDiagramTypeProvider().getDiagram());
+        if (null != module && module instanceof EObject) {
+            List<EObject> objects = YangModelUtil.filter(YangModelUtil.getAllBusinessObjects((EObject) module, null),
+                    type);
+            for (EObject obj : objects) {
+                updateConnections(obj, fp);
+            }
+        }
+        return false;
+    }
+
+    public static PictogramElement drawObject(EObject obj, ContainerShape cs, IFeatureProvider fp, int x, int y) {
+        AddContext ac = new AddContext();
+        ac.setTargetContainer(cs);
+        ac.setLocation(x, y);
+        ac.setNewObject(obj);
+        return fp.addIfPossible(ac);
+    }
+
+    public static Connection drawConnection(EObject obj, Anchor start, Anchor finish, IFeatureProvider fp) {
+        AddConnectionContext ac = new AddConnectionContext(start, finish);
+        ac.setNewObject(obj);
+        return (Connection) fp.addIfPossible(ac);
+    }
+
+    public static Connection drawPictogramConnectionElement(IAddConnectionContext context, IFeatureProvider fp) {
+        return drawPictogramConnectionElement(context, fp, Strings.EMPTY_STRING);
+    }
+
+    public static Connection drawPictogramConnectionElement(IAddConnectionContext context, IFeatureProvider fp,
+            String title) {
+        EObject addedEReference = (EObject) context.getNewObject();
+        IPeCreateService peCreateService = Graphiti.getPeCreateService();
+
+        Connection connection = peCreateService.createFreeFormConnection(fp.getDiagramTypeProvider().getDiagram());
+        connection.setStart(context.getSourceAnchor());
+        connection.setEnd(context.getTargetAnchor());
+
+        IGaService gaService = Graphiti.getGaService();
+        Polyline polyline = gaService.createPlainPolyline(connection);
+        polyline.setStyle(StyleUtil.getStyleForDomainObject(fp.getDiagramTypeProvider().getDiagram()));
+
+        // add dynamic text decorator for the reference name
+
+        ConnectionDecorator textDecorator = peCreateService.createConnectionDecorator(connection, false, 0.5, true);
+        Text text = gaService.createPlainText(textDecorator);
+        text.setStyle(StyleUtil.getStyleForTextDecorator(fp.getDiagramTypeProvider().getDiagram()));
+        gaService.setLocation(text, 10, 0);
+
+        // set reference name in the text decorator
+        text.setValue(title);
+        // add static graphical decorators (composition and inheritance)
+        if (YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getIdentity(), addedEReference)) {
+            createInheritanceConnectionArrow(connection, fp);
+        } else {
+            createConnectionArrow(connection, fp);
+        }
+
+        return connection;
+    }
+
+    public static Polyline createConnectionArrow(Connection connection, IFeatureProvider fp) {
+        ConnectionDecorator cd = Graphiti.getPeCreateService().createConnectionDecorator(connection, false, 1.0, true);
+        Polyline polyline = Graphiti.getGaCreateService().createPlainPolyline(cd, new int[] { -10, 5, 0, 0, -10, -5 });
+        polyline.setStyle(StyleUtil.getStyleForDomainObject(fp.getDiagramTypeProvider().getDiagram()));
+        return polyline;
+    }
+
+    public static Polyline createInheritanceConnectionArrow(Connection connection, IFeatureProvider fp) {
+        ConnectionDecorator cd = Graphiti.getPeCreateService().createConnectionDecorator(connection, false, 1.0, true);
+        Polyline polyline = Graphiti.getGaCreateService().createPlainPolygon(cd, new int[] { -10, 5, 0, 0, -10, -5 });
+        polyline.setStyle(StyleUtil.getStyleForDomainObject(fp.getDiagramTypeProvider().getDiagram()));
+        return polyline;
+    }
+
+    public static void drawBoxRelativeAnchor(ContainerShape containerShape, IAddContext context, IFeatureProvider fp) {
+        final BoxRelativeAnchor boxAnchor = Graphiti.getPeCreateService().createBoxRelativeAnchor(containerShape);
+        boxAnchor.setRelativeWidth(1.0);
+        boxAnchor.setRelativeHeight(0.5);
+
+        boxAnchor.setReferencedGraphicsAlgorithm(containerShape.getGraphicsAlgorithm());
+        final Ellipse ellipse = Graphiti.getGaService().createPlainEllipse(boxAnchor);
+
+        Graphiti.getGaService().setLocationAndSize(ellipse, -2 * DEFAULT_BOX_ANCHOR_RADIUS,
+                -2 * DEFAULT_BOX_ANCHOR_RADIUS, 2 * DEFAULT_BOX_ANCHOR_RADIUS, 2 * DEFAULT_BOX_ANCHOR_RADIUS);
+        ellipse.setStyle(StyleUtil.getStyleForDomainObject(fp.getDiagramTypeProvider().getDiagram()));
+    }
+
+    public static String getTypeText(TypedNode node) {
+        if (null != node) {
+            return getTypeText(node.getType());
+        }
+        return null;
+    }
+
+    public static String getTypeText(Typeref ref) {
+        if (null != ref) {
+            return " : " + ref.getName();
+        }
+        return null;
+    }
+
+    public static void drawPictogramElementHeader(ContainerShape containerShape, IAddContext context,
+            IFeatureProvider fp, String imageId, String title, int width, int height) {
+        final Shape imageShape = Graphiti.getPeCreateService().createShape(containerShape, false);
+        // create and set text graphics algorithm
+        final Image image = Graphiti.getGaService().createImage(imageShape, imageId);
+        image.setHeight(height);
+        image.setWidth(height);
+        image.setStretchH(true);
+        image.setStretchH(true);
+        image.setProportional(true);
+        Graphiti.getGaService().setLocationAndSize(image, DEFAULT_V_ALIGN, 0, height, height);
+        PropertyUtil.setObjectShapeProp(imageShape, PropertyUtil.OBJECT_IMAGE_SHAPE_KEY, true);
+        final Shape textShape = Graphiti.getPeCreateService().createShape(containerShape, false);
+        Text text;
+        if (YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getNamedNode(), context.getNewObject())) {
+            if (null == ((NamedNode) context.getNewObject()).getName()) {
+                ((NamedNode) context.getNewObject()).setName("name");
+            }
+            text = Graphiti.getGaService().createPlainText(textShape, ((NamedNode) context.getNewObject()).getName());
+            fp.link(textShape,
+                    new Object[] { context.getNewObject(), YangModelUtil.MODEL_PACKAGE.getNamedNode_Name() });
+            PropertyUtil.setObjectShapeProp(textShape, PropertyUtil.EDITABLE_SHAPE, true);
+        } else {
+            String qName = YangModelUtil.getQNamePresentation((EObject) context.getNewObject());
+            if (null == qName) {
+                text = Graphiti.getGaService().createPlainText(textShape, title);
+            } else {
+                text = Graphiti.getGaService().createPlainText(textShape, qName);
+                fp.link(textShape, context.getNewObject());
+            }
+
+        }
+        text.setStyle(StyleUtil.getStyleForDomainObjectText(fp.getDiagramTypeProvider().getDiagram()));
+        PropertyUtil.setObjectShapeProp(textShape, PropertyUtil.OBJECT_HEADER_TEXT_SHAPE_KEY, true);
+        Graphiti.getGaService().setLocationAndSize(text, height + DEFAULT_V_ALIGN, 0, width, height);
+
+        if (YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getTypedNode(), context.getNewObject())) {
+            Shape typeShape = Graphiti.getPeCreateService().createShape(containerShape, false);
+            Text type = Graphiti.getGaService().createPlainText(typeShape,
+                    getTypeText((TypedNode) context.getNewObject()));
+            fp.link(typeShape, context.getNewObject());
+            type.setStyle(StyleUtil.getStyleForDomainObjectTypeText(fp.getDiagramTypeProvider().getDiagram()));
+            PropertyUtil.setObjectShapeProp(typeShape, PropertyUtil.BUSINESS_OBJECT_TYPE_SHAPE_KEY, true);
+            Graphiti.getGaService().setLocationAndSize(type, height + DEFAULT_V_ALIGN, 0, Math.max(0, width), height);
+        }
+
+    }
+
+    public static void drawPictogramElementPositionInParent(ContainerShape shape, IFeatureProvider fp) {
+        Integer pos = YangModelUtil.getPositionInParent(fp.getBusinessObjectForPictogramElement(shape.getContainer()),
+                fp.getBusinessObjectForPictogramElement(shape));
+        if (0 <= pos) {
+            pos++;
+            final Shape textShape = Graphiti.getPeCreateService().createShape(shape, false);
+            Text text = Graphiti.getGaService().createPlainText(textShape, pos.toString());
+            text.setStyle(StyleUtil.getStyleForDomainObjectNumberText(fp.getDiagramTypeProvider().getDiagram()));
+            IDimension dim = GraphitiUi.getUiLayoutService().calculateTextSize(text.getValue(),
+                    text.getStyle().getFont());
+            Graphiti.getGaService().setLocationAndSize(text,
+                    shape.getGraphicsAlgorithm().getWidth() - DEFAULT_OBJECT_NUMBER_IND, DEFAULT_OBJECT_NUMBER_IND,
+                    dim.getWidth(), dim.getHeight());
+            PropertyUtil.setObjectShapeProp(textShape, PropertyUtil.OBJECT_NUMBER_SHAPE_KEY, true);
+        }
+    }
+
+    public static ContainerShape drawPictogramElement(IAddContext context, IFeatureProvider fp, String imageId,
+            String title) {
+        ContainerShape result = null;
+        if (YangModelUtil.checkType(YangModelUtil.MODEL_PACKAGE.getContainingNode(), context.getNewObject())) {
+            result = drawCompositePictogramElement(context, fp, imageId, title);
+        } else {
+            result = drawAttributePictogramElement(context, fp, imageId, title);
+        }
+        fp.link(result, context.getNewObject());
+        ChopboxAnchor anchor = Graphiti.getPeCreateService().createChopboxAnchor(result);
+        anchor.setReferencedGraphicsAlgorithm(result.getGraphicsAlgorithm());
+        // create BoxRelativeAnchor for references
+        if (context.getNewObject() instanceof EObject && YangModelUtil.hasReference((EObject) context.getNewObject())) {
+            drawBoxRelativeAnchor(result, context, fp);
+        }
+        PropertyUtil.setObjectShapeProp(result, PropertyUtil.BUSINESS_OBJECT_SHAPE_KEY, true);
+
+        // call the layout feature
+        if (context.getTargetContainer() instanceof Diagram) {
+            drawPictogramElementPositionInParent(result, fp);
+        }
+
+        // add feedback element
+        final Shape feedbackShape = Graphiti.getPeCreateService().createShape(result, false);
+        Graphiti.getGaService().createPlatformGraphicsAlgorithm(feedbackShape, "feedback");
+
+        ContainerShape layoutShape = result;
+        while (!(layoutShape.getContainer() instanceof Diagram)) {
+            layoutShape = layoutShape.getContainer();
+        }
+        layoutPictogramElement(layoutShape, fp);
+        return result;
+    }
+
+    public static ContainerShape drawCompositePictogramElement(IAddContext context, IFeatureProvider fp, String imageId,
+            String title) {
+
+        ContainerShape targetShape = context.getTargetContainer();
+        IPeCreateService peCreateService = Graphiti.getPeCreateService();
+        IGaService gaService = Graphiti.getGaService();
+
+        ContainerShape containerShape = peCreateService.createContainerShape(targetShape, true);
+
+        final int width = context.getWidth() <= 0 ? DEFAULT_WIDTH : context.getWidth();
+        final int height = context.getHeight() <= 0 ? DEFAULT_COMPOSITE_HEIGHT : context.getHeight();
+
+        RoundedRectangle roundedRectangle = gaService.createPlainRoundedRectangle(containerShape, 5, 5);
+        roundedRectangle.setStyle(StyleUtil.getStyleForDomainObject(fp.getDiagramTypeProvider().getDiagram()));
+        gaService.setLocationAndSize(roundedRectangle, context.getX(), context.getY(), width, height);
+
+        // create shape for line
+        final Shape shape = peCreateService.createShape(containerShape, false);
+
+        // create and set graphics algorithm
+        final Polyline polyline = gaService.createPlainPolyline(shape,
+                new int[] { 0, DEFAULT_TEXT_HEIGHT, width, DEFAULT_TEXT_HEIGHT });
+        polyline.setStyle(StyleUtil.getStyleForDomainObject(fp.getDiagramTypeProvider().getDiagram()));
+
+        drawPictogramElementHeader(containerShape, context, fp, imageId, title, width, DEFAULT_TEXT_HEIGHT);
+        return containerShape;
+
+    }
+
+    public static ContainerShape drawAttributePictogramElement(IAddContext context, IFeatureProvider fp, String imageId,
+            String title) {
+        ContainerShape targetShape = context.getTargetContainer();
+        IPeCreateService peCreateService = Graphiti.getPeCreateService();
+        IGaService gaService = Graphiti.getGaService();
+
+        ContainerShape containerShape = peCreateService.createContainerShape(targetShape, true);
+
+        final int width = context.getWidth() <= 0 ? DEFAULT_WIDTH : context.getWidth();
+        final int height = context.getHeight() <= 0 ? DEFAULT_TEXT_HEIGHT : context.getHeight();
+
+        GraphicsAlgorithm rectangle;
+        if (context.getTargetContainer() instanceof Diagram) {
+            rectangle = gaService.createPlainRoundedRectangle(containerShape, 5, 5);
+        } else {
+            rectangle = gaService.createInvisibleRectangle(containerShape);
+        }
+        rectangle.setStyle(StyleUtil.getStyleForDomainObject(fp.getDiagramTypeProvider().getDiagram()));
+        gaService.setLocationAndSize(rectangle, context.getX(), context.getY(), width, height);
+        drawPictogramElementHeader(containerShape, context, fp, imageId, title, width, DEFAULT_TEXT_HEIGHT);
+        return containerShape;
+
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/YangModelUtil.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/YangModelUtil.java
new file mode 100644 (file)
index 0000000..34d878f
--- /dev/null
@@ -0,0 +1,580 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.util;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.graphiti.features.IFeatureProvider;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+
+import com.cisco.yangide.core.dom.ASTCompositeNode;
+import com.cisco.yangide.core.dom.ASTNamedNode;
+import com.cisco.yangide.core.dom.ASTNode;
+import com.cisco.yangide.core.dom.AnyXmlSchemaNode;
+import com.cisco.yangide.core.dom.AugmentationSchema;
+import com.cisco.yangide.core.dom.ChoiceCaseNode;
+import com.cisco.yangide.core.dom.ChoiceNode;
+import com.cisco.yangide.core.dom.ContrainerSchemaNode;
+import com.cisco.yangide.core.dom.Deviation;
+import com.cisco.yangide.core.dom.ExtensionDefinition;
+import com.cisco.yangide.core.dom.FeatureDefinition;
+import com.cisco.yangide.core.dom.GroupingDefinition;
+import com.cisco.yangide.core.dom.IdentitySchemaNode;
+import com.cisco.yangide.core.dom.LeafListSchemaNode;
+import com.cisco.yangide.core.dom.LeafSchemaNode;
+import com.cisco.yangide.core.dom.ListSchemaNode;
+import com.cisco.yangide.core.dom.ModuleImport;
+import com.cisco.yangide.core.dom.NotificationDefinition;
+import com.cisco.yangide.core.dom.RevisionNode;
+import com.cisco.yangide.core.dom.RpcDefinition;
+import com.cisco.yangide.core.dom.RpcInputNode;
+import com.cisco.yangide.core.dom.RpcOutputNode;
+import com.cisco.yangide.core.dom.SimpleNamedNode;
+import com.cisco.yangide.core.dom.SimpleNode;
+import com.cisco.yangide.core.dom.SubModule;
+import com.cisco.yangide.core.dom.TypeDefinition;
+import com.cisco.yangide.core.dom.TypeReference;
+import com.cisco.yangide.core.dom.UsesNode;
+import com.cisco.yangide.ext.model.BelongsTo;
+import com.cisco.yangide.ext.model.ContainingNode;
+import com.cisco.yangide.ext.model.Grouping;
+import com.cisco.yangide.ext.model.Identity;
+import com.cisco.yangide.ext.model.Import;
+import com.cisco.yangide.ext.model.ModelFactory;
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Module;
+import com.cisco.yangide.ext.model.NamedNode;
+import com.cisco.yangide.ext.model.Node;
+import com.cisco.yangide.ext.model.ReferenceNode;
+import com.cisco.yangide.ext.model.RpcIO;
+import com.cisco.yangide.ext.model.Submodule;
+import com.cisco.yangide.ext.model.Tag;
+import com.cisco.yangide.ext.model.TaggedNode;
+import com.cisco.yangide.ext.model.Uses;
+
+public class YangModelUtil {
+
+    private YangModelUtil() {
+        super();
+    }
+
+    public static Map<EClass, List<EClass>> compositeNodeMap = new HashMap<EClass, List<EClass>>();
+    private static Map<EClass, List<YangTag>> taggedNodeMap = new HashMap<EClass, List<YangTag>>();
+    // key has reference to value
+    private static final Map<EClass, EClass> connections = new HashMap<EClass, EClass>();
+
+    private static Map<Class<? extends ASTNode>, EClass> astNodes = new HashMap<Class<? extends ASTNode>, EClass>();
+    public static final ModelPackage MODEL_PACKAGE = ModelPackage.eINSTANCE;
+
+    static {
+        compositeNodeMap.put(MODEL_PACKAGE.getAugment(),
+                Arrays.asList(MODEL_PACKAGE.getAnyxml(), MODEL_PACKAGE.getChoice(), MODEL_PACKAGE.getContainer(),
+                        MODEL_PACKAGE.getLeaf(), MODEL_PACKAGE.getLeafList(), MODEL_PACKAGE.getList(),
+                        MODEL_PACKAGE.getUses()));
+        compositeNodeMap.put(MODEL_PACKAGE.getChoice(),
+                Arrays.asList(MODEL_PACKAGE.getAnyxml(), MODEL_PACKAGE.getChoiceCase(), MODEL_PACKAGE.getContainer(),
+                        MODEL_PACKAGE.getLeaf(), MODEL_PACKAGE.getLeafList(), MODEL_PACKAGE.getList()));
+        compositeNodeMap.put(MODEL_PACKAGE.getChoiceCase(),
+                Arrays.asList(MODEL_PACKAGE.getAnyxml(), MODEL_PACKAGE.getChoice(), MODEL_PACKAGE.getContainer(),
+                        MODEL_PACKAGE.getLeaf(), MODEL_PACKAGE.getLeafList(), MODEL_PACKAGE.getList(),
+                        MODEL_PACKAGE.getUses()));
+        compositeNodeMap.put(MODEL_PACKAGE.getContainer(),
+                Arrays.asList(MODEL_PACKAGE.getAnyxml(), MODEL_PACKAGE.getChoice(), MODEL_PACKAGE.getContainer(),
+                        MODEL_PACKAGE.getGrouping(), MODEL_PACKAGE.getLeaf(), MODEL_PACKAGE.getLeafList(),
+                        MODEL_PACKAGE.getList(), MODEL_PACKAGE.getTypedef(), MODEL_PACKAGE.getUses()));
+        compositeNodeMap.put(MODEL_PACKAGE.getGrouping(),
+                Arrays.asList(MODEL_PACKAGE.getAnyxml(), MODEL_PACKAGE.getChoice(), MODEL_PACKAGE.getContainer(),
+                        MODEL_PACKAGE.getGrouping(), MODEL_PACKAGE.getLeaf(), MODEL_PACKAGE.getLeafList(),
+                        MODEL_PACKAGE.getList(), MODEL_PACKAGE.getTypedef(), MODEL_PACKAGE.getUses()));
+        compositeNodeMap.put(MODEL_PACKAGE.getList(),
+                Arrays.asList(MODEL_PACKAGE.getAnyxml(), MODEL_PACKAGE.getChoice(), MODEL_PACKAGE.getContainer(),
+                        MODEL_PACKAGE.getGrouping(), MODEL_PACKAGE.getListKey(), MODEL_PACKAGE.getLeaf(),
+                        MODEL_PACKAGE.getLeafList(), MODEL_PACKAGE.getList(), MODEL_PACKAGE.getTypedef(),
+                        MODEL_PACKAGE.getUses()));
+        compositeNodeMap.put(MODEL_PACKAGE.getModule(),
+                Arrays.asList(MODEL_PACKAGE.getAnyxml(), MODEL_PACKAGE.getAugment(), MODEL_PACKAGE.getChoice(),
+                        MODEL_PACKAGE.getContainer(), MODEL_PACKAGE.getDeviation(), MODEL_PACKAGE.getExtension(),
+                        MODEL_PACKAGE.getFeature(), MODEL_PACKAGE.getGrouping(), MODEL_PACKAGE.getIdentity(),
+                        MODEL_PACKAGE.getImport(), MODEL_PACKAGE.getLeaf(), MODEL_PACKAGE.getLeafList(),
+                        MODEL_PACKAGE.getList(), MODEL_PACKAGE.getNotification(), MODEL_PACKAGE.getRpc(),
+                        MODEL_PACKAGE.getTypedef(), MODEL_PACKAGE.getUses()));
+        compositeNodeMap.put(MODEL_PACKAGE.getSubmodule(),
+                Arrays.asList(MODEL_PACKAGE.getAnyxml(), MODEL_PACKAGE.getAugment(), MODEL_PACKAGE.getChoice(),
+                        MODEL_PACKAGE.getContainer(), MODEL_PACKAGE.getDeviation(), MODEL_PACKAGE.getExtension(),
+                        MODEL_PACKAGE.getFeature(), MODEL_PACKAGE.getGrouping(), MODEL_PACKAGE.getIdentity(),
+                        MODEL_PACKAGE.getImport(), MODEL_PACKAGE.getLeaf(), MODEL_PACKAGE.getLeafList(),
+                        MODEL_PACKAGE.getList(), MODEL_PACKAGE.getNotification(), MODEL_PACKAGE.getRpc(),
+                        MODEL_PACKAGE.getTypedef(), MODEL_PACKAGE.getUses()));
+        compositeNodeMap.put(MODEL_PACKAGE.getNotification(),
+                Arrays.asList(MODEL_PACKAGE.getAnyxml(), MODEL_PACKAGE.getChoice(), MODEL_PACKAGE.getContainer(),
+                        MODEL_PACKAGE.getGrouping(), MODEL_PACKAGE.getLeaf(), MODEL_PACKAGE.getLeaf(),
+                        MODEL_PACKAGE.getLeafList(), MODEL_PACKAGE.getList(), MODEL_PACKAGE.getTypedef(),
+                        MODEL_PACKAGE.getUses()));
+        compositeNodeMap.put(MODEL_PACKAGE.getRpc(),
+                Arrays.asList(MODEL_PACKAGE.getRpcIO(), MODEL_PACKAGE.getGrouping(), MODEL_PACKAGE.getTypedef()));
+        compositeNodeMap.put(MODEL_PACKAGE.getRpcIO(),
+                Arrays.asList(MODEL_PACKAGE.getAnyxml(), MODEL_PACKAGE.getChoice(), MODEL_PACKAGE.getContainer(),
+                        MODEL_PACKAGE.getGrouping(), MODEL_PACKAGE.getLeaf(), MODEL_PACKAGE.getLeafList(),
+                        MODEL_PACKAGE.getList(), MODEL_PACKAGE.getTypedef(), MODEL_PACKAGE.getUses()));
+
+        taggedNodeMap.put(MODEL_PACKAGE.getAnyxml(), Arrays.asList(YangTag.CONFIG, YangTag.DESCRIPTION,
+                YangTag.MANDATORY, YangTag.REFERENCE, YangTag.STATUS));
+        taggedNodeMap.put(MODEL_PACKAGE.getChoice(), Arrays.asList(YangTag.CONFIG, YangTag.DEFAULT, YangTag.DESCRIPTION,
+                YangTag.MANDATORY, YangTag.REFERENCE, YangTag.STATUS));
+        taggedNodeMap.put(MODEL_PACKAGE.getChoiceCase(),
+                Arrays.asList(YangTag.DESCRIPTION, YangTag.REFERENCE, YangTag.STATUS));
+        taggedNodeMap.put(MODEL_PACKAGE.getContainer(), Arrays.asList(YangTag.CONFIG, YangTag.DESCRIPTION,
+                YangTag.PRESENCE, YangTag.REFERENCE, YangTag.STATUS));
+        taggedNodeMap.put(MODEL_PACKAGE.getGrouping(),
+                Arrays.asList(YangTag.DESCRIPTION, YangTag.REFERENCE, YangTag.STATUS));
+        taggedNodeMap.put(MODEL_PACKAGE.getLeaf(), Arrays.asList(YangTag.CONFIG, YangTag.DEFAULT, YangTag.DESCRIPTION,
+                YangTag.MANDATORY, YangTag.REFERENCE, YangTag.STATUS, YangTag.UNITS));
+        taggedNodeMap.put(MODEL_PACKAGE.getModule(), Arrays.asList(YangTag.CONTACT, YangTag.DESCRIPTION,
+                YangTag.NAMESPACE, YangTag.ORGANIZATION, YangTag.PREFIX, YangTag.REFERENCE, YangTag.YANG_VERSION));
+        taggedNodeMap.put(MODEL_PACKAGE.getSubmodule(), Arrays.asList(YangTag.CONTACT, YangTag.DESCRIPTION,
+                YangTag.ORGANIZATION, YangTag.REFERENCE, YangTag.YANG_VERSION));
+        taggedNodeMap.put(MODEL_PACKAGE.getRevision(), Arrays.asList(YangTag.DESCRIPTION, YangTag.REFERENCE));
+        taggedNodeMap.put(MODEL_PACKAGE.getLeafList(),
+                Arrays.asList(YangTag.CONFIG, YangTag.DESCRIPTION, YangTag.MAX_ELEMENTS, YangTag.MIN_ELEMENTS,
+                        YangTag.ORDERED_BY, YangTag.REFERENCE, YangTag.STATUS, YangTag.UNITS));
+        taggedNodeMap.put(MODEL_PACKAGE.getList(),
+                Arrays.asList(YangTag.CONFIG, YangTag.DESCRIPTION, YangTag.MAX_ELEMENTS, YangTag.MIN_ELEMENTS,
+                        YangTag.ORDERED_BY, YangTag.REFERENCE, YangTag.STATUS, YangTag.UNITS));
+        taggedNodeMap.put(MODEL_PACKAGE.getRpc(),
+                Arrays.asList(YangTag.DESCRIPTION, YangTag.REFERENCE, YangTag.STATUS));
+        taggedNodeMap.put(MODEL_PACKAGE.getTypedef(),
+                Arrays.asList(YangTag.DEFAULT, YangTag.DESCRIPTION, YangTag.REFERENCE, YangTag.STATUS, YangTag.UNITS));
+
+        astNodes.put(com.cisco.yangide.core.dom.Module.class, MODEL_PACKAGE.getModule());
+        astNodes.put(com.cisco.yangide.core.dom.SubModule.class, MODEL_PACKAGE.getSubmodule());
+        astNodes.put(GroupingDefinition.class, MODEL_PACKAGE.getGrouping());
+        astNodes.put(ContrainerSchemaNode.class, MODEL_PACKAGE.getContainer());
+        astNodes.put(LeafSchemaNode.class, MODEL_PACKAGE.getLeaf());
+        astNodes.put(RpcDefinition.class, MODEL_PACKAGE.getRpc());
+        astNodes.put(RpcOutputNode.class, MODEL_PACKAGE.getRpcIO());
+        astNodes.put(RpcInputNode.class, MODEL_PACKAGE.getRpcIO());
+        astNodes.put(UsesNode.class, MODEL_PACKAGE.getUses());
+        astNodes.put(NotificationDefinition.class, MODEL_PACKAGE.getNotification());
+        astNodes.put(AugmentationSchema.class, MODEL_PACKAGE.getAugment());
+        astNodes.put(Deviation.class, MODEL_PACKAGE.getDeviation());
+        astNodes.put(ExtensionDefinition.class, MODEL_PACKAGE.getExtension());
+        astNodes.put(FeatureDefinition.class, MODEL_PACKAGE.getFeature());
+        astNodes.put(IdentitySchemaNode.class, MODEL_PACKAGE.getIdentity());
+        astNodes.put(ModuleImport.class, MODEL_PACKAGE.getImport());
+        astNodes.put(RevisionNode.class, MODEL_PACKAGE.getRevision());
+        astNodes.put(LeafListSchemaNode.class, MODEL_PACKAGE.getLeafList());
+        astNodes.put(ListSchemaNode.class, MODEL_PACKAGE.getList());
+        astNodes.put(ChoiceNode.class, MODEL_PACKAGE.getChoice());
+        astNodes.put(ChoiceCaseNode.class, MODEL_PACKAGE.getChoiceCase());
+        astNodes.put(TypeDefinition.class, MODEL_PACKAGE.getTypedef());
+        astNodes.put(TypeReference.class, MODEL_PACKAGE.getTyperef());
+        astNodes.put(AnyXmlSchemaNode.class, MODEL_PACKAGE.getAnyxml());
+
+        connections.put(MODEL_PACKAGE.getUses(), MODEL_PACKAGE.getGrouping());
+        connections.put(MODEL_PACKAGE.getIdentity(), MODEL_PACKAGE.getIdentity());
+    }
+
+    public static boolean canContain(Object parent) {
+        return checkType(MODEL_PACKAGE.getContainingNode(), parent);
+    }
+
+    public static boolean canContain(Object parent, Object child) {
+        return checkType(MODEL_PACKAGE.getContainingNode(), parent) && checkType(MODEL_PACKAGE.getNode(), child)
+                && canContain(((ContainingNode) parent).eClass(), ((Node) child).eClass())
+                && !hasCircles((ContainingNode) parent, (Node) child);
+    }
+
+    public static boolean canContain(EClass parent, EClass child) {
+        if (checkType(MODEL_PACKAGE.getContainingNode(), parent)) {
+            for (EClass c : getPossibleChildren(parent)) {
+                if (c.equals(child)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    public static int getPositionInParent(Object parent, Object child) {
+        if (null != parent && null != child && checkType(MODEL_PACKAGE.getContainingNode(), parent)
+                && checkType(MODEL_PACKAGE.getNode(), child)) {
+            if (((ContainingNode) parent).getChildren().contains(child)) {
+                return ((ContainingNode) parent).getChildren().indexOf(child);
+            }
+        }
+        return -1;
+    }
+
+    public static void move(Object source, Object target, Object obj, int pos) {
+        if (source != target) {
+            remove(source, obj);
+            add(target, obj, pos);
+        } else {
+            move(target, obj, pos);
+        }
+
+    }
+
+    public static void move(Object target, Object obj, int pos) {
+        if (null != target && null != obj && checkType(MODEL_PACKAGE.getContainingNode(), target)
+                && checkType(MODEL_PACKAGE.getNode(), obj)) {
+            ((Node) obj).setParent((ContainingNode) target);
+            if (pos >= ((ContainingNode) target).getChildren().size()) {
+                pos = ((ContainingNode) target).getChildren().size() - 1;
+            }
+            ((ContainingNode) target).getChildren().move(pos, (Node) obj);
+        }
+    }
+
+    public static void add(Object target, Object obj, int pos) {
+        if (null != target && null != obj && checkType(MODEL_PACKAGE.getContainingNode(), target)
+                && checkType(MODEL_PACKAGE.getNode(), obj)) {
+            ((Node) obj).setParent((ContainingNode) target);
+            if (pos >= ((ContainingNode) target).getChildren().size()) {
+                ((ContainingNode) target).getChildren().add((Node) obj);
+            } else {
+                ((ContainingNode) target).getChildren().add(pos, (Node) obj);
+            }
+        }
+    }
+
+    public static void remove(Object source, Object obj) {
+        if (null != source && null != obj && checkType(MODEL_PACKAGE.getContainingNode(), source)) {
+            ((ContainingNode) source).getChildren().remove(obj);
+        }
+
+        if (null != obj && checkType(MODEL_PACKAGE.getNode(), obj)) {
+            ((Node) obj).setParent(null);
+        }
+    }
+
+    public static boolean hasReference(EObject tested) {
+        return null != getConnectionReferenceObjectClass(tested);
+    }
+
+    public static EClass getConnectionReferenceObjectClass(EObject tested) {
+        if (null != tested) {
+            if (null == connections.get(tested.eClass())) {
+                for (Map.Entry<EClass, EClass> c : connections.entrySet()) {
+                    if (checkType(c.getKey(), tested)) {
+                        return c.getValue();
+                    }
+                }
+            } else {
+                return connections.get(tested.eClass());
+            }
+        }
+        return null;
+    }
+
+    public static boolean canBeReferenced(Object tested) {
+        return null != getConnectionReferenceSubjectClass(tested);
+    }
+
+    public static EClass getConnectionReferenceSubjectClass(Object tested) {
+        for (Map.Entry<EClass, EClass> c : connections.entrySet()) {
+            if (checkType(c.getValue(), tested)) {
+                return c.getKey();
+            }
+        }
+        return null;
+    }
+
+    public static EStructuralFeature getReference(EClass parent, EClass ref) {
+        for (EStructuralFeature esf : parent.getEAllStructuralFeatures()) {
+            if (esf.getEType().getClassifierID() == ref.getClassifierID()) {
+                return esf;
+            }
+        }
+        return null;
+    }
+
+    public static EObject getReferencedObject(IFeatureProvider fp, EObject obj) {
+        EClass referencedClass = getConnectionReferenceObjectClass(obj);
+        if (null != referencedClass) {
+            Object module = fp.getBusinessObjectForPictogramElement(fp.getDiagramTypeProvider().getDiagram());
+            for (EObject o : filter(getAllBusinessObjects((EObject) module, null), referencedClass)) {
+                if (checkType(MODEL_PACKAGE.getUses(), obj) && null != module && module instanceof EObject) {
+                    if (((Grouping) o).getName().equals(((Uses) obj).getQName())) {
+                        return o;
+                    }
+                }
+                if (checkType(MODEL_PACKAGE.getReferenceNode(), obj)
+                        && checkType(MODEL_PACKAGE.getNamedNode(), referencedClass)) {
+                    if (null != ((NamedNode) o).getName()
+                            && ((NamedNode) o).getName().equals(((ReferenceNode) obj).getReference())) {
+                        return o;
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
+    public static List<EObject> getAllBusinessObjects(EObject obj, List<EObject> list) {
+        if (null == list) {
+            list = new ArrayList<EObject>();
+        }
+        list.add(obj);
+        if (checkType(MODEL_PACKAGE.getContainingNode(), obj)) {
+            for (EObject o : ((ContainingNode) obj).getChildren()) {
+                getAllBusinessObjects(o, list);
+            }
+        }
+        return list;
+    }
+
+    public static boolean checkType(EClass parent, Object tested) {
+        return null != tested && tested instanceof EObject && checkType(parent, ((EObject) tested).eClass());
+    }
+
+    public static boolean checkType(EClass parent, EClass tested) {
+        return parent.isSuperTypeOf(tested);
+    }
+
+    private static boolean hasCircles(ContainingNode parent, Node child) {
+        Set<Node> checked = new HashSet<Node>();
+        List<Node> descendants = new ArrayList<Node>();
+        descendants.add(child);
+        for (int i = 0; i < descendants.size(); i++) {
+            Node n = descendants.get(i);
+            if (n == parent) {
+                return true;
+            }
+            if (!checked.contains(n) && n instanceof ContainingNode) {
+                descendants.addAll(((ContainingNode) n).getChildren());
+            }
+            checked.add(n);
+        }
+        return false;
+    }
+
+    public static List<IPropertyDescriptor> getPropertyDescriptors(EClass c) {
+        List<IPropertyDescriptor> result = new ArrayList<IPropertyDescriptor>();
+        if (taggedNodeMap.containsKey(c)) {
+            for (YangTag tag : taggedNodeMap.get(c)) {
+                result.add(tag.getPropertyDescriptor());
+            }
+        }
+        return result;
+    }
+
+    public static Tag getTag(YangTag id, TaggedNode node) {
+        for (Tag tag : node.getTags()) {
+            if (id.getName().equals(tag.getName())) {
+                return tag;
+            }
+        }
+        return null;
+    }
+
+    public static Object getValue(YangTag id, TaggedNode node) {
+        Tag tag = getTag(id, node);
+        if (null != tag) {
+            return tag.getValue();
+        }
+        return null;
+    }
+
+    public static Object getValue(YangTag id, ASTNode node) {
+        if (YangTag.DESCRIPTION == id) {
+            return node.getDescription();
+        }
+        if (YangTag.REFERENCE == id) {
+            return node.getReference();
+        }
+        if (YangTag.STATUS == id) {
+            return node.getStatus();
+        }
+        if (node instanceof ASTCompositeNode) {
+            for (ASTNode n : ((ASTCompositeNode) node).getChildren()) {
+                if (n instanceof SimpleNode<?>) {
+                    if (id.getName().equals(((SimpleNode<?>) n).getNodeName())) {
+                        return ((SimpleNode<?>) n).getValue();
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
+    public static void setValue(YangTag id, TaggedNode node, Object value) {
+        Tag tag = getTag(id, node);
+        if (null != tag) {
+            tag.setValue(value);
+        } else {
+            Tag t = ModelFactory.eINSTANCE.createTag();
+            t.setName(id.getName());
+            t.setValue(value);
+            node.getTags().add(t);
+        }
+    }
+
+    private static List<EClass> getPossibleChildren(EClass e) {
+        return (null != compositeNodeMap.get(e) ? compositeNodeMap.get(e) : Collections.<EClass> emptyList());
+    }
+
+    public static Module exportModel(com.cisco.yangide.core.dom.Module module, Map<Node, ASTNode> relations) {
+        return (Module) createEObject(module, null, relations);
+    }
+
+    private static EObject createEObject(ASTNode n, EObject parent, Map<Node, ASTNode> relations) {
+        EClass cl = getEClass(n);
+        if (null != cl) {
+            EObject o = ModelFactory.eINSTANCE.create(cl);
+            if (null != o) {
+                setName(o, n);
+                setTags(o, n);
+                setAdditionalInfo(o, n);
+                if (null != parent) {
+                    setRelation(parent, o);
+                }
+                if (checkType(MODEL_PACKAGE.getNode(), o)) {
+                    relations.put((Node) o, n);
+                    if (checkType(MODEL_PACKAGE.getContainingNode(), o) || checkType(MODEL_PACKAGE.getTypedNode(), o)) {
+                        if (n instanceof ASTCompositeNode) {
+                            for (ASTNode c : ((ASTCompositeNode) n).getChildren()) {
+                                createEObject(c, o, relations);
+                            }
+                        }
+                    }
+                }
+                return o;
+            }
+        }
+        return null;
+    }
+
+    private static void setAdditionalInfo(EObject o, ASTNode n) {
+        if (checkType(MODEL_PACKAGE.getRpcIO(), o)) {
+            ((RpcIO) o).setInput(n instanceof RpcInputNode);
+        }
+        if (checkType(MODEL_PACKAGE.getUses(), o)) {
+            if (n instanceof UsesNode) {
+                ((Uses) o).setQName(((UsesNode) n).getName());
+            }
+        }
+        if (checkType(MODEL_PACKAGE.getImport(), o)) {
+            if (n instanceof ModuleImport) {
+                ((Import) o).setModule(((ModuleImport) n).getName());
+                ((Import) o).setPrefix(((ModuleImport) n).getPrefix());
+                ((Import) o).setRevisionDate(((ModuleImport) n).getRevision());
+            }
+        }
+        if (checkType(MODEL_PACKAGE.getIdentity(), o)) {
+            if (n instanceof IdentitySchemaNode && null != ((IdentitySchemaNode) n).getBase()) {
+                ((Identity) o).setReference(((IdentitySchemaNode) n).getBase().getName());
+            }
+        }
+        if (checkType(MODEL_PACKAGE.getSubmodule(), o)) {
+            if (n instanceof SubModule) {
+                SubModule subModule = (SubModule) n;
+                SimpleNode<String> pmNode = subModule.getParentModule();
+                if (pmNode != null) {
+                    BelongsTo belongsTo = ModelFactory.eINSTANCE.createBelongsTo();
+                    Module parentModule = ModelFactory.eINSTANCE.createModule();
+
+                    parentModule.setName(pmNode.getValue());
+
+                    belongsTo.setOwnerModule(parentModule);
+                    setValue(YangTag.PREFIX, parentModule, subModule.getParentPrefix());
+
+                    ((Submodule) o).setBelongsTo(belongsTo);
+                }
+            }
+        }
+    }
+
+    private static void setTags(EObject o, ASTNode n) {
+        List<YangTag> tags = taggedNodeMap.get(o.eClass());
+        if (null != tags && checkType(YangModelUtil.MODEL_PACKAGE.getTaggedNode(), o)) {
+            for (YangTag t : tags) {
+                setValue(t, (TaggedNode) o, getValue(t, n));
+            }
+        }
+    }
+
+    private static void setName(EObject o, ASTNode n) {
+        if (checkType(MODEL_PACKAGE.getNamedNode(), o)) {
+            if (n instanceof ASTNamedNode) {
+                ((NamedNode) o).setName(((ASTNamedNode) n).getName());
+            }
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    private static void setRelation(EObject parent, EObject o) {
+        if (canContain(parent, o) && checkType(MODEL_PACKAGE.getContainingNode(), parent)) {
+            add(parent, o, ((ContainingNode) parent).getChildren().size());
+        }
+        EStructuralFeature esf = getReference(parent.eClass(), o.eClass());
+        if (null != esf) {
+            if (1 != esf.getUpperBound()) {
+                ((Collection<EObject>) parent.eGet(esf)).add(o);
+            } else {
+                parent.eSet(esf, o);
+            }
+        }
+    }
+
+    public static String getQName(EObject obj) {
+        if (checkType(MODEL_PACKAGE.getUses(), obj)) {
+            if (null != obj && null != ((Uses) obj).getQName()) {
+                return ((Uses) obj).getQName();
+            }
+        }
+        return null;
+    }
+
+    public static String getQNamePresentation(EObject obj) {
+        String result = getQName(obj);
+        if (null != result) {
+            return obj.eClass().getName().toLowerCase() + " " + result;
+        }
+        return null;
+    }
+
+    public static EClass getEClass(ASTNode obj) {
+        Class<? extends ASTNode> c = obj.getClass();
+        EClass ec = astNodes.get(c);
+        if (null == ec) {
+            for (Map.Entry<Class<? extends ASTNode>, EClass> entry : astNodes.entrySet()) {
+                if (c.isAssignableFrom(entry.getKey())) {
+                    return entry.getValue();
+                }
+            }
+        }
+        if (null == ec && obj instanceof SimpleNamedNode) {
+            if ("key".equals(((SimpleNamedNode) obj).getNodeName())) {
+                return MODEL_PACKAGE.getListKey();
+            }
+        }
+        return ec;
+    }
+
+    public static <T extends EObject> List<T> filter(List<T> list, EClass ec) {
+        List<T> result = new ArrayList<T>();
+        for (T n : list) {
+            if (checkType(ec, n)) {
+                result.add(n);
+            }
+        }
+        return result;
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/YangTag.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/YangTag.java
new file mode 100644 (file)
index 0000000..159d277
--- /dev/null
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.util;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+
+import com.cisco.yangide.ext.model.editor.property.DialogTextPropertyDescriptor;
+
+public enum YangTag {
+    DESCRIPTION, YANG_VERSION("yang-version"), NAMESPACE, PREFIX, ORGANIZATION(true), CONTACT, REFERENCE, CONFIG(
+            Arrays.asList(Strings.EMPTY_STRING, Boolean.TRUE.toString(), Boolean.FALSE.toString())), MANDATORY(
+                    Arrays.asList(Strings.EMPTY_STRING, Boolean.TRUE.toString(), Boolean.FALSE.toString())), STATUS(
+                            Arrays.asList(Strings.EMPTY_STRING, "current", "deprecated", "obsolete")), PRESENCE(
+                                    Arrays.asList(Strings.EMPTY_STRING, Boolean.TRUE.toString(),
+                                            Boolean.FALSE.toString())), ORDERED_BY(
+                                                    "ordered-by",
+                                                    Arrays.asList(Strings.EMPTY_STRING, "user", "system",
+                                                            "obsolete")), DEFAULT, UNITS, MAX_ELEMENTS(
+                                                                    "max-elements"), MIN_ELEMENTS("min-elements");
+    private String name;
+    private boolean required;
+    private List<String> possibleValues;
+    private IPropertyDescriptor pd;
+
+    private YangTag() {
+        required = false;
+    }
+
+    private YangTag(boolean required) {
+        this();
+        this.required = required;
+    }
+
+    private YangTag(String name) {
+        this();
+        this.name = name;
+    }
+
+    private YangTag(List<String> possibleValues) {
+        this();
+        this.possibleValues = possibleValues;
+    }
+
+    private YangTag(String name, List<String> possibleValues) {
+        this();
+        this.name = name;
+        this.possibleValues = possibleValues;
+    }
+
+    public String getDescriptor() {
+        return toString();
+    }
+
+    public String getName() {
+        if (null == name) {
+            return toString().toLowerCase();
+        }
+        return name;
+    }
+
+    public boolean isRequired() {
+        return required;
+    }
+
+    public List<String> getPossibleValues() {
+        return possibleValues;
+    }
+
+    public IPropertyDescriptor getPropertyDescriptor() {
+        if (null == pd) {
+            if (this == DESCRIPTION || this == CONTACT || this == ORGANIZATION || this == REFERENCE) {
+                return new DialogTextPropertyDescriptor(this, getName());
+            } else if (null != possibleValues && !possibleValues.isEmpty()) {
+                pd = new ComboBoxPropertyDescriptor(this, getName(), possibleValues.toArray(new String[0]));
+            } else {
+                pd = new TextPropertyDescriptor(this, getName());
+            }
+        }
+        return pd;
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/connection/AbstractHighwayMatrix.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/connection/AbstractHighwayMatrix.java
new file mode 100644 (file)
index 0000000..c1ae03c
--- /dev/null
@@ -0,0 +1,249 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.util.connection;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.PointList;
+
+/**
+ * Base implemention of the {@link IHighwayMatrix}. Do not contain the search logic. Uses the
+ * {@link List} as collection of the highways and position on list as identifier.
+ *
+ * @author Ruslan
+ */
+public abstract class AbstractHighwayMatrix implements IHighwayMatrix {
+    private final List<HighwayPtr> highways;
+
+    /**
+     * Constructor. Creates the instance using list of the highways.
+     *
+     * @param highways - highways list
+     * @see IHighwayMatrix
+     * @see Highway
+     */
+    protected AbstractHighwayMatrix(List<Highway> highways) {
+        this.highways = new ArrayList<>();
+        for (Highway highway : highways) {
+            addHighway(highway);
+        }
+    }
+
+    /**
+     * Creates new HighwayPtr using specified {@code highway} and adds it to the end of highway
+     * pointers list.
+     *
+     * @param highway - the highway to be added to this matrix
+     * @return the index of the highway to be added
+     */
+    @Override
+    public int addHighway(Highway highway) {
+        if (highway == null) {
+            return -1;
+        }
+        int index = highways.size();
+        highways.add(new HighwayPtr(highway, index));
+        return index;
+    }
+
+    /**
+     * Removes the highway pointer at the specified position in the highway pointers list
+     *
+     * @param index - the index of the highway to be removed
+     * @return the highway that was removed from the matrix
+     */
+    @Override
+    public Highway removeHighway(int index) {
+        HighwayPtr ptrHighway = highways.remove(index);
+        for (int pos = index; pos < highways.size(); pos++) {
+            ptrHighway.shiftToLeft();
+        }
+        return ptrHighway.highway;
+    }
+
+    /**
+     * Creates the points list using specified {@code path}.
+     *
+     * @param path - array of the highways indexes
+     * @param start - start point (first element on the returned points list)
+     * @param end - end point (last element on the returned points list)
+     * @return the points list
+     */
+    protected PointList getPoints(int[] path, Point start, Point end) {
+        // System.out.println("Path: " + Arrays.toString(path));
+
+        PointList result = new PointList();
+        result.addPoint(start);
+
+        Highway current = path.length == 0 ? null : getHighway(path[0]);
+        for (int index = 1; index < path.length; index++) {
+            Highway next = getHighway(path[index]);
+            result.addPoint(current.getIntersection(next));
+            current = next;
+        }
+
+        result.addPoint(end);
+        return result;
+    }
+
+    /**
+     * Gets the highways iterator
+     *
+     * @return the highways iterator
+     */
+    @Override
+    public Iterable<Highway> getHighways() {
+        List<Highway> list = new ArrayList<>();
+        for (HighwayPtr highway : highways) {
+            list.add(highway.highway);
+        }
+        return list;
+    }
+
+    /**
+     * Gets the size of the highways list
+     *
+     * @return the size of the highways list
+     */
+    protected int getSize() {
+        return highways.size();
+    }
+
+    /**
+     * Returns the highway at the specified position in list.
+     *
+     * @param index - index of the highway to return
+     * @return the highway at the specified position in this list
+     * @throws IndexOutOfBoundsException if the index is out of range (
+     * <tt>index &lt; 0 || index &gt;= getSize()</tt>)
+     */
+    @Override
+    public Highway getHighway(int index) {
+        return highways.get(index).highway;
+    }
+
+    /**
+     * Returns the index of the specified {@code highway}, or -1 if highways list does not contain
+     * the element.
+     *
+     * @param highway - element to search for
+     * @return the index of the specified {@code highway}, or -1 if highways list does not contain
+     * the element.
+     * @throws NullPointerException if the specified element is {@code null}
+     */
+    @Override
+    public int getIdentifier(Highway highway) {
+        for (int index = 0; index < highways.size(); index++) {
+            if (highways.get(index).highway.equals(highway)) {
+                return index;
+            }
+        }
+        return -1;
+    }
+
+    /**
+     * Returns the highway pointer at the specified position in list.
+     *
+     * @param index - index of the highway to return
+     * @return the highway pointer at the specified position in this list
+     * @throws IndexOutOfBoundsException if the index is out of range (
+     * <tt>index &lt; 0 || index &gt;= getSize()</tt>)
+     * @see HighwayPtr
+     */
+    protected HighwayPtr getHighwayPtr(int index) {
+        return highways.get(index);
+    }
+
+    /**
+     * Returns the index of the specified {@code highway} pointer
+     *
+     * @param highway - element to search for
+     * @return the index of the specified {@code highway} pointer
+     * @throws NullPointerException if the specified element is {@code null}
+     */
+    protected int getIndex(HighwayPtr highway) {
+        return highway.index;
+    }
+
+    /**
+     * Wrapper on the {@link Highway}. Contains index of the highway in the highways list for quick
+     * operation of the get index of element. Overrides {@code hashCode()} and {@code equals()} for
+     * quick operations with hash map and hash set.
+     *
+     * @author Ruslan
+     */
+    protected static class HighwayPtr {
+        /**
+         * the wrapped element
+         */
+        public final Highway highway;
+        /**
+         * the index on the highways list
+         */
+        public int index;
+
+        /**
+         * Create HighwayPtr using specified {@code highway} and {@code index
+         * }
+         *
+         * @param highway - the highway
+         * @param index - the index
+         */
+        public HighwayPtr(Highway highway, int index) {
+            super();
+            this.highway = highway;
+            this.index = index;
+        }
+
+        /**
+         * Decrements the index. For internal use only. Uses in the {@link #removeHighway()} method.
+         */
+        private void shiftToLeft() {
+            index--;
+        }
+
+        /**
+         * Returns the index
+         *
+         * @return the index
+         */
+        @Override
+        public int hashCode() {
+            return index;
+        }
+
+        /**
+         * Compares the indexes (after standart checks of the {@code null} and type).
+         */
+        @Override
+        public boolean equals(Object obj) {
+            if (obj == this) {
+                return true;
+            }
+            if (obj == null) {
+                return false;
+            }
+            if (getClass() != obj.getClass()) {
+                return false;
+            }
+            HighwayPtr other = (HighwayPtr) obj;
+            return other.index == index;
+        }
+
+        /**
+         * Returns the string in the format: &lt;index&gt;:&nbsp;&lt;highway.ToString()&gt;
+         */
+        @Override
+        public String toString() {
+            return String.format("%d: %s", index, highway);
+        }
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/connection/DirectPathFinder.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/connection/DirectPathFinder.java
new file mode 100644 (file)
index 0000000..7e9da9f
--- /dev/null
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.util.connection;
+
+import org.eclipse.draw2d.geometry.PointList;
+import org.eclipse.draw2d.geometry.Rectangle;
+
+/**
+ * Simple implementation without using obstacles.
+ */
+public class DirectPathFinder implements IPathFinder {
+    /**
+     * It isn't used in this implementation. Always returns {@code 0}.
+     *
+     * @return 0
+     */
+    public int getSpacing() {
+        return 0;
+    }
+
+    /**
+     * It isn't used in this implementation
+     *
+     * @param spacing the spacing to set
+     */
+    public void setSpacing(int spacing) {
+    }
+
+    /**
+     * It isn't used in this implementation
+     */
+    @Override
+    public void addObstacle(Rectangle rect) {
+    }
+
+    /**
+     * It isn't used in this implementation
+     */
+    @Override
+    public void removeObstacle(Rectangle rect) {
+    }
+
+    /**
+     * It isn't used in this implementation
+     */
+    @Override
+    public void updateObstacle(Rectangle oldBounds, Rectangle newBounds) {
+    }
+
+    /**
+     * Returns a path containing start and end points of the positions.
+     *
+     * @return a path containing start and end points of the positions
+     */
+    @Override
+    public RoutePath find(Position start, Position end, boolean strict) {
+        if (start == null || end == null) {
+            return null;
+        }
+
+        PointList result = new PointList();
+        result.addPoint(start.getPoint());
+        result.addPoint(end.getPoint());
+
+        double distance = start.getPoint().getDistance(end.getPoint());
+        return new RoutePath(result, 0, (int) distance);
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/connection/Highway.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/connection/Highway.java
new file mode 100644 (file)
index 0000000..6e4c483
--- /dev/null
@@ -0,0 +1,211 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.util.connection;
+
+import org.eclipse.draw2d.geometry.Point;
+
+/**
+ * The horizontal or vertical line (probably bounded by one or both ends) not crossing an obstacle.
+ */
+public class Highway {
+    private int start;
+    private int end;
+    private int position;
+    private boolean type;
+
+    /**
+     * Static factory method creting horizontal {@code Highway} using point and length. Use
+     * {@link Integer#MIN_VALUE} and {@link Integer#MAX_VALUE} foor creating unlimited end.
+     * <p>
+     * Examples:<br>
+     * <b>createHorizontal(-100, 100, 200)</b>:<br>
+     * &nbsp;&nbsp;&nbsp;&nbsp;line segment [point(-100, 100), point(100, 100)]<br>
+     * <b>createHorizontal(Integer.MIN_VALUE, 100, 200-Integer.MIN_VALUE)</b>:<br>
+     * &nbsp;&nbsp;&nbsp;&nbsp;line segment [point(-INFINITY, 200), point(100, 200)]<br>
+     * <b>createHorizontal(-200, 100, Integer.MAX_VALUE-(-200))</b>:<br>
+     * &nbsp;&nbsp;&nbsp;&nbsp;line segment [point(-200, 100), point(INFINITY, 200)]<br>
+     * </p>
+     *
+     * @param x - x coordinate of the point
+     * @param y - y coordinate of the point
+     * @param length - length
+     * @return horizontal {@code Highway}
+     */
+    public static Highway createHorizontal(int x, int y, int length) {
+        return new Highway(x, x + length, y, true);
+    }
+
+    /**
+     * Static factory method creting vertival {@code Highway} using point and length. Use
+     * {@link Integer#MIN_VALUE} and {@link Integer#MAX_VALUE} foor creating unlimited end.
+     * <p>
+     * Examples:<br>
+     * <b>createVertical(-100, 100, 200)</b>:<br>
+     * &nbsp;&nbsp;&nbsp;&nbsp;line segment [point(-100, 100), point(-100, 300)]<br>
+     * <b>createVertical(100, Integer.MIN_VALUE, 200-Integer.MIN_VALUE)</b>:<br>
+     * &nbsp;&nbsp;&nbsp;&nbsp;line segment [point(100, -INFINITY), point(100, 200)]<br>
+     * <b>createVertical(-200, -100, Integer.MAX_VALUE-(-100))</b>:<br>
+     * &nbsp;&nbsp;&nbsp;&nbsp;line segment [point(-200, -100), point(-200, INFINITY)]<br>
+     * </p>
+     *
+     * @param x - x coordinate of the point
+     * @param y - y coordinate of the point
+     * @param length - length
+     * @return horizontal {@code Highway}
+     */
+    public static Highway createVertical(int x, int y, int length) {
+        return new Highway(y, y + length, x, false);
+    }
+
+    /**
+     * Constructor
+     *
+     * @param start the start position. {@code x} in case horizontal or {@code y} otherwise
+     * @param end the end position. {@code x} in case horizontal or {@code y} otherwise
+     * @param position the {@code y} position in case horizontal or {@code x} otherwise
+     * @param type {@code true} - horizontal, {@code false} vertical
+     */
+    protected Highway(int start, int end, int position, boolean type) {
+        super();
+        this.start = start;
+        this.end = end;
+        this.position = position;
+        this.type = type;
+    }
+
+    /**
+     * Gets the start position. {@code x} in case horizontal or {@code y} otherwise
+     *
+     * @return the start position. {@code x} in case horizontal or {@code y} otherwise
+     */
+    public int getStart() {
+        return start;
+    }
+
+    /**
+     * Gets the end position. {@code x} in case horizontal or {@code y} otherwise
+     *
+     * @return the end position. {@code x} in case horizontal or {@code y} otherwise
+     */
+    public int getEnd() {
+        return end;
+    }
+
+    /**
+     * Gets the {@code y} position in case horizontal or {@code x} otherwise
+     *
+     * @return the {@code y} position in case horizontal or {@code x} otherwise
+     */
+    public int getPosition() {
+        return position;
+    }
+
+    /**
+     * Whether is horisontal highway?
+     *
+     * @return whether is horisontal highway?
+     */
+    public boolean isHorizontal() {
+        return type;
+    }
+
+    /**
+     * Whether is vertical highway
+     *
+     * @return whether is vertical highway
+     */
+    public boolean isVertical() {
+        return !type;
+    }
+
+    /**
+     * Gets the start point
+     *
+     * @return the start point
+     */
+    public Point getStartPoint() {
+        return type ? new Point(start, position) : new Point(position, start);
+    }
+
+    /**
+     * Checks, whether has crossing with {@code other} highway.
+     *
+     * @return the start point
+     */
+    public boolean isIntersect(Highway other) {
+        if (type == other.type) {
+            return false;
+        }
+        return other.position >= start && other.position <= end && position >= other.start && position <= other.end;
+    }
+
+    /**
+     * Gets the intersection point.
+     * <p>
+     * NOTE: Invalid in case highways has not intersection. Call {@link #isIntersect(Highway)}
+     * before.
+     * </p>
+     *
+     * @param other other hightway
+     * @return the intersection point
+     */
+    public Point getIntersection(Highway other) {
+        return type ? new Point(other.position, position) : new Point(position, other.position);
+    }
+
+    /*
+     * Generated
+     */
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + end;
+        result = prime * result + position;
+        result = prime * result + start;
+        result = prime * result + (type ? 1231 : 1237);
+        return result;
+    }
+
+    /*
+     * Generated
+     */
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        Highway other = (Highway) obj;
+        if (end != other.end) {
+            return false;
+        }
+        if (position != other.position) {
+            return false;
+        }
+        if (start != other.start) {
+            return false;
+        }
+        if (type != other.type) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        String dir = type ? "HOR" : "VER";
+        return String.format("%s[%d] (%d-%d)", dir, position, start, end);
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/connection/HighwayMatrix.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/connection/HighwayMatrix.java
new file mode 100644 (file)
index 0000000..c2007ac
--- /dev/null
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.util.connection;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.draw2d.geometry.Point;
+
+/**
+ * Draft TODO: Not implemented
+ */
+public class HighwayMatrix extends AbstractHighwayMatrix implements IHighwayMatrix {
+    private Cell[][] matrix;
+
+    public HighwayMatrix(List<Highway> highways) {
+        super(highways);
+    }
+
+    @Override
+    public int addHighway(Highway highway) {
+        matrix = null;
+        return super.addHighway(highway);
+    }
+
+    @Override
+    public Highway removeHighway(int index) {
+        matrix = null;
+        return super.removeHighway(index);
+    }
+
+    @Override
+    public RoutePath getPath(int indexFrom, Point start, int indexTo, Point end) {
+        // if (indexFrom == indexTo)
+        // {
+        // return new int[] { indexTo };
+        // }
+        //
+        // Cell cell = getMatrix()[indexFrom][indexTo];
+        // return cell == null ? null : cell.path;
+        return null;
+    }
+
+    protected Cell[][] getMatrix() {
+        if (matrix == null) {
+            matrix = build();
+        }
+        return matrix;
+    }
+
+    protected Cell[][] build() {
+        Cell[][] result = new Cell[getSize()][getSize()];
+        for (int index = 0; index < result.length; index++) {
+            addToMatrix(result, index);
+        }
+        return result;
+    }
+
+    protected void addToMatrix(Cell[][] result, int newIndex) {
+        for (int crossIndex = 0; crossIndex < newIndex; crossIndex++) {
+            if (newIndex != crossIndex && hasPath(result, newIndex, crossIndex)) {
+                result[newIndex][crossIndex] = new Cell(crossIndex);
+                result[crossIndex][newIndex] = new Cell(newIndex);
+                updateMatrix(result, newIndex, crossIndex);
+                updateMatrix(result, crossIndex, newIndex);
+            }
+        }
+    }
+
+    private boolean hasPath(Cell[][] result, int id1, int id2) {
+        Highway highway1 = getHighway(id1);
+        Highway highway2 = getHighway(id2);
+        return result[id1][id2] != null || highway1.isIntersect(highway2);
+    }
+
+    protected void updateMatrix(Cell[][] result, int dest, int src) {
+        for (int index = 0; index < result.length; index++) {
+            if (index == dest) {
+                continue;
+            }
+
+            Cell cell = result[src][index];
+            int size = cell == null ? -1 : cell.path.length;
+
+            Cell backCell = result[index][src];
+            int backSize = backCell == null ? -1 : backCell.path.length;
+
+            assert size == backSize;
+
+            if (cell != null /* && backCell != null */) {
+                int[] path = new int[cell.path.length + 1];
+                path[0] = src;
+                cell.copyPath(path, 1);
+                result[dest][index] = new Cell(path);
+
+                int[] backPath = new int[backCell.path.length + 1];
+                backPath[backPath.length - 1] = dest;
+                backCell.copyPath(backPath, 0);
+                result[index][dest] = new Cell(backPath);
+            }
+        }
+    }
+
+    public static class Cell {
+        public final int[] path;
+
+        public Cell(int path) {
+            this(new int[] { path });
+        }
+
+        public Cell(int[] path) {
+            this.path = path;
+        }
+
+        /**
+         * Copies {@code path} of this cell to the specified destination array.
+         *
+         * @param dest - the destination array.
+         * @param offset - starting position in the destination data.
+         */
+        public void copyPath(int[] dest, int offset) {
+            System.arraycopy(path, 0, dest, offset, path.length);
+        }
+
+        @Override
+        public String toString() {
+            return Arrays.toString(path);
+        }
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/connection/HighwayMatrixWave.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/connection/HighwayMatrixWave.java
new file mode 100644 (file)
index 0000000..ba8cea6
--- /dev/null
@@ -0,0 +1,196 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.util.connection;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.PointList;
+
+/**
+ * The implementation of the {@link IHighwayMatrix} using wave algorithm.
+ */
+public class HighwayMatrixWave extends AbstractHighwayMatrix implements IHighwayMatrix {
+    /**
+     * Constructor.<br>
+     * Creates the instance, using starting set of the highways. Before a call of the
+     * {@link #getPath(int, Point, int, Point)} this set can be changed using
+     * {@link #addHighway(Highway)} or {@link #removeHighway(int)}.
+     *
+     * @param highways - starting set of the highways.
+     */
+    public HighwayMatrixWave(List<Highway> highways) {
+        super(highways);
+    }
+
+    /**
+     * Looks for a path, using algorithm of a wave.<br>
+     * If path is not found, then {@code null} will be returned.<br>
+     * Returned path contain the {@code start} and {@code end} points.
+     *
+     * @param idFrom the identifier of the starting highway
+     * @param start the start point
+     * @param idTo the identifier of the ending highway
+     * @param end the end point and required direction from from this point
+     * @return finded path or @{code null}
+     */
+    @Override
+    public RoutePath getPath(int indexFrom, Point start, int indexTo, Point end) {
+        if (indexFrom == indexTo) {
+            PointList points = new PointList();
+            points.addPoint(start);
+            points.addPoint(end);
+            int length = (int) end.getDistance(start);
+            return new RoutePath(points, 0, length);
+        }
+
+        // Init vertex info (neighbours, wave label)
+        List<Vertex> vertexes = new ArrayList<>();
+        for (int index = 0; index < getSize(); index++) {
+            vertexes.add(new Vertex(getHighwayPtr(index)));
+        }
+
+        // Init Wave
+        LinkedList<Vertex> front = new LinkedList<>();
+        Vertex vertexFrom = vertexes.get(indexFrom);
+        Vertex vertexTo = vertexes.get(indexTo);
+
+        vertexFrom.setStartPoint(start);
+        front.add(vertexFrom);
+
+        // Start wave
+        while (!front.isEmpty()) {
+            Vertex vertex = front.removeFirst();
+            if (vertex == vertexTo) {
+                int[] path = vertex.getPath(vertexes, indexFrom, indexTo);
+                PointList points = getPoints(path, start, end);
+                Point last = vertex.right.point;
+                int length = vertex.length + (int) end.getDistance(last);
+                return new RoutePath(points, points.size() - 2, length);
+            }
+
+            int step = vertex.label + 1;
+            for (Integer idxNeighbour : vertex.neighbours) {
+                Vertex neighbour = vertexes.get(idxNeighbour);
+                if (neighbour.updateLabel(vertex, step)) {
+                    front.add(neighbour);
+                }
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * Vertex of the graph. Contains the collection of the neighbour vertexes and also the data
+     * needed for algorithm work. NOTE: for internal use only.
+     *
+     * @author Ruslan
+     */
+    private class Vertex {
+        private static final int UNDEFINED = -1;
+
+        private final Highway highway;
+        private final List<Integer> neighbours = new ArrayList<>();
+        private int label = UNDEFINED;
+        private int length = Integer.MAX_VALUE;
+
+        private Cross left;
+        private Cross right;
+
+        public Vertex(HighwayPtr ptrHighway) {
+            this.highway = ptrHighway.highway;
+            for (int index = 0; index < getSize(); index++) {
+                if (ptrHighway.index != index && ptrHighway.highway.isIntersect(getHighway(index))) {
+                    neighbours.add(index);
+                }
+            }
+        }
+
+        public void setStartPoint(Point point) {
+            left = new Cross(null, point, false);
+            right = new Cross(null, point, true);
+            length = 0;
+            label = 0;
+        }
+
+        public boolean updateLabel(Vertex from, int step) {
+            boolean result = label == UNDEFINED;
+            if (result || label == step) {
+                Point cross = from.highway.getIntersection(highway);
+
+                int newLeftLength = calcLength(cross, from.left.point);
+                int newRightLength = calcLength(cross, from.right.point);
+
+                int newLength = Math.min(newLeftLength, newRightLength) + from.length;
+
+                if (newLength < length) {
+                    length = newLength;
+                    left = new Cross(from, cross, false);
+                    right = new Cross(from, cross, true);
+                    label = step;
+                } else if (newLength == length) {
+                    if (less(cross, left.point)) {
+                        left = new Cross(from, cross, false);
+                    } else if (more(cross, right.point)) {
+                        right = new Cross(from, cross, true);
+                    }
+                    label = step;
+                }
+            }
+            return result;
+        }
+
+        private int calcLength(Point cross, Point point) {
+            return highway.isHorizontal() ? Math.abs(point.y - cross.y) : Math.abs(point.x - cross.x);
+        }
+
+        private boolean less(Point p1, Point p2) {
+            return highway.isHorizontal() ? p1.x < p2.x : p1.y < p2.y;
+        }
+
+        private boolean more(Point p1, Point p2) {
+            return highway.isHorizontal() ? p1.x > p2.x : p1.y > p2.y;
+        }
+
+        public int[] getPath(List<Vertex> vertexes, int indexFrom, int indexTo) {
+            int[] result = new int[label + 1];
+            result[label] = indexTo;
+            result[0] = indexFrom;
+            fillPath(result, label - 1, true, vertexes);
+            return result;
+        }
+
+        protected void fillPath(int[] result, int index, boolean useRight, List<Vertex> vertexes) {
+            if (index > 0) {
+                Vertex from = useRight ? right.from : left.from;
+                int idxFrom = vertexes.indexOf(from);
+                result[index--] = idxFrom;
+
+                useRight = useRight ? right.useRight : left.useRight;
+                from.fillPath(result, index, useRight, vertexes);
+            }
+        }
+
+        private class Cross {
+            public final Vertex from;
+            public final boolean useRight;
+            public final Point point;
+
+            public Cross(Vertex from, Point point, boolean useRight) {
+                this.from = from;
+                this.point = point;
+                this.useRight = useRight;
+            }
+        }
+
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/connection/IHighwayMatrix.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/connection/IHighwayMatrix.java
new file mode 100644 (file)
index 0000000..3c90973
--- /dev/null
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.util.connection;
+
+import org.eclipse.draw2d.geometry.Point;
+
+/**
+ * Search algorithm of a way from one highway to the another. Contains the collection of the
+ * highway. For fast access to this collection of ways identifiers are used.
+ * <p>
+ * Depending on implementation, can do intermediate calculations at the time of change of this
+ * collection (see {@link #addHighway} and {@link #removeHighway} methods).
+ * </p>
+ */
+public interface IHighwayMatrix {
+    /**
+     * Finds the path
+     *
+     * @param idFrom the identifier of the starting highway
+     * @param start the start point
+     * @param idTo the identifier of the ending highway
+     * @param end the end point and required direction from from this point
+     * @return finded path
+     * @see RoutePath
+     */
+    RoutePath getPath(int idFrom, Point start, int idTo, Point end);
+
+    /**
+     * Gets the highways iterator
+     *
+     * @return the highways iterator
+     */
+    Iterable<Highway> getHighways();
+
+    /**
+     * Add the specified {@code highway} to the highways collection.
+     *
+     * @param highway - the highway to be added to this matrix
+     * @return the identifier of the highway to be added
+     */
+    int addHighway(Highway highway);
+
+    /**
+     * Removes the of the specified {@code highway} from highways collection.
+     *
+     * @param identifier - the identifier of the highway to be removed
+     * @return the highway that was removed from the matrix
+     */
+    Highway removeHighway(int identifier);
+
+    /**
+     * Returns the highway using the specified {@code identifier}.
+     *
+     * @param identifier - identifier of the highway to return
+     * @return the highway at the specified position in this list
+     * @throws RuntimeException in case invalid identifier
+     */
+    Highway getHighway(int identifier);
+
+    /**
+     * Returns the identifier of the specified {@code highway}, or -1 if highways collection does
+     * not contain the element.
+     *
+     * @param highway - element to search for
+     * @return the identifier of the specified {@code highway}, or -1 if highways collection does
+     * not contain the element.
+     * @throws NullPointerException if the specified element is {@code null}
+     */
+    int getIdentifier(Highway highway);
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/connection/IPathFinder.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/connection/IPathFinder.java
new file mode 100644 (file)
index 0000000..81c384d
--- /dev/null
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.util.connection;
+
+import org.eclipse.draw2d.geometry.Rectangle;
+
+/**
+ * Interface for find the path between obstacles
+ */
+public interface IPathFinder {
+    /**
+     * Adds an obstacle with the given bounds to the obstacles.
+     *
+     * @param rect the bounds of this obstacle
+     */
+    public void addObstacle(Rectangle rect);
+
+    /**
+     * Removes the obstacle with the rectangle's bounds from the routing.
+     *
+     * @param rect the bounds of the obstacle to remove
+     */
+    public void removeObstacle(Rectangle rect);
+
+    /**
+     * Updates the position of an existing obstacle.
+     *
+     * @param oldBounds the old bounds(used to find the obstacle)
+     * @param newBounds the new bounds
+     */
+    public void updateObstacle(Rectangle oldBounds, Rectangle newBounds);
+
+    /**
+     * Finds the path
+     *
+     * @param start the start position
+     * @param end the end position
+     * @param strict the flag
+     * @return finded path
+     * @see RoutePath
+     */
+    public RoutePath find(Position start, Position end, boolean strict);
+
+    /**
+     * Gets the spacing maintained between figure and path.
+     *
+     * @return the spacing maintained between figure and path.
+     */
+    int getSpacing();
+
+    /**
+     * Sets the spacing maintained between figure and path.
+     *
+     * @param spacing the spacing to set
+     */
+    void setSpacing(int spacing);
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/connection/Position.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/connection/Position.java
new file mode 100644 (file)
index 0000000..31460fb
--- /dev/null
@@ -0,0 +1,176 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.util.connection;
+
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.Rectangle;
+
+/**
+ * <pre>
+ * The position information:
+ *  - point
+ *  - direction
+ *  - assigned obstacle
+ * </pre>
+ */
+public class Position {
+    /**
+     * Enumeration of the rectilinear directions (UP, RIGHT, DOWN, LEFT)
+     */
+    public enum Direction {
+        UP, RIGHT, DOWN, LEFT
+    }
+
+    private Point point;
+
+    private final Direction direction;
+
+    private final Rectangle obstacle;
+
+    /**
+     * Create new {@code Position} using specified {@code point}, {@code direction} and
+     * {@code obstacle}
+     *
+     * @param point - the ray start point
+     * @param direction - the ray direction
+     * @param obstacle - the area assigned with figure - source of the ray
+     */
+    private Position(Point point, Direction direction, Rectangle obstacle) {
+        this.point = point;
+        this.direction = direction;
+        this.obstacle = obstacle;
+    }
+
+    /**
+     * Gets the point
+     *
+     * @return the point
+     */
+    public Point getPoint() {
+        return point;
+    }
+
+    /**
+     * Gets the direction
+     *
+     * @return the direction
+     */
+    public Direction getDirection() {
+        return direction;
+    }
+
+    /**
+     * Gets the obstacle: the area assigned with figure - source of the ray
+     *
+     * @return the obstacle: the area assigned with figure - source of the ray
+     */
+    public Rectangle getObstacle() {
+        return obstacle;
+    }
+
+    /**
+     * Checks, is {@code direction} not specified or horizontal
+     *
+     * @return {@code true} in case direction not specified or horizontal and {@code false}
+     * otherwise
+     */
+    public boolean isHorizontal() {
+        return direction == null || direction == Direction.RIGHT || direction == Direction.LEFT;
+    }
+
+    /**
+     * Checks, is {@code direction} not specified or vertical
+     *
+     * @return {@code true} in case direction not specified or vertical and {@code false} otherwise
+     */
+    public boolean isVertical() {
+        return direction == null || direction == Direction.UP || direction == Direction.DOWN;
+    }
+
+    /**
+     * Factory method for create new instance of the {@code Position} using {@code point} and
+     * {@code obstacle}. Calculates the rectangle side nearest to a point and sets the ray direction
+     * to opposite. If {@code obstacle} is {@code null} then Ray with empty direction will created.
+     *
+     * @param obstacle the area assigned with figure - source of the ray
+     * @param point the point of ray
+     * @return new instance of the {@code Position}
+     */
+    public static Position create(Rectangle obstacle, Point point) {
+        if (obstacle == null) {
+            return new Position(point, null, null);
+        }
+
+        int minDistance = Math.abs(obstacle.x() - point.x());
+        Direction direction = Direction.LEFT;
+
+        int distance = Math.abs(obstacle.right() - point.x());
+        if (distance < minDistance) {
+            minDistance = distance;
+            direction = Direction.RIGHT;
+        }
+
+        distance = Math.abs(obstacle.y() - point.y());
+        if (distance < minDistance) {
+            minDistance = distance;
+            direction = Direction.UP;
+        }
+
+        distance = Math.abs(obstacle.bottom() - point.y());
+        if (distance < minDistance) {
+            minDistance = distance;
+            direction = Direction.DOWN;
+        }
+
+        return new Position(point.getCopy(), direction, obstacle);
+    }
+
+    /**
+     * @return a copy of this Position
+     */
+    public Position getCopy() {
+        return new Position(point.getCopy(), direction, obstacle);
+    }
+
+    /**
+     * Shifts the start point by the specified {@code length} using the current direction.
+     *
+     * @param length - a length
+     * @return <code>this</code> for convenience
+     */
+    public Position moveOnDirection(int length) {
+        if (direction == null) {
+            return this;
+        }
+
+        switch (direction) {
+        case LEFT:
+            point.translate(-length, 0);
+            break;
+        case RIGHT:
+            point.translate(length, 0);
+            break;
+        case UP:
+            point.translate(0, -length);
+            break;
+        case DOWN:
+            point.translate(0, length);
+            break;
+        }
+        return this;
+    }
+
+    /**
+     * Returns the string in the format: "(&lt;x&gt;,&lt;y&gt;)&nbsp;&lt;direction&gt;"
+     */
+    @Override
+    public String toString() {
+        return String.format("(%d,%d) %s", point.x, point.y, direction);
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/connection/RectilinearAvoidObstaclesPathFinder.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/connection/RectilinearAvoidObstaclesPathFinder.java
new file mode 100644 (file)
index 0000000..f2b656b
--- /dev/null
@@ -0,0 +1,255 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.util.connection;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.PointList;
+import org.eclipse.draw2d.geometry.Rectangle;
+
+public class RectilinearAvoidObstaclesPathFinder implements IPathFinder {
+    /**
+     * The default spacing maintained between figure and path.
+     *
+     * @see #getSpacing()
+     * @see #setSpacing(int)
+     */
+    public static final int DEFAULT_SPACING = 15;
+
+    /**
+     * The spacing maintained between figure and path.
+     */
+    private int spacing = DEFAULT_SPACING;
+
+    private IHighwayMatrix matrix;
+    private Set<Rectangle> obstacles = new HashSet<>();
+    private List<Rectangle> temporaryObstaclesStore = null;
+
+    /**
+     * The empty constructor.
+     */
+    public RectilinearAvoidObstaclesPathFinder() {
+    }
+
+    @Override
+    public void addObstacle(Rectangle rect) {
+        if (!isSmallObstacle(rect)) {
+            obstacles.add(addSpacing(rect));
+            matrix = null;
+        }
+    }
+
+    @Override
+    public void removeObstacle(Rectangle rect) {
+        if (!isSmallObstacle(rect)) {
+            obstacles.remove(addSpacing(rect));
+            matrix = null;
+        }
+    }
+
+    protected boolean isSmallObstacle(Rectangle rect) {
+        return rect.width() <= 1 && rect.height() <= 1;
+    }
+
+    protected Rectangle addSpacing(Rectangle rect) {
+        if (rect != null) {
+            return rect.getCopy().translate(-spacing, -spacing).resize(spacing * 2, spacing * 2);
+        }
+        return null;
+    }
+
+    @Override
+    public void updateObstacle(Rectangle oldBounds, Rectangle newBounds) {
+        obstacles.remove(oldBounds);
+        obstacles.remove(newBounds);
+    }
+
+    @Override
+    public RoutePath find(Position start, Position end, boolean strict) {
+        // System.out.println(String.format("From: %s, To: %s", start, end));
+
+        start = start.getCopy().moveOnDirection(spacing);
+        end = end.getCopy().moveOnDirection(spacing);
+
+        if (isDirect(start, end)) {
+            PointList points = new PointList();
+            points.addPoint(start.getPoint());
+            points.addPoint(end.getPoint());
+            int length = (int) end.getPoint().getDistance(start.getPoint());
+            return new RoutePath(points, 0, length);
+        }
+
+        filterObstacles(start, strict);
+        filterObstacles(end, strict);
+        try {
+            IHighwayMatrix matrix = getMatrix();
+            RoutePath minPath = null;
+
+            for (Highway highwayFrom : getHighways(start, strict)) {
+                int fromId = matrix.addHighway(highwayFrom);
+                for (Highway highwayTo : getHighways(end, strict)) {
+                    int toId = matrix.addHighway(highwayTo);
+                    RoutePath candidate = matrix.getPath(fromId, start.getPoint(), toId, end.getPoint());
+                    minPath = RoutePath.min(minPath, candidate);
+
+                    matrix.removeHighway(toId);
+                }
+                matrix.removeHighway(fromId);
+            }
+
+            return minPath;
+        } finally {
+            restoreObstacles();
+        }
+    }
+
+    protected void filterObstacles(Position pos, boolean strict) {
+        if (!strict) {
+            if (temporaryObstaclesStore == null) {
+                temporaryObstaclesStore = new ArrayList<>();
+            }
+            Rectangle owner = addSpacing(pos.getObstacle());
+            Point point = pos.getPoint();
+
+            for (Iterator<Rectangle> it = obstacles.iterator(); it.hasNext();) {
+                Rectangle obstacle = it.next();
+                if (!obstacle.equals(owner) && obstacle.contains(point)) {
+                    it.remove();
+                    temporaryObstaclesStore.add(obstacle);
+                    // TODO: to remove highways from a matrix
+                    matrix = null;
+                }
+            }
+        }
+    }
+
+    protected void restoreObstacles() {
+        if (temporaryObstaclesStore != null) {
+            for (Rectangle obstacle : temporaryObstaclesStore) {
+                addObstacle(obstacle);
+                // TODO: to add highways to the matrix
+            }
+        }
+        temporaryObstaclesStore = null;
+    }
+
+    protected boolean isDirect(Position start, Position end) {
+        Point ptStart = start.getPoint();
+        Point ptEnd = end.getPoint();
+
+        if (ptStart.x == ptEnd.x) {
+            return Math.abs(ptStart.y - ptEnd.y) <= spacing * 2;
+        }
+        if (ptStart.y == ptEnd.y) {
+            return Math.abs(ptStart.x - ptEnd.x) <= spacing * 2;
+        }
+        return false;
+    }
+
+    protected List<Highway> getHighways(Position position, boolean strict) {
+        List<Highway> highways = new ArrayList<>();
+
+        // In case position direction is undefined it horizontal and vertical at the same time
+        if (position.isVertical()) {
+            Rectangle owner = strict ? addSpacing(position.getObstacle()) : null;
+            Highway highway = createVerHighway(position.getPoint(), owner);
+            if (highway != null) {
+                highways.add(highway);
+            }
+        }
+
+        if (position.isHorizontal()) {
+            Rectangle owner = strict ? addSpacing(position.getObstacle()) : null;
+            Highway highway = createHorHighway(position.getPoint(), owner);
+            if (highway != null) {
+                highways.add(highway);
+            }
+        }
+
+        return highways;
+    }
+
+    protected IHighwayMatrix getMatrix() {
+        if (matrix == null) {
+            matrix = createMatrix();
+        }
+        return matrix;
+    }
+
+    protected IHighwayMatrix createMatrix() {
+        List<Highway> highways = new ArrayList<>();
+        for (Rectangle obstacle : obstacles) {
+            highways.add(createVerHighway(obstacle.getLeft(), obstacle));
+            highways.add(createHorHighway(obstacle.getTop(), obstacle));
+            highways.add(createVerHighway(obstacle.getRight(), obstacle));
+            highways.add(createHorHighway(obstacle.getBottom(), obstacle));
+        }
+        return new HighwayMatrixWave(highways);
+    }
+
+    private Highway createHorHighway(Point point, Rectangle owner) {
+        int minX = Integer.MIN_VALUE, maxX = Integer.MAX_VALUE;
+        for (Rectangle obstacle : obstacles) {
+            if (owner != null && !owner.equals(obstacle) && obstacle.contains(point)) {
+                return null;
+            }
+            if (point.y() > obstacle.y() && point.y() < obstacle.bottom()) {
+                if (point.x() >= obstacle.right()) {
+                    minX = Math.max(minX, obstacle.right());
+                } else if (point.x() <= obstacle.x()) {
+                    maxX = Math.min(maxX, obstacle.x());
+                }
+            }
+        }
+        return Highway.createHorizontal(minX, point.y(), maxX - minX);
+    }
+
+    private Highway createVerHighway(Point point, Rectangle owner) {
+        int minY = Integer.MIN_VALUE, maxY = Integer.MAX_VALUE;
+        for (Rectangle obstacle : obstacles) {
+            if (owner != null && !owner.equals(obstacle) && obstacle.contains(point)) {
+                return null;
+            }
+            if (point.x() > obstacle.x() && point.x() < obstacle.right()) {
+                if (point.y() >= obstacle.bottom()) {
+                    minY = Math.max(minY, obstacle.bottom());
+                } else if (point.y() <= obstacle.y()) {
+                    maxY = Math.min(maxY, obstacle.y());
+                }
+            }
+        }
+        return Highway.createVertical(point.x(), minY, maxY - minY);
+    }
+
+    /**
+     * Gets the spacing maintained between figure and path.<br>
+     * <b>Default: </b> 10.
+     *
+     * @return the spacing maintained between figure and path.
+     */
+    @Override
+    public int getSpacing() {
+        return spacing;
+    }
+
+    /**
+     * Sets the spacing maintained between figure and path.
+     *
+     * @param spacing the spacing to set
+     */
+    @Override
+    public void setSpacing(int spacing) {
+        this.spacing = spacing;
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/connection/RoutePath.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/util/connection/RoutePath.java
new file mode 100644 (file)
index 0000000..a7f27cb
--- /dev/null
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.util.connection;
+
+import org.eclipse.draw2d.geometry.PointList;
+
+/**
+ * <pre>
+ * The path information:
+ *  - points list
+ *  - amount of the crossings
+ *  - summary length of the path segments
+ * </pre>
+ */
+public class RoutePath implements Comparable<RoutePath> {
+    public final PointList path;
+    public final int cross;
+    public final int length;
+
+    /**
+     * Constructor.
+     *
+     * @param path - points list
+     * @param cross - amount of the crossings
+     * @param length - summary length of the path segments
+     */
+    public RoutePath(PointList path, int cross, int length) {
+        super();
+        this.path = path;
+        this.cross = cross;
+        this.length = length;
+    }
+
+    /**
+     * Compares two {@code RoutePath} objects using count of the {@link #cross} and {@link #length}.
+     * <br>
+     * Priorities: numbers of intersections, length
+     *
+     * @param other - the {@code RoutePath} to be compared.
+     */
+    @Override
+    public int compareTo(RoutePath other) {
+        return cross != other.cross ? cross - other.cross : length - other.length;
+    }
+
+    /**
+     * Returns the smaller of two {@code RoutePath} values using {@link #compareTo(RoutePath)}
+     *
+     * @param p1 - an argument.
+     * @param p2 - another argument.
+     * @return the smaller of two {@code RoutePath} values
+     */
+    public static RoutePath min(RoutePath p1, RoutePath p2) {
+        if (p1 == null) {
+            return p2;
+        }
+        if (p2 == null) {
+            return p1;
+        }
+        return p1.compareTo(p2) > 0 ? p2 : p1;
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/widget/DialogText.java b/plugins/com.cisco.yangide.ext.model.editor/src/com/cisco/yangide/ext/model/editor/widget/DialogText.java
new file mode 100644 (file)
index 0000000..1b9e36c
--- /dev/null
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.editor.widget;
+
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.ControlListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+public abstract class DialogText {
+
+    public DialogText(Composite parent, FormToolkit toolkit) {
+        createControl(parent, toolkit);
+    }
+
+    private Control contents;
+
+    private Text text;
+
+    private Composite editor;
+
+    private Button button;
+
+    /**
+     * The value of this cell editor; initially <code>null</code>.
+     */
+    private Object value = null;
+
+    protected Control createControl(final Composite parent, FormToolkit toolkit) {
+        editor = toolkit.createComposite(parent, SWT.NONE);
+        GridDataFactory.fillDefaults().grab(true, false).applyTo(editor);
+        GridLayoutFactory.fillDefaults().numColumns(2).spacing(2, 0).applyTo(editor);
+        text = toolkit.createText(editor, "");
+
+        contents = text;
+        updateContents(value);
+
+        GridDataFactory.swtDefaults().align(SWT.FILL, SWT.TOP).hint(100, -1).grab(true, false).applyTo(contents);
+
+        button = toolkit.createButton(editor, "...", SWT.PUSH);
+        button.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent event) {
+                openDialogBox(text);
+            }
+        });
+        parent.layout();
+        int h = text.computeSize(-1, -1).y;
+        if (h == 0) {
+            h = 25;
+        }
+        GridDataFactory.swtDefaults().align(SWT.FILL, SWT.TOP).hint(h, h).grab(false, false).applyTo(button);
+        editor.addControlListener(new ControlListener() {
+            @Override
+            public void controlResized(ControlEvent e) {
+                int h = text.getBounds().height;
+                if (((GridData) button.getLayoutData()).heightHint != h && h != 0) {
+                    GridDataFactory.swtDefaults().align(SWT.FILL, SWT.TOP).hint(h, h).grab(false, false)
+                            .applyTo(button);
+                    editor.layout();
+                    editor.getParent().layout();
+                }
+            }
+
+            @Override
+            public void controlMoved(ControlEvent e) {
+            }
+        });
+
+        return editor;
+    }
+
+    public Text getTextControl() {
+        return text;
+    }
+
+    public String getText() {
+        return text.getText();
+    }
+
+    public void setText(String value) {
+        text.setText(value);
+    }
+
+    public Control getControl() {
+        return editor;
+    }
+
+    public void setLayoutData(Object layoutData) {
+        editor.setLayoutData(layoutData);
+    }
+
+    protected abstract Object openDialogBox(Text text);
+
+    protected void updateContents(Object value) {
+        if (text == null) {
+            return;
+        }
+
+        String textValue = "";//$NON-NLS-1$
+        if (value != null) {
+            textValue = value.toString();
+        }
+        text.setText(textValue);
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/anyxml.txt b/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/anyxml.txt
new file mode 100644 (file)
index 0000000..5949fdc
--- /dev/null
@@ -0,0 +1 @@
+anyxml @name@;
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/augment.txt b/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/augment.txt
new file mode 100644 (file)
index 0000000..3330e08
--- /dev/null
@@ -0,0 +1,3 @@
+augment @name@ {
+    ext:augment-identifier "@name@";
+}
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/case.txt b/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/case.txt
new file mode 100644 (file)
index 0000000..d80414c
--- /dev/null
@@ -0,0 +1,2 @@
+case @name@ {
+}
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/choice.txt b/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/choice.txt
new file mode 100644 (file)
index 0000000..5023ef1
--- /dev/null
@@ -0,0 +1,4 @@
+choice @name@ {
+    case case0 {
+    }
+}
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/container.txt b/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/container.txt
new file mode 100644 (file)
index 0000000..80c670d
--- /dev/null
@@ -0,0 +1,3 @@
+container @name@ {
+    
+}
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/deviation.txt b/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/deviation.txt
new file mode 100644 (file)
index 0000000..2771398
--- /dev/null
@@ -0,0 +1,3 @@
+deviation "/base:@name@" {
+    deviate not-supported;
+}
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/extension.txt b/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/extension.txt
new file mode 100644 (file)
index 0000000..6bd99fb
--- /dev/null
@@ -0,0 +1,4 @@
+extension @name@ {
+    description "";
+    argument "name";
+}
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/feature.txt b/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/feature.txt
new file mode 100644 (file)
index 0000000..eed1a2c
--- /dev/null
@@ -0,0 +1,3 @@
+feature @name@ {
+    description "";
+}
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/grouping.txt b/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/grouping.txt
new file mode 100644 (file)
index 0000000..7c64f03
--- /dev/null
@@ -0,0 +1,3 @@
+grouping @name@ {
+    
+}
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/identity.txt b/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/identity.txt
new file mode 100644 (file)
index 0000000..1b93da8
--- /dev/null
@@ -0,0 +1,3 @@
+identity @name@ {
+    description "";
+}
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/input.txt b/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/input.txt
new file mode 100644 (file)
index 0000000..a45415f
--- /dev/null
@@ -0,0 +1,2 @@
+input {
+}
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/leaf list.txt b/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/leaf list.txt
new file mode 100644 (file)
index 0000000..facfa60
--- /dev/null
@@ -0,0 +1,3 @@
+leaf-list @name@ {
+    type string;
+}
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/leaf.txt b/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/leaf.txt
new file mode 100644 (file)
index 0000000..0d25f25
--- /dev/null
@@ -0,0 +1,3 @@
+leaf @name@ {
+    type string;
+}
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/list.txt b/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/list.txt
new file mode 100644 (file)
index 0000000..3fb8b1f
--- /dev/null
@@ -0,0 +1,3 @@
+list @name@ {
+    key "name";
+}
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/notification.txt b/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/notification.txt
new file mode 100644 (file)
index 0000000..7c0c815
--- /dev/null
@@ -0,0 +1,3 @@
+notification @name@ {
+
+}
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/output.txt b/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/output.txt
new file mode 100644 (file)
index 0000000..71a8d6e
--- /dev/null
@@ -0,0 +1,2 @@
+output {
+}
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/rpc.txt b/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/rpc.txt
new file mode 100644 (file)
index 0000000..aa85cf9
--- /dev/null
@@ -0,0 +1,7 @@
+rpc @name@ {
+    input {
+    }
+
+    output {
+    }
+}
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/submodule.txt b/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/submodule.txt
new file mode 100644 (file)
index 0000000..f82f309
--- /dev/null
@@ -0,0 +1,3 @@
+submodule @name@ {
+    
+}
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/typedef.txt b/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/typedef.txt
new file mode 100644 (file)
index 0000000..f8d50e1
--- /dev/null
@@ -0,0 +1,4 @@
+typedef @name@ {
+    type string;
+    description "Type description";
+}
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/uses.txt b/plugins/com.cisco.yangide.ext.model.editor/templates/nodes/uses.txt
new file mode 100644 (file)
index 0000000..6feb2f5
--- /dev/null
@@ -0,0 +1 @@
+uses @name@;
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.ext.model/.gitignore b/plugins/com.cisco.yangide.ext.model/.gitignore
new file mode 100644 (file)
index 0000000..b77461b
--- /dev/null
@@ -0,0 +1,3 @@
+/target/
+/.settings/
+.classpath
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.ext.model/.project b/plugins/com.cisco.yangide.ext.model/.project
new file mode 100644 (file)
index 0000000..e9f70fa
--- /dev/null
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>com.cisco.yangide.ext.model</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.m2e.core.maven2Builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.m2e.core.maven2Nature</nature>
+               <nature>org.eclipse.sirius.nature.modelingproject</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+               <nature>org.eclipse.pde.PluginNature</nature>
+       </natures>
+</projectDescription>
diff --git a/plugins/com.cisco.yangide.ext.model/META-INF/MANIFEST.MF b/plugins/com.cisco.yangide.ext.model/META-INF/MANIFEST.MF
new file mode 100644 (file)
index 0000000..0999d56
--- /dev/null
@@ -0,0 +1,15 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: com.cisco.yangide.ext.model;singleton:=true
+Bundle-Version: 1.1.1.qualifier
+Bundle-ClassPath: .
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Export-Package: com.cisco.yangide.ext.model,
+ com.cisco.yangide.ext.model.impl,
+ com.cisco.yangide.ext.model.util
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.emf.ecore;visibility:=reexport
+Bundle-ActivationPolicy: lazy
diff --git a/plugins/com.cisco.yangide.ext.model/build.properties b/plugins/com.cisco.yangide.ext.model/build.properties
new file mode 100644 (file)
index 0000000..05207b8
--- /dev/null
@@ -0,0 +1,19 @@
+###############################################################################
+# Copyright (c) 2014, 2015 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
+#  
+###############################################################################
+#
+
+bin.includes = .,\
+               model/,\
+               META-INF/,\
+               plugin.xml,\
+               plugin.properties,\
+               src/
+jars.compile.order = .
+source.. = src/
+output.. = bin/
diff --git a/plugins/com.cisco.yangide.ext.model/model/model.aird b/plugins/com.cisco.yangide.ext.model/model/model.aird
new file mode 100644 (file)
index 0000000..a99305d
--- /dev/null
@@ -0,0 +1,862 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<viewpoint:DAnalysis xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:description="http://www.eclipse.org/sirius/table/description/1.1.0" xmlns:description_1="http://www.eclipse.org/sirius/description/1.1.0" xmlns:description_2="http://www.eclipse.org/sirius/diagram/description/1.1.0" xmlns:diagram="http://www.eclipse.org/sirius/diagram/1.1.0" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.2/notation" xmlns:style="http://www.eclipse.org/sirius/diagram/description/style/1.1.0" xmlns:table="http://www.eclipse.org/sirius/table/1.1.0" xmlns:viewpoint="http://www.eclipse.org/sirius/1.1.0" xsi:schemaLocation="http://www.eclipse.org/sirius/table/description/1.1.0 http://www.eclipse.org/sirius/table/1.1.0#//description http://www.eclipse.org/sirius/description/1.1.0 http://www.eclipse.org/sirius/1.1.0#//description http://www.eclipse.org/sirius/diagram/description/1.1.0 http://www.eclipse.org/sirius/diagram/1.1.0#//description http://www.eclipse.org/sirius/diagram/description/style/1.1.0 http://www.eclipse.org/sirius/diagram/1.1.0#//description/style" xmi:id="_R172wCNxEeS1ypqXlbG4tA" selectedViews="_R4NHoCNxEeS1ypqXlbG4tA _R9nMECNxEeS1ypqXlbG4tA _R-UWsCNxEeS1ypqXlbG4tA _SG8HMCNxEeS1ypqXlbG4tA" version="8.1.1">
+  <models xmi:type="ecore:EPackage" href="model.ecore#/"/>
+  <models xmi:type="ecore:EPackage" href="http://www.eclipse.org/emf/2002/Ecore#/"/>
+  <models xmi:type="ecore:EPackage" href="http://www.eclipse.org/emf/2003/XMLType#/"/>
+  <ownedViews xmi:type="viewpoint:DRepresentationContainer" xmi:id="_R4NHoCNxEeS1ypqXlbG4tA" initialized="true">
+    <ownedRepresentations xmi:type="table:DTable" xmi:id="_mNK1oCNxEeS1ypqXlbG4tA" name="model class table" headerColumnWidth="353">
+      <target xmi:type="ecore:EPackage" href="model.ecore#/"/>
+      <lines xmi:type="table:DLine" xmi:id="_mNK1oSNxEeS1ypqXlbG4tA" label="Module -> NamedContainingNode, TaggedNode">
+        <target xmi:type="ecore:EClass" href="model.ecore#//Module"/>
+        <lines xmi:type="table:DLine" xmi:id="_mNK1oiNxEeS1ypqXlbG4tA" label="namespace : EString">
+          <target xmi:type="ecore:EAttribute" href="model.ecore#//Module/namespace"/>
+          <semanticElements xmi:type="ecore:EAttribute" href="model.ecore#//Module/namespace"/>
+          <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']/@ownedSubLines[name='Feature']"/>
+          <cells xmi:type="table:DCell" xmi:id="_mNK1oyNxEeS1ypqXlbG4tA" label="namespace" column="_mNLc1SNxEeS1ypqXlbG4tA">
+            <target xmi:type="ecore:EAttribute" href="model.ecore#//Module/namespace"/>
+            <semanticElements xmi:type="ecore:EAttribute" href="model.ecore#//Module/namespace"/>
+          </cells>
+        </lines>
+        <lines xmi:type="table:DLine" xmi:id="_mNK1pCNxEeS1ypqXlbG4tA" label="revisions : Revision">
+          <target xmi:type="ecore:EReference" href="model.ecore#//Module/revisions"/>
+          <semanticElements xmi:type="ecore:EReference" href="model.ecore#//Module/revisions"/>
+          <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']/@ownedSubLines[name='Feature']"/>
+          <cells xmi:type="table:DCell" xmi:id="_mNK1pSNxEeS1ypqXlbG4tA" label="revisions" column="_mNLc1SNxEeS1ypqXlbG4tA">
+            <target xmi:type="ecore:EReference" href="model.ecore#//Module/revisions"/>
+            <semanticElements xmi:type="ecore:EReference" href="model.ecore#//Module/revisions"/>
+          </cells>
+        </lines>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Module"/>
+        <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']"/>
+        <cells xmi:type="table:DCell" xmi:id="_mNK1piNxEeS1ypqXlbG4tA" label="Module" column="_mNLc1SNxEeS1ypqXlbG4tA">
+          <target xmi:type="ecore:EClass" href="model.ecore#//Module"/>
+          <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Module"/>
+        </cells>
+      </lines>
+      <lines xmi:type="table:DLine" xmi:id="_mNK1pyNxEeS1ypqXlbG4tA" label="Grouping -> NamedContainingNode, TaggedNode">
+        <target xmi:type="ecore:EClass" href="model.ecore#//Grouping"/>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Grouping"/>
+        <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']"/>
+        <cells xmi:type="table:DCell" xmi:id="_mNK1qCNxEeS1ypqXlbG4tA" label="Grouping" column="_mNLc1SNxEeS1ypqXlbG4tA">
+          <target xmi:type="ecore:EClass" href="model.ecore#//Grouping"/>
+          <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Grouping"/>
+        </cells>
+      </lines>
+      <lines xmi:type="table:DLine" xmi:id="_mNK1qSNxEeS1ypqXlbG4tA" label="Leaf -> NamedNode, TaggedNode">
+        <target xmi:type="ecore:EClass" href="model.ecore#//Leaf"/>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Leaf"/>
+        <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']"/>
+        <cells xmi:type="table:DCell" xmi:id="_mNK1qiNxEeS1ypqXlbG4tA" label="Leaf" column="_mNLc1SNxEeS1ypqXlbG4tA">
+          <target xmi:type="ecore:EClass" href="model.ecore#//Leaf"/>
+          <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Leaf"/>
+        </cells>
+      </lines>
+      <lines xmi:type="table:DLine" xmi:id="_mNK1qyNxEeS1ypqXlbG4tA" label="Container -> NamedContainingNode, TaggedNode">
+        <target xmi:type="ecore:EClass" href="model.ecore#//Container"/>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Container"/>
+        <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']"/>
+        <cells xmi:type="table:DCell" xmi:id="_mNK1rCNxEeS1ypqXlbG4tA" label="Container" column="_mNLc1SNxEeS1ypqXlbG4tA">
+          <target xmi:type="ecore:EClass" href="model.ecore#//Container"/>
+          <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Container"/>
+        </cells>
+      </lines>
+      <lines xmi:type="table:DLine" xmi:id="_mNK1rSNxEeS1ypqXlbG4tA" label="Node">
+        <target xmi:type="ecore:EClass" href="model.ecore#//Node"/>
+        <lines xmi:type="table:DLine" xmi:id="_mNK1riNxEeS1ypqXlbG4tA" label="parent : Node">
+          <target xmi:type="ecore:EReference" href="model.ecore#//Node/parent"/>
+          <semanticElements xmi:type="ecore:EReference" href="model.ecore#//Node/parent"/>
+          <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']/@ownedSubLines[name='Feature']"/>
+          <cells xmi:type="table:DCell" xmi:id="_mNK1ryNxEeS1ypqXlbG4tA" label="parent" column="_mNLc1SNxEeS1ypqXlbG4tA">
+            <target xmi:type="ecore:EReference" href="model.ecore#//Node/parent"/>
+            <semanticElements xmi:type="ecore:EReference" href="model.ecore#//Node/parent"/>
+          </cells>
+        </lines>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Node"/>
+        <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']"/>
+        <cells xmi:type="table:DCell" xmi:id="_mNK1sCNxEeS1ypqXlbG4tA" label="Node" column="_mNLc1SNxEeS1ypqXlbG4tA">
+          <target xmi:type="ecore:EClass" href="model.ecore#//Node"/>
+          <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Node"/>
+        </cells>
+        <currentStyle xmi:type="table:DTableElementStyle" xmi:id="_mNK1sSNxEeS1ypqXlbG4tA" labelSize="10" labelFormat="italic">
+          <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_mNK1siNxEeS1ypqXlbG4tA"/>
+        </currentStyle>
+      </lines>
+      <lines xmi:type="table:DLine" xmi:id="_mNK1syNxEeS1ypqXlbG4tA" label="NamedNode -> Node">
+        <target xmi:type="ecore:EClass" href="model.ecore#//NamedNode"/>
+        <lines xmi:type="table:DLine" xmi:id="_mNK1tCNxEeS1ypqXlbG4tA" label="name : EString">
+          <target xmi:type="ecore:EAttribute" href="model.ecore#//NamedNode/name"/>
+          <semanticElements xmi:type="ecore:EAttribute" href="model.ecore#//NamedNode/name"/>
+          <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']/@ownedSubLines[name='Feature']"/>
+          <cells xmi:type="table:DCell" xmi:id="_mNK1tSNxEeS1ypqXlbG4tA" label="name" column="_mNLc1SNxEeS1ypqXlbG4tA">
+            <target xmi:type="ecore:EAttribute" href="model.ecore#//NamedNode/name"/>
+            <semanticElements xmi:type="ecore:EAttribute" href="model.ecore#//NamedNode/name"/>
+          </cells>
+        </lines>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//NamedNode"/>
+        <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']"/>
+        <cells xmi:type="table:DCell" xmi:id="_mNK1tiNxEeS1ypqXlbG4tA" label="NamedNode" column="_mNLc1SNxEeS1ypqXlbG4tA">
+          <target xmi:type="ecore:EClass" href="model.ecore#//NamedNode"/>
+          <semanticElements xmi:type="ecore:EClass" href="model.ecore#//NamedNode"/>
+        </cells>
+        <currentStyle xmi:type="table:DTableElementStyle" xmi:id="_mNK1tyNxEeS1ypqXlbG4tA" labelSize="10" labelFormat="italic">
+          <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_mNK1uCNxEeS1ypqXlbG4tA"/>
+        </currentStyle>
+      </lines>
+      <lines xmi:type="table:DLine" xmi:id="_mNK1uSNxEeS1ypqXlbG4tA" label="ContainingNode -> Node">
+        <target xmi:type="ecore:EClass" href="model.ecore#//ContainingNode"/>
+        <lines xmi:type="table:DLine" xmi:id="_mNK1uiNxEeS1ypqXlbG4tA" label="children : Node">
+          <target xmi:type="ecore:EReference" href="model.ecore#//ContainingNode/children"/>
+          <semanticElements xmi:type="ecore:EReference" href="model.ecore#//ContainingNode/children"/>
+          <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']/@ownedSubLines[name='Feature']"/>
+          <cells xmi:type="table:DCell" xmi:id="_mNK1uyNxEeS1ypqXlbG4tA" label="children" column="_mNLc1SNxEeS1ypqXlbG4tA">
+            <target xmi:type="ecore:EReference" href="model.ecore#//ContainingNode/children"/>
+            <semanticElements xmi:type="ecore:EReference" href="model.ecore#//ContainingNode/children"/>
+          </cells>
+        </lines>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//ContainingNode"/>
+        <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']"/>
+        <cells xmi:type="table:DCell" xmi:id="_mNK1vCNxEeS1ypqXlbG4tA" label="ContainingNode" column="_mNLc1SNxEeS1ypqXlbG4tA">
+          <target xmi:type="ecore:EClass" href="model.ecore#//ContainingNode"/>
+          <semanticElements xmi:type="ecore:EClass" href="model.ecore#//ContainingNode"/>
+        </cells>
+        <currentStyle xmi:type="table:DTableElementStyle" xmi:id="_mNK1vSNxEeS1ypqXlbG4tA" labelSize="10" labelFormat="italic">
+          <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_mNK1viNxEeS1ypqXlbG4tA"/>
+        </currentStyle>
+      </lines>
+      <lines xmi:type="table:DLine" xmi:id="_mNK1vyNxEeS1ypqXlbG4tA" label="NamedContainingNode -> NamedNode, ContainingNode">
+        <target xmi:type="ecore:EClass" href="model.ecore#//NamedContainingNode"/>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//NamedContainingNode"/>
+        <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']"/>
+        <cells xmi:type="table:DCell" xmi:id="_mNK1wCNxEeS1ypqXlbG4tA" label="NamedContainingNode" column="_mNLc1SNxEeS1ypqXlbG4tA">
+          <target xmi:type="ecore:EClass" href="model.ecore#//NamedContainingNode"/>
+          <semanticElements xmi:type="ecore:EClass" href="model.ecore#//NamedContainingNode"/>
+        </cells>
+        <currentStyle xmi:type="table:DTableElementStyle" xmi:id="_mNK1wSNxEeS1ypqXlbG4tA" labelSize="10" labelFormat="italic">
+          <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_mNK1wiNxEeS1ypqXlbG4tA"/>
+        </currentStyle>
+      </lines>
+      <lines xmi:type="table:DLine" xmi:id="_mNK1wyNxEeS1ypqXlbG4tA" label="Submodule -> Module">
+        <target xmi:type="ecore:EClass" href="model.ecore#//Submodule"/>
+        <lines xmi:type="table:DLine" xmi:id="_mNK1xCNxEeS1ypqXlbG4tA" label="belongsTo : BelongsTo">
+          <target xmi:type="ecore:EReference" href="model.ecore#//Submodule/belongsTo"/>
+          <semanticElements xmi:type="ecore:EReference" href="model.ecore#//Submodule/belongsTo"/>
+          <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']/@ownedSubLines[name='Feature']"/>
+          <cells xmi:type="table:DCell" xmi:id="_mNK1xSNxEeS1ypqXlbG4tA" label="belongsTo" column="_mNLc1SNxEeS1ypqXlbG4tA">
+            <target xmi:type="ecore:EReference" href="model.ecore#//Submodule/belongsTo"/>
+            <semanticElements xmi:type="ecore:EReference" href="model.ecore#//Submodule/belongsTo"/>
+          </cells>
+        </lines>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Submodule"/>
+        <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']"/>
+        <cells xmi:type="table:DCell" xmi:id="_mNK1xiNxEeS1ypqXlbG4tA" label="Submodule" column="_mNLc1SNxEeS1ypqXlbG4tA">
+          <target xmi:type="ecore:EClass" href="model.ecore#//Submodule"/>
+          <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Submodule"/>
+        </cells>
+      </lines>
+      <lines xmi:type="table:DLine" xmi:id="_mNK1xyNxEeS1ypqXlbG4tA" label="Typedef">
+        <target xmi:type="ecore:EClass" href="model.ecore#//Typedef"/>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Typedef"/>
+        <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']"/>
+        <cells xmi:type="table:DCell" xmi:id="_mNK1yCNxEeS1ypqXlbG4tA" label="Typedef" column="_mNLc1SNxEeS1ypqXlbG4tA">
+          <target xmi:type="ecore:EClass" href="model.ecore#//Typedef"/>
+          <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Typedef"/>
+        </cells>
+      </lines>
+      <lines xmi:type="table:DLine" xmi:id="_mNK1ySNxEeS1ypqXlbG4tA" label="Choice -> NamedContainingNode">
+        <target xmi:type="ecore:EClass" href="model.ecore#//Choice"/>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Choice"/>
+        <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']"/>
+        <cells xmi:type="table:DCell" xmi:id="_mNK1yiNxEeS1ypqXlbG4tA" label="Choice" column="_mNLc1SNxEeS1ypqXlbG4tA">
+          <target xmi:type="ecore:EClass" href="model.ecore#//Choice"/>
+          <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Choice"/>
+        </cells>
+      </lines>
+      <lines xmi:type="table:DLine" xmi:id="_mNK1yyNxEeS1ypqXlbG4tA" label="LeafList -> NamedContainingNode">
+        <target xmi:type="ecore:EClass" href="model.ecore#//LeafList"/>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//LeafList"/>
+        <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']"/>
+        <cells xmi:type="table:DCell" xmi:id="_mNK1zCNxEeS1ypqXlbG4tA" label="LeafList" column="_mNLc1SNxEeS1ypqXlbG4tA">
+          <target xmi:type="ecore:EClass" href="model.ecore#//LeafList"/>
+          <semanticElements xmi:type="ecore:EClass" href="model.ecore#//LeafList"/>
+        </cells>
+      </lines>
+      <lines xmi:type="table:DLine" xmi:id="_mNK1zSNxEeS1ypqXlbG4tA" label="Anyxml -> NamedNode">
+        <target xmi:type="ecore:EClass" href="model.ecore#//Anyxml"/>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Anyxml"/>
+        <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']"/>
+        <cells xmi:type="table:DCell" xmi:id="_mNK1ziNxEeS1ypqXlbG4tA" label="Anyxml" column="_mNLc1SNxEeS1ypqXlbG4tA">
+          <target xmi:type="ecore:EClass" href="model.ecore#//Anyxml"/>
+          <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Anyxml"/>
+        </cells>
+      </lines>
+      <lines xmi:type="table:DLine" xmi:id="_mNK1zyNxEeS1ypqXlbG4tA" label="Import -> Node">
+        <target xmi:type="ecore:EClass" href="model.ecore#//Import"/>
+        <lines xmi:type="table:DLine" xmi:id="_mNK10CNxEeS1ypqXlbG4tA" label="module : Module">
+          <target xmi:type="ecore:EReference" href="model.ecore#//Import/module"/>
+          <semanticElements xmi:type="ecore:EReference" href="model.ecore#//Import/module"/>
+          <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']/@ownedSubLines[name='Feature']"/>
+          <cells xmi:type="table:DCell" xmi:id="_mNK10SNxEeS1ypqXlbG4tA" label="module" column="_mNLc1SNxEeS1ypqXlbG4tA">
+            <target xmi:type="ecore:EReference" href="model.ecore#//Import/module"/>
+            <semanticElements xmi:type="ecore:EReference" href="model.ecore#//Import/module"/>
+          </cells>
+        </lines>
+        <lines xmi:type="table:DLine" xmi:id="_mNK10iNxEeS1ypqXlbG4tA" label="prefix : String">
+          <target xmi:type="ecore:EAttribute" href="model.ecore#//Import/prefix"/>
+          <semanticElements xmi:type="ecore:EAttribute" href="model.ecore#//Import/prefix"/>
+          <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']/@ownedSubLines[name='Feature']"/>
+          <cells xmi:type="table:DCell" xmi:id="_mNK10yNxEeS1ypqXlbG4tA" label="prefix" column="_mNLc1SNxEeS1ypqXlbG4tA">
+            <target xmi:type="ecore:EAttribute" href="model.ecore#//Import/prefix"/>
+            <semanticElements xmi:type="ecore:EAttribute" href="model.ecore#//Import/prefix"/>
+          </cells>
+        </lines>
+        <lines xmi:type="table:DLine" xmi:id="_mNK11CNxEeS1ypqXlbG4tA" label="revisionDate : String">
+          <target xmi:type="ecore:EAttribute" href="model.ecore#//Import/revisionDate"/>
+          <semanticElements xmi:type="ecore:EAttribute" href="model.ecore#//Import/revisionDate"/>
+          <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']/@ownedSubLines[name='Feature']"/>
+          <cells xmi:type="table:DCell" xmi:id="_mNK11SNxEeS1ypqXlbG4tA" label="revisionDate" column="_mNLc1SNxEeS1ypqXlbG4tA">
+            <target xmi:type="ecore:EAttribute" href="model.ecore#//Import/revisionDate"/>
+            <semanticElements xmi:type="ecore:EAttribute" href="model.ecore#//Import/revisionDate"/>
+          </cells>
+        </lines>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Import"/>
+        <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']"/>
+        <cells xmi:type="table:DCell" xmi:id="_mNK11iNxEeS1ypqXlbG4tA" label="Import" column="_mNLc1SNxEeS1ypqXlbG4tA">
+          <target xmi:type="ecore:EClass" href="model.ecore#//Import"/>
+          <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Import"/>
+        </cells>
+      </lines>
+      <lines xmi:type="table:DLine" xmi:id="_mNK11yNxEeS1ypqXlbG4tA" label="Include -> Node">
+        <target xmi:type="ecore:EClass" href="model.ecore#//Include"/>
+        <lines xmi:type="table:DLine" xmi:id="_mNK12CNxEeS1ypqXlbG4tA" label="submodule : Submodule">
+          <target xmi:type="ecore:EReference" href="model.ecore#//Include/submodule"/>
+          <semanticElements xmi:type="ecore:EReference" href="model.ecore#//Include/submodule"/>
+          <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']/@ownedSubLines[name='Feature']"/>
+          <cells xmi:type="table:DCell" xmi:id="_mNK12SNxEeS1ypqXlbG4tA" label="submodule" column="_mNLc1SNxEeS1ypqXlbG4tA">
+            <target xmi:type="ecore:EReference" href="model.ecore#//Include/submodule"/>
+            <semanticElements xmi:type="ecore:EReference" href="model.ecore#//Include/submodule"/>
+          </cells>
+        </lines>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Include"/>
+        <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']"/>
+        <cells xmi:type="table:DCell" xmi:id="_mNK12iNxEeS1ypqXlbG4tA" label="Include" column="_mNLc1SNxEeS1ypqXlbG4tA">
+          <target xmi:type="ecore:EClass" href="model.ecore#//Include"/>
+          <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Include"/>
+        </cells>
+      </lines>
+      <lines xmi:type="table:DLine" xmi:id="_mNK12yNxEeS1ypqXlbG4tA" label="Revision">
+        <target xmi:type="ecore:EClass" href="model.ecore#//Revision"/>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Revision"/>
+        <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']"/>
+        <cells xmi:type="table:DCell" xmi:id="_mNK13CNxEeS1ypqXlbG4tA" label="Revision" column="_mNLc1SNxEeS1ypqXlbG4tA">
+          <target xmi:type="ecore:EClass" href="model.ecore#//Revision"/>
+          <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Revision"/>
+        </cells>
+      </lines>
+      <lines xmi:type="table:DLine" xmi:id="_mNK13SNxEeS1ypqXlbG4tA" label="BelongsTo">
+        <target xmi:type="ecore:EClass" href="model.ecore#//BelongsTo"/>
+        <lines xmi:type="table:DLine" xmi:id="_mNK13iNxEeS1ypqXlbG4tA" label="ownerModule : Module">
+          <target xmi:type="ecore:EReference" href="model.ecore#//BelongsTo/ownerModule"/>
+          <semanticElements xmi:type="ecore:EReference" href="model.ecore#//BelongsTo/ownerModule"/>
+          <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']/@ownedSubLines[name='Feature']"/>
+          <cells xmi:type="table:DCell" xmi:id="_mNK13yNxEeS1ypqXlbG4tA" label="ownerModule" column="_mNLc1SNxEeS1ypqXlbG4tA">
+            <target xmi:type="ecore:EReference" href="model.ecore#//BelongsTo/ownerModule"/>
+            <semanticElements xmi:type="ecore:EReference" href="model.ecore#//BelongsTo/ownerModule"/>
+          </cells>
+        </lines>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//BelongsTo"/>
+        <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']"/>
+        <cells xmi:type="table:DCell" xmi:id="_mNK14CNxEeS1ypqXlbG4tA" label="BelongsTo" column="_mNLc1SNxEeS1ypqXlbG4tA">
+          <target xmi:type="ecore:EClass" href="model.ecore#//BelongsTo"/>
+          <semanticElements xmi:type="ecore:EClass" href="model.ecore#//BelongsTo"/>
+        </cells>
+      </lines>
+      <lines xmi:type="table:DLine" xmi:id="_mNK14SNxEeS1ypqXlbG4tA" label="List -> NamedContainingNode">
+        <target xmi:type="ecore:EClass" href="model.ecore#//List"/>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//List"/>
+        <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']"/>
+        <cells xmi:type="table:DCell" xmi:id="_mNK14iNxEeS1ypqXlbG4tA" label="List" column="_mNLc1SNxEeS1ypqXlbG4tA">
+          <target xmi:type="ecore:EClass" href="model.ecore#//List"/>
+          <semanticElements xmi:type="ecore:EClass" href="model.ecore#//List"/>
+        </cells>
+      </lines>
+      <lines xmi:type="table:DLine" xmi:id="_mNK14yNxEeS1ypqXlbG4tA" label="Tag">
+        <target xmi:type="ecore:EClass" href="model.ecore#//Tag"/>
+        <lines xmi:type="table:DLine" xmi:id="_mNLcsCNxEeS1ypqXlbG4tA" label="name : EString">
+          <target xmi:type="ecore:EAttribute" href="model.ecore#//Tag/name"/>
+          <semanticElements xmi:type="ecore:EAttribute" href="model.ecore#//Tag/name"/>
+          <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']/@ownedSubLines[name='Feature']"/>
+          <cells xmi:type="table:DCell" xmi:id="_mNLcsSNxEeS1ypqXlbG4tA" label="name" column="_mNLc1SNxEeS1ypqXlbG4tA">
+            <target xmi:type="ecore:EAttribute" href="model.ecore#//Tag/name"/>
+            <semanticElements xmi:type="ecore:EAttribute" href="model.ecore#//Tag/name"/>
+          </cells>
+        </lines>
+        <lines xmi:type="table:DLine" xmi:id="_mNLcsiNxEeS1ypqXlbG4tA" label="value : EJavaObject">
+          <target xmi:type="ecore:EAttribute" href="model.ecore#//Tag/value"/>
+          <semanticElements xmi:type="ecore:EAttribute" href="model.ecore#//Tag/value"/>
+          <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']/@ownedSubLines[name='Feature']"/>
+          <cells xmi:type="table:DCell" xmi:id="_mNLcsyNxEeS1ypqXlbG4tA" label="value" column="_mNLc1SNxEeS1ypqXlbG4tA">
+            <target xmi:type="ecore:EAttribute" href="model.ecore#//Tag/value"/>
+            <semanticElements xmi:type="ecore:EAttribute" href="model.ecore#//Tag/value"/>
+          </cells>
+        </lines>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Tag"/>
+        <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']"/>
+        <cells xmi:type="table:DCell" xmi:id="_mNLctCNxEeS1ypqXlbG4tA" label="Tag" column="_mNLc1SNxEeS1ypqXlbG4tA">
+          <target xmi:type="ecore:EClass" href="model.ecore#//Tag"/>
+          <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Tag"/>
+        </cells>
+      </lines>
+      <lines xmi:type="table:DLine" xmi:id="_mNLctSNxEeS1ypqXlbG4tA" label="TaggedNode">
+        <target xmi:type="ecore:EClass" href="model.ecore#//TaggedNode"/>
+        <lines xmi:type="table:DLine" xmi:id="_mNLctiNxEeS1ypqXlbG4tA" label="tags : Tag">
+          <target xmi:type="ecore:EReference" href="model.ecore#//TaggedNode/tags"/>
+          <semanticElements xmi:type="ecore:EReference" href="model.ecore#//TaggedNode/tags"/>
+          <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']/@ownedSubLines[name='Feature']"/>
+          <cells xmi:type="table:DCell" xmi:id="_mNLctyNxEeS1ypqXlbG4tA" label="tags" column="_mNLc1SNxEeS1ypqXlbG4tA">
+            <target xmi:type="ecore:EReference" href="model.ecore#//TaggedNode/tags"/>
+            <semanticElements xmi:type="ecore:EReference" href="model.ecore#//TaggedNode/tags"/>
+          </cells>
+        </lines>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//TaggedNode"/>
+        <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']"/>
+        <cells xmi:type="table:DCell" xmi:id="_mNLcuCNxEeS1ypqXlbG4tA" label="TaggedNode" column="_mNLc1SNxEeS1ypqXlbG4tA">
+          <target xmi:type="ecore:EClass" href="model.ecore#//TaggedNode"/>
+          <semanticElements xmi:type="ecore:EClass" href="model.ecore#//TaggedNode"/>
+        </cells>
+        <currentStyle xmi:type="table:DTableElementStyle" xmi:id="_mNLcuSNxEeS1ypqXlbG4tA" labelSize="10" labelFormat="italic">
+          <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_mNLcuiNxEeS1ypqXlbG4tA"/>
+        </currentStyle>
+      </lines>
+      <lines xmi:type="table:DLine" xmi:id="_mNLcuyNxEeS1ypqXlbG4tA" label="Uses -> Node">
+        <target xmi:type="ecore:EClass" href="model.ecore#//Uses"/>
+        <lines xmi:type="table:DLine" xmi:id="_mNLcvCNxEeS1ypqXlbG4tA" label="grouping : Grouping">
+          <target xmi:type="ecore:EReference" href="model.ecore#//Uses/grouping"/>
+          <semanticElements xmi:type="ecore:EReference" href="model.ecore#//Uses/grouping"/>
+          <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']/@ownedSubLines[name='Feature']"/>
+          <cells xmi:type="table:DCell" xmi:id="_mNLcvSNxEeS1ypqXlbG4tA" label="grouping" column="_mNLc1SNxEeS1ypqXlbG4tA">
+            <target xmi:type="ecore:EReference" href="model.ecore#//Uses/grouping"/>
+            <semanticElements xmi:type="ecore:EReference" href="model.ecore#//Uses/grouping"/>
+          </cells>
+        </lines>
+        <lines xmi:type="table:DLine" xmi:id="_mNLcviNxEeS1ypqXlbG4tA" label="qName : String">
+          <target xmi:type="ecore:EAttribute" href="model.ecore#//Uses/qName"/>
+          <semanticElements xmi:type="ecore:EAttribute" href="model.ecore#//Uses/qName"/>
+          <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']/@ownedSubLines[name='Feature']"/>
+          <cells xmi:type="table:DCell" xmi:id="_mNLcvyNxEeS1ypqXlbG4tA" label="qName" column="_mNLc1SNxEeS1ypqXlbG4tA">
+            <target xmi:type="ecore:EAttribute" href="model.ecore#//Uses/qName"/>
+            <semanticElements xmi:type="ecore:EAttribute" href="model.ecore#//Uses/qName"/>
+          </cells>
+        </lines>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Uses"/>
+        <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']"/>
+        <cells xmi:type="table:DCell" xmi:id="_mNLcwCNxEeS1ypqXlbG4tA" label="Uses" column="_mNLc1SNxEeS1ypqXlbG4tA">
+          <target xmi:type="ecore:EClass" href="model.ecore#//Uses"/>
+          <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Uses"/>
+        </cells>
+      </lines>
+      <lines xmi:type="table:DLine" xmi:id="_mNLcwSNxEeS1ypqXlbG4tA" label="Rpc -> NamedContainingNode">
+        <target xmi:type="ecore:EClass" href="model.ecore#//Rpc"/>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Rpc"/>
+        <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']"/>
+        <cells xmi:type="table:DCell" xmi:id="_mNLcwiNxEeS1ypqXlbG4tA" label="Rpc" column="_mNLc1SNxEeS1ypqXlbG4tA">
+          <target xmi:type="ecore:EClass" href="model.ecore#//Rpc"/>
+          <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Rpc"/>
+        </cells>
+      </lines>
+      <lines xmi:type="table:DLine" xmi:id="_mNLcwyNxEeS1ypqXlbG4tA" label="RpcIO -> ContainingNode">
+        <target xmi:type="ecore:EClass" href="model.ecore#//RpcIO"/>
+        <lines xmi:type="table:DLine" xmi:id="_mNLcxCNxEeS1ypqXlbG4tA" label="input : Boolean">
+          <target xmi:type="ecore:EAttribute" href="model.ecore#//RpcIO/input"/>
+          <semanticElements xmi:type="ecore:EAttribute" href="model.ecore#//RpcIO/input"/>
+          <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']/@ownedSubLines[name='Feature']"/>
+          <cells xmi:type="table:DCell" xmi:id="_mNLcxSNxEeS1ypqXlbG4tA" label="input" column="_mNLc1SNxEeS1ypqXlbG4tA">
+            <target xmi:type="ecore:EAttribute" href="model.ecore#//RpcIO/input"/>
+            <semanticElements xmi:type="ecore:EAttribute" href="model.ecore#//RpcIO/input"/>
+          </cells>
+        </lines>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//RpcIO"/>
+        <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']"/>
+        <cells xmi:type="table:DCell" xmi:id="_mNLcxiNxEeS1ypqXlbG4tA" label="RpcIO" column="_mNLc1SNxEeS1ypqXlbG4tA">
+          <target xmi:type="ecore:EClass" href="model.ecore#//RpcIO"/>
+          <semanticElements xmi:type="ecore:EClass" href="model.ecore#//RpcIO"/>
+        </cells>
+      </lines>
+      <lines xmi:type="table:DLine" xmi:id="_mNLcxyNxEeS1ypqXlbG4tA" label="Notification -> NamedContainingNode">
+        <target xmi:type="ecore:EClass" href="model.ecore#//Notification"/>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Notification"/>
+        <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']"/>
+        <cells xmi:type="table:DCell" xmi:id="_mNLcyCNxEeS1ypqXlbG4tA" label="Notification" column="_mNLc1SNxEeS1ypqXlbG4tA">
+          <target xmi:type="ecore:EClass" href="model.ecore#//Notification"/>
+          <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Notification"/>
+        </cells>
+      </lines>
+      <lines xmi:type="table:DLine" xmi:id="_mNLcySNxEeS1ypqXlbG4tA" label="Augment -> NamedContainingNode">
+        <target xmi:type="ecore:EClass" href="model.ecore#//Augment"/>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Augment"/>
+        <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']"/>
+        <cells xmi:type="table:DCell" xmi:id="_mNLcyiNxEeS1ypqXlbG4tA" label="Augment" column="_mNLc1SNxEeS1ypqXlbG4tA">
+          <target xmi:type="ecore:EClass" href="model.ecore#//Augment"/>
+          <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Augment"/>
+        </cells>
+      </lines>
+      <lines xmi:type="table:DLine" xmi:id="_mNLcyyNxEeS1ypqXlbG4tA" label="Extension -> NamedNode">
+        <target xmi:type="ecore:EClass" href="model.ecore#//Extension"/>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Extension"/>
+        <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']"/>
+        <cells xmi:type="table:DCell" xmi:id="_mNLczCNxEeS1ypqXlbG4tA" label="Extension" column="_mNLc1SNxEeS1ypqXlbG4tA">
+          <target xmi:type="ecore:EClass" href="model.ecore#//Extension"/>
+          <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Extension"/>
+        </cells>
+      </lines>
+      <lines xmi:type="table:DLine" xmi:id="_mNLczSNxEeS1ypqXlbG4tA" label="Feature -> NamedNode">
+        <target xmi:type="ecore:EClass" href="model.ecore#//Feature"/>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Feature"/>
+        <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']"/>
+        <cells xmi:type="table:DCell" xmi:id="_mNLcziNxEeS1ypqXlbG4tA" label="Feature" column="_mNLc1SNxEeS1ypqXlbG4tA">
+          <target xmi:type="ecore:EClass" href="model.ecore#//Feature"/>
+          <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Feature"/>
+        </cells>
+      </lines>
+      <lines xmi:type="table:DLine" xmi:id="_mNLczyNxEeS1ypqXlbG4tA" label="Deviation -> NamedNode">
+        <target xmi:type="ecore:EClass" href="model.ecore#//Deviation"/>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Deviation"/>
+        <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']"/>
+        <cells xmi:type="table:DCell" xmi:id="_mNLc0CNxEeS1ypqXlbG4tA" label="Deviation" column="_mNLc1SNxEeS1ypqXlbG4tA">
+          <target xmi:type="ecore:EClass" href="model.ecore#//Deviation"/>
+          <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Deviation"/>
+        </cells>
+      </lines>
+      <lines xmi:type="table:DLine" xmi:id="_mNLc0SNxEeS1ypqXlbG4tA" label="Identity -> NamedNode">
+        <target xmi:type="ecore:EClass" href="model.ecore#//Identity"/>
+        <lines xmi:type="table:DLine" xmi:id="_mNLc0iNxEeS1ypqXlbG4tA" label="base : Identity">
+          <target xmi:type="ecore:EReference" href="model.ecore#//Identity/base"/>
+          <semanticElements xmi:type="ecore:EReference" href="model.ecore#//Identity/base"/>
+          <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']/@ownedSubLines[name='Feature']"/>
+          <cells xmi:type="table:DCell" xmi:id="_mNLc0yNxEeS1ypqXlbG4tA" label="base" column="_mNLc1SNxEeS1ypqXlbG4tA">
+            <target xmi:type="ecore:EReference" href="model.ecore#//Identity/base"/>
+            <semanticElements xmi:type="ecore:EReference" href="model.ecore#//Identity/base"/>
+          </cells>
+        </lines>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Identity"/>
+        <originMapping xmi:type="description:LineMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedLineMappings[name='Classes%20lines']"/>
+        <cells xmi:type="table:DCell" xmi:id="_mNLc1CNxEeS1ypqXlbG4tA" label="Identity" column="_mNLc1SNxEeS1ypqXlbG4tA">
+          <target xmi:type="ecore:EClass" href="model.ecore#//Identity"/>
+          <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Identity"/>
+        </cells>
+      </lines>
+      <columns xmi:type="table:DFeatureColumn" xmi:id="_mNLc1SNxEeS1ypqXlbG4tA" label="Name" cells="_mNK1piNxEeS1ypqXlbG4tA _mNK1oyNxEeS1ypqXlbG4tA _mNK1pSNxEeS1ypqXlbG4tA _mNK1qCNxEeS1ypqXlbG4tA _mNK1qiNxEeS1ypqXlbG4tA _mNK1rCNxEeS1ypqXlbG4tA _mNK1sCNxEeS1ypqXlbG4tA _mNK1ryNxEeS1ypqXlbG4tA _mNK1tiNxEeS1ypqXlbG4tA _mNK1tSNxEeS1ypqXlbG4tA _mNK1vCNxEeS1ypqXlbG4tA _mNK1uyNxEeS1ypqXlbG4tA _mNK1wCNxEeS1ypqXlbG4tA _mNK1xiNxEeS1ypqXlbG4tA _mNK1xSNxEeS1ypqXlbG4tA _mNK1yCNxEeS1ypqXlbG4tA _mNK1yiNxEeS1ypqXlbG4tA _mNK1zCNxEeS1ypqXlbG4tA _mNK1ziNxEeS1ypqXlbG4tA _mNK11iNxEeS1ypqXlbG4tA _mNK10SNxEeS1ypqXlbG4tA _mNK10yNxEeS1ypqXlbG4tA _mNK11SNxEeS1ypqXlbG4tA _mNK12iNxEeS1ypqXlbG4tA _mNK12SNxEeS1ypqXlbG4tA _mNK13CNxEeS1ypqXlbG4tA _mNK14CNxEeS1ypqXlbG4tA _mNK13yNxEeS1ypqXlbG4tA _mNK14iNxEeS1ypqXlbG4tA _mNLctCNxEeS1ypqXlbG4tA _mNLcsSNxEeS1ypqXlbG4tA _mNLcsyNxEeS1ypqXlbG4tA _mNLcuCNxEeS1ypqXlbG4tA _mNLctyNxEeS1ypqXlbG4tA _mNLcwCNxEeS1ypqXlbG4tA _mNLcvSNxEeS1ypqXlbG4tA _mNLcvyNxEeS1ypqXlbG4tA _mNLcwiNxEeS1ypqXlbG4tA _mNLcxiNxEeS1ypqXlbG4tA _mNLcxSNxEeS1ypqXlbG4tA _mNLcyCNxEeS1ypqXlbG4tA _mNLcyiNxEeS1ypqXlbG4tA _mNLczCNxEeS1ypqXlbG4tA _mNLcziNxEeS1ypqXlbG4tA _mNLc0CNxEeS1ypqXlbG4tA _mNLc1CNxEeS1ypqXlbG4tA _mNLc0yNxEeS1ypqXlbG4tA" width="141" featureName="name">
+        <originMapping xmi:type="description:FeatureColumnMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']/@ownedColumnMappings[name='Name']"/>
+      </columns>
+      <description xmi:type="description:EditionTableDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Classes']"/>
+    </ownedRepresentations>
+    <ownedRepresentations xmi:type="diagram:DSemanticDiagram" xmi:id="_6wvAUCNxEeS1ypqXlbG4tA" name="model class diagram">
+      <ownedAnnotationEntries xmi:type="description_1:AnnotationEntry" xmi:id="_6xAGECNxEeS1ypqXlbG4tA" source="GMF_DIAGRAMS">
+        <data xmi:type="notation:Diagram" xmi:id="_6xAGESNxEeS1ypqXlbG4tA" type="Sirius" element="_6wvAUCNxEeS1ypqXlbG4tA" measurementUnit="Pixel">
+          <children xmi:type="notation:Node" xmi:id="_7kMdkCNxEeS1ypqXlbG4tA" type="2003" element="_7jiWQCNxEeS1ypqXlbG4tA">
+            <children xmi:type="notation:Node" xmi:id="_7kNEoCNxEeS1ypqXlbG4tA" type="5007"/>
+            <children xmi:type="notation:Node" xmi:id="_7kNrsCNxEeS1ypqXlbG4tA" type="7004">
+              <children xmi:type="notation:Node" xmi:id="_7kQH8CNxEeS1ypqXlbG4tA" type="3010" element="_7j3tcCNxEeS1ypqXlbG4tA">
+                <layoutConstraint xmi:type="notation:Location" xmi:id="_7kQH8SNxEeS1ypqXlbG4tA"/>
+              </children>
+              <styles xmi:type="notation:SortingStyle" xmi:id="_7kNrsSNxEeS1ypqXlbG4tA"/>
+              <styles xmi:type="notation:FilteringStyle" xmi:id="_7kNrsiNxEeS1ypqXlbG4tA"/>
+            </children>
+            <styles xmi:type="notation:ShapeStyle" xmi:id="_7kMdkSNxEeS1ypqXlbG4tA" fontName="Segoe UI" fontHeight="8"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_7kMdkiNxEeS1ypqXlbG4tA" x="612" y="384"/>
+          </children>
+          <children xmi:type="notation:Node" xmi:id="_7_IGECNxEeS1ypqXlbG4tA" type="2003" element="_7-xgwCNxEeS1ypqXlbG4tA">
+            <children xmi:type="notation:Node" xmi:id="_7_ItICNxEeS1ypqXlbG4tA" type="5007"/>
+            <children xmi:type="notation:Node" xmi:id="_7_ItISNxEeS1ypqXlbG4tA" type="7004">
+              <styles xmi:type="notation:SortingStyle" xmi:id="_7_ItIiNxEeS1ypqXlbG4tA"/>
+              <styles xmi:type="notation:FilteringStyle" xmi:id="_7_ItIyNxEeS1ypqXlbG4tA"/>
+            </children>
+            <styles xmi:type="notation:ShapeStyle" xmi:id="_7_IGESNxEeS1ypqXlbG4tA" fontName="Segoe UI" fontHeight="8"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_7_IGEiNxEeS1ypqXlbG4tA" x="336" y="48"/>
+          </children>
+          <children xmi:type="notation:Node" xmi:id="_8T41ICNxEeS1ypqXlbG4tA" type="2003" element="_8Tsn4CNxEeS1ypqXlbG4tA">
+            <children xmi:type="notation:Node" xmi:id="_8T5cMCNxEeS1ypqXlbG4tA" type="5007"/>
+            <children xmi:type="notation:Node" xmi:id="_8T5cMSNxEeS1ypqXlbG4tA" type="7004">
+              <styles xmi:type="notation:SortingStyle" xmi:id="_8T5cMiNxEeS1ypqXlbG4tA"/>
+              <styles xmi:type="notation:FilteringStyle" xmi:id="_8T5cMyNxEeS1ypqXlbG4tA"/>
+            </children>
+            <styles xmi:type="notation:ShapeStyle" xmi:id="_8T41ISNxEeS1ypqXlbG4tA" fontName="Segoe UI" fontHeight="8"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_8T41IiNxEeS1ypqXlbG4tA" x="547" y="110"/>
+          </children>
+          <children xmi:type="notation:Node" xmi:id="_8rO-ICNxEeS1ypqXlbG4tA" type="2003" element="_8qn6ICNxEeS1ypqXlbG4tA">
+            <children xmi:type="notation:Node" xmi:id="_8rPlMCNxEeS1ypqXlbG4tA" type="5007"/>
+            <children xmi:type="notation:Node" xmi:id="_8rPlMSNxEeS1ypqXlbG4tA" type="7004">
+              <styles xmi:type="notation:SortingStyle" xmi:id="_8rPlMiNxEeS1ypqXlbG4tA"/>
+              <styles xmi:type="notation:FilteringStyle" xmi:id="_8rPlMyNxEeS1ypqXlbG4tA"/>
+            </children>
+            <styles xmi:type="notation:ShapeStyle" xmi:id="_8rO-ISNxEeS1ypqXlbG4tA" fontName="Segoe UI" fontHeight="8"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_8rO-IiNxEeS1ypqXlbG4tA" x="798" y="335"/>
+          </children>
+          <children xmi:type="notation:Node" xmi:id="_9GORACNxEeS1ypqXlbG4tA" type="2003" element="_9F5g4CNxEeS1ypqXlbG4tA">
+            <children xmi:type="notation:Node" xmi:id="_9GO4ECNxEeS1ypqXlbG4tA" type="5007"/>
+            <children xmi:type="notation:Node" xmi:id="_9GO4ESNxEeS1ypqXlbG4tA" type="7004">
+              <styles xmi:type="notation:SortingStyle" xmi:id="_9GO4EiNxEeS1ypqXlbG4tA"/>
+              <styles xmi:type="notation:FilteringStyle" xmi:id="_9GO4EyNxEeS1ypqXlbG4tA"/>
+            </children>
+            <styles xmi:type="notation:ShapeStyle" xmi:id="_9GORASNxEeS1ypqXlbG4tA" fontName="Segoe UI" fontHeight="8" italic="true"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_9GORAiNxEeS1ypqXlbG4tA" x="984" y="12"/>
+          </children>
+          <children xmi:type="notation:Node" xmi:id="_-OlAMCNxEeS1ypqXlbG4tA" type="2003" element="_-OLXkCNxEeS1ypqXlbG4tA">
+            <children xmi:type="notation:Node" xmi:id="_-OlnQCNxEeS1ypqXlbG4tA" type="5007"/>
+            <children xmi:type="notation:Node" xmi:id="_-OlnQSNxEeS1ypqXlbG4tA" type="7004">
+              <children xmi:type="notation:Node" xmi:id="_-OmOUCNxEeS1ypqXlbG4tA" type="3010" element="_-ObPMCNxEeS1ypqXlbG4tA">
+                <layoutConstraint xmi:type="notation:Location" xmi:id="_-OmOUSNxEeS1ypqXlbG4tA"/>
+              </children>
+              <styles xmi:type="notation:SortingStyle" xmi:id="_-OlnQiNxEeS1ypqXlbG4tA"/>
+              <styles xmi:type="notation:FilteringStyle" xmi:id="_-OlnQyNxEeS1ypqXlbG4tA"/>
+            </children>
+            <styles xmi:type="notation:ShapeStyle" xmi:id="_-OlAMSNxEeS1ypqXlbG4tA" fontName="Segoe UI" fontHeight="8" italic="true"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-OlAMiNxEeS1ypqXlbG4tA" x="219" y="397"/>
+          </children>
+          <children xmi:type="notation:Node" xmi:id="_-19wUCNxEeS1ypqXlbG4tA" type="2003" element="_-1aWsCNxEeS1ypqXlbG4tA">
+            <children xmi:type="notation:Node" xmi:id="_-1-XYCNxEeS1ypqXlbG4tA" type="5007"/>
+            <children xmi:type="notation:Node" xmi:id="_-1-XYSNxEeS1ypqXlbG4tA" type="7004">
+              <styles xmi:type="notation:SortingStyle" xmi:id="_-1-XYiNxEeS1ypqXlbG4tA"/>
+              <styles xmi:type="notation:FilteringStyle" xmi:id="_-1-XYyNxEeS1ypqXlbG4tA"/>
+            </children>
+            <styles xmi:type="notation:ShapeStyle" xmi:id="_-19wUSNxEeS1ypqXlbG4tA" fontName="Segoe UI" fontHeight="8" italic="true"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-19wUiNxEeS1ypqXlbG4tA" x="780" y="108"/>
+          </children>
+          <styles xmi:type="notation:DiagramStyle" xmi:id="_6xAGEiNxEeS1ypqXlbG4tA"/>
+          <edges xmi:type="notation:Edge" xmi:id="_9GTJgCNxEeS1ypqXlbG4tA" type="4001" element="_9GJ_kCNxEeS1ypqXlbG4tA" source="_9GORACNxEeS1ypqXlbG4tA" target="_9GORACNxEeS1ypqXlbG4tA">
+            <children xmi:type="notation:Node" xmi:id="_9GU-sCNxEeS1ypqXlbG4tA" type="6001">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_9GU-sSNxEeS1ypqXlbG4tA" y="-10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_9GWM0CNxEeS1ypqXlbG4tA" type="6002">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_9GWM0SNxEeS1ypqXlbG4tA" y="10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_9GXa8CNxEeS1ypqXlbG4tA" type="6003">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_9GXa8SNxEeS1ypqXlbG4tA" y="10"/>
+            </children>
+            <styles xmi:type="notation:ConnectorStyle" xmi:id="_9GTJgSNxEeS1ypqXlbG4tA" routing="Rectilinear" jumpLinkStatus="Above"/>
+            <styles xmi:type="notation:FontStyle" xmi:id="_9GTJgiNxEeS1ypqXlbG4tA" fontColor="7490599" fontName="Segoe UI" fontHeight="8"/>
+            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_9GTJgyNxEeS1ypqXlbG4tA" points="[111, 119, 111, 119]$[111, 119, 111, 119]"/>
+            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_9GldYCNxEeS1ypqXlbG4tA" id="(0.5,0.5)"/>
+            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_9GldYSNxEeS1ypqXlbG4tA" id="(0.5,0.5)"/>
+          </edges>
+          <edges xmi:type="notation:Edge" xmi:id="_-Om1YCNxEeS1ypqXlbG4tA" type="4001" element="_-OgHsCNxEeS1ypqXlbG4tA" source="_8T41ICNxEeS1ypqXlbG4tA" target="_-OlAMCNxEeS1ypqXlbG4tA">
+            <children xmi:type="notation:Node" xmi:id="_-OnccCNxEeS1ypqXlbG4tA" type="6001">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-OnccSNxEeS1ypqXlbG4tA" y="-10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_-OncciNxEeS1ypqXlbG4tA" type="6002">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-OnccyNxEeS1ypqXlbG4tA" y="10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_-OncdCNxEeS1ypqXlbG4tA" type="6003">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-OncdSNxEeS1ypqXlbG4tA" y="10"/>
+            </children>
+            <styles xmi:type="notation:ConnectorStyle" xmi:id="_-Om1YSNxEeS1ypqXlbG4tA" routing="Tree"/>
+            <styles xmi:type="notation:FontStyle" xmi:id="_-Om1YiNxEeS1ypqXlbG4tA" fontName="Segoe UI" fontHeight="8"/>
+            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_-Om1YyNxEeS1ypqXlbG4tA" points="[547, 110, 547, 110]$[219, 397, 219, 397]"/>
+            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_-OrG0CNxEeS1ypqXlbG4tA" id="(0.5,0.5)"/>
+            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_-OrG0SNxEeS1ypqXlbG4tA" id="(0.5,0.5)"/>
+          </edges>
+          <edges xmi:type="notation:Edge" xmi:id="_-OrG0iNxEeS1ypqXlbG4tA" type="4001" element="_-Oh84CNxEeS1ypqXlbG4tA" source="_-OlAMCNxEeS1ypqXlbG4tA" target="_9GORACNxEeS1ypqXlbG4tA">
+            <children xmi:type="notation:Node" xmi:id="_-Ort4CNxEeS1ypqXlbG4tA" type="6001">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-Ort4SNxEeS1ypqXlbG4tA" y="-10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_-Ort4iNxEeS1ypqXlbG4tA" type="6002">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-Ort4yNxEeS1ypqXlbG4tA" y="10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_-OsU8CNxEeS1ypqXlbG4tA" type="6003">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-OsU8SNxEeS1ypqXlbG4tA" y="10"/>
+            </children>
+            <styles xmi:type="notation:ConnectorStyle" xmi:id="_-OrG0yNxEeS1ypqXlbG4tA" routing="Tree"/>
+            <styles xmi:type="notation:FontStyle" xmi:id="_-OrG1CNxEeS1ypqXlbG4tA" fontName="Segoe UI" fontHeight="8"/>
+            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_-OrG1SNxEeS1ypqXlbG4tA" points="[219, 397, 219, 397]$[111, 119, 111, 119]"/>
+            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_-OsU8iNxEeS1ypqXlbG4tA" id="(0.5,0.5)"/>
+            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_-OsU8yNxEeS1ypqXlbG4tA" id="(0.5,0.5)"/>
+          </edges>
+          <edges xmi:type="notation:Edge" xmi:id="_-1--cCNxEeS1ypqXlbG4tA" type="4001" element="_-12bkCNxEeS1ypqXlbG4tA" source="_-19wUCNxEeS1ypqXlbG4tA" target="_9GORACNxEeS1ypqXlbG4tA">
+            <children xmi:type="notation:Node" xmi:id="_-1_lgCNxEeS1ypqXlbG4tA" type="6001">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-1_lgSNxEeS1ypqXlbG4tA" y="-10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_-1_lgiNxEeS1ypqXlbG4tA" type="6002">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-1_lgyNxEeS1ypqXlbG4tA" y="10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_-1_lhCNxEeS1ypqXlbG4tA" type="6003">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-1_lhSNxEeS1ypqXlbG4tA" y="10"/>
+            </children>
+            <styles xmi:type="notation:ConnectorStyle" xmi:id="_-1--cSNxEeS1ypqXlbG4tA" routing="Rectilinear" jumpLinkStatus="Above"/>
+            <styles xmi:type="notation:FontStyle" xmi:id="_-1--ciNxEeS1ypqXlbG4tA" fontColor="7490599" fontName="Segoe UI" fontHeight="8"/>
+            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_-1--cyNxEeS1ypqXlbG4tA" points="[622, 454, 622, 454]$[111, 119, 111, 119]"/>
+            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_-2AMkCNxEeS1ypqXlbG4tA" id="(0.5,0.5)"/>
+            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_-2AMkSNxEeS1ypqXlbG4tA" id="(0.5,0.5)"/>
+          </edges>
+          <edges xmi:type="notation:Edge" xmi:id="_-2AMkiNxEeS1ypqXlbG4tA" type="4001" element="_-16F8CNxEeS1ypqXlbG4tA" source="_-19wUCNxEeS1ypqXlbG4tA" target="_9GORACNxEeS1ypqXlbG4tA">
+            <children xmi:type="notation:Node" xmi:id="_-2AzoCNxEeS1ypqXlbG4tA" type="6001">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-2AzoSNxEeS1ypqXlbG4tA" y="-10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_-2AzoiNxEeS1ypqXlbG4tA" type="6002">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-2AzoyNxEeS1ypqXlbG4tA" y="10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_-2AzpCNxEeS1ypqXlbG4tA" type="6003">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_-2AzpSNxEeS1ypqXlbG4tA" y="10"/>
+            </children>
+            <styles xmi:type="notation:ConnectorStyle" xmi:id="_-2AMkyNxEeS1ypqXlbG4tA" routing="Tree"/>
+            <styles xmi:type="notation:FontStyle" xmi:id="_-2AMlCNxEeS1ypqXlbG4tA" fontName="Segoe UI" fontHeight="8"/>
+            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_-2AMlSNxEeS1ypqXlbG4tA" points="[622, 454, 622, 454]$[111, 119, 111, 119]"/>
+            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_-2AzpiNxEeS1ypqXlbG4tA" id="(0.5,0.5)"/>
+            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_-2BasCNxEeS1ypqXlbG4tA" id="(0.5,0.5)"/>
+          </edges>
+        </data>
+      </ownedAnnotationEntries>
+      <ownedAnnotationEntries xmi:type="description_1:AnnotationEntry" xmi:id="_7j47kCNxEeS1ypqXlbG4tA" source="DANNOTATION_CUSTOMIZATION_KEY">
+        <data xmi:type="diagram:ComputedStyleDescriptionRegistry" xmi:id="_7j5ioCNxEeS1ypqXlbG4tA">
+          <computedStyleDescriptions xmi:type="style:BundledImageDescription" xmi:id="_7j5ipCNxEeS1ypqXlbG4tA" labelFormat="bold" labelExpression="service:render" labelAlignment="LEFT" tooltipExpression="service:renderTooltip" sizeComputationExpression="1">
+            <borderColor xmi:type="description_1:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            <labelColor xmi:type="description_1:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            <color xmi:type="description_1:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+          </computedStyleDescriptions>
+          <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="_-13CoyNxEeS1ypqXlbG4tA" sourceArrow="FillDiamond" sizeComputationExpression="1" routingStyle="manhattan">
+            <strokeColor xmi:type="description_1:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            <centerLabelStyleDescription xmi:type="style:CenterLabelStyleDescription" xmi:id="_-13CpCNxEeS1ypqXlbG4tA" showIcon="false" labelExpression="service:render">
+              <labelColor xmi:type="description_1:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            </centerLabelStyleDescription>
+            <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="_-13CpSNxEeS1ypqXlbG4tA" labelSize="6" showIcon="false" labelExpression="service:eKeysLabel">
+              <labelColor xmi:type="description_1:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='dark_blue']"/>
+            </endLabelStyleDescription>
+          </computedStyleDescriptions>
+          <cache xmi:type="diagram:DiagramElementMapping2ModelElement" xmi:id="_7j5ioSNxEeS1ypqXlbG4tA">
+            <key xmi:type="description_2:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']"/>
+            <value xmi:type="diagram:ModelElement2ViewVariable" xmi:id="_7j5ioiNxEeS1ypqXlbG4tA">
+              <key xmi:type="ecore:EAttribute" href="model.ecore#//Module/namespace"/>
+              <value xmi:type="diagram:ViewVariable2ContainerVariable" xmi:id="_7j5ioyNxEeS1ypqXlbG4tA" key="_7j3tcCNxEeS1ypqXlbG4tA">
+                <value xmi:type="diagram:ContainerVariable2StyleDescription" xmi:id="_7j5ipSNxEeS1ypqXlbG4tA" value="_7j5ipCNxEeS1ypqXlbG4tA">
+                  <key xmi:type="ecore:EClass" href="model.ecore#//Module"/>
+                </value>
+              </value>
+            </value>
+          </cache>
+          <cache xmi:type="diagram:DiagramElementMapping2ModelElement" xmi:id="_-13CoCNxEeS1ypqXlbG4tA">
+            <key xmi:type="description_2:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
+            <value xmi:type="diagram:ModelElement2ViewVariable" xmi:id="_-13CoSNxEeS1ypqXlbG4tA">
+              <key xmi:type="ecore:EReference" href="model.ecore#//ContainingNode/children"/>
+              <value xmi:type="diagram:ViewVariable2ContainerVariable" xmi:id="_-13CoiNxEeS1ypqXlbG4tA" key="_-12bkCNxEeS1ypqXlbG4tA">
+                <value xmi:type="diagram:ContainerVariable2StyleDescription" xmi:id="_-13psCNxEeS1ypqXlbG4tA" value="_-13CoyNxEeS1ypqXlbG4tA">
+                  <key xmi:type="ecore:EPackage" href="model.ecore#/"/>
+                </value>
+              </value>
+            </value>
+          </cache>
+        </data>
+      </ownedAnnotationEntries>
+      <ownedDiagramElements xmi:type="diagram:DNodeList" xmi:id="_7jiWQCNxEeS1ypqXlbG4tA" name="Module" tooltipText="" width="12" height="10">
+        <target xmi:type="ecore:EClass" href="model.ecore#//Module"/>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Module"/>
+        <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+        <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+        <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+        <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_7jkygCNxEeS1ypqXlbG4tA" backgroundStyle="Liquid">
+          <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_7jkygSNxEeS1ypqXlbG4tA"/>
+          <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/>
+          <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_7jkygiNxEeS1ypqXlbG4tA"/>
+          <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_7jkygyNxEeS1ypqXlbG4tA" red="255" green="255" blue="255"/>
+          <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_7jkyhCNxEeS1ypqXlbG4tA" red="255" green="252" blue="216"/>
+        </ownedStyle>
+        <actualMapping xmi:type="description_2:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
+        <ownedElements xmi:type="diagram:DNodeListElement" xmi:id="_7j3tcCNxEeS1ypqXlbG4tA" name="namespace : EString" tooltipText="">
+          <target xmi:type="ecore:EAttribute" href="model.ecore#//Module/namespace"/>
+          <semanticElements xmi:type="ecore:EAttribute" href="model.ecore#//Module/namespace"/>
+          <ownedStyle xmi:type="diagram:BundledImage" xmi:id="_7j7X0CNxEeS1ypqXlbG4tA" labelFormat="bold" labelAlignment="LEFT" description="_7j5ipCNxEeS1ypqXlbG4tA">
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_7j7X0SNxEeS1ypqXlbG4tA"/>
+            <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_7j7X0iNxEeS1ypqXlbG4tA"/>
+            <color xmi:type="viewpoint:RGBValues" xmi:id="_7j7X0yNxEeS1ypqXlbG4tA"/>
+          </ownedStyle>
+          <actualMapping xmi:type="description_2:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']"/>
+        </ownedElements>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DNodeList" xmi:id="_7-xgwCNxEeS1ypqXlbG4tA" name="Grouping" tooltipText="" width="12" height="10">
+        <target xmi:type="ecore:EClass" href="model.ecore#//Grouping"/>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Grouping"/>
+        <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+        <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+        <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+        <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_7-yH0CNxEeS1ypqXlbG4tA" backgroundStyle="Liquid">
+          <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_7-yH0SNxEeS1ypqXlbG4tA"/>
+          <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/>
+          <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_7-yH0iNxEeS1ypqXlbG4tA"/>
+          <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_7-yH0yNxEeS1ypqXlbG4tA" red="255" green="255" blue="255"/>
+          <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_7-yH1CNxEeS1ypqXlbG4tA" red="255" green="252" blue="216"/>
+        </ownedStyle>
+        <actualMapping xmi:type="description_2:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DNodeList" xmi:id="_8Tsn4CNxEeS1ypqXlbG4tA" name="Leaf" tooltipText="" outgoingEdges="_-OgHsCNxEeS1ypqXlbG4tA" width="12" height="10">
+        <target xmi:type="ecore:EClass" href="model.ecore#//Leaf"/>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Leaf"/>
+        <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_8TtO8CNxEeS1ypqXlbG4tA" backgroundStyle="Liquid">
+          <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_8TtO8SNxEeS1ypqXlbG4tA"/>
+          <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/>
+          <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_8TtO8iNxEeS1ypqXlbG4tA"/>
+          <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_8TtO8yNxEeS1ypqXlbG4tA" red="255" green="255" blue="255"/>
+          <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_8TtO9CNxEeS1ypqXlbG4tA" red="255" green="252" blue="216"/>
+        </ownedStyle>
+        <actualMapping xmi:type="description_2:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DNodeList" xmi:id="_8qn6ICNxEeS1ypqXlbG4tA" name="Container" tooltipText="" width="12" height="10">
+        <target xmi:type="ecore:EClass" href="model.ecore#//Container"/>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Container"/>
+        <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_8q7cICNxEeS1ypqXlbG4tA" backgroundStyle="Liquid">
+          <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_8q7cISNxEeS1ypqXlbG4tA"/>
+          <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/>
+          <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_8q7cIiNxEeS1ypqXlbG4tA"/>
+          <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_8q7cIyNxEeS1ypqXlbG4tA" red="255" green="255" blue="255"/>
+          <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_8q7cJCNxEeS1ypqXlbG4tA" red="255" green="252" blue="216"/>
+        </ownedStyle>
+        <actualMapping xmi:type="description_2:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DNodeList" xmi:id="_9F5g4CNxEeS1ypqXlbG4tA" name="Node" tooltipText="" outgoingEdges="_9GJ_kCNxEeS1ypqXlbG4tA" incomingEdges="_9GJ_kCNxEeS1ypqXlbG4tA _-Oh84CNxEeS1ypqXlbG4tA _-12bkCNxEeS1ypqXlbG4tA _-16F8CNxEeS1ypqXlbG4tA" width="12" height="10">
+        <target xmi:type="ecore:EClass" href="model.ecore#//Node"/>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//Node"/>
+        <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+        <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+        <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+        <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_9F6vACNxEeS1ypqXlbG4tA" labelFormat="italic" iconPath="/org.eclipse.emf.ecoretools.design/icons/full/obj16/EClass_interface.gif" backgroundStyle="Liquid">
+          <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_9F6vASNxEeS1ypqXlbG4tA"/>
+          <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@conditionnalStyles.0/@style"/>
+          <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_9F6vAiNxEeS1ypqXlbG4tA" red="125" green="125" blue="125"/>
+          <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_9F6vAyNxEeS1ypqXlbG4tA" red="255" green="255" blue="255"/>
+          <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_9F6vBCNxEeS1ypqXlbG4tA" red="228" green="228" blue="228"/>
+        </ownedStyle>
+        <actualMapping xmi:type="description_2:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_9GJ_kCNxEeS1ypqXlbG4tA" name="[0..1] parent" sourceNode="_9F5g4CNxEeS1ypqXlbG4tA" targetNode="_9F5g4CNxEeS1ypqXlbG4tA">
+        <target xmi:type="ecore:EReference" href="model.ecore#//Node/parent"/>
+        <semanticElements xmi:type="ecore:EReference" href="model.ecore#//Node/parent"/>
+        <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_9GL0wCNxEeS1ypqXlbG4tA" routingStyle="manhattan">
+          <description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']/@style"/>
+          <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_9GL0wSNxEeS1ypqXlbG4tA"/>
+          <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_9GL0wiNxEeS1ypqXlbG4tA" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_9GL0wyNxEeS1ypqXlbG4tA"/>
+          </centerLabelStyle>
+          <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_9GL0xCNxEeS1ypqXlbG4tA" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_9GL0xSNxEeS1ypqXlbG4tA" red="39" green="76" blue="114"/>
+          </endLabelStyle>
+        </ownedStyle>
+        <actualMapping xmi:type="description_2:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DNodeList" xmi:id="_-OLXkCNxEeS1ypqXlbG4tA" name="NamedNode" tooltipText="" outgoingEdges="_-Oh84CNxEeS1ypqXlbG4tA" incomingEdges="_-OgHsCNxEeS1ypqXlbG4tA" width="12" height="10">
+        <target xmi:type="ecore:EClass" href="model.ecore#//NamedNode"/>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//NamedNode"/>
+        <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_-ONMwCNxEeS1ypqXlbG4tA" labelFormat="italic" iconPath="/org.eclipse.emf.ecoretools.design/icons/full/obj16/EClass_interface.gif" backgroundStyle="Liquid">
+          <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_-ONMwSNxEeS1ypqXlbG4tA"/>
+          <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@conditionnalStyles.0/@style"/>
+          <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_-ONMwiNxEeS1ypqXlbG4tA" red="125" green="125" blue="125"/>
+          <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_-ONMwyNxEeS1ypqXlbG4tA" red="255" green="255" blue="255"/>
+          <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_-ONMxCNxEeS1ypqXlbG4tA" red="228" green="228" blue="228"/>
+        </ownedStyle>
+        <actualMapping xmi:type="description_2:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
+        <ownedElements xmi:type="diagram:DNodeListElement" xmi:id="_-ObPMCNxEeS1ypqXlbG4tA" name="name : EString" tooltipText="">
+          <target xmi:type="ecore:EAttribute" href="model.ecore#//NamedNode/name"/>
+          <semanticElements xmi:type="ecore:EAttribute" href="model.ecore#//NamedNode/name"/>
+          <ownedStyle xmi:type="diagram:BundledImage" xmi:id="_-Ob2QCNxEeS1ypqXlbG4tA" labelAlignment="LEFT">
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_-Ob2QSNxEeS1ypqXlbG4tA"/>
+            <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']/@style"/>
+            <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_-Ob2QiNxEeS1ypqXlbG4tA"/>
+            <color xmi:type="viewpoint:RGBValues" xmi:id="_-Ob2QyNxEeS1ypqXlbG4tA"/>
+          </ownedStyle>
+          <actualMapping xmi:type="description_2:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']"/>
+        </ownedElements>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_-OgHsCNxEeS1ypqXlbG4tA" sourceNode="_8Tsn4CNxEeS1ypqXlbG4tA" targetNode="_-OLXkCNxEeS1ypqXlbG4tA">
+        <target xmi:type="ecore:EClass" href="model.ecore#//Leaf"/>
+        <semanticElements xmi:type="ecore:EGenericType" href="model.ecore#//Leaf/@eGenericSuperTypes.0"/>
+        <semanticElements xmi:type="ecore:EGenericType" href="model.ecore#//Leaf/@eGenericSuperTypes.1"/>
+        <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_-OguwCNxEeS1ypqXlbG4tA" lineStyle="dash" targetArrow="InputClosedArrow" routingStyle="tree">
+          <description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']/@conditionnalStyles.0/@style"/>
+          <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_-OguwSNxEeS1ypqXlbG4tA" red="136" green="136" blue="136"/>
+          <beginLabelStyle xmi:type="diagram:BeginLabelStyle" xmi:id="_-OguwiNxEeS1ypqXlbG4tA" labelFormat="italic" showIcon="false">
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_-OguwyNxEeS1ypqXlbG4tA"/>
+          </beginLabelStyle>
+          <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_-OguxCNxEeS1ypqXlbG4tA" showIcon="false">
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_-OguxSNxEeS1ypqXlbG4tA"/>
+          </centerLabelStyle>
+        </ownedStyle>
+        <actualMapping xmi:type="description_2:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_-Oh84CNxEeS1ypqXlbG4tA" sourceNode="_-OLXkCNxEeS1ypqXlbG4tA" targetNode="_9F5g4CNxEeS1ypqXlbG4tA">
+        <target xmi:type="ecore:EClass" href="model.ecore#//NamedNode"/>
+        <semanticElements xmi:type="ecore:EGenericType" href="model.ecore#//NamedNode/@eGenericSuperTypes.0"/>
+        <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_-Oij8CNxEeS1ypqXlbG4tA" lineStyle="dash" targetArrow="InputClosedArrow" routingStyle="tree">
+          <description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']/@conditionnalStyles.0/@style"/>
+          <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_-Oij8SNxEeS1ypqXlbG4tA" red="136" green="136" blue="136"/>
+          <beginLabelStyle xmi:type="diagram:BeginLabelStyle" xmi:id="_-Oij8iNxEeS1ypqXlbG4tA" labelFormat="italic" showIcon="false">
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_-Oij8yNxEeS1ypqXlbG4tA"/>
+          </beginLabelStyle>
+          <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_-Oij9CNxEeS1ypqXlbG4tA" showIcon="false">
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_-Oij9SNxEeS1ypqXlbG4tA"/>
+          </centerLabelStyle>
+        </ownedStyle>
+        <actualMapping xmi:type="description_2:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DNodeList" xmi:id="_-1aWsCNxEeS1ypqXlbG4tA" name="ContainingNode" tooltipText="" outgoingEdges="_-12bkCNxEeS1ypqXlbG4tA _-16F8CNxEeS1ypqXlbG4tA" width="12" height="10">
+        <target xmi:type="ecore:EClass" href="model.ecore#//ContainingNode"/>
+        <semanticElements xmi:type="ecore:EClass" href="model.ecore#//ContainingNode"/>
+        <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+        <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+        <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+        <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_-1bk0CNxEeS1ypqXlbG4tA" labelFormat="italic" iconPath="/org.eclipse.emf.ecoretools.design/icons/full/obj16/EClass_interface.gif" backgroundStyle="Liquid">
+          <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_-1bk0SNxEeS1ypqXlbG4tA"/>
+          <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@conditionnalStyles.0/@style"/>
+          <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_-1bk0iNxEeS1ypqXlbG4tA" red="125" green="125" blue="125"/>
+          <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_-1bk0yNxEeS1ypqXlbG4tA" red="255" green="255" blue="255"/>
+          <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_-1bk1CNxEeS1ypqXlbG4tA" red="228" green="228" blue="228"/>
+        </ownedStyle>
+        <actualMapping xmi:type="description_2:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_-12bkCNxEeS1ypqXlbG4tA" name="[0..*] children" sourceNode="_-1aWsCNxEeS1ypqXlbG4tA" targetNode="_9F5g4CNxEeS1ypqXlbG4tA">
+        <target xmi:type="ecore:EReference" href="model.ecore#//ContainingNode/children"/>
+        <semanticElements xmi:type="ecore:EReference" href="model.ecore#//ContainingNode/children"/>
+        <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_-13psSNxEeS1ypqXlbG4tA" description="_-13CoyNxEeS1ypqXlbG4tA" sourceArrow="FillDiamond" routingStyle="manhattan">
+          <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_-13psiNxEeS1ypqXlbG4tA"/>
+          <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_-13psyNxEeS1ypqXlbG4tA" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_-13ptCNxEeS1ypqXlbG4tA"/>
+          </centerLabelStyle>
+          <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_-13ptSNxEeS1ypqXlbG4tA" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_-13ptiNxEeS1ypqXlbG4tA" red="39" green="76" blue="114"/>
+          </endLabelStyle>
+        </ownedStyle>
+        <actualMapping xmi:type="description_2:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_-16F8CNxEeS1ypqXlbG4tA" sourceNode="_-1aWsCNxEeS1ypqXlbG4tA" targetNode="_9F5g4CNxEeS1ypqXlbG4tA">
+        <target xmi:type="ecore:EClass" href="model.ecore#//ContainingNode"/>
+        <semanticElements xmi:type="ecore:EGenericType" href="model.ecore#//ContainingNode/@eGenericSuperTypes.0"/>
+        <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_-16tACNxEeS1ypqXlbG4tA" lineStyle="dash" targetArrow="InputClosedArrow" routingStyle="tree">
+          <description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']/@conditionnalStyles.0/@style"/>
+          <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_-16tASNxEeS1ypqXlbG4tA" red="136" green="136" blue="136"/>
+          <beginLabelStyle xmi:type="diagram:BeginLabelStyle" xmi:id="_-16tAiNxEeS1ypqXlbG4tA" labelFormat="italic" showIcon="false">
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_-16tAyNxEeS1ypqXlbG4tA"/>
+          </beginLabelStyle>
+          <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_-16tBCNxEeS1ypqXlbG4tA" showIcon="false">
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_-16tBSNxEeS1ypqXlbG4tA"/>
+          </centerLabelStyle>
+        </ownedStyle>
+        <actualMapping xmi:type="description_2:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/>
+      </ownedDiagramElements>
+      <description xmi:type="description_2:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/>
+      <filterVariableHistory xmi:type="diagram:FilterVariableHistory" xmi:id="_6wvAVSNxEeS1ypqXlbG4tA"/>
+      <activatedLayers xmi:type="description_2:Layer" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer"/>
+      <activatedLayers xmi:type="description_2:AdditionalLayer" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@additionalLayers[name='Package']"/>
+      <activatedLayers xmi:type="description_2:AdditionalLayer" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@additionalLayers[name='Validation']"/>
+      <activatedLayers xmi:type="description_2:AdditionalLayer" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Archetype']/@ownedRepresentationExtensions[name='Entities%20With%20Archetypes']/@layers[name='Archetypes']"/>
+      <target xmi:type="ecore:EPackage" href="model.ecore#/"/>
+    </ownedRepresentations>
+    <viewpoint xmi:type="description_1:Viewpoint" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']"/>
+  </ownedViews>
+  <ownedViews xmi:type="viewpoint:DRepresentationContainer" xmi:id="_R9nMECNxEeS1ypqXlbG4tA" initialized="true">
+    <viewpoint xmi:type="description_1:Viewpoint" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Review']"/>
+  </ownedViews>
+  <ownedViews xmi:type="viewpoint:DRepresentationContainer" xmi:id="_R-UWsCNxEeS1ypqXlbG4tA" initialized="true">
+    <viewpoint xmi:type="description_1:Viewpoint" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Archetype']"/>
+  </ownedViews>
+  <ownedViews xmi:type="viewpoint:DRepresentationContainer" xmi:id="_SG8HMCNxEeS1ypqXlbG4tA" initialized="true">
+    <viewpoint xmi:type="description_1:Viewpoint" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Generation']"/>
+  </ownedViews>
+</viewpoint:DAnalysis>
diff --git a/plugins/com.cisco.yangide.ext.model/model/model.ecore b/plugins/com.cisco.yangide.ext.model/model/model.ecore
new file mode 100644 (file)
index 0000000..e2c0a3c
--- /dev/null
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="model" nsURI="http://www.example.org/model" nsPrefix="model">
+  <eClassifiers xsi:type="ecore:EClass" name="Module" eSuperTypes="#//NamedContainingNode #//TaggedNode">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="namespace" lowerBound="1"
+        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="revisions" upperBound="-1"
+        eType="#//Revision" containment="true"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Grouping" eSuperTypes="#//NamedContainingNode #//TaggedNode"/>
+  <eClassifiers xsi:type="ecore:EClass" name="Leaf" eSuperTypes="#//NamedNode #//TaggedNode #//TypedNode"/>
+  <eClassifiers xsi:type="ecore:EClass" name="Container" eSuperTypes="#//NamedContainingNode #//TaggedNode"/>
+  <eClassifiers xsi:type="ecore:EClass" name="Node" abstract="true" interface="true">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="parent" eType="#//Node"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="NamedNode" abstract="true" interface="true"
+      eSuperTypes="#//Node">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="ContainingNode" abstract="true" interface="true"
+      eSuperTypes="#//Node">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="children" upperBound="-1"
+        eType="#//Node" containment="true"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="NamedContainingNode" abstract="true"
+      interface="true" eSuperTypes="#//NamedNode #//ContainingNode"/>
+  <eClassifiers xsi:type="ecore:EClass" name="Submodule" eSuperTypes="#//Module">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="belongsTo" lowerBound="1"
+        eType="#//BelongsTo"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Typedef" eSuperTypes="#//NamedNode #//TaggedNode #//TypedNode"/>
+  <eClassifiers xsi:type="ecore:EClass" name="Choice" eSuperTypes="#//NamedContainingNode #//TaggedNode"/>
+  <eClassifiers xsi:type="ecore:EClass" name="LeafList" eSuperTypes="#//NamedNode #//TaggedNode #//TypedNode"/>
+  <eClassifiers xsi:type="ecore:EClass" name="Anyxml" eSuperTypes="#//NamedNode #//TaggedNode"/>
+  <eClassifiers xsi:type="ecore:EClass" name="Import" eSuperTypes="#//Node">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="prefix" lowerBound="1"
+        eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="revisionDate" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="module" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Include" eSuperTypes="#//Node">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="submodule" lowerBound="1"
+        eType="#//Submodule" containment="true"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Revision" eSuperTypes="#//TaggedNode #//NamedNode"/>
+  <eClassifiers xsi:type="ecore:EClass" name="BelongsTo">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="ownerModule" lowerBound="1"
+        eType="#//Module"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="List" eSuperTypes="#//NamedContainingNode #//TaggedNode"/>
+  <eClassifiers xsi:type="ecore:EClass" name="Tag">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaObject"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="TaggedNode" abstract="true" interface="true">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="tags" upperBound="-1" eType="#//Tag"
+        containment="true"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Uses" eSuperTypes="#//Node">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="qName" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Rpc" eSuperTypes="#//NamedContainingNode #//TaggedNode"/>
+  <eClassifiers xsi:type="ecore:EClass" name="RpcIO" eSuperTypes="#//ContainingNode">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="input" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//Boolean"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Notification" eSuperTypes="#//NamedContainingNode"/>
+  <eClassifiers xsi:type="ecore:EClass" name="Augment" eSuperTypes="#//NamedContainingNode"/>
+  <eClassifiers xsi:type="ecore:EClass" name="Extension" eSuperTypes="#//NamedNode"/>
+  <eClassifiers xsi:type="ecore:EClass" name="Feature" eSuperTypes="#//NamedNode"/>
+  <eClassifiers xsi:type="ecore:EClass" name="Deviation" eSuperTypes="#//NamedNode"/>
+  <eClassifiers xsi:type="ecore:EClass" name="Identity" eSuperTypes="#//NamedNode #//ReferenceNode"/>
+  <eClassifiers xsi:type="ecore:EClass" name="TypedNode" abstract="true" interface="true">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="type" eType="#//Typeref"
+        containment="true"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="ChoiceCase" eSuperTypes="#//NamedContainingNode #//TaggedNode"/>
+  <eClassifiers xsi:type="ecore:EClass" name="ListKey" eSuperTypes="#//NamedNode"/>
+  <eClassifiers xsi:type="ecore:EClass" name="Typeref" eSuperTypes="#//NamedNode"/>
+  <eClassifiers xsi:type="ecore:EClass" name="ReferenceNode" abstract="true" interface="true">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="reference" eType="ecore:EDataType http://www.eclipse.org/emf/2003/XMLType#//String"/>
+  </eClassifiers>
+</ecore:EPackage>
diff --git a/plugins/com.cisco.yangide.ext.model/model/model.genmodel b/plugins/com.cisco.yangide.ext.model/model/model.genmodel
new file mode 100644 (file)
index 0000000..4d2ff49
--- /dev/null
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<genmodel:GenModel xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
+    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText="Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.&#xA;&#xA;This program and the accompanying materials are made available under the&#xA;terms of the Eclipse Public License v1.0 which accompanies this distribution,&#xA;and is available at http://www.eclipse.org/legal/epl-v10.html"
+    modelDirectory="/com.cisco.yangide.ext.model/src" modelPluginID="com.cisco.yangide.ext.model"
+    modelName="Model" rootExtendsClass="org.eclipse.emf.ecore.impl.MinimalEObjectImpl$Container"
+    importerID="org.eclipse.emf.importer.ecore" complianceLevel="7.0" copyrightFields="false"
+    runtimeVersion="2.10" operationReflection="true" importOrganizing="true">
+  <foreignModel>model.ecore</foreignModel>
+  <genPackages prefix="Model" basePackage="com.cisco.yangide.ext" disposableProviderFactory="true"
+      ecorePackage="model.ecore#/">
+    <genClasses ecoreClass="model.ecore#//Module">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute model.ecore#//Module/namespace"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference model.ecore#//Module/revisions"/>
+    </genClasses>
+    <genClasses ecoreClass="model.ecore#//Grouping"/>
+    <genClasses ecoreClass="model.ecore#//Leaf"/>
+    <genClasses ecoreClass="model.ecore#//Container"/>
+    <genClasses image="false" ecoreClass="model.ecore#//Node">
+      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference model.ecore#//Node/parent"/>
+    </genClasses>
+    <genClasses image="false" ecoreClass="model.ecore#//NamedNode">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute model.ecore#//NamedNode/name"/>
+    </genClasses>
+    <genClasses image="false" ecoreClass="model.ecore#//ContainingNode">
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference model.ecore#//ContainingNode/children"/>
+    </genClasses>
+    <genClasses image="false" ecoreClass="model.ecore#//NamedContainingNode"/>
+    <genClasses ecoreClass="model.ecore#//Submodule">
+      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference model.ecore#//Submodule/belongsTo"/>
+    </genClasses>
+    <genClasses ecoreClass="model.ecore#//Typedef"/>
+    <genClasses ecoreClass="model.ecore#//Choice"/>
+    <genClasses ecoreClass="model.ecore#//LeafList"/>
+    <genClasses ecoreClass="model.ecore#//Anyxml"/>
+    <genClasses ecoreClass="model.ecore#//Import">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute model.ecore#//Import/prefix"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute model.ecore#//Import/revisionDate"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EAttribute model.ecore#//Import/module"/>
+    </genClasses>
+    <genClasses ecoreClass="model.ecore#//Include">
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference model.ecore#//Include/submodule"/>
+    </genClasses>
+    <genClasses ecoreClass="model.ecore#//Revision"/>
+    <genClasses ecoreClass="model.ecore#//BelongsTo">
+      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference model.ecore#//BelongsTo/ownerModule"/>
+    </genClasses>
+    <genClasses ecoreClass="model.ecore#//List"/>
+    <genClasses ecoreClass="model.ecore#//Tag">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute model.ecore#//Tag/name"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute model.ecore#//Tag/value"/>
+    </genClasses>
+    <genClasses image="false" ecoreClass="model.ecore#//TaggedNode">
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference model.ecore#//TaggedNode/tags"/>
+    </genClasses>
+    <genClasses ecoreClass="model.ecore#//Uses">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute model.ecore#//Uses/qName"/>
+    </genClasses>
+    <genClasses ecoreClass="model.ecore#//Rpc"/>
+    <genClasses ecoreClass="model.ecore#//RpcIO">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute model.ecore#//RpcIO/input"/>
+    </genClasses>
+    <genClasses ecoreClass="model.ecore#//Notification"/>
+    <genClasses ecoreClass="model.ecore#//Augment"/>
+    <genClasses ecoreClass="model.ecore#//Extension"/>
+    <genClasses ecoreClass="model.ecore#//Feature"/>
+    <genClasses ecoreClass="model.ecore#//Deviation"/>
+    <genClasses ecoreClass="model.ecore#//Identity"/>
+    <genClasses image="false" ecoreClass="model.ecore#//TypedNode">
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference model.ecore#//TypedNode/type"/>
+    </genClasses>
+    <genClasses ecoreClass="model.ecore#//ChoiceCase"/>
+    <genClasses ecoreClass="model.ecore#//ListKey"/>
+    <genClasses ecoreClass="model.ecore#//Typeref"/>
+    <genClasses image="false" ecoreClass="model.ecore#//ReferenceNode">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute model.ecore#//ReferenceNode/reference"/>
+    </genClasses>
+  </genPackages>
+</genmodel:GenModel>
diff --git a/plugins/com.cisco.yangide.ext.model/model/model.notation b/plugins/com.cisco.yangide.ext.model/model/model.notation
new file mode 100644 (file)
index 0000000..9d29fd9
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<notation:Diagram xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.2/notation" xmlns:style="http://www.eclipse.org/papyrus/infra/viewpoints/policy/style" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_mxwg0B0YEeSXAKE9TNWEuA" type="PapyrusUMLClassDiagram" name="NewDiagram" measurementUnit="Pixel">
+  <styles xmi:type="notation:StringValueStyle" xmi:id="_mxxH4B0YEeSXAKE9TNWEuA" name="diagram_compatibility_version" stringValue="1.0.0"/>
+  <styles xmi:type="notation:DiagramStyle" xmi:id="_mxxH4R0YEeSXAKE9TNWEuA"/>
+  <styles xmi:type="style:PapyrusViewStyle" xmi:id="_mxxH4h0YEeSXAKE9TNWEuA">
+    <owner xmi:type="uml:Model" href="model.uml#_mwNBoB0YEeSXAKE9TNWEuA"/>
+  </styles>
+  <element xmi:type="uml:Model" href="model.uml#_mwNBoB0YEeSXAKE9TNWEuA"/>
+</notation:Diagram>
diff --git a/plugins/com.cisco.yangide.ext.model/plugin.properties b/plugins/com.cisco.yangide.ext.model/plugin.properties
new file mode 100644 (file)
index 0000000..e041e4c
--- /dev/null
@@ -0,0 +1,12 @@
+###############################################################################
+# Copyright (c) 2014, 2015 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
+#  
+###############################################################################
+#
+
+pluginName = Model Model
+providerName = www.example.org
diff --git a/plugins/com.cisco.yangide.ext.model/plugin.xml b/plugins/com.cisco.yangide.ext.model/plugin.xml
new file mode 100644 (file)
index 0000000..00df42a
--- /dev/null
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<!--
+    Copyright (c) 2014, 2015 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
+     
+ -->
+
+<plugin>
+
+   <extension point="org.eclipse.emf.ecore.generated_package">
+      <!-- @generated model -->
+      <package
+            uri="http://www.example.org/model"
+            class="com.cisco.yangide.ext.model.ModelPackage"
+            genModel="model/model.genmodel"/>
+   </extension>
+
+</plugin>
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.ext.model/pom.xml b/plugins/com.cisco.yangide.ext.model/pom.xml
new file mode 100644 (file)
index 0000000..425045c
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2014, 2015 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
+     
+ -->
+<!-- ============================================================================== -->
+<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">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>com.cisco.yangide</groupId>
+    <artifactId>com.cisco.yangide.parent</artifactId>
+    <version>1.1.1-SNAPSHOT</version>
+    <relativePath>../..</relativePath>
+  </parent>
+
+  <artifactId>com.cisco.yangide.ext.model</artifactId>
+  <packaging>eclipse-plugin</packaging>
+  <build>
+    <sourceDirectory>src</sourceDirectory>
+  </build>
+</project>
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Anyxml.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Anyxml.java
new file mode 100644 (file)
index 0000000..4ba4650
--- /dev/null
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Anyxml</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getAnyxml()
+ * @model
+ * @generated
+ */
+public interface Anyxml extends NamedNode, TaggedNode {
+} // Anyxml
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Augment.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Augment.java
new file mode 100644 (file)
index 0000000..5d4249c
--- /dev/null
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Augment</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getAugment()
+ * @model
+ * @generated
+ */
+public interface Augment extends NamedContainingNode {
+} // Augment
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/BelongsTo.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/BelongsTo.java
new file mode 100644 (file)
index 0000000..2dceeb0
--- /dev/null
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Belongs To</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.BelongsTo#getOwnerModule <em>Owner Module</em>}</li>
+ * </ul>
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getBelongsTo()
+ * @model
+ * @generated
+ */
+public interface BelongsTo extends EObject {
+    /**
+     * Returns the value of the '<em><b>Owner Module</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <p>
+     * If the meaning of the '<em>Owner Module</em>' reference isn't clear,
+     * there really should be more of a description here...
+     * </p>
+     * <!-- end-user-doc -->
+     * @return the value of the '<em>Owner Module</em>' reference.
+     * @see #setOwnerModule(Module)
+     * @see com.cisco.yangide.ext.model.ModelPackage#getBelongsTo_OwnerModule()
+     * @model required="true"
+     * @generated
+     */
+    Module getOwnerModule();
+
+    /**
+     * Sets the value of the '{@link com.cisco.yangide.ext.model.BelongsTo#getOwnerModule <em>Owner Module</em>}' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @param value the new value of the '<em>Owner Module</em>' reference.
+     * @see #getOwnerModule()
+     * @generated
+     */
+    void setOwnerModule(Module value);
+
+} // BelongsTo
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Choice.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Choice.java
new file mode 100644 (file)
index 0000000..fd50c33
--- /dev/null
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Choice</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getChoice()
+ * @model
+ * @generated
+ */
+public interface Choice extends NamedContainingNode, TaggedNode {
+} // Choice
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/ChoiceCase.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/ChoiceCase.java
new file mode 100644 (file)
index 0000000..a361e33
--- /dev/null
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Choice Case</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getChoiceCase()
+ * @model
+ * @generated
+ */
+public interface ChoiceCase extends NamedContainingNode, TaggedNode {
+} // ChoiceCase
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Container.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Container.java
new file mode 100644 (file)
index 0000000..1764138
--- /dev/null
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Container</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getContainer()
+ * @model
+ * @generated
+ */
+public interface Container extends NamedContainingNode, TaggedNode {
+} // Container
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/ContainingNode.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/ContainingNode.java
new file mode 100644 (file)
index 0000000..df2e820
--- /dev/null
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Containing Node</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.ContainingNode#getChildren <em>Children</em>}</li>
+ * </ul>
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getContainingNode()
+ * @model interface="true" abstract="true"
+ * @generated
+ */
+public interface ContainingNode extends Node {
+    /**
+     * Returns the value of the '<em><b>Children</b></em>' containment reference list.
+     * The list contents are of type {@link com.cisco.yangide.ext.model.Node}.
+     * <!-- begin-user-doc -->
+     * <p>
+     * If the meaning of the '<em>Children</em>' containment reference list isn't clear,
+     * there really should be more of a description here...
+     * </p>
+     * <!-- end-user-doc -->
+     * @return the value of the '<em>Children</em>' containment reference list.
+     * @see com.cisco.yangide.ext.model.ModelPackage#getContainingNode_Children()
+     * @model containment="true"
+     * @generated
+     */
+    EList<Node> getChildren();
+
+} // ContainingNode
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Deviation.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Deviation.java
new file mode 100644 (file)
index 0000000..d5a5689
--- /dev/null
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Deviation</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getDeviation()
+ * @model
+ * @generated
+ */
+public interface Deviation extends NamedNode {
+} // Deviation
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Extension.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Extension.java
new file mode 100644 (file)
index 0000000..7684d9c
--- /dev/null
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Extension</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getExtension()
+ * @model
+ * @generated
+ */
+public interface Extension extends NamedNode {
+} // Extension
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Feature.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Feature.java
new file mode 100644 (file)
index 0000000..c65312c
--- /dev/null
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Feature</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getFeature()
+ * @model
+ * @generated
+ */
+public interface Feature extends NamedNode {
+} // Feature
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Grouping.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Grouping.java
new file mode 100644 (file)
index 0000000..e51a304
--- /dev/null
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Grouping</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getGrouping()
+ * @model
+ * @generated
+ */
+public interface Grouping extends NamedContainingNode, TaggedNode {
+} // Grouping
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Identity.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Identity.java
new file mode 100644 (file)
index 0000000..3d42785
--- /dev/null
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Identity</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getIdentity()
+ * @model
+ * @generated
+ */
+public interface Identity extends NamedNode, ReferenceNode {
+} // Identity
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Import.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Import.java
new file mode 100644 (file)
index 0000000..5319cca
--- /dev/null
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Import</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.Import#getPrefix <em>Prefix</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.Import#getRevisionDate <em>Revision Date</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.Import#getModule <em>Module</em>}</li>
+ * </ul>
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getImport()
+ * @model
+ * @generated
+ */
+public interface Import extends Node {
+    /**
+     * Returns the value of the '<em><b>Prefix</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <p>
+     * If the meaning of the '<em>Prefix</em>' attribute isn't clear,
+     * there really should be more of a description here...
+     * </p>
+     * <!-- end-user-doc -->
+     * @return the value of the '<em>Prefix</em>' attribute.
+     * @see #setPrefix(String)
+     * @see com.cisco.yangide.ext.model.ModelPackage#getImport_Prefix()
+     * @model dataType="org.eclipse.emf.ecore.xml.type.String" required="true"
+     * @generated
+     */
+    String getPrefix();
+
+    /**
+     * Sets the value of the '{@link com.cisco.yangide.ext.model.Import#getPrefix <em>Prefix</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @param value the new value of the '<em>Prefix</em>' attribute.
+     * @see #getPrefix()
+     * @generated
+     */
+    void setPrefix(String value);
+
+    /**
+     * Returns the value of the '<em><b>Revision Date</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <p>
+     * If the meaning of the '<em>Revision Date</em>' attribute isn't clear,
+     * there really should be more of a description here...
+     * </p>
+     * <!-- end-user-doc -->
+     * @return the value of the '<em>Revision Date</em>' attribute.
+     * @see #setRevisionDate(String)
+     * @see com.cisco.yangide.ext.model.ModelPackage#getImport_RevisionDate()
+     * @model dataType="org.eclipse.emf.ecore.xml.type.String"
+     * @generated
+     */
+    String getRevisionDate();
+
+    /**
+     * Sets the value of the '{@link com.cisco.yangide.ext.model.Import#getRevisionDate <em>Revision Date</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @param value the new value of the '<em>Revision Date</em>' attribute.
+     * @see #getRevisionDate()
+     * @generated
+     */
+    void setRevisionDate(String value);
+
+    /**
+     * Returns the value of the '<em><b>Module</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <p>
+     * If the meaning of the '<em>Module</em>' attribute isn't clear,
+     * there really should be more of a description here...
+     * </p>
+     * <!-- end-user-doc -->
+     * @return the value of the '<em>Module</em>' attribute.
+     * @see #setModule(String)
+     * @see com.cisco.yangide.ext.model.ModelPackage#getImport_Module()
+     * @model dataType="org.eclipse.emf.ecore.xml.type.String"
+     * @generated
+     */
+    String getModule();
+
+    /**
+     * Sets the value of the '{@link com.cisco.yangide.ext.model.Import#getModule <em>Module</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @param value the new value of the '<em>Module</em>' attribute.
+     * @see #getModule()
+     * @generated
+     */
+    void setModule(String value);
+
+} // Import
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Include.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Include.java
new file mode 100644 (file)
index 0000000..8050834
--- /dev/null
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Include</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.Include#getSubmodule <em>Submodule</em>}</li>
+ * </ul>
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getInclude()
+ * @model
+ * @generated
+ */
+public interface Include extends Node {
+    /**
+     * Returns the value of the '<em><b>Submodule</b></em>' containment reference.
+     * <!-- begin-user-doc -->
+     * <p>
+     * If the meaning of the '<em>Submodule</em>' containment reference isn't clear,
+     * there really should be more of a description here...
+     * </p>
+     * <!-- end-user-doc -->
+     * @return the value of the '<em>Submodule</em>' containment reference.
+     * @see #setSubmodule(Submodule)
+     * @see com.cisco.yangide.ext.model.ModelPackage#getInclude_Submodule()
+     * @model containment="true" required="true"
+     * @generated
+     */
+    Submodule getSubmodule();
+
+    /**
+     * Sets the value of the '{@link com.cisco.yangide.ext.model.Include#getSubmodule <em>Submodule</em>}' containment reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @param value the new value of the '<em>Submodule</em>' containment reference.
+     * @see #getSubmodule()
+     * @generated
+     */
+    void setSubmodule(Submodule value);
+
+} // Include
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Leaf.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Leaf.java
new file mode 100644 (file)
index 0000000..d716194
--- /dev/null
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Leaf</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getLeaf()
+ * @model
+ * @generated
+ */
+public interface Leaf extends NamedNode, TaggedNode, TypedNode {
+} // Leaf
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/LeafList.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/LeafList.java
new file mode 100644 (file)
index 0000000..0c9f0c6
--- /dev/null
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Leaf List</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getLeafList()
+ * @model
+ * @generated
+ */
+public interface LeafList extends NamedNode, TaggedNode, TypedNode {
+} // LeafList
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/List.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/List.java
new file mode 100644 (file)
index 0000000..6c9724b
--- /dev/null
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>List</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getList()
+ * @model
+ * @generated
+ */
+public interface List extends NamedContainingNode, TaggedNode {
+} // List
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/ListKey.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/ListKey.java
new file mode 100644 (file)
index 0000000..304872c
--- /dev/null
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>List Key</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getListKey()
+ * @model
+ * @generated
+ */
+public interface ListKey extends NamedNode {
+} // ListKey
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/ModelFactory.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/ModelFactory.java
new file mode 100644 (file)
index 0000000..3604351
--- /dev/null
@@ -0,0 +1,281 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+import org.eclipse.emf.ecore.EFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Factory</b> for the model.
+ * It provides a create method for each non-abstract class of the model.
+ * <!-- end-user-doc -->
+ * @see com.cisco.yangide.ext.model.ModelPackage
+ * @generated
+ */
+public interface ModelFactory extends EFactory {
+    /**
+     * The singleton instance of the factory.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    ModelFactory eINSTANCE = com.cisco.yangide.ext.model.impl.ModelFactoryImpl.init();
+
+    /**
+     * Returns a new object of class '<em>Module</em>'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return a new object of class '<em>Module</em>'.
+     * @generated
+     */
+    Module createModule();
+
+    /**
+     * Returns a new object of class '<em>Grouping</em>'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return a new object of class '<em>Grouping</em>'.
+     * @generated
+     */
+    Grouping createGrouping();
+
+    /**
+     * Returns a new object of class '<em>Leaf</em>'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return a new object of class '<em>Leaf</em>'.
+     * @generated
+     */
+    Leaf createLeaf();
+
+    /**
+     * Returns a new object of class '<em>Container</em>'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return a new object of class '<em>Container</em>'.
+     * @generated
+     */
+    Container createContainer();
+
+    /**
+     * Returns a new object of class '<em>Submodule</em>'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return a new object of class '<em>Submodule</em>'.
+     * @generated
+     */
+    Submodule createSubmodule();
+
+    /**
+     * Returns a new object of class '<em>Typedef</em>'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return a new object of class '<em>Typedef</em>'.
+     * @generated
+     */
+    Typedef createTypedef();
+
+    /**
+     * Returns a new object of class '<em>Choice</em>'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return a new object of class '<em>Choice</em>'.
+     * @generated
+     */
+    Choice createChoice();
+
+    /**
+     * Returns a new object of class '<em>Leaf List</em>'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return a new object of class '<em>Leaf List</em>'.
+     * @generated
+     */
+    LeafList createLeafList();
+
+    /**
+     * Returns a new object of class '<em>Anyxml</em>'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return a new object of class '<em>Anyxml</em>'.
+     * @generated
+     */
+    Anyxml createAnyxml();
+
+    /**
+     * Returns a new object of class '<em>Import</em>'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return a new object of class '<em>Import</em>'.
+     * @generated
+     */
+    Import createImport();
+
+    /**
+     * Returns a new object of class '<em>Include</em>'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return a new object of class '<em>Include</em>'.
+     * @generated
+     */
+    Include createInclude();
+
+    /**
+     * Returns a new object of class '<em>Revision</em>'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return a new object of class '<em>Revision</em>'.
+     * @generated
+     */
+    Revision createRevision();
+
+    /**
+     * Returns a new object of class '<em>Belongs To</em>'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return a new object of class '<em>Belongs To</em>'.
+     * @generated
+     */
+    BelongsTo createBelongsTo();
+
+    /**
+     * Returns a new object of class '<em>List</em>'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return a new object of class '<em>List</em>'.
+     * @generated
+     */
+    List createList();
+
+    /**
+     * Returns a new object of class '<em>Tag</em>'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return a new object of class '<em>Tag</em>'.
+     * @generated
+     */
+    Tag createTag();
+
+    /**
+     * Returns a new object of class '<em>Uses</em>'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return a new object of class '<em>Uses</em>'.
+     * @generated
+     */
+    Uses createUses();
+
+    /**
+     * Returns a new object of class '<em>Rpc</em>'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return a new object of class '<em>Rpc</em>'.
+     * @generated
+     */
+    Rpc createRpc();
+
+    /**
+     * Returns a new object of class '<em>Rpc IO</em>'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return a new object of class '<em>Rpc IO</em>'.
+     * @generated
+     */
+    RpcIO createRpcIO();
+
+    /**
+     * Returns a new object of class '<em>Notification</em>'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return a new object of class '<em>Notification</em>'.
+     * @generated
+     */
+    Notification createNotification();
+
+    /**
+     * Returns a new object of class '<em>Augment</em>'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return a new object of class '<em>Augment</em>'.
+     * @generated
+     */
+    Augment createAugment();
+
+    /**
+     * Returns a new object of class '<em>Extension</em>'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return a new object of class '<em>Extension</em>'.
+     * @generated
+     */
+    Extension createExtension();
+
+    /**
+     * Returns a new object of class '<em>Feature</em>'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return a new object of class '<em>Feature</em>'.
+     * @generated
+     */
+    Feature createFeature();
+
+    /**
+     * Returns a new object of class '<em>Deviation</em>'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return a new object of class '<em>Deviation</em>'.
+     * @generated
+     */
+    Deviation createDeviation();
+
+    /**
+     * Returns a new object of class '<em>Identity</em>'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return a new object of class '<em>Identity</em>'.
+     * @generated
+     */
+    Identity createIdentity();
+
+    /**
+     * Returns a new object of class '<em>Choice Case</em>'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return a new object of class '<em>Choice Case</em>'.
+     * @generated
+     */
+    ChoiceCase createChoiceCase();
+
+    /**
+     * Returns a new object of class '<em>List Key</em>'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return a new object of class '<em>List Key</em>'.
+     * @generated
+     */
+    ListKey createListKey();
+
+    /**
+     * Returns a new object of class '<em>Typeref</em>'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return a new object of class '<em>Typeref</em>'.
+     * @generated
+     */
+    Typeref createTyperef();
+
+    /**
+     * Returns the package supported by this factory.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the package supported by this factory.
+     * @generated
+     */
+    ModelPackage getModelPackage();
+
+} //ModelFactory
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/ModelPackage.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/ModelPackage.java
new file mode 100644 (file)
index 0000000..26c9002
--- /dev/null
@@ -0,0 +1,2955 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Package</b> for the model.
+ * It contains accessors for the meta objects to represent
+ * <ul>
+ *   <li>each class,</li>
+ *   <li>each feature of each class,</li>
+ *   <li>each operation of each class,</li>
+ *   <li>each enum,</li>
+ *   <li>and each data type</li>
+ * </ul>
+ * <!-- end-user-doc -->
+ * @see com.cisco.yangide.ext.model.ModelFactory
+ * @model kind="package"
+ * @generated
+ */
+public interface ModelPackage extends EPackage {
+    /**
+     * The package name.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    String eNAME = "model";
+
+    /**
+     * The package namespace URI.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    String eNS_URI = "http://www.example.org/model";
+
+    /**
+     * The package namespace name.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    String eNS_PREFIX = "model";
+
+    /**
+     * The singleton instance of the package.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    ModelPackage eINSTANCE = com.cisco.yangide.ext.model.impl.ModelPackageImpl.init();
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.Node <em>Node</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.Node
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getNode()
+     * @generated
+     */
+    int NODE = 4;
+
+    /**
+     * The feature id for the '<em><b>Parent</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int NODE__PARENT = 0;
+
+    /**
+     * The number of structural features of the '<em>Node</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int NODE_FEATURE_COUNT = 1;
+
+    /**
+     * The number of operations of the '<em>Node</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int NODE_OPERATION_COUNT = 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.NamedNode <em>Named Node</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.NamedNode
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getNamedNode()
+     * @generated
+     */
+    int NAMED_NODE = 5;
+
+    /**
+     * The feature id for the '<em><b>Parent</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int NAMED_NODE__PARENT = NODE__PARENT;
+
+    /**
+     * The feature id for the '<em><b>Name</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int NAMED_NODE__NAME = NODE_FEATURE_COUNT + 0;
+
+    /**
+     * The number of structural features of the '<em>Named Node</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int NAMED_NODE_FEATURE_COUNT = NODE_FEATURE_COUNT + 1;
+
+    /**
+     * The number of operations of the '<em>Named Node</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int NAMED_NODE_OPERATION_COUNT = NODE_OPERATION_COUNT + 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.NamedContainingNode <em>Named Containing Node</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.NamedContainingNode
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getNamedContainingNode()
+     * @generated
+     */
+    int NAMED_CONTAINING_NODE = 7;
+
+    /**
+     * The feature id for the '<em><b>Parent</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int NAMED_CONTAINING_NODE__PARENT = NAMED_NODE__PARENT;
+
+    /**
+     * The feature id for the '<em><b>Name</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int NAMED_CONTAINING_NODE__NAME = NAMED_NODE__NAME;
+
+    /**
+     * The feature id for the '<em><b>Children</b></em>' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int NAMED_CONTAINING_NODE__CHILDREN = NAMED_NODE_FEATURE_COUNT + 0;
+
+    /**
+     * The number of structural features of the '<em>Named Containing Node</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int NAMED_CONTAINING_NODE_FEATURE_COUNT = NAMED_NODE_FEATURE_COUNT + 1;
+
+    /**
+     * The number of operations of the '<em>Named Containing Node</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int NAMED_CONTAINING_NODE_OPERATION_COUNT = NAMED_NODE_OPERATION_COUNT + 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.impl.ModuleImpl <em>Module</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.impl.ModuleImpl
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getModule()
+     * @generated
+     */
+    int MODULE = 0;
+
+    /**
+     * The feature id for the '<em><b>Parent</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int MODULE__PARENT = NAMED_CONTAINING_NODE__PARENT;
+
+    /**
+     * The feature id for the '<em><b>Name</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int MODULE__NAME = NAMED_CONTAINING_NODE__NAME;
+
+    /**
+     * The feature id for the '<em><b>Children</b></em>' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int MODULE__CHILDREN = NAMED_CONTAINING_NODE__CHILDREN;
+
+    /**
+     * The feature id for the '<em><b>Tags</b></em>' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int MODULE__TAGS = NAMED_CONTAINING_NODE_FEATURE_COUNT + 0;
+
+    /**
+     * The feature id for the '<em><b>Namespace</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int MODULE__NAMESPACE = NAMED_CONTAINING_NODE_FEATURE_COUNT + 1;
+
+    /**
+     * The feature id for the '<em><b>Revisions</b></em>' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int MODULE__REVISIONS = NAMED_CONTAINING_NODE_FEATURE_COUNT + 2;
+
+    /**
+     * The number of structural features of the '<em>Module</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int MODULE_FEATURE_COUNT = NAMED_CONTAINING_NODE_FEATURE_COUNT + 3;
+
+    /**
+     * The number of operations of the '<em>Module</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int MODULE_OPERATION_COUNT = NAMED_CONTAINING_NODE_OPERATION_COUNT + 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.impl.GroupingImpl <em>Grouping</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.impl.GroupingImpl
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getGrouping()
+     * @generated
+     */
+    int GROUPING = 1;
+
+    /**
+     * The feature id for the '<em><b>Parent</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int GROUPING__PARENT = NAMED_CONTAINING_NODE__PARENT;
+
+    /**
+     * The feature id for the '<em><b>Name</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int GROUPING__NAME = NAMED_CONTAINING_NODE__NAME;
+
+    /**
+     * The feature id for the '<em><b>Children</b></em>' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int GROUPING__CHILDREN = NAMED_CONTAINING_NODE__CHILDREN;
+
+    /**
+     * The feature id for the '<em><b>Tags</b></em>' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int GROUPING__TAGS = NAMED_CONTAINING_NODE_FEATURE_COUNT + 0;
+
+    /**
+     * The number of structural features of the '<em>Grouping</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int GROUPING_FEATURE_COUNT = NAMED_CONTAINING_NODE_FEATURE_COUNT + 1;
+
+    /**
+     * The number of operations of the '<em>Grouping</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int GROUPING_OPERATION_COUNT = NAMED_CONTAINING_NODE_OPERATION_COUNT + 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.impl.LeafImpl <em>Leaf</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.impl.LeafImpl
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getLeaf()
+     * @generated
+     */
+    int LEAF = 2;
+
+    /**
+     * The feature id for the '<em><b>Parent</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int LEAF__PARENT = NAMED_NODE__PARENT;
+
+    /**
+     * The feature id for the '<em><b>Name</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int LEAF__NAME = NAMED_NODE__NAME;
+
+    /**
+     * The feature id for the '<em><b>Tags</b></em>' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int LEAF__TAGS = NAMED_NODE_FEATURE_COUNT + 0;
+
+    /**
+     * The feature id for the '<em><b>Type</b></em>' containment reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int LEAF__TYPE = NAMED_NODE_FEATURE_COUNT + 1;
+
+    /**
+     * The number of structural features of the '<em>Leaf</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int LEAF_FEATURE_COUNT = NAMED_NODE_FEATURE_COUNT + 2;
+
+    /**
+     * The number of operations of the '<em>Leaf</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int LEAF_OPERATION_COUNT = NAMED_NODE_OPERATION_COUNT + 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.impl.ContainerImpl <em>Container</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.impl.ContainerImpl
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getContainer()
+     * @generated
+     */
+    int CONTAINER = 3;
+
+    /**
+     * The feature id for the '<em><b>Parent</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int CONTAINER__PARENT = NAMED_CONTAINING_NODE__PARENT;
+
+    /**
+     * The feature id for the '<em><b>Name</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int CONTAINER__NAME = NAMED_CONTAINING_NODE__NAME;
+
+    /**
+     * The feature id for the '<em><b>Children</b></em>' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int CONTAINER__CHILDREN = NAMED_CONTAINING_NODE__CHILDREN;
+
+    /**
+     * The feature id for the '<em><b>Tags</b></em>' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int CONTAINER__TAGS = NAMED_CONTAINING_NODE_FEATURE_COUNT + 0;
+
+    /**
+     * The number of structural features of the '<em>Container</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int CONTAINER_FEATURE_COUNT = NAMED_CONTAINING_NODE_FEATURE_COUNT + 1;
+
+    /**
+     * The number of operations of the '<em>Container</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int CONTAINER_OPERATION_COUNT = NAMED_CONTAINING_NODE_OPERATION_COUNT + 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.ContainingNode <em>Containing Node</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.ContainingNode
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getContainingNode()
+     * @generated
+     */
+    int CONTAINING_NODE = 6;
+
+    /**
+     * The feature id for the '<em><b>Parent</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int CONTAINING_NODE__PARENT = NODE__PARENT;
+
+    /**
+     * The feature id for the '<em><b>Children</b></em>' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int CONTAINING_NODE__CHILDREN = NODE_FEATURE_COUNT + 0;
+
+    /**
+     * The number of structural features of the '<em>Containing Node</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int CONTAINING_NODE_FEATURE_COUNT = NODE_FEATURE_COUNT + 1;
+
+    /**
+     * The number of operations of the '<em>Containing Node</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int CONTAINING_NODE_OPERATION_COUNT = NODE_OPERATION_COUNT + 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.impl.SubmoduleImpl <em>Submodule</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.impl.SubmoduleImpl
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getSubmodule()
+     * @generated
+     */
+    int SUBMODULE = 8;
+
+    /**
+     * The feature id for the '<em><b>Parent</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int SUBMODULE__PARENT = MODULE__PARENT;
+
+    /**
+     * The feature id for the '<em><b>Name</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int SUBMODULE__NAME = MODULE__NAME;
+
+    /**
+     * The feature id for the '<em><b>Children</b></em>' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int SUBMODULE__CHILDREN = MODULE__CHILDREN;
+
+    /**
+     * The feature id for the '<em><b>Tags</b></em>' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int SUBMODULE__TAGS = MODULE__TAGS;
+
+    /**
+     * The feature id for the '<em><b>Namespace</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int SUBMODULE__NAMESPACE = MODULE__NAMESPACE;
+
+    /**
+     * The feature id for the '<em><b>Revisions</b></em>' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int SUBMODULE__REVISIONS = MODULE__REVISIONS;
+
+    /**
+     * The feature id for the '<em><b>Belongs To</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int SUBMODULE__BELONGS_TO = MODULE_FEATURE_COUNT + 0;
+
+    /**
+     * The number of structural features of the '<em>Submodule</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int SUBMODULE_FEATURE_COUNT = MODULE_FEATURE_COUNT + 1;
+
+    /**
+     * The number of operations of the '<em>Submodule</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int SUBMODULE_OPERATION_COUNT = MODULE_OPERATION_COUNT + 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.impl.TypedefImpl <em>Typedef</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.impl.TypedefImpl
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getTypedef()
+     * @generated
+     */
+    int TYPEDEF = 9;
+
+    /**
+     * The feature id for the '<em><b>Parent</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int TYPEDEF__PARENT = NAMED_NODE__PARENT;
+
+    /**
+     * The feature id for the '<em><b>Name</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int TYPEDEF__NAME = NAMED_NODE__NAME;
+
+    /**
+     * The feature id for the '<em><b>Tags</b></em>' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int TYPEDEF__TAGS = NAMED_NODE_FEATURE_COUNT + 0;
+
+    /**
+     * The feature id for the '<em><b>Type</b></em>' containment reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int TYPEDEF__TYPE = NAMED_NODE_FEATURE_COUNT + 1;
+
+    /**
+     * The number of structural features of the '<em>Typedef</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int TYPEDEF_FEATURE_COUNT = NAMED_NODE_FEATURE_COUNT + 2;
+
+    /**
+     * The number of operations of the '<em>Typedef</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int TYPEDEF_OPERATION_COUNT = NAMED_NODE_OPERATION_COUNT + 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.impl.ChoiceImpl <em>Choice</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.impl.ChoiceImpl
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getChoice()
+     * @generated
+     */
+    int CHOICE = 10;
+
+    /**
+     * The feature id for the '<em><b>Parent</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int CHOICE__PARENT = NAMED_CONTAINING_NODE__PARENT;
+
+    /**
+     * The feature id for the '<em><b>Name</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int CHOICE__NAME = NAMED_CONTAINING_NODE__NAME;
+
+    /**
+     * The feature id for the '<em><b>Children</b></em>' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int CHOICE__CHILDREN = NAMED_CONTAINING_NODE__CHILDREN;
+
+    /**
+     * The feature id for the '<em><b>Tags</b></em>' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int CHOICE__TAGS = NAMED_CONTAINING_NODE_FEATURE_COUNT + 0;
+
+    /**
+     * The number of structural features of the '<em>Choice</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int CHOICE_FEATURE_COUNT = NAMED_CONTAINING_NODE_FEATURE_COUNT + 1;
+
+    /**
+     * The number of operations of the '<em>Choice</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int CHOICE_OPERATION_COUNT = NAMED_CONTAINING_NODE_OPERATION_COUNT + 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.impl.LeafListImpl <em>Leaf List</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.impl.LeafListImpl
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getLeafList()
+     * @generated
+     */
+    int LEAF_LIST = 11;
+
+    /**
+     * The feature id for the '<em><b>Parent</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int LEAF_LIST__PARENT = NAMED_NODE__PARENT;
+
+    /**
+     * The feature id for the '<em><b>Name</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int LEAF_LIST__NAME = NAMED_NODE__NAME;
+
+    /**
+     * The feature id for the '<em><b>Tags</b></em>' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int LEAF_LIST__TAGS = NAMED_NODE_FEATURE_COUNT + 0;
+
+    /**
+     * The feature id for the '<em><b>Type</b></em>' containment reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int LEAF_LIST__TYPE = NAMED_NODE_FEATURE_COUNT + 1;
+
+    /**
+     * The number of structural features of the '<em>Leaf List</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int LEAF_LIST_FEATURE_COUNT = NAMED_NODE_FEATURE_COUNT + 2;
+
+    /**
+     * The number of operations of the '<em>Leaf List</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int LEAF_LIST_OPERATION_COUNT = NAMED_NODE_OPERATION_COUNT + 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.impl.AnyxmlImpl <em>Anyxml</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.impl.AnyxmlImpl
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getAnyxml()
+     * @generated
+     */
+    int ANYXML = 12;
+
+    /**
+     * The feature id for the '<em><b>Parent</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int ANYXML__PARENT = NAMED_NODE__PARENT;
+
+    /**
+     * The feature id for the '<em><b>Name</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int ANYXML__NAME = NAMED_NODE__NAME;
+
+    /**
+     * The feature id for the '<em><b>Tags</b></em>' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int ANYXML__TAGS = NAMED_NODE_FEATURE_COUNT + 0;
+
+    /**
+     * The number of structural features of the '<em>Anyxml</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int ANYXML_FEATURE_COUNT = NAMED_NODE_FEATURE_COUNT + 1;
+
+    /**
+     * The number of operations of the '<em>Anyxml</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int ANYXML_OPERATION_COUNT = NAMED_NODE_OPERATION_COUNT + 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.impl.ImportImpl <em>Import</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.impl.ImportImpl
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getImport()
+     * @generated
+     */
+    int IMPORT = 13;
+
+    /**
+     * The feature id for the '<em><b>Parent</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int IMPORT__PARENT = NODE__PARENT;
+
+    /**
+     * The feature id for the '<em><b>Prefix</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int IMPORT__PREFIX = NODE_FEATURE_COUNT + 0;
+
+    /**
+     * The feature id for the '<em><b>Revision Date</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int IMPORT__REVISION_DATE = NODE_FEATURE_COUNT + 1;
+
+    /**
+     * The feature id for the '<em><b>Module</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int IMPORT__MODULE = NODE_FEATURE_COUNT + 2;
+
+    /**
+     * The number of structural features of the '<em>Import</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int IMPORT_FEATURE_COUNT = NODE_FEATURE_COUNT + 3;
+
+    /**
+     * The number of operations of the '<em>Import</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int IMPORT_OPERATION_COUNT = NODE_OPERATION_COUNT + 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.impl.IncludeImpl <em>Include</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.impl.IncludeImpl
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getInclude()
+     * @generated
+     */
+    int INCLUDE = 14;
+
+    /**
+     * The feature id for the '<em><b>Parent</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int INCLUDE__PARENT = NODE__PARENT;
+
+    /**
+     * The feature id for the '<em><b>Submodule</b></em>' containment reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int INCLUDE__SUBMODULE = NODE_FEATURE_COUNT + 0;
+
+    /**
+     * The number of structural features of the '<em>Include</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int INCLUDE_FEATURE_COUNT = NODE_FEATURE_COUNT + 1;
+
+    /**
+     * The number of operations of the '<em>Include</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int INCLUDE_OPERATION_COUNT = NODE_OPERATION_COUNT + 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.TaggedNode <em>Tagged Node</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.TaggedNode
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getTaggedNode()
+     * @generated
+     */
+    int TAGGED_NODE = 19;
+
+    /**
+     * The feature id for the '<em><b>Tags</b></em>' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int TAGGED_NODE__TAGS = 0;
+
+    /**
+     * The number of structural features of the '<em>Tagged Node</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int TAGGED_NODE_FEATURE_COUNT = 1;
+
+    /**
+     * The number of operations of the '<em>Tagged Node</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int TAGGED_NODE_OPERATION_COUNT = 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.impl.RevisionImpl <em>Revision</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.impl.RevisionImpl
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getRevision()
+     * @generated
+     */
+    int REVISION = 15;
+
+    /**
+     * The feature id for the '<em><b>Tags</b></em>' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int REVISION__TAGS = TAGGED_NODE__TAGS;
+
+    /**
+     * The feature id for the '<em><b>Parent</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int REVISION__PARENT = TAGGED_NODE_FEATURE_COUNT + 0;
+
+    /**
+     * The feature id for the '<em><b>Name</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int REVISION__NAME = TAGGED_NODE_FEATURE_COUNT + 1;
+
+    /**
+     * The number of structural features of the '<em>Revision</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int REVISION_FEATURE_COUNT = TAGGED_NODE_FEATURE_COUNT + 2;
+
+    /**
+     * The number of operations of the '<em>Revision</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int REVISION_OPERATION_COUNT = TAGGED_NODE_OPERATION_COUNT + 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.impl.BelongsToImpl <em>Belongs To</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.impl.BelongsToImpl
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getBelongsTo()
+     * @generated
+     */
+    int BELONGS_TO = 16;
+
+    /**
+     * The feature id for the '<em><b>Owner Module</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int BELONGS_TO__OWNER_MODULE = 0;
+
+    /**
+     * The number of structural features of the '<em>Belongs To</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int BELONGS_TO_FEATURE_COUNT = 1;
+
+    /**
+     * The number of operations of the '<em>Belongs To</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int BELONGS_TO_OPERATION_COUNT = 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.impl.ListImpl <em>List</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.impl.ListImpl
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getList()
+     * @generated
+     */
+    int LIST = 17;
+
+    /**
+     * The feature id for the '<em><b>Parent</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int LIST__PARENT = NAMED_CONTAINING_NODE__PARENT;
+
+    /**
+     * The feature id for the '<em><b>Name</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int LIST__NAME = NAMED_CONTAINING_NODE__NAME;
+
+    /**
+     * The feature id for the '<em><b>Children</b></em>' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int LIST__CHILDREN = NAMED_CONTAINING_NODE__CHILDREN;
+
+    /**
+     * The feature id for the '<em><b>Tags</b></em>' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int LIST__TAGS = NAMED_CONTAINING_NODE_FEATURE_COUNT + 0;
+
+    /**
+     * The number of structural features of the '<em>List</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int LIST_FEATURE_COUNT = NAMED_CONTAINING_NODE_FEATURE_COUNT + 1;
+
+    /**
+     * The number of operations of the '<em>List</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int LIST_OPERATION_COUNT = NAMED_CONTAINING_NODE_OPERATION_COUNT + 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.impl.TagImpl <em>Tag</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.impl.TagImpl
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getTag()
+     * @generated
+     */
+    int TAG = 18;
+
+    /**
+     * The feature id for the '<em><b>Name</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int TAG__NAME = 0;
+
+    /**
+     * The feature id for the '<em><b>Value</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int TAG__VALUE = 1;
+
+    /**
+     * The number of structural features of the '<em>Tag</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int TAG_FEATURE_COUNT = 2;
+
+    /**
+     * The number of operations of the '<em>Tag</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int TAG_OPERATION_COUNT = 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.impl.UsesImpl <em>Uses</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.impl.UsesImpl
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getUses()
+     * @generated
+     */
+    int USES = 20;
+
+    /**
+     * The feature id for the '<em><b>Parent</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int USES__PARENT = NODE__PARENT;
+
+    /**
+     * The feature id for the '<em><b>QName</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int USES__QNAME = NODE_FEATURE_COUNT + 0;
+
+    /**
+     * The number of structural features of the '<em>Uses</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int USES_FEATURE_COUNT = NODE_FEATURE_COUNT + 1;
+
+    /**
+     * The number of operations of the '<em>Uses</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int USES_OPERATION_COUNT = NODE_OPERATION_COUNT + 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.impl.RpcImpl <em>Rpc</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.impl.RpcImpl
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getRpc()
+     * @generated
+     */
+    int RPC = 21;
+
+    /**
+     * The feature id for the '<em><b>Parent</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int RPC__PARENT = NAMED_CONTAINING_NODE__PARENT;
+
+    /**
+     * The feature id for the '<em><b>Name</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int RPC__NAME = NAMED_CONTAINING_NODE__NAME;
+
+    /**
+     * The feature id for the '<em><b>Children</b></em>' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int RPC__CHILDREN = NAMED_CONTAINING_NODE__CHILDREN;
+
+    /**
+     * The feature id for the '<em><b>Tags</b></em>' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int RPC__TAGS = NAMED_CONTAINING_NODE_FEATURE_COUNT + 0;
+
+    /**
+     * The number of structural features of the '<em>Rpc</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int RPC_FEATURE_COUNT = NAMED_CONTAINING_NODE_FEATURE_COUNT + 1;
+
+    /**
+     * The number of operations of the '<em>Rpc</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int RPC_OPERATION_COUNT = NAMED_CONTAINING_NODE_OPERATION_COUNT + 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.impl.RpcIOImpl <em>Rpc IO</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.impl.RpcIOImpl
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getRpcIO()
+     * @generated
+     */
+    int RPC_IO = 22;
+
+    /**
+     * The feature id for the '<em><b>Parent</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int RPC_IO__PARENT = CONTAINING_NODE__PARENT;
+
+    /**
+     * The feature id for the '<em><b>Children</b></em>' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int RPC_IO__CHILDREN = CONTAINING_NODE__CHILDREN;
+
+    /**
+     * The feature id for the '<em><b>Input</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int RPC_IO__INPUT = CONTAINING_NODE_FEATURE_COUNT + 0;
+
+    /**
+     * The number of structural features of the '<em>Rpc IO</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int RPC_IO_FEATURE_COUNT = CONTAINING_NODE_FEATURE_COUNT + 1;
+
+    /**
+     * The number of operations of the '<em>Rpc IO</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int RPC_IO_OPERATION_COUNT = CONTAINING_NODE_OPERATION_COUNT + 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.impl.NotificationImpl <em>Notification</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.impl.NotificationImpl
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getNotification()
+     * @generated
+     */
+    int NOTIFICATION = 23;
+
+    /**
+     * The feature id for the '<em><b>Parent</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int NOTIFICATION__PARENT = NAMED_CONTAINING_NODE__PARENT;
+
+    /**
+     * The feature id for the '<em><b>Name</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int NOTIFICATION__NAME = NAMED_CONTAINING_NODE__NAME;
+
+    /**
+     * The feature id for the '<em><b>Children</b></em>' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int NOTIFICATION__CHILDREN = NAMED_CONTAINING_NODE__CHILDREN;
+
+    /**
+     * The number of structural features of the '<em>Notification</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int NOTIFICATION_FEATURE_COUNT = NAMED_CONTAINING_NODE_FEATURE_COUNT + 0;
+
+    /**
+     * The number of operations of the '<em>Notification</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int NOTIFICATION_OPERATION_COUNT = NAMED_CONTAINING_NODE_OPERATION_COUNT + 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.impl.AugmentImpl <em>Augment</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.impl.AugmentImpl
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getAugment()
+     * @generated
+     */
+    int AUGMENT = 24;
+
+    /**
+     * The feature id for the '<em><b>Parent</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int AUGMENT__PARENT = NAMED_CONTAINING_NODE__PARENT;
+
+    /**
+     * The feature id for the '<em><b>Name</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int AUGMENT__NAME = NAMED_CONTAINING_NODE__NAME;
+
+    /**
+     * The feature id for the '<em><b>Children</b></em>' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int AUGMENT__CHILDREN = NAMED_CONTAINING_NODE__CHILDREN;
+
+    /**
+     * The number of structural features of the '<em>Augment</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int AUGMENT_FEATURE_COUNT = NAMED_CONTAINING_NODE_FEATURE_COUNT + 0;
+
+    /**
+     * The number of operations of the '<em>Augment</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int AUGMENT_OPERATION_COUNT = NAMED_CONTAINING_NODE_OPERATION_COUNT + 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.impl.ExtensionImpl <em>Extension</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.impl.ExtensionImpl
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getExtension()
+     * @generated
+     */
+    int EXTENSION = 25;
+
+    /**
+     * The feature id for the '<em><b>Parent</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int EXTENSION__PARENT = NAMED_NODE__PARENT;
+
+    /**
+     * The feature id for the '<em><b>Name</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int EXTENSION__NAME = NAMED_NODE__NAME;
+
+    /**
+     * The number of structural features of the '<em>Extension</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int EXTENSION_FEATURE_COUNT = NAMED_NODE_FEATURE_COUNT + 0;
+
+    /**
+     * The number of operations of the '<em>Extension</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int EXTENSION_OPERATION_COUNT = NAMED_NODE_OPERATION_COUNT + 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.impl.FeatureImpl <em>Feature</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.impl.FeatureImpl
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getFeature()
+     * @generated
+     */
+    int FEATURE = 26;
+
+    /**
+     * The feature id for the '<em><b>Parent</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int FEATURE__PARENT = NAMED_NODE__PARENT;
+
+    /**
+     * The feature id for the '<em><b>Name</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int FEATURE__NAME = NAMED_NODE__NAME;
+
+    /**
+     * The number of structural features of the '<em>Feature</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int FEATURE_FEATURE_COUNT = NAMED_NODE_FEATURE_COUNT + 0;
+
+    /**
+     * The number of operations of the '<em>Feature</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int FEATURE_OPERATION_COUNT = NAMED_NODE_OPERATION_COUNT + 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.impl.DeviationImpl <em>Deviation</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.impl.DeviationImpl
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getDeviation()
+     * @generated
+     */
+    int DEVIATION = 27;
+
+    /**
+     * The feature id for the '<em><b>Parent</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int DEVIATION__PARENT = NAMED_NODE__PARENT;
+
+    /**
+     * The feature id for the '<em><b>Name</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int DEVIATION__NAME = NAMED_NODE__NAME;
+
+    /**
+     * The number of structural features of the '<em>Deviation</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int DEVIATION_FEATURE_COUNT = NAMED_NODE_FEATURE_COUNT + 0;
+
+    /**
+     * The number of operations of the '<em>Deviation</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int DEVIATION_OPERATION_COUNT = NAMED_NODE_OPERATION_COUNT + 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.impl.IdentityImpl <em>Identity</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.impl.IdentityImpl
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getIdentity()
+     * @generated
+     */
+    int IDENTITY = 28;
+
+    /**
+     * The feature id for the '<em><b>Parent</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int IDENTITY__PARENT = NAMED_NODE__PARENT;
+
+    /**
+     * The feature id for the '<em><b>Name</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int IDENTITY__NAME = NAMED_NODE__NAME;
+
+    /**
+     * The feature id for the '<em><b>Reference</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int IDENTITY__REFERENCE = NAMED_NODE_FEATURE_COUNT + 0;
+
+    /**
+     * The number of structural features of the '<em>Identity</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int IDENTITY_FEATURE_COUNT = NAMED_NODE_FEATURE_COUNT + 1;
+
+    /**
+     * The number of operations of the '<em>Identity</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int IDENTITY_OPERATION_COUNT = NAMED_NODE_OPERATION_COUNT + 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.TypedNode <em>Typed Node</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.TypedNode
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getTypedNode()
+     * @generated
+     */
+    int TYPED_NODE = 29;
+
+    /**
+     * The feature id for the '<em><b>Type</b></em>' containment reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int TYPED_NODE__TYPE = 0;
+
+    /**
+     * The number of structural features of the '<em>Typed Node</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int TYPED_NODE_FEATURE_COUNT = 1;
+
+    /**
+     * The number of operations of the '<em>Typed Node</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int TYPED_NODE_OPERATION_COUNT = 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.impl.ChoiceCaseImpl <em>Choice Case</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.impl.ChoiceCaseImpl
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getChoiceCase()
+     * @generated
+     */
+    int CHOICE_CASE = 30;
+
+    /**
+     * The feature id for the '<em><b>Parent</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int CHOICE_CASE__PARENT = NAMED_CONTAINING_NODE__PARENT;
+
+    /**
+     * The feature id for the '<em><b>Name</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int CHOICE_CASE__NAME = NAMED_CONTAINING_NODE__NAME;
+
+    /**
+     * The feature id for the '<em><b>Children</b></em>' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int CHOICE_CASE__CHILDREN = NAMED_CONTAINING_NODE__CHILDREN;
+
+    /**
+     * The feature id for the '<em><b>Tags</b></em>' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int CHOICE_CASE__TAGS = NAMED_CONTAINING_NODE_FEATURE_COUNT + 0;
+
+    /**
+     * The number of structural features of the '<em>Choice Case</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int CHOICE_CASE_FEATURE_COUNT = NAMED_CONTAINING_NODE_FEATURE_COUNT + 1;
+
+    /**
+     * The number of operations of the '<em>Choice Case</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int CHOICE_CASE_OPERATION_COUNT = NAMED_CONTAINING_NODE_OPERATION_COUNT + 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.impl.ListKeyImpl <em>List Key</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.impl.ListKeyImpl
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getListKey()
+     * @generated
+     */
+    int LIST_KEY = 31;
+
+    /**
+     * The feature id for the '<em><b>Parent</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int LIST_KEY__PARENT = NAMED_NODE__PARENT;
+
+    /**
+     * The feature id for the '<em><b>Name</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int LIST_KEY__NAME = NAMED_NODE__NAME;
+
+    /**
+     * The number of structural features of the '<em>List Key</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int LIST_KEY_FEATURE_COUNT = NAMED_NODE_FEATURE_COUNT + 0;
+
+    /**
+     * The number of operations of the '<em>List Key</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int LIST_KEY_OPERATION_COUNT = NAMED_NODE_OPERATION_COUNT + 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.impl.TyperefImpl <em>Typeref</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.impl.TyperefImpl
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getTyperef()
+     * @generated
+     */
+    int TYPEREF = 32;
+
+    /**
+     * The feature id for the '<em><b>Parent</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int TYPEREF__PARENT = NAMED_NODE__PARENT;
+
+    /**
+     * The feature id for the '<em><b>Name</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int TYPEREF__NAME = NAMED_NODE__NAME;
+
+    /**
+     * The number of structural features of the '<em>Typeref</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int TYPEREF_FEATURE_COUNT = NAMED_NODE_FEATURE_COUNT + 0;
+
+    /**
+     * The number of operations of the '<em>Typeref</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int TYPEREF_OPERATION_COUNT = NAMED_NODE_OPERATION_COUNT + 0;
+
+    /**
+     * The meta object id for the '{@link com.cisco.yangide.ext.model.ReferenceNode <em>Reference Node</em>}' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see com.cisco.yangide.ext.model.ReferenceNode
+     * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getReferenceNode()
+     * @generated
+     */
+    int REFERENCE_NODE = 33;
+
+    /**
+     * The feature id for the '<em><b>Reference</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int REFERENCE_NODE__REFERENCE = 0;
+
+    /**
+     * The number of structural features of the '<em>Reference Node</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int REFERENCE_NODE_FEATURE_COUNT = 1;
+
+    /**
+     * The number of operations of the '<em>Reference Node</em>' class.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     * @ordered
+     */
+    int REFERENCE_NODE_OPERATION_COUNT = 0;
+
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.Module <em>Module</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Module</em>'.
+     * @see com.cisco.yangide.ext.model.Module
+     * @generated
+     */
+    EClass getModule();
+
+    /**
+     * Returns the meta object for the attribute '{@link com.cisco.yangide.ext.model.Module#getNamespace <em>Namespace</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for the attribute '<em>Namespace</em>'.
+     * @see com.cisco.yangide.ext.model.Module#getNamespace()
+     * @see #getModule()
+     * @generated
+     */
+    EAttribute getModule_Namespace();
+
+    /**
+     * Returns the meta object for the containment reference list '{@link com.cisco.yangide.ext.model.Module#getRevisions <em>Revisions</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for the containment reference list '<em>Revisions</em>'.
+     * @see com.cisco.yangide.ext.model.Module#getRevisions()
+     * @see #getModule()
+     * @generated
+     */
+    EReference getModule_Revisions();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.Grouping <em>Grouping</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Grouping</em>'.
+     * @see com.cisco.yangide.ext.model.Grouping
+     * @generated
+     */
+    EClass getGrouping();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.Leaf <em>Leaf</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Leaf</em>'.
+     * @see com.cisco.yangide.ext.model.Leaf
+     * @generated
+     */
+    EClass getLeaf();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.Container <em>Container</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Container</em>'.
+     * @see com.cisco.yangide.ext.model.Container
+     * @generated
+     */
+    EClass getContainer();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.Node <em>Node</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Node</em>'.
+     * @see com.cisco.yangide.ext.model.Node
+     * @generated
+     */
+    EClass getNode();
+
+    /**
+     * Returns the meta object for the reference '{@link com.cisco.yangide.ext.model.Node#getParent <em>Parent</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for the reference '<em>Parent</em>'.
+     * @see com.cisco.yangide.ext.model.Node#getParent()
+     * @see #getNode()
+     * @generated
+     */
+    EReference getNode_Parent();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.NamedNode <em>Named Node</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Named Node</em>'.
+     * @see com.cisco.yangide.ext.model.NamedNode
+     * @generated
+     */
+    EClass getNamedNode();
+
+    /**
+     * Returns the meta object for the attribute '{@link com.cisco.yangide.ext.model.NamedNode#getName <em>Name</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for the attribute '<em>Name</em>'.
+     * @see com.cisco.yangide.ext.model.NamedNode#getName()
+     * @see #getNamedNode()
+     * @generated
+     */
+    EAttribute getNamedNode_Name();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.ContainingNode <em>Containing Node</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Containing Node</em>'.
+     * @see com.cisco.yangide.ext.model.ContainingNode
+     * @generated
+     */
+    EClass getContainingNode();
+
+    /**
+     * Returns the meta object for the containment reference list '{@link com.cisco.yangide.ext.model.ContainingNode#getChildren <em>Children</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for the containment reference list '<em>Children</em>'.
+     * @see com.cisco.yangide.ext.model.ContainingNode#getChildren()
+     * @see #getContainingNode()
+     * @generated
+     */
+    EReference getContainingNode_Children();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.NamedContainingNode <em>Named Containing Node</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Named Containing Node</em>'.
+     * @see com.cisco.yangide.ext.model.NamedContainingNode
+     * @generated
+     */
+    EClass getNamedContainingNode();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.Submodule <em>Submodule</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Submodule</em>'.
+     * @see com.cisco.yangide.ext.model.Submodule
+     * @generated
+     */
+    EClass getSubmodule();
+
+    /**
+     * Returns the meta object for the reference '{@link com.cisco.yangide.ext.model.Submodule#getBelongsTo <em>Belongs To</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for the reference '<em>Belongs To</em>'.
+     * @see com.cisco.yangide.ext.model.Submodule#getBelongsTo()
+     * @see #getSubmodule()
+     * @generated
+     */
+    EReference getSubmodule_BelongsTo();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.Typedef <em>Typedef</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Typedef</em>'.
+     * @see com.cisco.yangide.ext.model.Typedef
+     * @generated
+     */
+    EClass getTypedef();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.Choice <em>Choice</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Choice</em>'.
+     * @see com.cisco.yangide.ext.model.Choice
+     * @generated
+     */
+    EClass getChoice();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.LeafList <em>Leaf List</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Leaf List</em>'.
+     * @see com.cisco.yangide.ext.model.LeafList
+     * @generated
+     */
+    EClass getLeafList();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.Anyxml <em>Anyxml</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Anyxml</em>'.
+     * @see com.cisco.yangide.ext.model.Anyxml
+     * @generated
+     */
+    EClass getAnyxml();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.Import <em>Import</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Import</em>'.
+     * @see com.cisco.yangide.ext.model.Import
+     * @generated
+     */
+    EClass getImport();
+
+    /**
+     * Returns the meta object for the attribute '{@link com.cisco.yangide.ext.model.Import#getPrefix <em>Prefix</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for the attribute '<em>Prefix</em>'.
+     * @see com.cisco.yangide.ext.model.Import#getPrefix()
+     * @see #getImport()
+     * @generated
+     */
+    EAttribute getImport_Prefix();
+
+    /**
+     * Returns the meta object for the attribute '{@link com.cisco.yangide.ext.model.Import#getRevisionDate <em>Revision Date</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for the attribute '<em>Revision Date</em>'.
+     * @see com.cisco.yangide.ext.model.Import#getRevisionDate()
+     * @see #getImport()
+     * @generated
+     */
+    EAttribute getImport_RevisionDate();
+
+    /**
+     * Returns the meta object for the attribute '{@link com.cisco.yangide.ext.model.Import#getModule <em>Module</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for the attribute '<em>Module</em>'.
+     * @see com.cisco.yangide.ext.model.Import#getModule()
+     * @see #getImport()
+     * @generated
+     */
+    EAttribute getImport_Module();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.Include <em>Include</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Include</em>'.
+     * @see com.cisco.yangide.ext.model.Include
+     * @generated
+     */
+    EClass getInclude();
+
+    /**
+     * Returns the meta object for the containment reference '{@link com.cisco.yangide.ext.model.Include#getSubmodule <em>Submodule</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for the containment reference '<em>Submodule</em>'.
+     * @see com.cisco.yangide.ext.model.Include#getSubmodule()
+     * @see #getInclude()
+     * @generated
+     */
+    EReference getInclude_Submodule();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.Revision <em>Revision</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Revision</em>'.
+     * @see com.cisco.yangide.ext.model.Revision
+     * @generated
+     */
+    EClass getRevision();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.BelongsTo <em>Belongs To</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Belongs To</em>'.
+     * @see com.cisco.yangide.ext.model.BelongsTo
+     * @generated
+     */
+    EClass getBelongsTo();
+
+    /**
+     * Returns the meta object for the reference '{@link com.cisco.yangide.ext.model.BelongsTo#getOwnerModule <em>Owner Module</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for the reference '<em>Owner Module</em>'.
+     * @see com.cisco.yangide.ext.model.BelongsTo#getOwnerModule()
+     * @see #getBelongsTo()
+     * @generated
+     */
+    EReference getBelongsTo_OwnerModule();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.List <em>List</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>List</em>'.
+     * @see com.cisco.yangide.ext.model.List
+     * @generated
+     */
+    EClass getList();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.Tag <em>Tag</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Tag</em>'.
+     * @see com.cisco.yangide.ext.model.Tag
+     * @generated
+     */
+    EClass getTag();
+
+    /**
+     * Returns the meta object for the attribute '{@link com.cisco.yangide.ext.model.Tag#getName <em>Name</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for the attribute '<em>Name</em>'.
+     * @see com.cisco.yangide.ext.model.Tag#getName()
+     * @see #getTag()
+     * @generated
+     */
+    EAttribute getTag_Name();
+
+    /**
+     * Returns the meta object for the attribute '{@link com.cisco.yangide.ext.model.Tag#getValue <em>Value</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for the attribute '<em>Value</em>'.
+     * @see com.cisco.yangide.ext.model.Tag#getValue()
+     * @see #getTag()
+     * @generated
+     */
+    EAttribute getTag_Value();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.TaggedNode <em>Tagged Node</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Tagged Node</em>'.
+     * @see com.cisco.yangide.ext.model.TaggedNode
+     * @generated
+     */
+    EClass getTaggedNode();
+
+    /**
+     * Returns the meta object for the containment reference list '{@link com.cisco.yangide.ext.model.TaggedNode#getTags <em>Tags</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for the containment reference list '<em>Tags</em>'.
+     * @see com.cisco.yangide.ext.model.TaggedNode#getTags()
+     * @see #getTaggedNode()
+     * @generated
+     */
+    EReference getTaggedNode_Tags();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.Uses <em>Uses</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Uses</em>'.
+     * @see com.cisco.yangide.ext.model.Uses
+     * @generated
+     */
+    EClass getUses();
+
+    /**
+     * Returns the meta object for the attribute '{@link com.cisco.yangide.ext.model.Uses#getQName <em>QName</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for the attribute '<em>QName</em>'.
+     * @see com.cisco.yangide.ext.model.Uses#getQName()
+     * @see #getUses()
+     * @generated
+     */
+    EAttribute getUses_QName();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.Rpc <em>Rpc</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Rpc</em>'.
+     * @see com.cisco.yangide.ext.model.Rpc
+     * @generated
+     */
+    EClass getRpc();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.RpcIO <em>Rpc IO</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Rpc IO</em>'.
+     * @see com.cisco.yangide.ext.model.RpcIO
+     * @generated
+     */
+    EClass getRpcIO();
+
+    /**
+     * Returns the meta object for the attribute '{@link com.cisco.yangide.ext.model.RpcIO#isInput <em>Input</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for the attribute '<em>Input</em>'.
+     * @see com.cisco.yangide.ext.model.RpcIO#isInput()
+     * @see #getRpcIO()
+     * @generated
+     */
+    EAttribute getRpcIO_Input();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.Notification <em>Notification</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Notification</em>'.
+     * @see com.cisco.yangide.ext.model.Notification
+     * @generated
+     */
+    EClass getNotification();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.Augment <em>Augment</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Augment</em>'.
+     * @see com.cisco.yangide.ext.model.Augment
+     * @generated
+     */
+    EClass getAugment();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.Extension <em>Extension</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Extension</em>'.
+     * @see com.cisco.yangide.ext.model.Extension
+     * @generated
+     */
+    EClass getExtension();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.Feature <em>Feature</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Feature</em>'.
+     * @see com.cisco.yangide.ext.model.Feature
+     * @generated
+     */
+    EClass getFeature();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.Deviation <em>Deviation</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Deviation</em>'.
+     * @see com.cisco.yangide.ext.model.Deviation
+     * @generated
+     */
+    EClass getDeviation();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.Identity <em>Identity</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Identity</em>'.
+     * @see com.cisco.yangide.ext.model.Identity
+     * @generated
+     */
+    EClass getIdentity();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.TypedNode <em>Typed Node</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Typed Node</em>'.
+     * @see com.cisco.yangide.ext.model.TypedNode
+     * @generated
+     */
+    EClass getTypedNode();
+
+    /**
+     * Returns the meta object for the containment reference '{@link com.cisco.yangide.ext.model.TypedNode#getType <em>Type</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for the containment reference '<em>Type</em>'.
+     * @see com.cisco.yangide.ext.model.TypedNode#getType()
+     * @see #getTypedNode()
+     * @generated
+     */
+    EReference getTypedNode_Type();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.ChoiceCase <em>Choice Case</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Choice Case</em>'.
+     * @see com.cisco.yangide.ext.model.ChoiceCase
+     * @generated
+     */
+    EClass getChoiceCase();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.ListKey <em>List Key</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>List Key</em>'.
+     * @see com.cisco.yangide.ext.model.ListKey
+     * @generated
+     */
+    EClass getListKey();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.Typeref <em>Typeref</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Typeref</em>'.
+     * @see com.cisco.yangide.ext.model.Typeref
+     * @generated
+     */
+    EClass getTyperef();
+
+    /**
+     * Returns the meta object for class '{@link com.cisco.yangide.ext.model.ReferenceNode <em>Reference Node</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for class '<em>Reference Node</em>'.
+     * @see com.cisco.yangide.ext.model.ReferenceNode
+     * @generated
+     */
+    EClass getReferenceNode();
+
+    /**
+     * Returns the meta object for the attribute '{@link com.cisco.yangide.ext.model.ReferenceNode#getReference <em>Reference</em>}'.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the meta object for the attribute '<em>Reference</em>'.
+     * @see com.cisco.yangide.ext.model.ReferenceNode#getReference()
+     * @see #getReferenceNode()
+     * @generated
+     */
+    EAttribute getReferenceNode_Reference();
+
+    /**
+     * Returns the factory that creates the instances of the model.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the factory that creates the instances of the model.
+     * @generated
+     */
+    ModelFactory getModelFactory();
+
+    /**
+     * <!-- begin-user-doc -->
+     * Defines literals for the meta objects that represent
+     * <ul>
+     *   <li>each class,</li>
+     *   <li>each feature of each class,</li>
+     *   <li>each operation of each class,</li>
+     *   <li>each enum,</li>
+     *   <li>and each data type</li>
+     * </ul>
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    interface Literals {
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.impl.ModuleImpl <em>Module</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.impl.ModuleImpl
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getModule()
+         * @generated
+         */
+        EClass MODULE = eINSTANCE.getModule();
+
+        /**
+         * The meta object literal for the '<em><b>Namespace</b></em>' attribute feature.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @generated
+         */
+        EAttribute MODULE__NAMESPACE = eINSTANCE.getModule_Namespace();
+
+        /**
+         * The meta object literal for the '<em><b>Revisions</b></em>' containment reference list feature.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @generated
+         */
+        EReference MODULE__REVISIONS = eINSTANCE.getModule_Revisions();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.impl.GroupingImpl <em>Grouping</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.impl.GroupingImpl
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getGrouping()
+         * @generated
+         */
+        EClass GROUPING = eINSTANCE.getGrouping();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.impl.LeafImpl <em>Leaf</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.impl.LeafImpl
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getLeaf()
+         * @generated
+         */
+        EClass LEAF = eINSTANCE.getLeaf();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.impl.ContainerImpl <em>Container</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.impl.ContainerImpl
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getContainer()
+         * @generated
+         */
+        EClass CONTAINER = eINSTANCE.getContainer();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.Node <em>Node</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.Node
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getNode()
+         * @generated
+         */
+        EClass NODE = eINSTANCE.getNode();
+
+        /**
+         * The meta object literal for the '<em><b>Parent</b></em>' reference feature.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @generated
+         */
+        EReference NODE__PARENT = eINSTANCE.getNode_Parent();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.NamedNode <em>Named Node</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.NamedNode
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getNamedNode()
+         * @generated
+         */
+        EClass NAMED_NODE = eINSTANCE.getNamedNode();
+
+        /**
+         * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @generated
+         */
+        EAttribute NAMED_NODE__NAME = eINSTANCE.getNamedNode_Name();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.ContainingNode <em>Containing Node</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.ContainingNode
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getContainingNode()
+         * @generated
+         */
+        EClass CONTAINING_NODE = eINSTANCE.getContainingNode();
+
+        /**
+         * The meta object literal for the '<em><b>Children</b></em>' containment reference list feature.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @generated
+         */
+        EReference CONTAINING_NODE__CHILDREN = eINSTANCE.getContainingNode_Children();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.NamedContainingNode <em>Named Containing Node</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.NamedContainingNode
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getNamedContainingNode()
+         * @generated
+         */
+        EClass NAMED_CONTAINING_NODE = eINSTANCE.getNamedContainingNode();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.impl.SubmoduleImpl <em>Submodule</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.impl.SubmoduleImpl
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getSubmodule()
+         * @generated
+         */
+        EClass SUBMODULE = eINSTANCE.getSubmodule();
+
+        /**
+         * The meta object literal for the '<em><b>Belongs To</b></em>' reference feature.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @generated
+         */
+        EReference SUBMODULE__BELONGS_TO = eINSTANCE.getSubmodule_BelongsTo();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.impl.TypedefImpl <em>Typedef</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.impl.TypedefImpl
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getTypedef()
+         * @generated
+         */
+        EClass TYPEDEF = eINSTANCE.getTypedef();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.impl.ChoiceImpl <em>Choice</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.impl.ChoiceImpl
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getChoice()
+         * @generated
+         */
+        EClass CHOICE = eINSTANCE.getChoice();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.impl.LeafListImpl <em>Leaf List</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.impl.LeafListImpl
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getLeafList()
+         * @generated
+         */
+        EClass LEAF_LIST = eINSTANCE.getLeafList();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.impl.AnyxmlImpl <em>Anyxml</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.impl.AnyxmlImpl
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getAnyxml()
+         * @generated
+         */
+        EClass ANYXML = eINSTANCE.getAnyxml();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.impl.ImportImpl <em>Import</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.impl.ImportImpl
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getImport()
+         * @generated
+         */
+        EClass IMPORT = eINSTANCE.getImport();
+
+        /**
+         * The meta object literal for the '<em><b>Prefix</b></em>' attribute feature.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @generated
+         */
+        EAttribute IMPORT__PREFIX = eINSTANCE.getImport_Prefix();
+
+        /**
+         * The meta object literal for the '<em><b>Revision Date</b></em>' attribute feature.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @generated
+         */
+        EAttribute IMPORT__REVISION_DATE = eINSTANCE.getImport_RevisionDate();
+
+        /**
+         * The meta object literal for the '<em><b>Module</b></em>' attribute feature.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @generated
+         */
+        EAttribute IMPORT__MODULE = eINSTANCE.getImport_Module();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.impl.IncludeImpl <em>Include</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.impl.IncludeImpl
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getInclude()
+         * @generated
+         */
+        EClass INCLUDE = eINSTANCE.getInclude();
+
+        /**
+         * The meta object literal for the '<em><b>Submodule</b></em>' containment reference feature.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @generated
+         */
+        EReference INCLUDE__SUBMODULE = eINSTANCE.getInclude_Submodule();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.impl.RevisionImpl <em>Revision</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.impl.RevisionImpl
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getRevision()
+         * @generated
+         */
+        EClass REVISION = eINSTANCE.getRevision();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.impl.BelongsToImpl <em>Belongs To</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.impl.BelongsToImpl
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getBelongsTo()
+         * @generated
+         */
+        EClass BELONGS_TO = eINSTANCE.getBelongsTo();
+
+        /**
+         * The meta object literal for the '<em><b>Owner Module</b></em>' reference feature.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @generated
+         */
+        EReference BELONGS_TO__OWNER_MODULE = eINSTANCE.getBelongsTo_OwnerModule();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.impl.ListImpl <em>List</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.impl.ListImpl
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getList()
+         * @generated
+         */
+        EClass LIST = eINSTANCE.getList();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.impl.TagImpl <em>Tag</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.impl.TagImpl
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getTag()
+         * @generated
+         */
+        EClass TAG = eINSTANCE.getTag();
+
+        /**
+         * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @generated
+         */
+        EAttribute TAG__NAME = eINSTANCE.getTag_Name();
+
+        /**
+         * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @generated
+         */
+        EAttribute TAG__VALUE = eINSTANCE.getTag_Value();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.TaggedNode <em>Tagged Node</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.TaggedNode
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getTaggedNode()
+         * @generated
+         */
+        EClass TAGGED_NODE = eINSTANCE.getTaggedNode();
+
+        /**
+         * The meta object literal for the '<em><b>Tags</b></em>' containment reference list feature.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @generated
+         */
+        EReference TAGGED_NODE__TAGS = eINSTANCE.getTaggedNode_Tags();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.impl.UsesImpl <em>Uses</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.impl.UsesImpl
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getUses()
+         * @generated
+         */
+        EClass USES = eINSTANCE.getUses();
+
+        /**
+         * The meta object literal for the '<em><b>QName</b></em>' attribute feature.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @generated
+         */
+        EAttribute USES__QNAME = eINSTANCE.getUses_QName();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.impl.RpcImpl <em>Rpc</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.impl.RpcImpl
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getRpc()
+         * @generated
+         */
+        EClass RPC = eINSTANCE.getRpc();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.impl.RpcIOImpl <em>Rpc IO</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.impl.RpcIOImpl
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getRpcIO()
+         * @generated
+         */
+        EClass RPC_IO = eINSTANCE.getRpcIO();
+
+        /**
+         * The meta object literal for the '<em><b>Input</b></em>' attribute feature.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @generated
+         */
+        EAttribute RPC_IO__INPUT = eINSTANCE.getRpcIO_Input();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.impl.NotificationImpl <em>Notification</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.impl.NotificationImpl
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getNotification()
+         * @generated
+         */
+        EClass NOTIFICATION = eINSTANCE.getNotification();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.impl.AugmentImpl <em>Augment</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.impl.AugmentImpl
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getAugment()
+         * @generated
+         */
+        EClass AUGMENT = eINSTANCE.getAugment();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.impl.ExtensionImpl <em>Extension</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.impl.ExtensionImpl
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getExtension()
+         * @generated
+         */
+        EClass EXTENSION = eINSTANCE.getExtension();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.impl.FeatureImpl <em>Feature</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.impl.FeatureImpl
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getFeature()
+         * @generated
+         */
+        EClass FEATURE = eINSTANCE.getFeature();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.impl.DeviationImpl <em>Deviation</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.impl.DeviationImpl
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getDeviation()
+         * @generated
+         */
+        EClass DEVIATION = eINSTANCE.getDeviation();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.impl.IdentityImpl <em>Identity</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.impl.IdentityImpl
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getIdentity()
+         * @generated
+         */
+        EClass IDENTITY = eINSTANCE.getIdentity();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.TypedNode <em>Typed Node</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.TypedNode
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getTypedNode()
+         * @generated
+         */
+        EClass TYPED_NODE = eINSTANCE.getTypedNode();
+
+        /**
+         * The meta object literal for the '<em><b>Type</b></em>' containment reference feature.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @generated
+         */
+        EReference TYPED_NODE__TYPE = eINSTANCE.getTypedNode_Type();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.impl.ChoiceCaseImpl <em>Choice Case</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.impl.ChoiceCaseImpl
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getChoiceCase()
+         * @generated
+         */
+        EClass CHOICE_CASE = eINSTANCE.getChoiceCase();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.impl.ListKeyImpl <em>List Key</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.impl.ListKeyImpl
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getListKey()
+         * @generated
+         */
+        EClass LIST_KEY = eINSTANCE.getListKey();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.impl.TyperefImpl <em>Typeref</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.impl.TyperefImpl
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getTyperef()
+         * @generated
+         */
+        EClass TYPEREF = eINSTANCE.getTyperef();
+
+        /**
+         * The meta object literal for the '{@link com.cisco.yangide.ext.model.ReferenceNode <em>Reference Node</em>}' class.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @see com.cisco.yangide.ext.model.ReferenceNode
+         * @see com.cisco.yangide.ext.model.impl.ModelPackageImpl#getReferenceNode()
+         * @generated
+         */
+        EClass REFERENCE_NODE = eINSTANCE.getReferenceNode();
+
+        /**
+         * The meta object literal for the '<em><b>Reference</b></em>' attribute feature.
+         * <!-- begin-user-doc -->
+         * <!-- end-user-doc -->
+         * @generated
+         */
+        EAttribute REFERENCE_NODE__REFERENCE = eINSTANCE.getReferenceNode_Reference();
+
+    }
+
+} //ModelPackage
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Module.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Module.java
new file mode 100644 (file)
index 0000000..f8652ad
--- /dev/null
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Module</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.Module#getNamespace <em>Namespace</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.Module#getRevisions <em>Revisions</em>}</li>
+ * </ul>
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getModule()
+ * @model
+ * @generated
+ */
+public interface Module extends NamedContainingNode, TaggedNode {
+    /**
+     * Returns the value of the '<em><b>Namespace</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <p>
+     * If the meaning of the '<em>Namespace</em>' attribute isn't clear,
+     * there really should be more of a description here...
+     * </p>
+     * <!-- end-user-doc -->
+     * @return the value of the '<em>Namespace</em>' attribute.
+     * @see #setNamespace(String)
+     * @see com.cisco.yangide.ext.model.ModelPackage#getModule_Namespace()
+     * @model required="true"
+     * @generated
+     */
+    String getNamespace();
+
+    /**
+     * Sets the value of the '{@link com.cisco.yangide.ext.model.Module#getNamespace <em>Namespace</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @param value the new value of the '<em>Namespace</em>' attribute.
+     * @see #getNamespace()
+     * @generated
+     */
+    void setNamespace(String value);
+
+    /**
+     * Returns the value of the '<em><b>Revisions</b></em>' containment reference list.
+     * The list contents are of type {@link com.cisco.yangide.ext.model.Revision}.
+     * <!-- begin-user-doc -->
+     * <p>
+     * If the meaning of the '<em>Revisions</em>' containment reference list isn't clear,
+     * there really should be more of a description here...
+     * </p>
+     * <!-- end-user-doc -->
+     * @return the value of the '<em>Revisions</em>' containment reference list.
+     * @see com.cisco.yangide.ext.model.ModelPackage#getModule_Revisions()
+     * @model containment="true"
+     * @generated
+     */
+    EList<Revision> getRevisions();
+
+} // Module
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/NamedContainingNode.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/NamedContainingNode.java
new file mode 100644 (file)
index 0000000..496d702
--- /dev/null
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Named Containing Node</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getNamedContainingNode()
+ * @model interface="true" abstract="true"
+ * @generated
+ */
+public interface NamedContainingNode extends NamedNode, ContainingNode {
+} // NamedContainingNode
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/NamedNode.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/NamedNode.java
new file mode 100644 (file)
index 0000000..688b817
--- /dev/null
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Named Node</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.NamedNode#getName <em>Name</em>}</li>
+ * </ul>
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getNamedNode()
+ * @model interface="true" abstract="true"
+ * @generated
+ */
+public interface NamedNode extends Node {
+    /**
+     * Returns the value of the '<em><b>Name</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <p>
+     * If the meaning of the '<em>Name</em>' attribute isn't clear,
+     * there really should be more of a description here...
+     * </p>
+     * <!-- end-user-doc -->
+     * @return the value of the '<em>Name</em>' attribute.
+     * @see #setName(String)
+     * @see com.cisco.yangide.ext.model.ModelPackage#getNamedNode_Name()
+     * @model
+     * @generated
+     */
+    String getName();
+
+    /**
+     * Sets the value of the '{@link com.cisco.yangide.ext.model.NamedNode#getName <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @param value the new value of the '<em>Name</em>' attribute.
+     * @see #getName()
+     * @generated
+     */
+    void setName(String value);
+
+} // NamedNode
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Node.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Node.java
new file mode 100644 (file)
index 0000000..c7e0405
--- /dev/null
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Node</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.Node#getParent <em>Parent</em>}</li>
+ * </ul>
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getNode()
+ * @model interface="true" abstract="true"
+ * @generated
+ */
+public interface Node extends EObject {
+    /**
+     * Returns the value of the '<em><b>Parent</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <p>
+     * If the meaning of the '<em>Parent</em>' reference isn't clear,
+     * there really should be more of a description here...
+     * </p>
+     * <!-- end-user-doc -->
+     * @return the value of the '<em>Parent</em>' reference.
+     * @see #setParent(Node)
+     * @see com.cisco.yangide.ext.model.ModelPackage#getNode_Parent()
+     * @model
+     * @generated
+     */
+    Node getParent();
+
+    /**
+     * Sets the value of the '{@link com.cisco.yangide.ext.model.Node#getParent <em>Parent</em>}' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @param value the new value of the '<em>Parent</em>' reference.
+     * @see #getParent()
+     * @generated
+     */
+    void setParent(Node value);
+
+} // Node
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Notification.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Notification.java
new file mode 100644 (file)
index 0000000..8df98bf
--- /dev/null
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Notification</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getNotification()
+ * @model
+ * @generated
+ */
+public interface Notification extends NamedContainingNode {
+} // Notification
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/ReferenceNode.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/ReferenceNode.java
new file mode 100644 (file)
index 0000000..d7b1eb8
--- /dev/null
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Reference Node</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.ReferenceNode#getReference <em>Reference</em>}</li>
+ * </ul>
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getReferenceNode()
+ * @model interface="true" abstract="true"
+ * @generated
+ */
+public interface ReferenceNode extends EObject {
+    /**
+     * Returns the value of the '<em><b>Reference</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <p>
+     * If the meaning of the '<em>Reference</em>' attribute isn't clear,
+     * there really should be more of a description here...
+     * </p>
+     * <!-- end-user-doc -->
+     * @return the value of the '<em>Reference</em>' attribute.
+     * @see #setReference(String)
+     * @see com.cisco.yangide.ext.model.ModelPackage#getReferenceNode_Reference()
+     * @model dataType="org.eclipse.emf.ecore.xml.type.String"
+     * @generated
+     */
+    String getReference();
+
+    /**
+     * Sets the value of the '{@link com.cisco.yangide.ext.model.ReferenceNode#getReference <em>Reference</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @param value the new value of the '<em>Reference</em>' attribute.
+     * @see #getReference()
+     * @generated
+     */
+    void setReference(String value);
+
+} // ReferenceNode
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Revision.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Revision.java
new file mode 100644 (file)
index 0000000..87b83d7
--- /dev/null
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Revision</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getRevision()
+ * @model
+ * @generated
+ */
+public interface Revision extends TaggedNode, NamedNode {
+} // Revision
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Rpc.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Rpc.java
new file mode 100644 (file)
index 0000000..7995b26
--- /dev/null
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Rpc</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getRpc()
+ * @model
+ * @generated
+ */
+public interface Rpc extends NamedContainingNode, TaggedNode {
+} // Rpc
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/RpcIO.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/RpcIO.java
new file mode 100644 (file)
index 0000000..1f980ef
--- /dev/null
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Rpc IO</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.RpcIO#isInput <em>Input</em>}</li>
+ * </ul>
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getRpcIO()
+ * @model
+ * @generated
+ */
+public interface RpcIO extends ContainingNode {
+    /**
+     * Returns the value of the '<em><b>Input</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <p>
+     * If the meaning of the '<em>Input</em>' attribute isn't clear,
+     * there really should be more of a description here...
+     * </p>
+     * <!-- end-user-doc -->
+     * @return the value of the '<em>Input</em>' attribute.
+     * @see #setInput(boolean)
+     * @see com.cisco.yangide.ext.model.ModelPackage#getRpcIO_Input()
+     * @model dataType="org.eclipse.emf.ecore.xml.type.Boolean"
+     * @generated
+     */
+    boolean isInput();
+
+    /**
+     * Sets the value of the '{@link com.cisco.yangide.ext.model.RpcIO#isInput <em>Input</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @param value the new value of the '<em>Input</em>' attribute.
+     * @see #isInput()
+     * @generated
+     */
+    void setInput(boolean value);
+
+} // RpcIO
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Submodule.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Submodule.java
new file mode 100644 (file)
index 0000000..3c47b8a
--- /dev/null
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Submodule</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.Submodule#getBelongsTo <em>Belongs To</em>}</li>
+ * </ul>
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getSubmodule()
+ * @model
+ * @generated
+ */
+public interface Submodule extends Module {
+    /**
+     * Returns the value of the '<em><b>Belongs To</b></em>' reference.
+     * <!-- begin-user-doc -->
+     * <p>
+     * If the meaning of the '<em>Belongs To</em>' reference isn't clear,
+     * there really should be more of a description here...
+     * </p>
+     * <!-- end-user-doc -->
+     * @return the value of the '<em>Belongs To</em>' reference.
+     * @see #setBelongsTo(BelongsTo)
+     * @see com.cisco.yangide.ext.model.ModelPackage#getSubmodule_BelongsTo()
+     * @model required="true"
+     * @generated
+     */
+    BelongsTo getBelongsTo();
+
+    /**
+     * Sets the value of the '{@link com.cisco.yangide.ext.model.Submodule#getBelongsTo <em>Belongs To</em>}' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @param value the new value of the '<em>Belongs To</em>' reference.
+     * @see #getBelongsTo()
+     * @generated
+     */
+    void setBelongsTo(BelongsTo value);
+
+} // Submodule
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Tag.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Tag.java
new file mode 100644 (file)
index 0000000..2468980
--- /dev/null
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Tag</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.Tag#getName <em>Name</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.Tag#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getTag()
+ * @model
+ * @generated
+ */
+public interface Tag extends EObject {
+    /**
+     * Returns the value of the '<em><b>Name</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <p>
+     * If the meaning of the '<em>Name</em>' attribute isn't clear,
+     * there really should be more of a description here...
+     * </p>
+     * <!-- end-user-doc -->
+     * @return the value of the '<em>Name</em>' attribute.
+     * @see #setName(String)
+     * @see com.cisco.yangide.ext.model.ModelPackage#getTag_Name()
+     * @model
+     * @generated
+     */
+    String getName();
+
+    /**
+     * Sets the value of the '{@link com.cisco.yangide.ext.model.Tag#getName <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @param value the new value of the '<em>Name</em>' attribute.
+     * @see #getName()
+     * @generated
+     */
+    void setName(String value);
+
+    /**
+     * Returns the value of the '<em><b>Value</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <p>
+     * If the meaning of the '<em>Value</em>' attribute isn't clear,
+     * there really should be more of a description here...
+     * </p>
+     * <!-- end-user-doc -->
+     * @return the value of the '<em>Value</em>' attribute.
+     * @see #setValue(Object)
+     * @see com.cisco.yangide.ext.model.ModelPackage#getTag_Value()
+     * @model
+     * @generated
+     */
+    Object getValue();
+
+    /**
+     * Sets the value of the '{@link com.cisco.yangide.ext.model.Tag#getValue <em>Value</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @param value the new value of the '<em>Value</em>' attribute.
+     * @see #getValue()
+     * @generated
+     */
+    void setValue(Object value);
+
+} // Tag
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/TaggedNode.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/TaggedNode.java
new file mode 100644 (file)
index 0000000..90c983f
--- /dev/null
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Tagged Node</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.TaggedNode#getTags <em>Tags</em>}</li>
+ * </ul>
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getTaggedNode()
+ * @model interface="true" abstract="true"
+ * @generated
+ */
+public interface TaggedNode extends EObject {
+    /**
+     * Returns the value of the '<em><b>Tags</b></em>' containment reference list.
+     * The list contents are of type {@link com.cisco.yangide.ext.model.Tag}.
+     * <!-- begin-user-doc -->
+     * <p>
+     * If the meaning of the '<em>Tags</em>' containment reference list isn't clear,
+     * there really should be more of a description here...
+     * </p>
+     * <!-- end-user-doc -->
+     * @return the value of the '<em>Tags</em>' containment reference list.
+     * @see com.cisco.yangide.ext.model.ModelPackage#getTaggedNode_Tags()
+     * @model containment="true"
+     * @generated
+     */
+    EList<Tag> getTags();
+
+} // TaggedNode
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/TypedNode.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/TypedNode.java
new file mode 100644 (file)
index 0000000..428e37d
--- /dev/null
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Typed Node</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.TypedNode#getType <em>Type</em>}</li>
+ * </ul>
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getTypedNode()
+ * @model interface="true" abstract="true"
+ * @generated
+ */
+public interface TypedNode extends EObject {
+    /**
+     * Returns the value of the '<em><b>Type</b></em>' containment reference.
+     * <!-- begin-user-doc -->
+     * <p>
+     * If the meaning of the '<em>Type</em>' containment reference isn't clear,
+     * there really should be more of a description here...
+     * </p>
+     * <!-- end-user-doc -->
+     * @return the value of the '<em>Type</em>' containment reference.
+     * @see #setType(Typeref)
+     * @see com.cisco.yangide.ext.model.ModelPackage#getTypedNode_Type()
+     * @model containment="true"
+     * @generated
+     */
+    Typeref getType();
+
+    /**
+     * Sets the value of the '{@link com.cisco.yangide.ext.model.TypedNode#getType <em>Type</em>}' containment reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @param value the new value of the '<em>Type</em>' containment reference.
+     * @see #getType()
+     * @generated
+     */
+    void setType(Typeref value);
+
+} // TypedNode
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Typedef.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Typedef.java
new file mode 100644 (file)
index 0000000..48925d0
--- /dev/null
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Typedef</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getTypedef()
+ * @model
+ * @generated
+ */
+public interface Typedef extends NamedNode, TaggedNode, TypedNode {
+} // Typedef
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Typeref.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Typeref.java
new file mode 100644 (file)
index 0000000..18db3ef
--- /dev/null
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Typeref</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getTyperef()
+ * @model
+ * @generated
+ */
+public interface Typeref extends NamedNode {
+} // Typeref
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Uses.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/Uses.java
new file mode 100644 (file)
index 0000000..66bfa5e
--- /dev/null
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Uses</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.Uses#getQName <em>QName</em>}</li>
+ * </ul>
+ *
+ * @see com.cisco.yangide.ext.model.ModelPackage#getUses()
+ * @model
+ * @generated
+ */
+public interface Uses extends Node {
+    /**
+     * Returns the value of the '<em><b>QName</b></em>' attribute.
+     * <!-- begin-user-doc -->
+     * <p>
+     * If the meaning of the '<em>QName</em>' attribute isn't clear,
+     * there really should be more of a description here...
+     * </p>
+     * <!-- end-user-doc -->
+     * @return the value of the '<em>QName</em>' attribute.
+     * @see #setQName(String)
+     * @see com.cisco.yangide.ext.model.ModelPackage#getUses_QName()
+     * @model dataType="org.eclipse.emf.ecore.xml.type.String"
+     * @generated
+     */
+    String getQName();
+
+    /**
+     * Sets the value of the '{@link com.cisco.yangide.ext.model.Uses#getQName <em>QName</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @param value the new value of the '<em>QName</em>' attribute.
+     * @see #getQName()
+     * @generated
+     */
+    void setQName(String value);
+
+} // Uses
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/AnyxmlImpl.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/AnyxmlImpl.java
new file mode 100644 (file)
index 0000000..ee5518c
--- /dev/null
@@ -0,0 +1,321 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.impl;
+
+import com.cisco.yangide.ext.model.Anyxml;
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Node;
+import com.cisco.yangide.ext.model.Tag;
+import com.cisco.yangide.ext.model.TaggedNode;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Anyxml</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.AnyxmlImpl#getParent <em>Parent</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.AnyxmlImpl#getName <em>Name</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.AnyxmlImpl#getTags <em>Tags</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class AnyxmlImpl extends MinimalEObjectImpl.Container implements Anyxml {
+    /**
+     * The cached value of the '{@link #getParent() <em>Parent</em>}' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getParent()
+     * @generated
+     * @ordered
+     */
+    protected Node parent;
+
+    /**
+     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected static final String NAME_EDEFAULT = null;
+
+    /**
+     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected String name = NAME_EDEFAULT;
+
+    /**
+     * The cached value of the '{@link #getTags() <em>Tags</em>}' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getTags()
+     * @generated
+     * @ordered
+     */
+    protected EList<Tag> tags;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected AnyxmlImpl() {
+        super();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected EClass eStaticClass() {
+        return ModelPackage.Literals.ANYXML;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node getParent() {
+        if (parent != null && parent.eIsProxy()) {
+            InternalEObject oldParent = (InternalEObject)parent;
+            parent = (Node)eResolveProxy(oldParent);
+            if (parent != oldParent) {
+                if (eNotificationRequired())
+                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, ModelPackage.ANYXML__PARENT, oldParent, parent));
+            }
+        }
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node basicGetParent() {
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setParent(Node newParent) {
+        Node oldParent = parent;
+        parent = newParent;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.ANYXML__PARENT, oldParent, parent));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setName(String newName) {
+        String oldName = name;
+        name = newName;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.ANYXML__NAME, oldName, name));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EList<Tag> getTags() {
+        if (tags == null) {
+            tags = new EObjectContainmentEList<Tag>(Tag.class, this, ModelPackage.ANYXML__TAGS);
+        }
+        return tags;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+        switch (featureID) {
+            case ModelPackage.ANYXML__TAGS:
+                return ((InternalEList<?>)getTags()).basicRemove(otherEnd, msgs);
+        }
+        return super.eInverseRemove(otherEnd, featureID, msgs);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object eGet(int featureID, boolean resolve, boolean coreType) {
+        switch (featureID) {
+            case ModelPackage.ANYXML__PARENT:
+                if (resolve) return getParent();
+                return basicGetParent();
+            case ModelPackage.ANYXML__NAME:
+                return getName();
+            case ModelPackage.ANYXML__TAGS:
+                return getTags();
+        }
+        return super.eGet(featureID, resolve, coreType);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @SuppressWarnings("unchecked")
+    @Override
+    public void eSet(int featureID, Object newValue) {
+        switch (featureID) {
+            case ModelPackage.ANYXML__PARENT:
+                setParent((Node)newValue);
+                return;
+            case ModelPackage.ANYXML__NAME:
+                setName((String)newValue);
+                return;
+            case ModelPackage.ANYXML__TAGS:
+                getTags().clear();
+                getTags().addAll((Collection<? extends Tag>)newValue);
+                return;
+        }
+        super.eSet(featureID, newValue);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eUnset(int featureID) {
+        switch (featureID) {
+            case ModelPackage.ANYXML__PARENT:
+                setParent((Node)null);
+                return;
+            case ModelPackage.ANYXML__NAME:
+                setName(NAME_EDEFAULT);
+                return;
+            case ModelPackage.ANYXML__TAGS:
+                getTags().clear();
+                return;
+        }
+        super.eUnset(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public boolean eIsSet(int featureID) {
+        switch (featureID) {
+            case ModelPackage.ANYXML__PARENT:
+                return parent != null;
+            case ModelPackage.ANYXML__NAME:
+                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+            case ModelPackage.ANYXML__TAGS:
+                return tags != null && !tags.isEmpty();
+        }
+        return super.eIsSet(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
+        if (baseClass == TaggedNode.class) {
+            switch (derivedFeatureID) {
+                case ModelPackage.ANYXML__TAGS: return ModelPackage.TAGGED_NODE__TAGS;
+                default: return -1;
+            }
+        }
+        return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
+        if (baseClass == TaggedNode.class) {
+            switch (baseFeatureID) {
+                case ModelPackage.TAGGED_NODE__TAGS: return ModelPackage.ANYXML__TAGS;
+                default: return -1;
+            }
+        }
+        return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public String toString() {
+        if (eIsProxy()) return super.toString();
+
+        StringBuffer result = new StringBuffer(super.toString());
+        result.append(" (name: ");
+        result.append(name);
+        result.append(')');
+        return result.toString();
+    }
+
+} //AnyxmlImpl
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/AugmentImpl.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/AugmentImpl.java
new file mode 100644 (file)
index 0000000..ca82a9b
--- /dev/null
@@ -0,0 +1,320 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.impl;
+
+import com.cisco.yangide.ext.model.Augment;
+import com.cisco.yangide.ext.model.ContainingNode;
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Node;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Augment</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.AugmentImpl#getParent <em>Parent</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.AugmentImpl#getName <em>Name</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.AugmentImpl#getChildren <em>Children</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class AugmentImpl extends MinimalEObjectImpl.Container implements Augment {
+    /**
+     * The cached value of the '{@link #getParent() <em>Parent</em>}' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getParent()
+     * @generated
+     * @ordered
+     */
+    protected Node parent;
+
+    /**
+     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected static final String NAME_EDEFAULT = null;
+
+    /**
+     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected String name = NAME_EDEFAULT;
+
+    /**
+     * The cached value of the '{@link #getChildren() <em>Children</em>}' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getChildren()
+     * @generated
+     * @ordered
+     */
+    protected EList<Node> children;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected AugmentImpl() {
+        super();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected EClass eStaticClass() {
+        return ModelPackage.Literals.AUGMENT;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node getParent() {
+        if (parent != null && parent.eIsProxy()) {
+            InternalEObject oldParent = (InternalEObject)parent;
+            parent = (Node)eResolveProxy(oldParent);
+            if (parent != oldParent) {
+                if (eNotificationRequired())
+                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, ModelPackage.AUGMENT__PARENT, oldParent, parent));
+            }
+        }
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node basicGetParent() {
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setParent(Node newParent) {
+        Node oldParent = parent;
+        parent = newParent;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.AUGMENT__PARENT, oldParent, parent));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setName(String newName) {
+        String oldName = name;
+        name = newName;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.AUGMENT__NAME, oldName, name));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EList<Node> getChildren() {
+        if (children == null) {
+            children = new EObjectContainmentEList<Node>(Node.class, this, ModelPackage.AUGMENT__CHILDREN);
+        }
+        return children;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+        switch (featureID) {
+            case ModelPackage.AUGMENT__CHILDREN:
+                return ((InternalEList<?>)getChildren()).basicRemove(otherEnd, msgs);
+        }
+        return super.eInverseRemove(otherEnd, featureID, msgs);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object eGet(int featureID, boolean resolve, boolean coreType) {
+        switch (featureID) {
+            case ModelPackage.AUGMENT__PARENT:
+                if (resolve) return getParent();
+                return basicGetParent();
+            case ModelPackage.AUGMENT__NAME:
+                return getName();
+            case ModelPackage.AUGMENT__CHILDREN:
+                return getChildren();
+        }
+        return super.eGet(featureID, resolve, coreType);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @SuppressWarnings("unchecked")
+    @Override
+    public void eSet(int featureID, Object newValue) {
+        switch (featureID) {
+            case ModelPackage.AUGMENT__PARENT:
+                setParent((Node)newValue);
+                return;
+            case ModelPackage.AUGMENT__NAME:
+                setName((String)newValue);
+                return;
+            case ModelPackage.AUGMENT__CHILDREN:
+                getChildren().clear();
+                getChildren().addAll((Collection<? extends Node>)newValue);
+                return;
+        }
+        super.eSet(featureID, newValue);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eUnset(int featureID) {
+        switch (featureID) {
+            case ModelPackage.AUGMENT__PARENT:
+                setParent((Node)null);
+                return;
+            case ModelPackage.AUGMENT__NAME:
+                setName(NAME_EDEFAULT);
+                return;
+            case ModelPackage.AUGMENT__CHILDREN:
+                getChildren().clear();
+                return;
+        }
+        super.eUnset(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public boolean eIsSet(int featureID) {
+        switch (featureID) {
+            case ModelPackage.AUGMENT__PARENT:
+                return parent != null;
+            case ModelPackage.AUGMENT__NAME:
+                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+            case ModelPackage.AUGMENT__CHILDREN:
+                return children != null && !children.isEmpty();
+        }
+        return super.eIsSet(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
+        if (baseClass == ContainingNode.class) {
+            switch (derivedFeatureID) {
+                case ModelPackage.AUGMENT__CHILDREN: return ModelPackage.CONTAINING_NODE__CHILDREN;
+                default: return -1;
+            }
+        }
+        return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
+        if (baseClass == ContainingNode.class) {
+            switch (baseFeatureID) {
+                case ModelPackage.CONTAINING_NODE__CHILDREN: return ModelPackage.AUGMENT__CHILDREN;
+                default: return -1;
+            }
+        }
+        return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public String toString() {
+        if (eIsProxy()) return super.toString();
+
+        StringBuffer result = new StringBuffer(super.toString());
+        result.append(" (name: ");
+        result.append(name);
+        result.append(')');
+        return result.toString();
+    }
+
+} //AugmentImpl
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/BelongsToImpl.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/BelongsToImpl.java
new file mode 100644 (file)
index 0000000..eb643d1
--- /dev/null
@@ -0,0 +1,162 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.impl;
+
+import com.cisco.yangide.ext.model.BelongsTo;
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Module;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Belongs To</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.BelongsToImpl#getOwnerModule <em>Owner Module</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class BelongsToImpl extends MinimalEObjectImpl.Container implements BelongsTo {
+    /**
+     * The cached value of the '{@link #getOwnerModule() <em>Owner Module</em>}' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getOwnerModule()
+     * @generated
+     * @ordered
+     */
+    protected Module ownerModule;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected BelongsToImpl() {
+        super();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected EClass eStaticClass() {
+        return ModelPackage.Literals.BELONGS_TO;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Module getOwnerModule() {
+        if (ownerModule != null && ownerModule.eIsProxy()) {
+            InternalEObject oldOwnerModule = (InternalEObject)ownerModule;
+            ownerModule = (Module)eResolveProxy(oldOwnerModule);
+            if (ownerModule != oldOwnerModule) {
+                if (eNotificationRequired())
+                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, ModelPackage.BELONGS_TO__OWNER_MODULE, oldOwnerModule, ownerModule));
+            }
+        }
+        return ownerModule;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Module basicGetOwnerModule() {
+        return ownerModule;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setOwnerModule(Module newOwnerModule) {
+        Module oldOwnerModule = ownerModule;
+        ownerModule = newOwnerModule;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.BELONGS_TO__OWNER_MODULE, oldOwnerModule, ownerModule));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object eGet(int featureID, boolean resolve, boolean coreType) {
+        switch (featureID) {
+            case ModelPackage.BELONGS_TO__OWNER_MODULE:
+                if (resolve) return getOwnerModule();
+                return basicGetOwnerModule();
+        }
+        return super.eGet(featureID, resolve, coreType);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eSet(int featureID, Object newValue) {
+        switch (featureID) {
+            case ModelPackage.BELONGS_TO__OWNER_MODULE:
+                setOwnerModule((Module)newValue);
+                return;
+        }
+        super.eSet(featureID, newValue);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eUnset(int featureID) {
+        switch (featureID) {
+            case ModelPackage.BELONGS_TO__OWNER_MODULE:
+                setOwnerModule((Module)null);
+                return;
+        }
+        super.eUnset(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public boolean eIsSet(int featureID) {
+        switch (featureID) {
+            case ModelPackage.BELONGS_TO__OWNER_MODULE:
+                return ownerModule != null;
+        }
+        return super.eIsSet(featureID);
+    }
+
+} //BelongsToImpl
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/ChoiceCaseImpl.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/ChoiceCaseImpl.java
new file mode 100644 (file)
index 0000000..824a1e1
--- /dev/null
@@ -0,0 +1,370 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.impl;
+
+import com.cisco.yangide.ext.model.ChoiceCase;
+import com.cisco.yangide.ext.model.ContainingNode;
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Node;
+import com.cisco.yangide.ext.model.Tag;
+import com.cisco.yangide.ext.model.TaggedNode;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Choice Case</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.ChoiceCaseImpl#getParent <em>Parent</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.ChoiceCaseImpl#getName <em>Name</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.ChoiceCaseImpl#getChildren <em>Children</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.ChoiceCaseImpl#getTags <em>Tags</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ChoiceCaseImpl extends MinimalEObjectImpl.Container implements ChoiceCase {
+    /**
+     * The cached value of the '{@link #getParent() <em>Parent</em>}' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getParent()
+     * @generated
+     * @ordered
+     */
+    protected Node parent;
+
+    /**
+     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected static final String NAME_EDEFAULT = null;
+
+    /**
+     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected String name = NAME_EDEFAULT;
+
+    /**
+     * The cached value of the '{@link #getChildren() <em>Children</em>}' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getChildren()
+     * @generated
+     * @ordered
+     */
+    protected EList<Node> children;
+
+    /**
+     * The cached value of the '{@link #getTags() <em>Tags</em>}' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getTags()
+     * @generated
+     * @ordered
+     */
+    protected EList<Tag> tags;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected ChoiceCaseImpl() {
+        super();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected EClass eStaticClass() {
+        return ModelPackage.Literals.CHOICE_CASE;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node getParent() {
+        if (parent != null && parent.eIsProxy()) {
+            InternalEObject oldParent = (InternalEObject)parent;
+            parent = (Node)eResolveProxy(oldParent);
+            if (parent != oldParent) {
+                if (eNotificationRequired())
+                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, ModelPackage.CHOICE_CASE__PARENT, oldParent, parent));
+            }
+        }
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node basicGetParent() {
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setParent(Node newParent) {
+        Node oldParent = parent;
+        parent = newParent;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.CHOICE_CASE__PARENT, oldParent, parent));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setName(String newName) {
+        String oldName = name;
+        name = newName;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.CHOICE_CASE__NAME, oldName, name));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EList<Node> getChildren() {
+        if (children == null) {
+            children = new EObjectContainmentEList<Node>(Node.class, this, ModelPackage.CHOICE_CASE__CHILDREN);
+        }
+        return children;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EList<Tag> getTags() {
+        if (tags == null) {
+            tags = new EObjectContainmentEList<Tag>(Tag.class, this, ModelPackage.CHOICE_CASE__TAGS);
+        }
+        return tags;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+        switch (featureID) {
+            case ModelPackage.CHOICE_CASE__CHILDREN:
+                return ((InternalEList<?>)getChildren()).basicRemove(otherEnd, msgs);
+            case ModelPackage.CHOICE_CASE__TAGS:
+                return ((InternalEList<?>)getTags()).basicRemove(otherEnd, msgs);
+        }
+        return super.eInverseRemove(otherEnd, featureID, msgs);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object eGet(int featureID, boolean resolve, boolean coreType) {
+        switch (featureID) {
+            case ModelPackage.CHOICE_CASE__PARENT:
+                if (resolve) return getParent();
+                return basicGetParent();
+            case ModelPackage.CHOICE_CASE__NAME:
+                return getName();
+            case ModelPackage.CHOICE_CASE__CHILDREN:
+                return getChildren();
+            case ModelPackage.CHOICE_CASE__TAGS:
+                return getTags();
+        }
+        return super.eGet(featureID, resolve, coreType);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @SuppressWarnings("unchecked")
+    @Override
+    public void eSet(int featureID, Object newValue) {
+        switch (featureID) {
+            case ModelPackage.CHOICE_CASE__PARENT:
+                setParent((Node)newValue);
+                return;
+            case ModelPackage.CHOICE_CASE__NAME:
+                setName((String)newValue);
+                return;
+            case ModelPackage.CHOICE_CASE__CHILDREN:
+                getChildren().clear();
+                getChildren().addAll((Collection<? extends Node>)newValue);
+                return;
+            case ModelPackage.CHOICE_CASE__TAGS:
+                getTags().clear();
+                getTags().addAll((Collection<? extends Tag>)newValue);
+                return;
+        }
+        super.eSet(featureID, newValue);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eUnset(int featureID) {
+        switch (featureID) {
+            case ModelPackage.CHOICE_CASE__PARENT:
+                setParent((Node)null);
+                return;
+            case ModelPackage.CHOICE_CASE__NAME:
+                setName(NAME_EDEFAULT);
+                return;
+            case ModelPackage.CHOICE_CASE__CHILDREN:
+                getChildren().clear();
+                return;
+            case ModelPackage.CHOICE_CASE__TAGS:
+                getTags().clear();
+                return;
+        }
+        super.eUnset(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public boolean eIsSet(int featureID) {
+        switch (featureID) {
+            case ModelPackage.CHOICE_CASE__PARENT:
+                return parent != null;
+            case ModelPackage.CHOICE_CASE__NAME:
+                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+            case ModelPackage.CHOICE_CASE__CHILDREN:
+                return children != null && !children.isEmpty();
+            case ModelPackage.CHOICE_CASE__TAGS:
+                return tags != null && !tags.isEmpty();
+        }
+        return super.eIsSet(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
+        if (baseClass == ContainingNode.class) {
+            switch (derivedFeatureID) {
+                case ModelPackage.CHOICE_CASE__CHILDREN: return ModelPackage.CONTAINING_NODE__CHILDREN;
+                default: return -1;
+            }
+        }
+        if (baseClass == TaggedNode.class) {
+            switch (derivedFeatureID) {
+                case ModelPackage.CHOICE_CASE__TAGS: return ModelPackage.TAGGED_NODE__TAGS;
+                default: return -1;
+            }
+        }
+        return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
+        if (baseClass == ContainingNode.class) {
+            switch (baseFeatureID) {
+                case ModelPackage.CONTAINING_NODE__CHILDREN: return ModelPackage.CHOICE_CASE__CHILDREN;
+                default: return -1;
+            }
+        }
+        if (baseClass == TaggedNode.class) {
+            switch (baseFeatureID) {
+                case ModelPackage.TAGGED_NODE__TAGS: return ModelPackage.CHOICE_CASE__TAGS;
+                default: return -1;
+            }
+        }
+        return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public String toString() {
+        if (eIsProxy()) return super.toString();
+
+        StringBuffer result = new StringBuffer(super.toString());
+        result.append(" (name: ");
+        result.append(name);
+        result.append(')');
+        return result.toString();
+    }
+
+} //ChoiceCaseImpl
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/ChoiceImpl.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/ChoiceImpl.java
new file mode 100644 (file)
index 0000000..3ec3bec
--- /dev/null
@@ -0,0 +1,370 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.impl;
+
+import com.cisco.yangide.ext.model.Choice;
+import com.cisco.yangide.ext.model.ContainingNode;
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Node;
+import com.cisco.yangide.ext.model.Tag;
+import com.cisco.yangide.ext.model.TaggedNode;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Choice</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.ChoiceImpl#getParent <em>Parent</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.ChoiceImpl#getName <em>Name</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.ChoiceImpl#getChildren <em>Children</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.ChoiceImpl#getTags <em>Tags</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ChoiceImpl extends MinimalEObjectImpl.Container implements Choice {
+    /**
+     * The cached value of the '{@link #getParent() <em>Parent</em>}' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getParent()
+     * @generated
+     * @ordered
+     */
+    protected Node parent;
+
+    /**
+     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected static final String NAME_EDEFAULT = null;
+
+    /**
+     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected String name = NAME_EDEFAULT;
+
+    /**
+     * The cached value of the '{@link #getChildren() <em>Children</em>}' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getChildren()
+     * @generated
+     * @ordered
+     */
+    protected EList<Node> children;
+
+    /**
+     * The cached value of the '{@link #getTags() <em>Tags</em>}' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getTags()
+     * @generated
+     * @ordered
+     */
+    protected EList<Tag> tags;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected ChoiceImpl() {
+        super();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected EClass eStaticClass() {
+        return ModelPackage.Literals.CHOICE;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node getParent() {
+        if (parent != null && parent.eIsProxy()) {
+            InternalEObject oldParent = (InternalEObject)parent;
+            parent = (Node)eResolveProxy(oldParent);
+            if (parent != oldParent) {
+                if (eNotificationRequired())
+                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, ModelPackage.CHOICE__PARENT, oldParent, parent));
+            }
+        }
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node basicGetParent() {
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setParent(Node newParent) {
+        Node oldParent = parent;
+        parent = newParent;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.CHOICE__PARENT, oldParent, parent));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setName(String newName) {
+        String oldName = name;
+        name = newName;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.CHOICE__NAME, oldName, name));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EList<Node> getChildren() {
+        if (children == null) {
+            children = new EObjectContainmentEList<Node>(Node.class, this, ModelPackage.CHOICE__CHILDREN);
+        }
+        return children;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EList<Tag> getTags() {
+        if (tags == null) {
+            tags = new EObjectContainmentEList<Tag>(Tag.class, this, ModelPackage.CHOICE__TAGS);
+        }
+        return tags;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+        switch (featureID) {
+            case ModelPackage.CHOICE__CHILDREN:
+                return ((InternalEList<?>)getChildren()).basicRemove(otherEnd, msgs);
+            case ModelPackage.CHOICE__TAGS:
+                return ((InternalEList<?>)getTags()).basicRemove(otherEnd, msgs);
+        }
+        return super.eInverseRemove(otherEnd, featureID, msgs);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object eGet(int featureID, boolean resolve, boolean coreType) {
+        switch (featureID) {
+            case ModelPackage.CHOICE__PARENT:
+                if (resolve) return getParent();
+                return basicGetParent();
+            case ModelPackage.CHOICE__NAME:
+                return getName();
+            case ModelPackage.CHOICE__CHILDREN:
+                return getChildren();
+            case ModelPackage.CHOICE__TAGS:
+                return getTags();
+        }
+        return super.eGet(featureID, resolve, coreType);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @SuppressWarnings("unchecked")
+    @Override
+    public void eSet(int featureID, Object newValue) {
+        switch (featureID) {
+            case ModelPackage.CHOICE__PARENT:
+                setParent((Node)newValue);
+                return;
+            case ModelPackage.CHOICE__NAME:
+                setName((String)newValue);
+                return;
+            case ModelPackage.CHOICE__CHILDREN:
+                getChildren().clear();
+                getChildren().addAll((Collection<? extends Node>)newValue);
+                return;
+            case ModelPackage.CHOICE__TAGS:
+                getTags().clear();
+                getTags().addAll((Collection<? extends Tag>)newValue);
+                return;
+        }
+        super.eSet(featureID, newValue);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eUnset(int featureID) {
+        switch (featureID) {
+            case ModelPackage.CHOICE__PARENT:
+                setParent((Node)null);
+                return;
+            case ModelPackage.CHOICE__NAME:
+                setName(NAME_EDEFAULT);
+                return;
+            case ModelPackage.CHOICE__CHILDREN:
+                getChildren().clear();
+                return;
+            case ModelPackage.CHOICE__TAGS:
+                getTags().clear();
+                return;
+        }
+        super.eUnset(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public boolean eIsSet(int featureID) {
+        switch (featureID) {
+            case ModelPackage.CHOICE__PARENT:
+                return parent != null;
+            case ModelPackage.CHOICE__NAME:
+                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+            case ModelPackage.CHOICE__CHILDREN:
+                return children != null && !children.isEmpty();
+            case ModelPackage.CHOICE__TAGS:
+                return tags != null && !tags.isEmpty();
+        }
+        return super.eIsSet(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
+        if (baseClass == ContainingNode.class) {
+            switch (derivedFeatureID) {
+                case ModelPackage.CHOICE__CHILDREN: return ModelPackage.CONTAINING_NODE__CHILDREN;
+                default: return -1;
+            }
+        }
+        if (baseClass == TaggedNode.class) {
+            switch (derivedFeatureID) {
+                case ModelPackage.CHOICE__TAGS: return ModelPackage.TAGGED_NODE__TAGS;
+                default: return -1;
+            }
+        }
+        return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
+        if (baseClass == ContainingNode.class) {
+            switch (baseFeatureID) {
+                case ModelPackage.CONTAINING_NODE__CHILDREN: return ModelPackage.CHOICE__CHILDREN;
+                default: return -1;
+            }
+        }
+        if (baseClass == TaggedNode.class) {
+            switch (baseFeatureID) {
+                case ModelPackage.TAGGED_NODE__TAGS: return ModelPackage.CHOICE__TAGS;
+                default: return -1;
+            }
+        }
+        return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public String toString() {
+        if (eIsProxy()) return super.toString();
+
+        StringBuffer result = new StringBuffer(super.toString());
+        result.append(" (name: ");
+        result.append(name);
+        result.append(')');
+        return result.toString();
+    }
+
+} //ChoiceImpl
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/ContainerImpl.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/ContainerImpl.java
new file mode 100644 (file)
index 0000000..efc2a40
--- /dev/null
@@ -0,0 +1,369 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.impl;
+
+import com.cisco.yangide.ext.model.ContainingNode;
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Node;
+import com.cisco.yangide.ext.model.Tag;
+import com.cisco.yangide.ext.model.TaggedNode;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Container</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.ContainerImpl#getParent <em>Parent</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.ContainerImpl#getName <em>Name</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.ContainerImpl#getChildren <em>Children</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.ContainerImpl#getTags <em>Tags</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ContainerImpl extends MinimalEObjectImpl.Container implements com.cisco.yangide.ext.model.Container {
+    /**
+     * The cached value of the '{@link #getParent() <em>Parent</em>}' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getParent()
+     * @generated
+     * @ordered
+     */
+    protected Node parent;
+
+    /**
+     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected static final String NAME_EDEFAULT = null;
+
+    /**
+     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected String name = NAME_EDEFAULT;
+
+    /**
+     * The cached value of the '{@link #getChildren() <em>Children</em>}' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getChildren()
+     * @generated
+     * @ordered
+     */
+    protected EList<Node> children;
+
+    /**
+     * The cached value of the '{@link #getTags() <em>Tags</em>}' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getTags()
+     * @generated
+     * @ordered
+     */
+    protected EList<Tag> tags;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected ContainerImpl() {
+        super();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected EClass eStaticClass() {
+        return ModelPackage.Literals.CONTAINER;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node getParent() {
+        if (parent != null && parent.eIsProxy()) {
+            InternalEObject oldParent = (InternalEObject)parent;
+            parent = (Node)eResolveProxy(oldParent);
+            if (parent != oldParent) {
+                if (eNotificationRequired())
+                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, ModelPackage.CONTAINER__PARENT, oldParent, parent));
+            }
+        }
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node basicGetParent() {
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setParent(Node newParent) {
+        Node oldParent = parent;
+        parent = newParent;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.CONTAINER__PARENT, oldParent, parent));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setName(String newName) {
+        String oldName = name;
+        name = newName;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.CONTAINER__NAME, oldName, name));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EList<Node> getChildren() {
+        if (children == null) {
+            children = new EObjectContainmentEList<Node>(Node.class, this, ModelPackage.CONTAINER__CHILDREN);
+        }
+        return children;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EList<Tag> getTags() {
+        if (tags == null) {
+            tags = new EObjectContainmentEList<Tag>(Tag.class, this, ModelPackage.CONTAINER__TAGS);
+        }
+        return tags;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+        switch (featureID) {
+            case ModelPackage.CONTAINER__CHILDREN:
+                return ((InternalEList<?>)getChildren()).basicRemove(otherEnd, msgs);
+            case ModelPackage.CONTAINER__TAGS:
+                return ((InternalEList<?>)getTags()).basicRemove(otherEnd, msgs);
+        }
+        return super.eInverseRemove(otherEnd, featureID, msgs);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object eGet(int featureID, boolean resolve, boolean coreType) {
+        switch (featureID) {
+            case ModelPackage.CONTAINER__PARENT:
+                if (resolve) return getParent();
+                return basicGetParent();
+            case ModelPackage.CONTAINER__NAME:
+                return getName();
+            case ModelPackage.CONTAINER__CHILDREN:
+                return getChildren();
+            case ModelPackage.CONTAINER__TAGS:
+                return getTags();
+        }
+        return super.eGet(featureID, resolve, coreType);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @SuppressWarnings("unchecked")
+    @Override
+    public void eSet(int featureID, Object newValue) {
+        switch (featureID) {
+            case ModelPackage.CONTAINER__PARENT:
+                setParent((Node)newValue);
+                return;
+            case ModelPackage.CONTAINER__NAME:
+                setName((String)newValue);
+                return;
+            case ModelPackage.CONTAINER__CHILDREN:
+                getChildren().clear();
+                getChildren().addAll((Collection<? extends Node>)newValue);
+                return;
+            case ModelPackage.CONTAINER__TAGS:
+                getTags().clear();
+                getTags().addAll((Collection<? extends Tag>)newValue);
+                return;
+        }
+        super.eSet(featureID, newValue);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eUnset(int featureID) {
+        switch (featureID) {
+            case ModelPackage.CONTAINER__PARENT:
+                setParent((Node)null);
+                return;
+            case ModelPackage.CONTAINER__NAME:
+                setName(NAME_EDEFAULT);
+                return;
+            case ModelPackage.CONTAINER__CHILDREN:
+                getChildren().clear();
+                return;
+            case ModelPackage.CONTAINER__TAGS:
+                getTags().clear();
+                return;
+        }
+        super.eUnset(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public boolean eIsSet(int featureID) {
+        switch (featureID) {
+            case ModelPackage.CONTAINER__PARENT:
+                return parent != null;
+            case ModelPackage.CONTAINER__NAME:
+                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+            case ModelPackage.CONTAINER__CHILDREN:
+                return children != null && !children.isEmpty();
+            case ModelPackage.CONTAINER__TAGS:
+                return tags != null && !tags.isEmpty();
+        }
+        return super.eIsSet(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
+        if (baseClass == ContainingNode.class) {
+            switch (derivedFeatureID) {
+                case ModelPackage.CONTAINER__CHILDREN: return ModelPackage.CONTAINING_NODE__CHILDREN;
+                default: return -1;
+            }
+        }
+        if (baseClass == TaggedNode.class) {
+            switch (derivedFeatureID) {
+                case ModelPackage.CONTAINER__TAGS: return ModelPackage.TAGGED_NODE__TAGS;
+                default: return -1;
+            }
+        }
+        return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
+        if (baseClass == ContainingNode.class) {
+            switch (baseFeatureID) {
+                case ModelPackage.CONTAINING_NODE__CHILDREN: return ModelPackage.CONTAINER__CHILDREN;
+                default: return -1;
+            }
+        }
+        if (baseClass == TaggedNode.class) {
+            switch (baseFeatureID) {
+                case ModelPackage.TAGGED_NODE__TAGS: return ModelPackage.CONTAINER__TAGS;
+                default: return -1;
+            }
+        }
+        return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public String toString() {
+        if (eIsProxy()) return super.toString();
+
+        StringBuffer result = new StringBuffer(super.toString());
+        result.append(" (name: ");
+        result.append(name);
+        result.append(')');
+        return result.toString();
+    }
+
+} //ContainerImpl
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/DeviationImpl.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/DeviationImpl.java
new file mode 100644 (file)
index 0000000..2100c2a
--- /dev/null
@@ -0,0 +1,230 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.impl;
+
+import com.cisco.yangide.ext.model.Deviation;
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Node;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Deviation</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.DeviationImpl#getParent <em>Parent</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.DeviationImpl#getName <em>Name</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DeviationImpl extends MinimalEObjectImpl.Container implements Deviation {
+    /**
+     * The cached value of the '{@link #getParent() <em>Parent</em>}' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getParent()
+     * @generated
+     * @ordered
+     */
+    protected Node parent;
+
+    /**
+     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected static final String NAME_EDEFAULT = null;
+
+    /**
+     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected String name = NAME_EDEFAULT;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected DeviationImpl() {
+        super();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected EClass eStaticClass() {
+        return ModelPackage.Literals.DEVIATION;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node getParent() {
+        if (parent != null && parent.eIsProxy()) {
+            InternalEObject oldParent = (InternalEObject)parent;
+            parent = (Node)eResolveProxy(oldParent);
+            if (parent != oldParent) {
+                if (eNotificationRequired())
+                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, ModelPackage.DEVIATION__PARENT, oldParent, parent));
+            }
+        }
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node basicGetParent() {
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setParent(Node newParent) {
+        Node oldParent = parent;
+        parent = newParent;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.DEVIATION__PARENT, oldParent, parent));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setName(String newName) {
+        String oldName = name;
+        name = newName;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.DEVIATION__NAME, oldName, name));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object eGet(int featureID, boolean resolve, boolean coreType) {
+        switch (featureID) {
+            case ModelPackage.DEVIATION__PARENT:
+                if (resolve) return getParent();
+                return basicGetParent();
+            case ModelPackage.DEVIATION__NAME:
+                return getName();
+        }
+        return super.eGet(featureID, resolve, coreType);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eSet(int featureID, Object newValue) {
+        switch (featureID) {
+            case ModelPackage.DEVIATION__PARENT:
+                setParent((Node)newValue);
+                return;
+            case ModelPackage.DEVIATION__NAME:
+                setName((String)newValue);
+                return;
+        }
+        super.eSet(featureID, newValue);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eUnset(int featureID) {
+        switch (featureID) {
+            case ModelPackage.DEVIATION__PARENT:
+                setParent((Node)null);
+                return;
+            case ModelPackage.DEVIATION__NAME:
+                setName(NAME_EDEFAULT);
+                return;
+        }
+        super.eUnset(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public boolean eIsSet(int featureID) {
+        switch (featureID) {
+            case ModelPackage.DEVIATION__PARENT:
+                return parent != null;
+            case ModelPackage.DEVIATION__NAME:
+                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+        }
+        return super.eIsSet(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public String toString() {
+        if (eIsProxy()) return super.toString();
+
+        StringBuffer result = new StringBuffer(super.toString());
+        result.append(" (name: ");
+        result.append(name);
+        result.append(')');
+        return result.toString();
+    }
+
+} //DeviationImpl
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/ExtensionImpl.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/ExtensionImpl.java
new file mode 100644 (file)
index 0000000..d806542
--- /dev/null
@@ -0,0 +1,230 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.impl;
+
+import com.cisco.yangide.ext.model.Extension;
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Node;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Extension</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.ExtensionImpl#getParent <em>Parent</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.ExtensionImpl#getName <em>Name</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ExtensionImpl extends MinimalEObjectImpl.Container implements Extension {
+    /**
+     * The cached value of the '{@link #getParent() <em>Parent</em>}' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getParent()
+     * @generated
+     * @ordered
+     */
+    protected Node parent;
+
+    /**
+     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected static final String NAME_EDEFAULT = null;
+
+    /**
+     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected String name = NAME_EDEFAULT;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected ExtensionImpl() {
+        super();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected EClass eStaticClass() {
+        return ModelPackage.Literals.EXTENSION;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node getParent() {
+        if (parent != null && parent.eIsProxy()) {
+            InternalEObject oldParent = (InternalEObject)parent;
+            parent = (Node)eResolveProxy(oldParent);
+            if (parent != oldParent) {
+                if (eNotificationRequired())
+                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, ModelPackage.EXTENSION__PARENT, oldParent, parent));
+            }
+        }
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node basicGetParent() {
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setParent(Node newParent) {
+        Node oldParent = parent;
+        parent = newParent;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.EXTENSION__PARENT, oldParent, parent));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setName(String newName) {
+        String oldName = name;
+        name = newName;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.EXTENSION__NAME, oldName, name));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object eGet(int featureID, boolean resolve, boolean coreType) {
+        switch (featureID) {
+            case ModelPackage.EXTENSION__PARENT:
+                if (resolve) return getParent();
+                return basicGetParent();
+            case ModelPackage.EXTENSION__NAME:
+                return getName();
+        }
+        return super.eGet(featureID, resolve, coreType);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eSet(int featureID, Object newValue) {
+        switch (featureID) {
+            case ModelPackage.EXTENSION__PARENT:
+                setParent((Node)newValue);
+                return;
+            case ModelPackage.EXTENSION__NAME:
+                setName((String)newValue);
+                return;
+        }
+        super.eSet(featureID, newValue);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eUnset(int featureID) {
+        switch (featureID) {
+            case ModelPackage.EXTENSION__PARENT:
+                setParent((Node)null);
+                return;
+            case ModelPackage.EXTENSION__NAME:
+                setName(NAME_EDEFAULT);
+                return;
+        }
+        super.eUnset(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public boolean eIsSet(int featureID) {
+        switch (featureID) {
+            case ModelPackage.EXTENSION__PARENT:
+                return parent != null;
+            case ModelPackage.EXTENSION__NAME:
+                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+        }
+        return super.eIsSet(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public String toString() {
+        if (eIsProxy()) return super.toString();
+
+        StringBuffer result = new StringBuffer(super.toString());
+        result.append(" (name: ");
+        result.append(name);
+        result.append(')');
+        return result.toString();
+    }
+
+} //ExtensionImpl
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/FeatureImpl.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/FeatureImpl.java
new file mode 100644 (file)
index 0000000..fea8f37
--- /dev/null
@@ -0,0 +1,230 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.impl;
+
+import com.cisco.yangide.ext.model.Feature;
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Node;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Feature</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.FeatureImpl#getParent <em>Parent</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.FeatureImpl#getName <em>Name</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class FeatureImpl extends MinimalEObjectImpl.Container implements Feature {
+    /**
+     * The cached value of the '{@link #getParent() <em>Parent</em>}' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getParent()
+     * @generated
+     * @ordered
+     */
+    protected Node parent;
+
+    /**
+     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected static final String NAME_EDEFAULT = null;
+
+    /**
+     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected String name = NAME_EDEFAULT;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected FeatureImpl() {
+        super();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected EClass eStaticClass() {
+        return ModelPackage.Literals.FEATURE;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node getParent() {
+        if (parent != null && parent.eIsProxy()) {
+            InternalEObject oldParent = (InternalEObject)parent;
+            parent = (Node)eResolveProxy(oldParent);
+            if (parent != oldParent) {
+                if (eNotificationRequired())
+                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, ModelPackage.FEATURE__PARENT, oldParent, parent));
+            }
+        }
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node basicGetParent() {
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setParent(Node newParent) {
+        Node oldParent = parent;
+        parent = newParent;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.FEATURE__PARENT, oldParent, parent));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setName(String newName) {
+        String oldName = name;
+        name = newName;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.FEATURE__NAME, oldName, name));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object eGet(int featureID, boolean resolve, boolean coreType) {
+        switch (featureID) {
+            case ModelPackage.FEATURE__PARENT:
+                if (resolve) return getParent();
+                return basicGetParent();
+            case ModelPackage.FEATURE__NAME:
+                return getName();
+        }
+        return super.eGet(featureID, resolve, coreType);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eSet(int featureID, Object newValue) {
+        switch (featureID) {
+            case ModelPackage.FEATURE__PARENT:
+                setParent((Node)newValue);
+                return;
+            case ModelPackage.FEATURE__NAME:
+                setName((String)newValue);
+                return;
+        }
+        super.eSet(featureID, newValue);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eUnset(int featureID) {
+        switch (featureID) {
+            case ModelPackage.FEATURE__PARENT:
+                setParent((Node)null);
+                return;
+            case ModelPackage.FEATURE__NAME:
+                setName(NAME_EDEFAULT);
+                return;
+        }
+        super.eUnset(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public boolean eIsSet(int featureID) {
+        switch (featureID) {
+            case ModelPackage.FEATURE__PARENT:
+                return parent != null;
+            case ModelPackage.FEATURE__NAME:
+                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+        }
+        return super.eIsSet(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public String toString() {
+        if (eIsProxy()) return super.toString();
+
+        StringBuffer result = new StringBuffer(super.toString());
+        result.append(" (name: ");
+        result.append(name);
+        result.append(')');
+        return result.toString();
+    }
+
+} //FeatureImpl
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/GroupingImpl.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/GroupingImpl.java
new file mode 100644 (file)
index 0000000..84e34e4
--- /dev/null
@@ -0,0 +1,370 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.impl;
+
+import com.cisco.yangide.ext.model.ContainingNode;
+import com.cisco.yangide.ext.model.Grouping;
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Node;
+import com.cisco.yangide.ext.model.Tag;
+import com.cisco.yangide.ext.model.TaggedNode;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Grouping</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.GroupingImpl#getParent <em>Parent</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.GroupingImpl#getName <em>Name</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.GroupingImpl#getChildren <em>Children</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.GroupingImpl#getTags <em>Tags</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class GroupingImpl extends MinimalEObjectImpl.Container implements Grouping {
+    /**
+     * The cached value of the '{@link #getParent() <em>Parent</em>}' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getParent()
+     * @generated
+     * @ordered
+     */
+    protected Node parent;
+
+    /**
+     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected static final String NAME_EDEFAULT = null;
+
+    /**
+     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected String name = NAME_EDEFAULT;
+
+    /**
+     * The cached value of the '{@link #getChildren() <em>Children</em>}' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getChildren()
+     * @generated
+     * @ordered
+     */
+    protected EList<Node> children;
+
+    /**
+     * The cached value of the '{@link #getTags() <em>Tags</em>}' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getTags()
+     * @generated
+     * @ordered
+     */
+    protected EList<Tag> tags;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected GroupingImpl() {
+        super();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected EClass eStaticClass() {
+        return ModelPackage.Literals.GROUPING;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node getParent() {
+        if (parent != null && parent.eIsProxy()) {
+            InternalEObject oldParent = (InternalEObject)parent;
+            parent = (Node)eResolveProxy(oldParent);
+            if (parent != oldParent) {
+                if (eNotificationRequired())
+                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, ModelPackage.GROUPING__PARENT, oldParent, parent));
+            }
+        }
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node basicGetParent() {
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setParent(Node newParent) {
+        Node oldParent = parent;
+        parent = newParent;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.GROUPING__PARENT, oldParent, parent));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setName(String newName) {
+        String oldName = name;
+        name = newName;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.GROUPING__NAME, oldName, name));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EList<Node> getChildren() {
+        if (children == null) {
+            children = new EObjectContainmentEList<Node>(Node.class, this, ModelPackage.GROUPING__CHILDREN);
+        }
+        return children;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EList<Tag> getTags() {
+        if (tags == null) {
+            tags = new EObjectContainmentEList<Tag>(Tag.class, this, ModelPackage.GROUPING__TAGS);
+        }
+        return tags;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+        switch (featureID) {
+            case ModelPackage.GROUPING__CHILDREN:
+                return ((InternalEList<?>)getChildren()).basicRemove(otherEnd, msgs);
+            case ModelPackage.GROUPING__TAGS:
+                return ((InternalEList<?>)getTags()).basicRemove(otherEnd, msgs);
+        }
+        return super.eInverseRemove(otherEnd, featureID, msgs);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object eGet(int featureID, boolean resolve, boolean coreType) {
+        switch (featureID) {
+            case ModelPackage.GROUPING__PARENT:
+                if (resolve) return getParent();
+                return basicGetParent();
+            case ModelPackage.GROUPING__NAME:
+                return getName();
+            case ModelPackage.GROUPING__CHILDREN:
+                return getChildren();
+            case ModelPackage.GROUPING__TAGS:
+                return getTags();
+        }
+        return super.eGet(featureID, resolve, coreType);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @SuppressWarnings("unchecked")
+    @Override
+    public void eSet(int featureID, Object newValue) {
+        switch (featureID) {
+            case ModelPackage.GROUPING__PARENT:
+                setParent((Node)newValue);
+                return;
+            case ModelPackage.GROUPING__NAME:
+                setName((String)newValue);
+                return;
+            case ModelPackage.GROUPING__CHILDREN:
+                getChildren().clear();
+                getChildren().addAll((Collection<? extends Node>)newValue);
+                return;
+            case ModelPackage.GROUPING__TAGS:
+                getTags().clear();
+                getTags().addAll((Collection<? extends Tag>)newValue);
+                return;
+        }
+        super.eSet(featureID, newValue);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eUnset(int featureID) {
+        switch (featureID) {
+            case ModelPackage.GROUPING__PARENT:
+                setParent((Node)null);
+                return;
+            case ModelPackage.GROUPING__NAME:
+                setName(NAME_EDEFAULT);
+                return;
+            case ModelPackage.GROUPING__CHILDREN:
+                getChildren().clear();
+                return;
+            case ModelPackage.GROUPING__TAGS:
+                getTags().clear();
+                return;
+        }
+        super.eUnset(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public boolean eIsSet(int featureID) {
+        switch (featureID) {
+            case ModelPackage.GROUPING__PARENT:
+                return parent != null;
+            case ModelPackage.GROUPING__NAME:
+                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+            case ModelPackage.GROUPING__CHILDREN:
+                return children != null && !children.isEmpty();
+            case ModelPackage.GROUPING__TAGS:
+                return tags != null && !tags.isEmpty();
+        }
+        return super.eIsSet(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
+        if (baseClass == ContainingNode.class) {
+            switch (derivedFeatureID) {
+                case ModelPackage.GROUPING__CHILDREN: return ModelPackage.CONTAINING_NODE__CHILDREN;
+                default: return -1;
+            }
+        }
+        if (baseClass == TaggedNode.class) {
+            switch (derivedFeatureID) {
+                case ModelPackage.GROUPING__TAGS: return ModelPackage.TAGGED_NODE__TAGS;
+                default: return -1;
+            }
+        }
+        return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
+        if (baseClass == ContainingNode.class) {
+            switch (baseFeatureID) {
+                case ModelPackage.CONTAINING_NODE__CHILDREN: return ModelPackage.GROUPING__CHILDREN;
+                default: return -1;
+            }
+        }
+        if (baseClass == TaggedNode.class) {
+            switch (baseFeatureID) {
+                case ModelPackage.TAGGED_NODE__TAGS: return ModelPackage.GROUPING__TAGS;
+                default: return -1;
+            }
+        }
+        return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public String toString() {
+        if (eIsProxy()) return super.toString();
+
+        StringBuffer result = new StringBuffer(super.toString());
+        result.append(" (name: ");
+        result.append(name);
+        result.append(')');
+        return result.toString();
+    }
+
+} //GroupingImpl
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/IdentityImpl.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/IdentityImpl.java
new file mode 100644 (file)
index 0000000..a65ff10
--- /dev/null
@@ -0,0 +1,317 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.impl;
+
+import com.cisco.yangide.ext.model.Identity;
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Node;
+import com.cisco.yangide.ext.model.ReferenceNode;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Identity</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.IdentityImpl#getParent <em>Parent</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.IdentityImpl#getName <em>Name</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.IdentityImpl#getReference <em>Reference</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class IdentityImpl extends MinimalEObjectImpl.Container implements Identity {
+    /**
+     * The cached value of the '{@link #getParent() <em>Parent</em>}' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getParent()
+     * @generated
+     * @ordered
+     */
+    protected Node parent;
+
+    /**
+     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected static final String NAME_EDEFAULT = null;
+
+    /**
+     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected String name = NAME_EDEFAULT;
+
+    /**
+     * The default value of the '{@link #getReference() <em>Reference</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getReference()
+     * @generated
+     * @ordered
+     */
+    protected static final String REFERENCE_EDEFAULT = null;
+
+    /**
+     * The cached value of the '{@link #getReference() <em>Reference</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getReference()
+     * @generated
+     * @ordered
+     */
+    protected String reference = REFERENCE_EDEFAULT;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected IdentityImpl() {
+        super();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected EClass eStaticClass() {
+        return ModelPackage.Literals.IDENTITY;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node getParent() {
+        if (parent != null && parent.eIsProxy()) {
+            InternalEObject oldParent = (InternalEObject)parent;
+            parent = (Node)eResolveProxy(oldParent);
+            if (parent != oldParent) {
+                if (eNotificationRequired())
+                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, ModelPackage.IDENTITY__PARENT, oldParent, parent));
+            }
+        }
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node basicGetParent() {
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setParent(Node newParent) {
+        Node oldParent = parent;
+        parent = newParent;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.IDENTITY__PARENT, oldParent, parent));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setName(String newName) {
+        String oldName = name;
+        name = newName;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.IDENTITY__NAME, oldName, name));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getReference() {
+        return reference;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setReference(String newReference) {
+        String oldReference = reference;
+        reference = newReference;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.IDENTITY__REFERENCE, oldReference, reference));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object eGet(int featureID, boolean resolve, boolean coreType) {
+        switch (featureID) {
+            case ModelPackage.IDENTITY__PARENT:
+                if (resolve) return getParent();
+                return basicGetParent();
+            case ModelPackage.IDENTITY__NAME:
+                return getName();
+            case ModelPackage.IDENTITY__REFERENCE:
+                return getReference();
+        }
+        return super.eGet(featureID, resolve, coreType);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eSet(int featureID, Object newValue) {
+        switch (featureID) {
+            case ModelPackage.IDENTITY__PARENT:
+                setParent((Node)newValue);
+                return;
+            case ModelPackage.IDENTITY__NAME:
+                setName((String)newValue);
+                return;
+            case ModelPackage.IDENTITY__REFERENCE:
+                setReference((String)newValue);
+                return;
+        }
+        super.eSet(featureID, newValue);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eUnset(int featureID) {
+        switch (featureID) {
+            case ModelPackage.IDENTITY__PARENT:
+                setParent((Node)null);
+                return;
+            case ModelPackage.IDENTITY__NAME:
+                setName(NAME_EDEFAULT);
+                return;
+            case ModelPackage.IDENTITY__REFERENCE:
+                setReference(REFERENCE_EDEFAULT);
+                return;
+        }
+        super.eUnset(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public boolean eIsSet(int featureID) {
+        switch (featureID) {
+            case ModelPackage.IDENTITY__PARENT:
+                return parent != null;
+            case ModelPackage.IDENTITY__NAME:
+                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+            case ModelPackage.IDENTITY__REFERENCE:
+                return REFERENCE_EDEFAULT == null ? reference != null : !REFERENCE_EDEFAULT.equals(reference);
+        }
+        return super.eIsSet(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
+        if (baseClass == ReferenceNode.class) {
+            switch (derivedFeatureID) {
+                case ModelPackage.IDENTITY__REFERENCE: return ModelPackage.REFERENCE_NODE__REFERENCE;
+                default: return -1;
+            }
+        }
+        return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
+        if (baseClass == ReferenceNode.class) {
+            switch (baseFeatureID) {
+                case ModelPackage.REFERENCE_NODE__REFERENCE: return ModelPackage.IDENTITY__REFERENCE;
+                default: return -1;
+            }
+        }
+        return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public String toString() {
+        if (eIsProxy()) return super.toString();
+
+        StringBuffer result = new StringBuffer(super.toString());
+        result.append(" (name: ");
+        result.append(name);
+        result.append(", reference: ");
+        result.append(reference);
+        result.append(')');
+        return result.toString();
+    }
+
+} //IdentityImpl
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/ImportImpl.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/ImportImpl.java
new file mode 100644 (file)
index 0000000..c21b042
--- /dev/null
@@ -0,0 +1,338 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.impl;
+
+import com.cisco.yangide.ext.model.Import;
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Node;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Import</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.ImportImpl#getParent <em>Parent</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.ImportImpl#getPrefix <em>Prefix</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.ImportImpl#getRevisionDate <em>Revision Date</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.ImportImpl#getModule <em>Module</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ImportImpl extends MinimalEObjectImpl.Container implements Import {
+    /**
+     * The cached value of the '{@link #getParent() <em>Parent</em>}' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getParent()
+     * @generated
+     * @ordered
+     */
+    protected Node parent;
+
+    /**
+     * The default value of the '{@link #getPrefix() <em>Prefix</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getPrefix()
+     * @generated
+     * @ordered
+     */
+    protected static final String PREFIX_EDEFAULT = null;
+
+    /**
+     * The cached value of the '{@link #getPrefix() <em>Prefix</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getPrefix()
+     * @generated
+     * @ordered
+     */
+    protected String prefix = PREFIX_EDEFAULT;
+
+    /**
+     * The default value of the '{@link #getRevisionDate() <em>Revision Date</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getRevisionDate()
+     * @generated
+     * @ordered
+     */
+    protected static final String REVISION_DATE_EDEFAULT = null;
+
+    /**
+     * The cached value of the '{@link #getRevisionDate() <em>Revision Date</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getRevisionDate()
+     * @generated
+     * @ordered
+     */
+    protected String revisionDate = REVISION_DATE_EDEFAULT;
+
+    /**
+     * The default value of the '{@link #getModule() <em>Module</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getModule()
+     * @generated
+     * @ordered
+     */
+    protected static final String MODULE_EDEFAULT = null;
+
+    /**
+     * The cached value of the '{@link #getModule() <em>Module</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getModule()
+     * @generated
+     * @ordered
+     */
+    protected String module = MODULE_EDEFAULT;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected ImportImpl() {
+        super();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected EClass eStaticClass() {
+        return ModelPackage.Literals.IMPORT;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node getParent() {
+        if (parent != null && parent.eIsProxy()) {
+            InternalEObject oldParent = (InternalEObject)parent;
+            parent = (Node)eResolveProxy(oldParent);
+            if (parent != oldParent) {
+                if (eNotificationRequired())
+                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, ModelPackage.IMPORT__PARENT, oldParent, parent));
+            }
+        }
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node basicGetParent() {
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setParent(Node newParent) {
+        Node oldParent = parent;
+        parent = newParent;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.IMPORT__PARENT, oldParent, parent));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getPrefix() {
+        return prefix;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setPrefix(String newPrefix) {
+        String oldPrefix = prefix;
+        prefix = newPrefix;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.IMPORT__PREFIX, oldPrefix, prefix));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getRevisionDate() {
+        return revisionDate;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setRevisionDate(String newRevisionDate) {
+        String oldRevisionDate = revisionDate;
+        revisionDate = newRevisionDate;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.IMPORT__REVISION_DATE, oldRevisionDate, revisionDate));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getModule() {
+        return module;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setModule(String newModule) {
+        String oldModule = module;
+        module = newModule;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.IMPORT__MODULE, oldModule, module));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object eGet(int featureID, boolean resolve, boolean coreType) {
+        switch (featureID) {
+            case ModelPackage.IMPORT__PARENT:
+                if (resolve) return getParent();
+                return basicGetParent();
+            case ModelPackage.IMPORT__PREFIX:
+                return getPrefix();
+            case ModelPackage.IMPORT__REVISION_DATE:
+                return getRevisionDate();
+            case ModelPackage.IMPORT__MODULE:
+                return getModule();
+        }
+        return super.eGet(featureID, resolve, coreType);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eSet(int featureID, Object newValue) {
+        switch (featureID) {
+            case ModelPackage.IMPORT__PARENT:
+                setParent((Node)newValue);
+                return;
+            case ModelPackage.IMPORT__PREFIX:
+                setPrefix((String)newValue);
+                return;
+            case ModelPackage.IMPORT__REVISION_DATE:
+                setRevisionDate((String)newValue);
+                return;
+            case ModelPackage.IMPORT__MODULE:
+                setModule((String)newValue);
+                return;
+        }
+        super.eSet(featureID, newValue);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eUnset(int featureID) {
+        switch (featureID) {
+            case ModelPackage.IMPORT__PARENT:
+                setParent((Node)null);
+                return;
+            case ModelPackage.IMPORT__PREFIX:
+                setPrefix(PREFIX_EDEFAULT);
+                return;
+            case ModelPackage.IMPORT__REVISION_DATE:
+                setRevisionDate(REVISION_DATE_EDEFAULT);
+                return;
+            case ModelPackage.IMPORT__MODULE:
+                setModule(MODULE_EDEFAULT);
+                return;
+        }
+        super.eUnset(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public boolean eIsSet(int featureID) {
+        switch (featureID) {
+            case ModelPackage.IMPORT__PARENT:
+                return parent != null;
+            case ModelPackage.IMPORT__PREFIX:
+                return PREFIX_EDEFAULT == null ? prefix != null : !PREFIX_EDEFAULT.equals(prefix);
+            case ModelPackage.IMPORT__REVISION_DATE:
+                return REVISION_DATE_EDEFAULT == null ? revisionDate != null : !REVISION_DATE_EDEFAULT.equals(revisionDate);
+            case ModelPackage.IMPORT__MODULE:
+                return MODULE_EDEFAULT == null ? module != null : !MODULE_EDEFAULT.equals(module);
+        }
+        return super.eIsSet(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public String toString() {
+        if (eIsProxy()) return super.toString();
+
+        StringBuffer result = new StringBuffer(super.toString());
+        result.append(" (prefix: ");
+        result.append(prefix);
+        result.append(", revisionDate: ");
+        result.append(revisionDate);
+        result.append(", module: ");
+        result.append(module);
+        result.append(')');
+        return result.toString();
+    }
+
+} //ImportImpl
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/IncludeImpl.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/IncludeImpl.java
new file mode 100644 (file)
index 0000000..a93b09e
--- /dev/null
@@ -0,0 +1,242 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.impl;
+
+import com.cisco.yangide.ext.model.Include;
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Node;
+import com.cisco.yangide.ext.model.Submodule;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Include</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.IncludeImpl#getParent <em>Parent</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.IncludeImpl#getSubmodule <em>Submodule</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class IncludeImpl extends MinimalEObjectImpl.Container implements Include {
+    /**
+     * The cached value of the '{@link #getParent() <em>Parent</em>}' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getParent()
+     * @generated
+     * @ordered
+     */
+    protected Node parent;
+
+    /**
+     * The cached value of the '{@link #getSubmodule() <em>Submodule</em>}' containment reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getSubmodule()
+     * @generated
+     * @ordered
+     */
+    protected Submodule submodule;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected IncludeImpl() {
+        super();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected EClass eStaticClass() {
+        return ModelPackage.Literals.INCLUDE;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node getParent() {
+        if (parent != null && parent.eIsProxy()) {
+            InternalEObject oldParent = (InternalEObject)parent;
+            parent = (Node)eResolveProxy(oldParent);
+            if (parent != oldParent) {
+                if (eNotificationRequired())
+                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, ModelPackage.INCLUDE__PARENT, oldParent, parent));
+            }
+        }
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node basicGetParent() {
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setParent(Node newParent) {
+        Node oldParent = parent;
+        parent = newParent;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.INCLUDE__PARENT, oldParent, parent));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Submodule getSubmodule() {
+        return submodule;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public NotificationChain basicSetSubmodule(Submodule newSubmodule, NotificationChain msgs) {
+        Submodule oldSubmodule = submodule;
+        submodule = newSubmodule;
+        if (eNotificationRequired()) {
+            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ModelPackage.INCLUDE__SUBMODULE, oldSubmodule, newSubmodule);
+            if (msgs == null) msgs = notification; else msgs.add(notification);
+        }
+        return msgs;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setSubmodule(Submodule newSubmodule) {
+        if (newSubmodule != submodule) {
+            NotificationChain msgs = null;
+            if (submodule != null)
+                msgs = ((InternalEObject)submodule).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ModelPackage.INCLUDE__SUBMODULE, null, msgs);
+            if (newSubmodule != null)
+                msgs = ((InternalEObject)newSubmodule).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ModelPackage.INCLUDE__SUBMODULE, null, msgs);
+            msgs = basicSetSubmodule(newSubmodule, msgs);
+            if (msgs != null) msgs.dispatch();
+        }
+        else if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.INCLUDE__SUBMODULE, newSubmodule, newSubmodule));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+        switch (featureID) {
+            case ModelPackage.INCLUDE__SUBMODULE:
+                return basicSetSubmodule(null, msgs);
+        }
+        return super.eInverseRemove(otherEnd, featureID, msgs);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object eGet(int featureID, boolean resolve, boolean coreType) {
+        switch (featureID) {
+            case ModelPackage.INCLUDE__PARENT:
+                if (resolve) return getParent();
+                return basicGetParent();
+            case ModelPackage.INCLUDE__SUBMODULE:
+                return getSubmodule();
+        }
+        return super.eGet(featureID, resolve, coreType);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eSet(int featureID, Object newValue) {
+        switch (featureID) {
+            case ModelPackage.INCLUDE__PARENT:
+                setParent((Node)newValue);
+                return;
+            case ModelPackage.INCLUDE__SUBMODULE:
+                setSubmodule((Submodule)newValue);
+                return;
+        }
+        super.eSet(featureID, newValue);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eUnset(int featureID) {
+        switch (featureID) {
+            case ModelPackage.INCLUDE__PARENT:
+                setParent((Node)null);
+                return;
+            case ModelPackage.INCLUDE__SUBMODULE:
+                setSubmodule((Submodule)null);
+                return;
+        }
+        super.eUnset(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public boolean eIsSet(int featureID) {
+        switch (featureID) {
+            case ModelPackage.INCLUDE__PARENT:
+                return parent != null;
+            case ModelPackage.INCLUDE__SUBMODULE:
+                return submodule != null;
+        }
+        return super.eIsSet(featureID);
+    }
+
+} //IncludeImpl
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/LeafImpl.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/LeafImpl.java
new file mode 100644 (file)
index 0000000..b376b2f
--- /dev/null
@@ -0,0 +1,401 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.impl;
+
+import com.cisco.yangide.ext.model.Leaf;
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Node;
+import com.cisco.yangide.ext.model.Tag;
+import com.cisco.yangide.ext.model.TaggedNode;
+import com.cisco.yangide.ext.model.TypedNode;
+import com.cisco.yangide.ext.model.Typeref;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Leaf</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.LeafImpl#getParent <em>Parent</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.LeafImpl#getName <em>Name</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.LeafImpl#getTags <em>Tags</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.LeafImpl#getType <em>Type</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class LeafImpl extends MinimalEObjectImpl.Container implements Leaf {
+    /**
+     * The cached value of the '{@link #getParent() <em>Parent</em>}' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getParent()
+     * @generated
+     * @ordered
+     */
+    protected Node parent;
+
+    /**
+     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected static final String NAME_EDEFAULT = null;
+
+    /**
+     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected String name = NAME_EDEFAULT;
+
+    /**
+     * The cached value of the '{@link #getTags() <em>Tags</em>}' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getTags()
+     * @generated
+     * @ordered
+     */
+    protected EList<Tag> tags;
+
+    /**
+     * The cached value of the '{@link #getType() <em>Type</em>}' containment reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getType()
+     * @generated
+     * @ordered
+     */
+    protected Typeref type;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected LeafImpl() {
+        super();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected EClass eStaticClass() {
+        return ModelPackage.Literals.LEAF;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node getParent() {
+        if (parent != null && parent.eIsProxy()) {
+            InternalEObject oldParent = (InternalEObject)parent;
+            parent = (Node)eResolveProxy(oldParent);
+            if (parent != oldParent) {
+                if (eNotificationRequired())
+                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, ModelPackage.LEAF__PARENT, oldParent, parent));
+            }
+        }
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node basicGetParent() {
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setParent(Node newParent) {
+        Node oldParent = parent;
+        parent = newParent;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.LEAF__PARENT, oldParent, parent));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setName(String newName) {
+        String oldName = name;
+        name = newName;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.LEAF__NAME, oldName, name));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EList<Tag> getTags() {
+        if (tags == null) {
+            tags = new EObjectContainmentEList<Tag>(Tag.class, this, ModelPackage.LEAF__TAGS);
+        }
+        return tags;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Typeref getType() {
+        return type;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public NotificationChain basicSetType(Typeref newType, NotificationChain msgs) {
+        Typeref oldType = type;
+        type = newType;
+        if (eNotificationRequired()) {
+            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ModelPackage.LEAF__TYPE, oldType, newType);
+            if (msgs == null) msgs = notification; else msgs.add(notification);
+        }
+        return msgs;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setType(Typeref newType) {
+        if (newType != type) {
+            NotificationChain msgs = null;
+            if (type != null)
+                msgs = ((InternalEObject)type).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ModelPackage.LEAF__TYPE, null, msgs);
+            if (newType != null)
+                msgs = ((InternalEObject)newType).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ModelPackage.LEAF__TYPE, null, msgs);
+            msgs = basicSetType(newType, msgs);
+            if (msgs != null) msgs.dispatch();
+        }
+        else if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.LEAF__TYPE, newType, newType));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+        switch (featureID) {
+            case ModelPackage.LEAF__TAGS:
+                return ((InternalEList<?>)getTags()).basicRemove(otherEnd, msgs);
+            case ModelPackage.LEAF__TYPE:
+                return basicSetType(null, msgs);
+        }
+        return super.eInverseRemove(otherEnd, featureID, msgs);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object eGet(int featureID, boolean resolve, boolean coreType) {
+        switch (featureID) {
+            case ModelPackage.LEAF__PARENT:
+                if (resolve) return getParent();
+                return basicGetParent();
+            case ModelPackage.LEAF__NAME:
+                return getName();
+            case ModelPackage.LEAF__TAGS:
+                return getTags();
+            case ModelPackage.LEAF__TYPE:
+                return getType();
+        }
+        return super.eGet(featureID, resolve, coreType);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @SuppressWarnings("unchecked")
+    @Override
+    public void eSet(int featureID, Object newValue) {
+        switch (featureID) {
+            case ModelPackage.LEAF__PARENT:
+                setParent((Node)newValue);
+                return;
+            case ModelPackage.LEAF__NAME:
+                setName((String)newValue);
+                return;
+            case ModelPackage.LEAF__TAGS:
+                getTags().clear();
+                getTags().addAll((Collection<? extends Tag>)newValue);
+                return;
+            case ModelPackage.LEAF__TYPE:
+                setType((Typeref)newValue);
+                return;
+        }
+        super.eSet(featureID, newValue);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eUnset(int featureID) {
+        switch (featureID) {
+            case ModelPackage.LEAF__PARENT:
+                setParent((Node)null);
+                return;
+            case ModelPackage.LEAF__NAME:
+                setName(NAME_EDEFAULT);
+                return;
+            case ModelPackage.LEAF__TAGS:
+                getTags().clear();
+                return;
+            case ModelPackage.LEAF__TYPE:
+                setType((Typeref)null);
+                return;
+        }
+        super.eUnset(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public boolean eIsSet(int featureID) {
+        switch (featureID) {
+            case ModelPackage.LEAF__PARENT:
+                return parent != null;
+            case ModelPackage.LEAF__NAME:
+                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+            case ModelPackage.LEAF__TAGS:
+                return tags != null && !tags.isEmpty();
+            case ModelPackage.LEAF__TYPE:
+                return type != null;
+        }
+        return super.eIsSet(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
+        if (baseClass == TaggedNode.class) {
+            switch (derivedFeatureID) {
+                case ModelPackage.LEAF__TAGS: return ModelPackage.TAGGED_NODE__TAGS;
+                default: return -1;
+            }
+        }
+        if (baseClass == TypedNode.class) {
+            switch (derivedFeatureID) {
+                case ModelPackage.LEAF__TYPE: return ModelPackage.TYPED_NODE__TYPE;
+                default: return -1;
+            }
+        }
+        return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
+        if (baseClass == TaggedNode.class) {
+            switch (baseFeatureID) {
+                case ModelPackage.TAGGED_NODE__TAGS: return ModelPackage.LEAF__TAGS;
+                default: return -1;
+            }
+        }
+        if (baseClass == TypedNode.class) {
+            switch (baseFeatureID) {
+                case ModelPackage.TYPED_NODE__TYPE: return ModelPackage.LEAF__TYPE;
+                default: return -1;
+            }
+        }
+        return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public String toString() {
+        if (eIsProxy()) return super.toString();
+
+        StringBuffer result = new StringBuffer(super.toString());
+        result.append(" (name: ");
+        result.append(name);
+        result.append(')');
+        return result.toString();
+    }
+
+} //LeafImpl
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/LeafListImpl.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/LeafListImpl.java
new file mode 100644 (file)
index 0000000..25154aa
--- /dev/null
@@ -0,0 +1,401 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.impl;
+
+import com.cisco.yangide.ext.model.LeafList;
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Node;
+import com.cisco.yangide.ext.model.Tag;
+import com.cisco.yangide.ext.model.TaggedNode;
+import com.cisco.yangide.ext.model.TypedNode;
+import com.cisco.yangide.ext.model.Typeref;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Leaf List</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.LeafListImpl#getParent <em>Parent</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.LeafListImpl#getName <em>Name</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.LeafListImpl#getTags <em>Tags</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.LeafListImpl#getType <em>Type</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class LeafListImpl extends MinimalEObjectImpl.Container implements LeafList {
+    /**
+     * The cached value of the '{@link #getParent() <em>Parent</em>}' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getParent()
+     * @generated
+     * @ordered
+     */
+    protected Node parent;
+
+    /**
+     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected static final String NAME_EDEFAULT = null;
+
+    /**
+     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected String name = NAME_EDEFAULT;
+
+    /**
+     * The cached value of the '{@link #getTags() <em>Tags</em>}' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getTags()
+     * @generated
+     * @ordered
+     */
+    protected EList<Tag> tags;
+
+    /**
+     * The cached value of the '{@link #getType() <em>Type</em>}' containment reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getType()
+     * @generated
+     * @ordered
+     */
+    protected Typeref type;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected LeafListImpl() {
+        super();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected EClass eStaticClass() {
+        return ModelPackage.Literals.LEAF_LIST;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node getParent() {
+        if (parent != null && parent.eIsProxy()) {
+            InternalEObject oldParent = (InternalEObject)parent;
+            parent = (Node)eResolveProxy(oldParent);
+            if (parent != oldParent) {
+                if (eNotificationRequired())
+                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, ModelPackage.LEAF_LIST__PARENT, oldParent, parent));
+            }
+        }
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node basicGetParent() {
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setParent(Node newParent) {
+        Node oldParent = parent;
+        parent = newParent;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.LEAF_LIST__PARENT, oldParent, parent));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setName(String newName) {
+        String oldName = name;
+        name = newName;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.LEAF_LIST__NAME, oldName, name));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EList<Tag> getTags() {
+        if (tags == null) {
+            tags = new EObjectContainmentEList<Tag>(Tag.class, this, ModelPackage.LEAF_LIST__TAGS);
+        }
+        return tags;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Typeref getType() {
+        return type;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public NotificationChain basicSetType(Typeref newType, NotificationChain msgs) {
+        Typeref oldType = type;
+        type = newType;
+        if (eNotificationRequired()) {
+            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ModelPackage.LEAF_LIST__TYPE, oldType, newType);
+            if (msgs == null) msgs = notification; else msgs.add(notification);
+        }
+        return msgs;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setType(Typeref newType) {
+        if (newType != type) {
+            NotificationChain msgs = null;
+            if (type != null)
+                msgs = ((InternalEObject)type).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ModelPackage.LEAF_LIST__TYPE, null, msgs);
+            if (newType != null)
+                msgs = ((InternalEObject)newType).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ModelPackage.LEAF_LIST__TYPE, null, msgs);
+            msgs = basicSetType(newType, msgs);
+            if (msgs != null) msgs.dispatch();
+        }
+        else if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.LEAF_LIST__TYPE, newType, newType));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+        switch (featureID) {
+            case ModelPackage.LEAF_LIST__TAGS:
+                return ((InternalEList<?>)getTags()).basicRemove(otherEnd, msgs);
+            case ModelPackage.LEAF_LIST__TYPE:
+                return basicSetType(null, msgs);
+        }
+        return super.eInverseRemove(otherEnd, featureID, msgs);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object eGet(int featureID, boolean resolve, boolean coreType) {
+        switch (featureID) {
+            case ModelPackage.LEAF_LIST__PARENT:
+                if (resolve) return getParent();
+                return basicGetParent();
+            case ModelPackage.LEAF_LIST__NAME:
+                return getName();
+            case ModelPackage.LEAF_LIST__TAGS:
+                return getTags();
+            case ModelPackage.LEAF_LIST__TYPE:
+                return getType();
+        }
+        return super.eGet(featureID, resolve, coreType);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @SuppressWarnings("unchecked")
+    @Override
+    public void eSet(int featureID, Object newValue) {
+        switch (featureID) {
+            case ModelPackage.LEAF_LIST__PARENT:
+                setParent((Node)newValue);
+                return;
+            case ModelPackage.LEAF_LIST__NAME:
+                setName((String)newValue);
+                return;
+            case ModelPackage.LEAF_LIST__TAGS:
+                getTags().clear();
+                getTags().addAll((Collection<? extends Tag>)newValue);
+                return;
+            case ModelPackage.LEAF_LIST__TYPE:
+                setType((Typeref)newValue);
+                return;
+        }
+        super.eSet(featureID, newValue);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eUnset(int featureID) {
+        switch (featureID) {
+            case ModelPackage.LEAF_LIST__PARENT:
+                setParent((Node)null);
+                return;
+            case ModelPackage.LEAF_LIST__NAME:
+                setName(NAME_EDEFAULT);
+                return;
+            case ModelPackage.LEAF_LIST__TAGS:
+                getTags().clear();
+                return;
+            case ModelPackage.LEAF_LIST__TYPE:
+                setType((Typeref)null);
+                return;
+        }
+        super.eUnset(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public boolean eIsSet(int featureID) {
+        switch (featureID) {
+            case ModelPackage.LEAF_LIST__PARENT:
+                return parent != null;
+            case ModelPackage.LEAF_LIST__NAME:
+                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+            case ModelPackage.LEAF_LIST__TAGS:
+                return tags != null && !tags.isEmpty();
+            case ModelPackage.LEAF_LIST__TYPE:
+                return type != null;
+        }
+        return super.eIsSet(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
+        if (baseClass == TaggedNode.class) {
+            switch (derivedFeatureID) {
+                case ModelPackage.LEAF_LIST__TAGS: return ModelPackage.TAGGED_NODE__TAGS;
+                default: return -1;
+            }
+        }
+        if (baseClass == TypedNode.class) {
+            switch (derivedFeatureID) {
+                case ModelPackage.LEAF_LIST__TYPE: return ModelPackage.TYPED_NODE__TYPE;
+                default: return -1;
+            }
+        }
+        return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
+        if (baseClass == TaggedNode.class) {
+            switch (baseFeatureID) {
+                case ModelPackage.TAGGED_NODE__TAGS: return ModelPackage.LEAF_LIST__TAGS;
+                default: return -1;
+            }
+        }
+        if (baseClass == TypedNode.class) {
+            switch (baseFeatureID) {
+                case ModelPackage.TYPED_NODE__TYPE: return ModelPackage.LEAF_LIST__TYPE;
+                default: return -1;
+            }
+        }
+        return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public String toString() {
+        if (eIsProxy()) return super.toString();
+
+        StringBuffer result = new StringBuffer(super.toString());
+        result.append(" (name: ");
+        result.append(name);
+        result.append(')');
+        return result.toString();
+    }
+
+} //LeafListImpl
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/ListImpl.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/ListImpl.java
new file mode 100644 (file)
index 0000000..db4c2df
--- /dev/null
@@ -0,0 +1,370 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.impl;
+
+import com.cisco.yangide.ext.model.ContainingNode;
+import com.cisco.yangide.ext.model.List;
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Node;
+import com.cisco.yangide.ext.model.Tag;
+import com.cisco.yangide.ext.model.TaggedNode;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>List</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.ListImpl#getParent <em>Parent</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.ListImpl#getName <em>Name</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.ListImpl#getChildren <em>Children</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.ListImpl#getTags <em>Tags</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ListImpl extends MinimalEObjectImpl.Container implements List {
+    /**
+     * The cached value of the '{@link #getParent() <em>Parent</em>}' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getParent()
+     * @generated
+     * @ordered
+     */
+    protected Node parent;
+
+    /**
+     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected static final String NAME_EDEFAULT = null;
+
+    /**
+     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected String name = NAME_EDEFAULT;
+
+    /**
+     * The cached value of the '{@link #getChildren() <em>Children</em>}' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getChildren()
+     * @generated
+     * @ordered
+     */
+    protected EList<Node> children;
+
+    /**
+     * The cached value of the '{@link #getTags() <em>Tags</em>}' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getTags()
+     * @generated
+     * @ordered
+     */
+    protected EList<Tag> tags;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected ListImpl() {
+        super();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected EClass eStaticClass() {
+        return ModelPackage.Literals.LIST;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node getParent() {
+        if (parent != null && parent.eIsProxy()) {
+            InternalEObject oldParent = (InternalEObject)parent;
+            parent = (Node)eResolveProxy(oldParent);
+            if (parent != oldParent) {
+                if (eNotificationRequired())
+                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, ModelPackage.LIST__PARENT, oldParent, parent));
+            }
+        }
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node basicGetParent() {
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setParent(Node newParent) {
+        Node oldParent = parent;
+        parent = newParent;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.LIST__PARENT, oldParent, parent));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setName(String newName) {
+        String oldName = name;
+        name = newName;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.LIST__NAME, oldName, name));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EList<Node> getChildren() {
+        if (children == null) {
+            children = new EObjectContainmentEList<Node>(Node.class, this, ModelPackage.LIST__CHILDREN);
+        }
+        return children;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EList<Tag> getTags() {
+        if (tags == null) {
+            tags = new EObjectContainmentEList<Tag>(Tag.class, this, ModelPackage.LIST__TAGS);
+        }
+        return tags;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+        switch (featureID) {
+            case ModelPackage.LIST__CHILDREN:
+                return ((InternalEList<?>)getChildren()).basicRemove(otherEnd, msgs);
+            case ModelPackage.LIST__TAGS:
+                return ((InternalEList<?>)getTags()).basicRemove(otherEnd, msgs);
+        }
+        return super.eInverseRemove(otherEnd, featureID, msgs);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object eGet(int featureID, boolean resolve, boolean coreType) {
+        switch (featureID) {
+            case ModelPackage.LIST__PARENT:
+                if (resolve) return getParent();
+                return basicGetParent();
+            case ModelPackage.LIST__NAME:
+                return getName();
+            case ModelPackage.LIST__CHILDREN:
+                return getChildren();
+            case ModelPackage.LIST__TAGS:
+                return getTags();
+        }
+        return super.eGet(featureID, resolve, coreType);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @SuppressWarnings("unchecked")
+    @Override
+    public void eSet(int featureID, Object newValue) {
+        switch (featureID) {
+            case ModelPackage.LIST__PARENT:
+                setParent((Node)newValue);
+                return;
+            case ModelPackage.LIST__NAME:
+                setName((String)newValue);
+                return;
+            case ModelPackage.LIST__CHILDREN:
+                getChildren().clear();
+                getChildren().addAll((Collection<? extends Node>)newValue);
+                return;
+            case ModelPackage.LIST__TAGS:
+                getTags().clear();
+                getTags().addAll((Collection<? extends Tag>)newValue);
+                return;
+        }
+        super.eSet(featureID, newValue);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eUnset(int featureID) {
+        switch (featureID) {
+            case ModelPackage.LIST__PARENT:
+                setParent((Node)null);
+                return;
+            case ModelPackage.LIST__NAME:
+                setName(NAME_EDEFAULT);
+                return;
+            case ModelPackage.LIST__CHILDREN:
+                getChildren().clear();
+                return;
+            case ModelPackage.LIST__TAGS:
+                getTags().clear();
+                return;
+        }
+        super.eUnset(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public boolean eIsSet(int featureID) {
+        switch (featureID) {
+            case ModelPackage.LIST__PARENT:
+                return parent != null;
+            case ModelPackage.LIST__NAME:
+                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+            case ModelPackage.LIST__CHILDREN:
+                return children != null && !children.isEmpty();
+            case ModelPackage.LIST__TAGS:
+                return tags != null && !tags.isEmpty();
+        }
+        return super.eIsSet(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
+        if (baseClass == ContainingNode.class) {
+            switch (derivedFeatureID) {
+                case ModelPackage.LIST__CHILDREN: return ModelPackage.CONTAINING_NODE__CHILDREN;
+                default: return -1;
+            }
+        }
+        if (baseClass == TaggedNode.class) {
+            switch (derivedFeatureID) {
+                case ModelPackage.LIST__TAGS: return ModelPackage.TAGGED_NODE__TAGS;
+                default: return -1;
+            }
+        }
+        return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
+        if (baseClass == ContainingNode.class) {
+            switch (baseFeatureID) {
+                case ModelPackage.CONTAINING_NODE__CHILDREN: return ModelPackage.LIST__CHILDREN;
+                default: return -1;
+            }
+        }
+        if (baseClass == TaggedNode.class) {
+            switch (baseFeatureID) {
+                case ModelPackage.TAGGED_NODE__TAGS: return ModelPackage.LIST__TAGS;
+                default: return -1;
+            }
+        }
+        return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public String toString() {
+        if (eIsProxy()) return super.toString();
+
+        StringBuffer result = new StringBuffer(super.toString());
+        result.append(" (name: ");
+        result.append(name);
+        result.append(')');
+        return result.toString();
+    }
+
+} //ListImpl
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/ListKeyImpl.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/ListKeyImpl.java
new file mode 100644 (file)
index 0000000..f79c472
--- /dev/null
@@ -0,0 +1,230 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.impl;
+
+import com.cisco.yangide.ext.model.ListKey;
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Node;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>List Key</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.ListKeyImpl#getParent <em>Parent</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.ListKeyImpl#getName <em>Name</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ListKeyImpl extends MinimalEObjectImpl.Container implements ListKey {
+    /**
+     * The cached value of the '{@link #getParent() <em>Parent</em>}' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getParent()
+     * @generated
+     * @ordered
+     */
+    protected Node parent;
+
+    /**
+     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected static final String NAME_EDEFAULT = null;
+
+    /**
+     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected String name = NAME_EDEFAULT;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected ListKeyImpl() {
+        super();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected EClass eStaticClass() {
+        return ModelPackage.Literals.LIST_KEY;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node getParent() {
+        if (parent != null && parent.eIsProxy()) {
+            InternalEObject oldParent = (InternalEObject)parent;
+            parent = (Node)eResolveProxy(oldParent);
+            if (parent != oldParent) {
+                if (eNotificationRequired())
+                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, ModelPackage.LIST_KEY__PARENT, oldParent, parent));
+            }
+        }
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node basicGetParent() {
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setParent(Node newParent) {
+        Node oldParent = parent;
+        parent = newParent;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.LIST_KEY__PARENT, oldParent, parent));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setName(String newName) {
+        String oldName = name;
+        name = newName;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.LIST_KEY__NAME, oldName, name));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object eGet(int featureID, boolean resolve, boolean coreType) {
+        switch (featureID) {
+            case ModelPackage.LIST_KEY__PARENT:
+                if (resolve) return getParent();
+                return basicGetParent();
+            case ModelPackage.LIST_KEY__NAME:
+                return getName();
+        }
+        return super.eGet(featureID, resolve, coreType);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eSet(int featureID, Object newValue) {
+        switch (featureID) {
+            case ModelPackage.LIST_KEY__PARENT:
+                setParent((Node)newValue);
+                return;
+            case ModelPackage.LIST_KEY__NAME:
+                setName((String)newValue);
+                return;
+        }
+        super.eSet(featureID, newValue);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eUnset(int featureID) {
+        switch (featureID) {
+            case ModelPackage.LIST_KEY__PARENT:
+                setParent((Node)null);
+                return;
+            case ModelPackage.LIST_KEY__NAME:
+                setName(NAME_EDEFAULT);
+                return;
+        }
+        super.eUnset(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public boolean eIsSet(int featureID) {
+        switch (featureID) {
+            case ModelPackage.LIST_KEY__PARENT:
+                return parent != null;
+            case ModelPackage.LIST_KEY__NAME:
+                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+        }
+        return super.eIsSet(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public String toString() {
+        if (eIsProxy()) return super.toString();
+
+        StringBuffer result = new StringBuffer(super.toString());
+        result.append(" (name: ");
+        result.append(name);
+        result.append(')');
+        return result.toString();
+    }
+
+} //ListKeyImpl
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/ModelFactoryImpl.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/ModelFactoryImpl.java
new file mode 100644 (file)
index 0000000..2f51561
--- /dev/null
@@ -0,0 +1,386 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.impl;
+
+import com.cisco.yangide.ext.model.*;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.impl.EFactoryImpl;
+
+import org.eclipse.emf.ecore.plugin.EcorePlugin;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Factory</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ModelFactoryImpl extends EFactoryImpl implements ModelFactory {
+    /**
+     * Creates the default factory implementation.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public static ModelFactory init() {
+        try {
+            ModelFactory theModelFactory = (ModelFactory)EPackage.Registry.INSTANCE.getEFactory(ModelPackage.eNS_URI);
+            if (theModelFactory != null) {
+                return theModelFactory;
+            }
+        }
+        catch (Exception exception) {
+            EcorePlugin.INSTANCE.log(exception);
+        }
+        return new ModelFactoryImpl();
+    }
+
+    /**
+     * Creates an instance of the factory.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public ModelFactoryImpl() {
+        super();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public EObject create(EClass eClass) {
+        switch (eClass.getClassifierID()) {
+            case ModelPackage.MODULE: return createModule();
+            case ModelPackage.GROUPING: return createGrouping();
+            case ModelPackage.LEAF: return createLeaf();
+            case ModelPackage.CONTAINER: return createContainer();
+            case ModelPackage.SUBMODULE: return createSubmodule();
+            case ModelPackage.TYPEDEF: return createTypedef();
+            case ModelPackage.CHOICE: return createChoice();
+            case ModelPackage.LEAF_LIST: return createLeafList();
+            case ModelPackage.ANYXML: return createAnyxml();
+            case ModelPackage.IMPORT: return createImport();
+            case ModelPackage.INCLUDE: return createInclude();
+            case ModelPackage.REVISION: return createRevision();
+            case ModelPackage.BELONGS_TO: return createBelongsTo();
+            case ModelPackage.LIST: return createList();
+            case ModelPackage.TAG: return createTag();
+            case ModelPackage.USES: return createUses();
+            case ModelPackage.RPC: return createRpc();
+            case ModelPackage.RPC_IO: return createRpcIO();
+            case ModelPackage.NOTIFICATION: return createNotification();
+            case ModelPackage.AUGMENT: return createAugment();
+            case ModelPackage.EXTENSION: return createExtension();
+            case ModelPackage.FEATURE: return createFeature();
+            case ModelPackage.DEVIATION: return createDeviation();
+            case ModelPackage.IDENTITY: return createIdentity();
+            case ModelPackage.CHOICE_CASE: return createChoiceCase();
+            case ModelPackage.LIST_KEY: return createListKey();
+            case ModelPackage.TYPEREF: return createTyperef();
+            default:
+                throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
+        }
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Module createModule() {
+        ModuleImpl module = new ModuleImpl();
+        return module;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Grouping createGrouping() {
+        GroupingImpl grouping = new GroupingImpl();
+        return grouping;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Leaf createLeaf() {
+        LeafImpl leaf = new LeafImpl();
+        return leaf;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public com.cisco.yangide.ext.model.Container createContainer() {
+        ContainerImpl container = new ContainerImpl();
+        return container;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Submodule createSubmodule() {
+        SubmoduleImpl submodule = new SubmoduleImpl();
+        return submodule;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Typedef createTypedef() {
+        TypedefImpl typedef = new TypedefImpl();
+        return typedef;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Choice createChoice() {
+        ChoiceImpl choice = new ChoiceImpl();
+        return choice;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public LeafList createLeafList() {
+        LeafListImpl leafList = new LeafListImpl();
+        return leafList;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Anyxml createAnyxml() {
+        AnyxmlImpl anyxml = new AnyxmlImpl();
+        return anyxml;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Import createImport() {
+        ImportImpl import_ = new ImportImpl();
+        return import_;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Include createInclude() {
+        IncludeImpl include = new IncludeImpl();
+        return include;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Revision createRevision() {
+        RevisionImpl revision = new RevisionImpl();
+        return revision;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public BelongsTo createBelongsTo() {
+        BelongsToImpl belongsTo = new BelongsToImpl();
+        return belongsTo;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public List createList() {
+        ListImpl list = new ListImpl();
+        return list;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Tag createTag() {
+        TagImpl tag = new TagImpl();
+        return tag;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Uses createUses() {
+        UsesImpl uses = new UsesImpl();
+        return uses;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Rpc createRpc() {
+        RpcImpl rpc = new RpcImpl();
+        return rpc;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public RpcIO createRpcIO() {
+        RpcIOImpl rpcIO = new RpcIOImpl();
+        return rpcIO;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Notification createNotification() {
+        NotificationImpl notification = new NotificationImpl();
+        return notification;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Augment createAugment() {
+        AugmentImpl augment = new AugmentImpl();
+        return augment;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Extension createExtension() {
+        ExtensionImpl extension = new ExtensionImpl();
+        return extension;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Feature createFeature() {
+        FeatureImpl feature = new FeatureImpl();
+        return feature;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Deviation createDeviation() {
+        DeviationImpl deviation = new DeviationImpl();
+        return deviation;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Identity createIdentity() {
+        IdentityImpl identity = new IdentityImpl();
+        return identity;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public ChoiceCase createChoiceCase() {
+        ChoiceCaseImpl choiceCase = new ChoiceCaseImpl();
+        return choiceCase;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public ListKey createListKey() {
+        ListKeyImpl listKey = new ListKeyImpl();
+        return listKey;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Typeref createTyperef() {
+        TyperefImpl typeref = new TyperefImpl();
+        return typeref;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public ModelPackage getModelPackage() {
+        return (ModelPackage)getEPackage();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @deprecated
+     * @generated
+     */
+    @Deprecated
+    public static ModelPackage getPackage() {
+        return ModelPackage.eINSTANCE;
+    }
+
+} //ModelFactoryImpl
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/ModelPackageImpl.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/ModelPackageImpl.java
new file mode 100644 (file)
index 0000000..944b9c4
--- /dev/null
@@ -0,0 +1,1115 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.impl;
+
+import com.cisco.yangide.ext.model.Anyxml;
+import com.cisco.yangide.ext.model.Augment;
+import com.cisco.yangide.ext.model.BelongsTo;
+import com.cisco.yangide.ext.model.Choice;
+import com.cisco.yangide.ext.model.ChoiceCase;
+import com.cisco.yangide.ext.model.ContainingNode;
+import com.cisco.yangide.ext.model.Deviation;
+import com.cisco.yangide.ext.model.Extension;
+import com.cisco.yangide.ext.model.Feature;
+import com.cisco.yangide.ext.model.Grouping;
+import com.cisco.yangide.ext.model.Identity;
+import com.cisco.yangide.ext.model.Import;
+import com.cisco.yangide.ext.model.Include;
+import com.cisco.yangide.ext.model.Leaf;
+import com.cisco.yangide.ext.model.LeafList;
+import com.cisco.yangide.ext.model.List;
+import com.cisco.yangide.ext.model.ListKey;
+import com.cisco.yangide.ext.model.ModelFactory;
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Module;
+import com.cisco.yangide.ext.model.NamedContainingNode;
+import com.cisco.yangide.ext.model.NamedNode;
+import com.cisco.yangide.ext.model.Node;
+import com.cisco.yangide.ext.model.Notification;
+import com.cisco.yangide.ext.model.ReferenceNode;
+import com.cisco.yangide.ext.model.Revision;
+import com.cisco.yangide.ext.model.Rpc;
+import com.cisco.yangide.ext.model.RpcIO;
+import com.cisco.yangide.ext.model.Submodule;
+import com.cisco.yangide.ext.model.Tag;
+import com.cisco.yangide.ext.model.TaggedNode;
+import com.cisco.yangide.ext.model.TypedNode;
+import com.cisco.yangide.ext.model.Typedef;
+import com.cisco.yangide.ext.model.Typeref;
+import com.cisco.yangide.ext.model.Uses;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+import org.eclipse.emf.ecore.impl.EPackageImpl;
+
+import org.eclipse.emf.ecore.xml.type.XMLTypePackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Package</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class ModelPackageImpl extends EPackageImpl implements ModelPackage {
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass moduleEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass groupingEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass leafEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass containerEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass nodeEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass namedNodeEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass containingNodeEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass namedContainingNodeEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass submoduleEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass typedefEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass choiceEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass leafListEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass anyxmlEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass importEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass includeEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass revisionEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass belongsToEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass listEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass tagEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass taggedNodeEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass usesEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass rpcEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass rpcIOEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass notificationEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass augmentEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass extensionEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass featureEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass deviationEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass identityEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass typedNodeEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass choiceCaseEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass listKeyEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass typerefEClass = null;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private EClass referenceNodeEClass = null;
+
+    /**
+     * Creates an instance of the model <b>Package</b>, registered with
+     * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
+     * package URI value.
+     * <p>Note: the correct way to create the package is via the static
+     * factory method {@link #init init()}, which also performs
+     * initialization of the package, or returns the registered package,
+     * if one already exists.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see org.eclipse.emf.ecore.EPackage.Registry
+     * @see com.cisco.yangide.ext.model.ModelPackage#eNS_URI
+     * @see #init()
+     * @generated
+     */
+    private ModelPackageImpl() {
+        super(eNS_URI, ModelFactory.eINSTANCE);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private static boolean isInited = false;
+
+    /**
+     * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
+     *
+     * <p>This method is used to initialize {@link ModelPackage#eINSTANCE} when that field is accessed.
+     * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #eNS_URI
+     * @see #createPackageContents()
+     * @see #initializePackageContents()
+     * @generated
+     */
+    public static ModelPackage init() {
+        if (isInited) return (ModelPackage)EPackage.Registry.INSTANCE.getEPackage(ModelPackage.eNS_URI);
+
+        // Obtain or create and register package
+        ModelPackageImpl theModelPackage = (ModelPackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof ModelPackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new ModelPackageImpl());
+
+        isInited = true;
+
+        // Initialize simple dependencies
+        XMLTypePackage.eINSTANCE.eClass();
+
+        // Create package meta-data objects
+        theModelPackage.createPackageContents();
+
+        // Initialize created meta-data
+        theModelPackage.initializePackageContents();
+
+        // Mark meta-data to indicate it can't be changed
+        theModelPackage.freeze();
+
+  
+        // Update the registry and return the package
+        EPackage.Registry.INSTANCE.put(ModelPackage.eNS_URI, theModelPackage);
+        return theModelPackage;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getModule() {
+        return moduleEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EAttribute getModule_Namespace() {
+        return (EAttribute)moduleEClass.getEStructuralFeatures().get(0);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EReference getModule_Revisions() {
+        return (EReference)moduleEClass.getEStructuralFeatures().get(1);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getGrouping() {
+        return groupingEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getLeaf() {
+        return leafEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getContainer() {
+        return containerEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getNode() {
+        return nodeEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EReference getNode_Parent() {
+        return (EReference)nodeEClass.getEStructuralFeatures().get(0);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getNamedNode() {
+        return namedNodeEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EAttribute getNamedNode_Name() {
+        return (EAttribute)namedNodeEClass.getEStructuralFeatures().get(0);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getContainingNode() {
+        return containingNodeEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EReference getContainingNode_Children() {
+        return (EReference)containingNodeEClass.getEStructuralFeatures().get(0);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getNamedContainingNode() {
+        return namedContainingNodeEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getSubmodule() {
+        return submoduleEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EReference getSubmodule_BelongsTo() {
+        return (EReference)submoduleEClass.getEStructuralFeatures().get(0);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getTypedef() {
+        return typedefEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getChoice() {
+        return choiceEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getLeafList() {
+        return leafListEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getAnyxml() {
+        return anyxmlEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getImport() {
+        return importEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EAttribute getImport_Prefix() {
+        return (EAttribute)importEClass.getEStructuralFeatures().get(0);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EAttribute getImport_RevisionDate() {
+        return (EAttribute)importEClass.getEStructuralFeatures().get(1);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EAttribute getImport_Module() {
+        return (EAttribute)importEClass.getEStructuralFeatures().get(2);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getInclude() {
+        return includeEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EReference getInclude_Submodule() {
+        return (EReference)includeEClass.getEStructuralFeatures().get(0);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getRevision() {
+        return revisionEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getBelongsTo() {
+        return belongsToEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EReference getBelongsTo_OwnerModule() {
+        return (EReference)belongsToEClass.getEStructuralFeatures().get(0);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getList() {
+        return listEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getTag() {
+        return tagEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EAttribute getTag_Name() {
+        return (EAttribute)tagEClass.getEStructuralFeatures().get(0);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EAttribute getTag_Value() {
+        return (EAttribute)tagEClass.getEStructuralFeatures().get(1);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getTaggedNode() {
+        return taggedNodeEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EReference getTaggedNode_Tags() {
+        return (EReference)taggedNodeEClass.getEStructuralFeatures().get(0);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getUses() {
+        return usesEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EAttribute getUses_QName() {
+        return (EAttribute)usesEClass.getEStructuralFeatures().get(0);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getRpc() {
+        return rpcEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getRpcIO() {
+        return rpcIOEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EAttribute getRpcIO_Input() {
+        return (EAttribute)rpcIOEClass.getEStructuralFeatures().get(0);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getNotification() {
+        return notificationEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getAugment() {
+        return augmentEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getExtension() {
+        return extensionEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getFeature() {
+        return featureEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getDeviation() {
+        return deviationEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getIdentity() {
+        return identityEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getTypedNode() {
+        return typedNodeEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EReference getTypedNode_Type() {
+        return (EReference)typedNodeEClass.getEStructuralFeatures().get(0);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getChoiceCase() {
+        return choiceCaseEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getListKey() {
+        return listKeyEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getTyperef() {
+        return typerefEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EClass getReferenceNode() {
+        return referenceNodeEClass;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EAttribute getReferenceNode_Reference() {
+        return (EAttribute)referenceNodeEClass.getEStructuralFeatures().get(0);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public ModelFactory getModelFactory() {
+        return (ModelFactory)getEFactoryInstance();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private boolean isCreated = false;
+
+    /**
+     * Creates the meta-model objects for the package.  This method is
+     * guarded to have no affect on any invocation but its first.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void createPackageContents() {
+        if (isCreated) return;
+        isCreated = true;
+
+        // Create classes and their features
+        moduleEClass = createEClass(MODULE);
+        createEAttribute(moduleEClass, MODULE__NAMESPACE);
+        createEReference(moduleEClass, MODULE__REVISIONS);
+
+        groupingEClass = createEClass(GROUPING);
+
+        leafEClass = createEClass(LEAF);
+
+        containerEClass = createEClass(CONTAINER);
+
+        nodeEClass = createEClass(NODE);
+        createEReference(nodeEClass, NODE__PARENT);
+
+        namedNodeEClass = createEClass(NAMED_NODE);
+        createEAttribute(namedNodeEClass, NAMED_NODE__NAME);
+
+        containingNodeEClass = createEClass(CONTAINING_NODE);
+        createEReference(containingNodeEClass, CONTAINING_NODE__CHILDREN);
+
+        namedContainingNodeEClass = createEClass(NAMED_CONTAINING_NODE);
+
+        submoduleEClass = createEClass(SUBMODULE);
+        createEReference(submoduleEClass, SUBMODULE__BELONGS_TO);
+
+        typedefEClass = createEClass(TYPEDEF);
+
+        choiceEClass = createEClass(CHOICE);
+
+        leafListEClass = createEClass(LEAF_LIST);
+
+        anyxmlEClass = createEClass(ANYXML);
+
+        importEClass = createEClass(IMPORT);
+        createEAttribute(importEClass, IMPORT__PREFIX);
+        createEAttribute(importEClass, IMPORT__REVISION_DATE);
+        createEAttribute(importEClass, IMPORT__MODULE);
+
+        includeEClass = createEClass(INCLUDE);
+        createEReference(includeEClass, INCLUDE__SUBMODULE);
+
+        revisionEClass = createEClass(REVISION);
+
+        belongsToEClass = createEClass(BELONGS_TO);
+        createEReference(belongsToEClass, BELONGS_TO__OWNER_MODULE);
+
+        listEClass = createEClass(LIST);
+
+        tagEClass = createEClass(TAG);
+        createEAttribute(tagEClass, TAG__NAME);
+        createEAttribute(tagEClass, TAG__VALUE);
+
+        taggedNodeEClass = createEClass(TAGGED_NODE);
+        createEReference(taggedNodeEClass, TAGGED_NODE__TAGS);
+
+        usesEClass = createEClass(USES);
+        createEAttribute(usesEClass, USES__QNAME);
+
+        rpcEClass = createEClass(RPC);
+
+        rpcIOEClass = createEClass(RPC_IO);
+        createEAttribute(rpcIOEClass, RPC_IO__INPUT);
+
+        notificationEClass = createEClass(NOTIFICATION);
+
+        augmentEClass = createEClass(AUGMENT);
+
+        extensionEClass = createEClass(EXTENSION);
+
+        featureEClass = createEClass(FEATURE);
+
+        deviationEClass = createEClass(DEVIATION);
+
+        identityEClass = createEClass(IDENTITY);
+
+        typedNodeEClass = createEClass(TYPED_NODE);
+        createEReference(typedNodeEClass, TYPED_NODE__TYPE);
+
+        choiceCaseEClass = createEClass(CHOICE_CASE);
+
+        listKeyEClass = createEClass(LIST_KEY);
+
+        typerefEClass = createEClass(TYPEREF);
+
+        referenceNodeEClass = createEClass(REFERENCE_NODE);
+        createEAttribute(referenceNodeEClass, REFERENCE_NODE__REFERENCE);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    private boolean isInitialized = false;
+
+    /**
+     * Complete the initialization of the package and its meta-model.  This
+     * method is guarded to have no affect on any invocation but its first.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void initializePackageContents() {
+        if (isInitialized) return;
+        isInitialized = true;
+
+        // Initialize package
+        setName(eNAME);
+        setNsPrefix(eNS_PREFIX);
+        setNsURI(eNS_URI);
+
+        // Obtain other dependent packages
+        XMLTypePackage theXMLTypePackage = (XMLTypePackage)EPackage.Registry.INSTANCE.getEPackage(XMLTypePackage.eNS_URI);
+
+        // Create type parameters
+
+        // Set bounds for type parameters
+
+        // Add supertypes to classes
+        moduleEClass.getESuperTypes().add(this.getNamedContainingNode());
+        moduleEClass.getESuperTypes().add(this.getTaggedNode());
+        groupingEClass.getESuperTypes().add(this.getNamedContainingNode());
+        groupingEClass.getESuperTypes().add(this.getTaggedNode());
+        leafEClass.getESuperTypes().add(this.getNamedNode());
+        leafEClass.getESuperTypes().add(this.getTaggedNode());
+        leafEClass.getESuperTypes().add(this.getTypedNode());
+        containerEClass.getESuperTypes().add(this.getNamedContainingNode());
+        containerEClass.getESuperTypes().add(this.getTaggedNode());
+        namedNodeEClass.getESuperTypes().add(this.getNode());
+        containingNodeEClass.getESuperTypes().add(this.getNode());
+        namedContainingNodeEClass.getESuperTypes().add(this.getNamedNode());
+        namedContainingNodeEClass.getESuperTypes().add(this.getContainingNode());
+        submoduleEClass.getESuperTypes().add(this.getModule());
+        typedefEClass.getESuperTypes().add(this.getNamedNode());
+        typedefEClass.getESuperTypes().add(this.getTaggedNode());
+        typedefEClass.getESuperTypes().add(this.getTypedNode());
+        choiceEClass.getESuperTypes().add(this.getNamedContainingNode());
+        choiceEClass.getESuperTypes().add(this.getTaggedNode());
+        leafListEClass.getESuperTypes().add(this.getNamedNode());
+        leafListEClass.getESuperTypes().add(this.getTaggedNode());
+        leafListEClass.getESuperTypes().add(this.getTypedNode());
+        anyxmlEClass.getESuperTypes().add(this.getNamedNode());
+        anyxmlEClass.getESuperTypes().add(this.getTaggedNode());
+        importEClass.getESuperTypes().add(this.getNode());
+        includeEClass.getESuperTypes().add(this.getNode());
+        revisionEClass.getESuperTypes().add(this.getTaggedNode());
+        revisionEClass.getESuperTypes().add(this.getNamedNode());
+        listEClass.getESuperTypes().add(this.getNamedContainingNode());
+        listEClass.getESuperTypes().add(this.getTaggedNode());
+        usesEClass.getESuperTypes().add(this.getNode());
+        rpcEClass.getESuperTypes().add(this.getNamedContainingNode());
+        rpcEClass.getESuperTypes().add(this.getTaggedNode());
+        rpcIOEClass.getESuperTypes().add(this.getContainingNode());
+        notificationEClass.getESuperTypes().add(this.getNamedContainingNode());
+        augmentEClass.getESuperTypes().add(this.getNamedContainingNode());
+        extensionEClass.getESuperTypes().add(this.getNamedNode());
+        featureEClass.getESuperTypes().add(this.getNamedNode());
+        deviationEClass.getESuperTypes().add(this.getNamedNode());
+        identityEClass.getESuperTypes().add(this.getNamedNode());
+        identityEClass.getESuperTypes().add(this.getReferenceNode());
+        choiceCaseEClass.getESuperTypes().add(this.getNamedContainingNode());
+        choiceCaseEClass.getESuperTypes().add(this.getTaggedNode());
+        listKeyEClass.getESuperTypes().add(this.getNamedNode());
+        typerefEClass.getESuperTypes().add(this.getNamedNode());
+
+        // Initialize classes, features, and operations; add parameters
+        initEClass(moduleEClass, Module.class, "Module", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+        initEAttribute(getModule_Namespace(), ecorePackage.getEString(), "namespace", null, 1, 1, Module.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+        initEReference(getModule_Revisions(), this.getRevision(), null, "revisions", null, 0, -1, Module.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+        initEClass(groupingEClass, Grouping.class, "Grouping", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+        initEClass(leafEClass, Leaf.class, "Leaf", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+        initEClass(containerEClass, com.cisco.yangide.ext.model.Container.class, "Container", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+        initEClass(nodeEClass, Node.class, "Node", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+        initEReference(getNode_Parent(), this.getNode(), null, "parent", null, 0, 1, Node.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+        initEClass(namedNodeEClass, NamedNode.class, "NamedNode", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+        initEAttribute(getNamedNode_Name(), ecorePackage.getEString(), "name", null, 0, 1, NamedNode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+        initEClass(containingNodeEClass, ContainingNode.class, "ContainingNode", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+        initEReference(getContainingNode_Children(), this.getNode(), null, "children", null, 0, -1, ContainingNode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+        initEClass(namedContainingNodeEClass, NamedContainingNode.class, "NamedContainingNode", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+        initEClass(submoduleEClass, Submodule.class, "Submodule", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+        initEReference(getSubmodule_BelongsTo(), this.getBelongsTo(), null, "belongsTo", null, 1, 1, Submodule.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+        initEClass(typedefEClass, Typedef.class, "Typedef", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+        initEClass(choiceEClass, Choice.class, "Choice", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+        initEClass(leafListEClass, LeafList.class, "LeafList", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+        initEClass(anyxmlEClass, Anyxml.class, "Anyxml", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+        initEClass(importEClass, Import.class, "Import", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+        initEAttribute(getImport_Prefix(), theXMLTypePackage.getString(), "prefix", null, 1, 1, Import.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+        initEAttribute(getImport_RevisionDate(), theXMLTypePackage.getString(), "revisionDate", null, 0, 1, Import.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+        initEAttribute(getImport_Module(), theXMLTypePackage.getString(), "module", null, 0, 1, Import.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+        initEClass(includeEClass, Include.class, "Include", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+        initEReference(getInclude_Submodule(), this.getSubmodule(), null, "submodule", null, 1, 1, Include.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+        initEClass(revisionEClass, Revision.class, "Revision", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+        initEClass(belongsToEClass, BelongsTo.class, "BelongsTo", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+        initEReference(getBelongsTo_OwnerModule(), this.getModule(), null, "ownerModule", null, 1, 1, BelongsTo.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+        initEClass(listEClass, List.class, "List", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+        initEClass(tagEClass, Tag.class, "Tag", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+        initEAttribute(getTag_Name(), ecorePackage.getEString(), "name", null, 0, 1, Tag.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+        initEAttribute(getTag_Value(), ecorePackage.getEJavaObject(), "value", null, 0, 1, Tag.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+        initEClass(taggedNodeEClass, TaggedNode.class, "TaggedNode", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+        initEReference(getTaggedNode_Tags(), this.getTag(), null, "tags", null, 0, -1, TaggedNode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+        initEClass(usesEClass, Uses.class, "Uses", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+        initEAttribute(getUses_QName(), theXMLTypePackage.getString(), "qName", null, 0, 1, Uses.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+        initEClass(rpcEClass, Rpc.class, "Rpc", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+        initEClass(rpcIOEClass, RpcIO.class, "RpcIO", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+        initEAttribute(getRpcIO_Input(), theXMLTypePackage.getBoolean(), "input", null, 0, 1, RpcIO.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+        initEClass(notificationEClass, Notification.class, "Notification", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+        initEClass(augmentEClass, Augment.class, "Augment", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+        initEClass(extensionEClass, Extension.class, "Extension", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+        initEClass(featureEClass, Feature.class, "Feature", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+        initEClass(deviationEClass, Deviation.class, "Deviation", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+        initEClass(identityEClass, Identity.class, "Identity", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+        initEClass(typedNodeEClass, TypedNode.class, "TypedNode", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+        initEReference(getTypedNode_Type(), this.getTyperef(), null, "type", null, 0, 1, TypedNode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+        initEClass(choiceCaseEClass, ChoiceCase.class, "ChoiceCase", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+        initEClass(listKeyEClass, ListKey.class, "ListKey", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+        initEClass(typerefEClass, Typeref.class, "Typeref", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+        initEClass(referenceNodeEClass, ReferenceNode.class, "ReferenceNode", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+        initEAttribute(getReferenceNode_Reference(), theXMLTypePackage.getString(), "reference", null, 0, 1, ReferenceNode.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+        // Create resource
+        createResource(eNS_URI);
+    }
+
+} //ModelPackageImpl
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/ModuleImpl.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/ModuleImpl.java
new file mode 100644 (file)
index 0000000..d2d29fe
--- /dev/null
@@ -0,0 +1,461 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.impl;
+
+import com.cisco.yangide.ext.model.ContainingNode;
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Module;
+import com.cisco.yangide.ext.model.Node;
+import com.cisco.yangide.ext.model.Revision;
+import com.cisco.yangide.ext.model.Tag;
+import com.cisco.yangide.ext.model.TaggedNode;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Module</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.ModuleImpl#getParent <em>Parent</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.ModuleImpl#getName <em>Name</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.ModuleImpl#getChildren <em>Children</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.ModuleImpl#getTags <em>Tags</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.ModuleImpl#getNamespace <em>Namespace</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.ModuleImpl#getRevisions <em>Revisions</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class ModuleImpl extends MinimalEObjectImpl.Container implements Module {
+    /**
+     * The cached value of the '{@link #getParent() <em>Parent</em>}' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getParent()
+     * @generated
+     * @ordered
+     */
+    protected Node parent;
+
+    /**
+     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected static final String NAME_EDEFAULT = null;
+
+    /**
+     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected String name = NAME_EDEFAULT;
+
+    /**
+     * The cached value of the '{@link #getChildren() <em>Children</em>}' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getChildren()
+     * @generated
+     * @ordered
+     */
+    protected EList<Node> children;
+
+    /**
+     * The cached value of the '{@link #getTags() <em>Tags</em>}' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getTags()
+     * @generated
+     * @ordered
+     */
+    protected EList<Tag> tags;
+
+    /**
+     * The default value of the '{@link #getNamespace() <em>Namespace</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getNamespace()
+     * @generated
+     * @ordered
+     */
+    protected static final String NAMESPACE_EDEFAULT = null;
+
+    /**
+     * The cached value of the '{@link #getNamespace() <em>Namespace</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getNamespace()
+     * @generated
+     * @ordered
+     */
+    protected String namespace = NAMESPACE_EDEFAULT;
+
+    /**
+     * The cached value of the '{@link #getRevisions() <em>Revisions</em>}' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getRevisions()
+     * @generated
+     * @ordered
+     */
+    protected EList<Revision> revisions;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected ModuleImpl() {
+        super();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected EClass eStaticClass() {
+        return ModelPackage.Literals.MODULE;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node getParent() {
+        if (parent != null && parent.eIsProxy()) {
+            InternalEObject oldParent = (InternalEObject)parent;
+            parent = (Node)eResolveProxy(oldParent);
+            if (parent != oldParent) {
+                if (eNotificationRequired())
+                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, ModelPackage.MODULE__PARENT, oldParent, parent));
+            }
+        }
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node basicGetParent() {
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setParent(Node newParent) {
+        Node oldParent = parent;
+        parent = newParent;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.MODULE__PARENT, oldParent, parent));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setName(String newName) {
+        String oldName = name;
+        name = newName;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.MODULE__NAME, oldName, name));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EList<Node> getChildren() {
+        if (children == null) {
+            children = new EObjectContainmentEList<Node>(Node.class, this, ModelPackage.MODULE__CHILDREN);
+        }
+        return children;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EList<Tag> getTags() {
+        if (tags == null) {
+            tags = new EObjectContainmentEList<Tag>(Tag.class, this, ModelPackage.MODULE__TAGS);
+        }
+        return tags;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getNamespace() {
+        return namespace;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setNamespace(String newNamespace) {
+        String oldNamespace = namespace;
+        namespace = newNamespace;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.MODULE__NAMESPACE, oldNamespace, namespace));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EList<Revision> getRevisions() {
+        if (revisions == null) {
+            revisions = new EObjectContainmentEList<Revision>(Revision.class, this, ModelPackage.MODULE__REVISIONS);
+        }
+        return revisions;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+        switch (featureID) {
+            case ModelPackage.MODULE__CHILDREN:
+                return ((InternalEList<?>)getChildren()).basicRemove(otherEnd, msgs);
+            case ModelPackage.MODULE__TAGS:
+                return ((InternalEList<?>)getTags()).basicRemove(otherEnd, msgs);
+            case ModelPackage.MODULE__REVISIONS:
+                return ((InternalEList<?>)getRevisions()).basicRemove(otherEnd, msgs);
+        }
+        return super.eInverseRemove(otherEnd, featureID, msgs);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object eGet(int featureID, boolean resolve, boolean coreType) {
+        switch (featureID) {
+            case ModelPackage.MODULE__PARENT:
+                if (resolve) return getParent();
+                return basicGetParent();
+            case ModelPackage.MODULE__NAME:
+                return getName();
+            case ModelPackage.MODULE__CHILDREN:
+                return getChildren();
+            case ModelPackage.MODULE__TAGS:
+                return getTags();
+            case ModelPackage.MODULE__NAMESPACE:
+                return getNamespace();
+            case ModelPackage.MODULE__REVISIONS:
+                return getRevisions();
+        }
+        return super.eGet(featureID, resolve, coreType);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @SuppressWarnings("unchecked")
+    @Override
+    public void eSet(int featureID, Object newValue) {
+        switch (featureID) {
+            case ModelPackage.MODULE__PARENT:
+                setParent((Node)newValue);
+                return;
+            case ModelPackage.MODULE__NAME:
+                setName((String)newValue);
+                return;
+            case ModelPackage.MODULE__CHILDREN:
+                getChildren().clear();
+                getChildren().addAll((Collection<? extends Node>)newValue);
+                return;
+            case ModelPackage.MODULE__TAGS:
+                getTags().clear();
+                getTags().addAll((Collection<? extends Tag>)newValue);
+                return;
+            case ModelPackage.MODULE__NAMESPACE:
+                setNamespace((String)newValue);
+                return;
+            case ModelPackage.MODULE__REVISIONS:
+                getRevisions().clear();
+                getRevisions().addAll((Collection<? extends Revision>)newValue);
+                return;
+        }
+        super.eSet(featureID, newValue);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eUnset(int featureID) {
+        switch (featureID) {
+            case ModelPackage.MODULE__PARENT:
+                setParent((Node)null);
+                return;
+            case ModelPackage.MODULE__NAME:
+                setName(NAME_EDEFAULT);
+                return;
+            case ModelPackage.MODULE__CHILDREN:
+                getChildren().clear();
+                return;
+            case ModelPackage.MODULE__TAGS:
+                getTags().clear();
+                return;
+            case ModelPackage.MODULE__NAMESPACE:
+                setNamespace(NAMESPACE_EDEFAULT);
+                return;
+            case ModelPackage.MODULE__REVISIONS:
+                getRevisions().clear();
+                return;
+        }
+        super.eUnset(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public boolean eIsSet(int featureID) {
+        switch (featureID) {
+            case ModelPackage.MODULE__PARENT:
+                return parent != null;
+            case ModelPackage.MODULE__NAME:
+                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+            case ModelPackage.MODULE__CHILDREN:
+                return children != null && !children.isEmpty();
+            case ModelPackage.MODULE__TAGS:
+                return tags != null && !tags.isEmpty();
+            case ModelPackage.MODULE__NAMESPACE:
+                return NAMESPACE_EDEFAULT == null ? namespace != null : !NAMESPACE_EDEFAULT.equals(namespace);
+            case ModelPackage.MODULE__REVISIONS:
+                return revisions != null && !revisions.isEmpty();
+        }
+        return super.eIsSet(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
+        if (baseClass == ContainingNode.class) {
+            switch (derivedFeatureID) {
+                case ModelPackage.MODULE__CHILDREN: return ModelPackage.CONTAINING_NODE__CHILDREN;
+                default: return -1;
+            }
+        }
+        if (baseClass == TaggedNode.class) {
+            switch (derivedFeatureID) {
+                case ModelPackage.MODULE__TAGS: return ModelPackage.TAGGED_NODE__TAGS;
+                default: return -1;
+            }
+        }
+        return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
+        if (baseClass == ContainingNode.class) {
+            switch (baseFeatureID) {
+                case ModelPackage.CONTAINING_NODE__CHILDREN: return ModelPackage.MODULE__CHILDREN;
+                default: return -1;
+            }
+        }
+        if (baseClass == TaggedNode.class) {
+            switch (baseFeatureID) {
+                case ModelPackage.TAGGED_NODE__TAGS: return ModelPackage.MODULE__TAGS;
+                default: return -1;
+            }
+        }
+        return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public String toString() {
+        if (eIsProxy()) return super.toString();
+
+        StringBuffer result = new StringBuffer(super.toString());
+        result.append(" (name: ");
+        result.append(name);
+        result.append(", namespace: ");
+        result.append(namespace);
+        result.append(')');
+        return result.toString();
+    }
+
+} //ModuleImpl
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/NotificationImpl.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/NotificationImpl.java
new file mode 100644 (file)
index 0000000..7170267
--- /dev/null
@@ -0,0 +1,319 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.impl;
+
+import com.cisco.yangide.ext.model.ContainingNode;
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Node;
+import com.cisco.yangide.ext.model.Notification;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Notification</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.NotificationImpl#getParent <em>Parent</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.NotificationImpl#getName <em>Name</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.NotificationImpl#getChildren <em>Children</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class NotificationImpl extends MinimalEObjectImpl.Container implements Notification {
+    /**
+     * The cached value of the '{@link #getParent() <em>Parent</em>}' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getParent()
+     * @generated
+     * @ordered
+     */
+    protected Node parent;
+
+    /**
+     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected static final String NAME_EDEFAULT = null;
+
+    /**
+     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected String name = NAME_EDEFAULT;
+
+    /**
+     * The cached value of the '{@link #getChildren() <em>Children</em>}' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getChildren()
+     * @generated
+     * @ordered
+     */
+    protected EList<Node> children;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected NotificationImpl() {
+        super();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected EClass eStaticClass() {
+        return ModelPackage.Literals.NOTIFICATION;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node getParent() {
+        if (parent != null && parent.eIsProxy()) {
+            InternalEObject oldParent = (InternalEObject)parent;
+            parent = (Node)eResolveProxy(oldParent);
+            if (parent != oldParent) {
+                if (eNotificationRequired())
+                    eNotify(new ENotificationImpl(this, org.eclipse.emf.common.notify.Notification.RESOLVE, ModelPackage.NOTIFICATION__PARENT, oldParent, parent));
+            }
+        }
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node basicGetParent() {
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setParent(Node newParent) {
+        Node oldParent = parent;
+        parent = newParent;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, org.eclipse.emf.common.notify.Notification.SET, ModelPackage.NOTIFICATION__PARENT, oldParent, parent));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setName(String newName) {
+        String oldName = name;
+        name = newName;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, org.eclipse.emf.common.notify.Notification.SET, ModelPackage.NOTIFICATION__NAME, oldName, name));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EList<Node> getChildren() {
+        if (children == null) {
+            children = new EObjectContainmentEList<Node>(Node.class, this, ModelPackage.NOTIFICATION__CHILDREN);
+        }
+        return children;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+        switch (featureID) {
+            case ModelPackage.NOTIFICATION__CHILDREN:
+                return ((InternalEList<?>)getChildren()).basicRemove(otherEnd, msgs);
+        }
+        return super.eInverseRemove(otherEnd, featureID, msgs);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object eGet(int featureID, boolean resolve, boolean coreType) {
+        switch (featureID) {
+            case ModelPackage.NOTIFICATION__PARENT:
+                if (resolve) return getParent();
+                return basicGetParent();
+            case ModelPackage.NOTIFICATION__NAME:
+                return getName();
+            case ModelPackage.NOTIFICATION__CHILDREN:
+                return getChildren();
+        }
+        return super.eGet(featureID, resolve, coreType);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @SuppressWarnings("unchecked")
+    @Override
+    public void eSet(int featureID, Object newValue) {
+        switch (featureID) {
+            case ModelPackage.NOTIFICATION__PARENT:
+                setParent((Node)newValue);
+                return;
+            case ModelPackage.NOTIFICATION__NAME:
+                setName((String)newValue);
+                return;
+            case ModelPackage.NOTIFICATION__CHILDREN:
+                getChildren().clear();
+                getChildren().addAll((Collection<? extends Node>)newValue);
+                return;
+        }
+        super.eSet(featureID, newValue);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eUnset(int featureID) {
+        switch (featureID) {
+            case ModelPackage.NOTIFICATION__PARENT:
+                setParent((Node)null);
+                return;
+            case ModelPackage.NOTIFICATION__NAME:
+                setName(NAME_EDEFAULT);
+                return;
+            case ModelPackage.NOTIFICATION__CHILDREN:
+                getChildren().clear();
+                return;
+        }
+        super.eUnset(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public boolean eIsSet(int featureID) {
+        switch (featureID) {
+            case ModelPackage.NOTIFICATION__PARENT:
+                return parent != null;
+            case ModelPackage.NOTIFICATION__NAME:
+                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+            case ModelPackage.NOTIFICATION__CHILDREN:
+                return children != null && !children.isEmpty();
+        }
+        return super.eIsSet(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
+        if (baseClass == ContainingNode.class) {
+            switch (derivedFeatureID) {
+                case ModelPackage.NOTIFICATION__CHILDREN: return ModelPackage.CONTAINING_NODE__CHILDREN;
+                default: return -1;
+            }
+        }
+        return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
+        if (baseClass == ContainingNode.class) {
+            switch (baseFeatureID) {
+                case ModelPackage.CONTAINING_NODE__CHILDREN: return ModelPackage.NOTIFICATION__CHILDREN;
+                default: return -1;
+            }
+        }
+        return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public String toString() {
+        if (eIsProxy()) return super.toString();
+
+        StringBuffer result = new StringBuffer(super.toString());
+        result.append(" (name: ");
+        result.append(name);
+        result.append(')');
+        return result.toString();
+    }
+
+} //NotificationImpl
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/RevisionImpl.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/RevisionImpl.java
new file mode 100644 (file)
index 0000000..1e75eaf
--- /dev/null
@@ -0,0 +1,333 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.impl;
+
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.NamedNode;
+import com.cisco.yangide.ext.model.Node;
+import com.cisco.yangide.ext.model.Revision;
+import com.cisco.yangide.ext.model.Tag;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Revision</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.RevisionImpl#getTags <em>Tags</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.RevisionImpl#getParent <em>Parent</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.RevisionImpl#getName <em>Name</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class RevisionImpl extends MinimalEObjectImpl.Container implements Revision {
+    /**
+     * The cached value of the '{@link #getTags() <em>Tags</em>}' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getTags()
+     * @generated
+     * @ordered
+     */
+    protected EList<Tag> tags;
+
+    /**
+     * The cached value of the '{@link #getParent() <em>Parent</em>}' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getParent()
+     * @generated
+     * @ordered
+     */
+    protected Node parent;
+
+    /**
+     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected static final String NAME_EDEFAULT = null;
+
+    /**
+     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected String name = NAME_EDEFAULT;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected RevisionImpl() {
+        super();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected EClass eStaticClass() {
+        return ModelPackage.Literals.REVISION;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EList<Tag> getTags() {
+        if (tags == null) {
+            tags = new EObjectContainmentEList<Tag>(Tag.class, this, ModelPackage.REVISION__TAGS);
+        }
+        return tags;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node getParent() {
+        if (parent != null && parent.eIsProxy()) {
+            InternalEObject oldParent = (InternalEObject)parent;
+            parent = (Node)eResolveProxy(oldParent);
+            if (parent != oldParent) {
+                if (eNotificationRequired())
+                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, ModelPackage.REVISION__PARENT, oldParent, parent));
+            }
+        }
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node basicGetParent() {
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setParent(Node newParent) {
+        Node oldParent = parent;
+        parent = newParent;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.REVISION__PARENT, oldParent, parent));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setName(String newName) {
+        String oldName = name;
+        name = newName;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.REVISION__NAME, oldName, name));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+        switch (featureID) {
+            case ModelPackage.REVISION__TAGS:
+                return ((InternalEList<?>)getTags()).basicRemove(otherEnd, msgs);
+        }
+        return super.eInverseRemove(otherEnd, featureID, msgs);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object eGet(int featureID, boolean resolve, boolean coreType) {
+        switch (featureID) {
+            case ModelPackage.REVISION__TAGS:
+                return getTags();
+            case ModelPackage.REVISION__PARENT:
+                if (resolve) return getParent();
+                return basicGetParent();
+            case ModelPackage.REVISION__NAME:
+                return getName();
+        }
+        return super.eGet(featureID, resolve, coreType);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @SuppressWarnings("unchecked")
+    @Override
+    public void eSet(int featureID, Object newValue) {
+        switch (featureID) {
+            case ModelPackage.REVISION__TAGS:
+                getTags().clear();
+                getTags().addAll((Collection<? extends Tag>)newValue);
+                return;
+            case ModelPackage.REVISION__PARENT:
+                setParent((Node)newValue);
+                return;
+            case ModelPackage.REVISION__NAME:
+                setName((String)newValue);
+                return;
+        }
+        super.eSet(featureID, newValue);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eUnset(int featureID) {
+        switch (featureID) {
+            case ModelPackage.REVISION__TAGS:
+                getTags().clear();
+                return;
+            case ModelPackage.REVISION__PARENT:
+                setParent((Node)null);
+                return;
+            case ModelPackage.REVISION__NAME:
+                setName(NAME_EDEFAULT);
+                return;
+        }
+        super.eUnset(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public boolean eIsSet(int featureID) {
+        switch (featureID) {
+            case ModelPackage.REVISION__TAGS:
+                return tags != null && !tags.isEmpty();
+            case ModelPackage.REVISION__PARENT:
+                return parent != null;
+            case ModelPackage.REVISION__NAME:
+                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+        }
+        return super.eIsSet(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
+        if (baseClass == Node.class) {
+            switch (derivedFeatureID) {
+                case ModelPackage.REVISION__PARENT: return ModelPackage.NODE__PARENT;
+                default: return -1;
+            }
+        }
+        if (baseClass == NamedNode.class) {
+            switch (derivedFeatureID) {
+                case ModelPackage.REVISION__NAME: return ModelPackage.NAMED_NODE__NAME;
+                default: return -1;
+            }
+        }
+        return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
+        if (baseClass == Node.class) {
+            switch (baseFeatureID) {
+                case ModelPackage.NODE__PARENT: return ModelPackage.REVISION__PARENT;
+                default: return -1;
+            }
+        }
+        if (baseClass == NamedNode.class) {
+            switch (baseFeatureID) {
+                case ModelPackage.NAMED_NODE__NAME: return ModelPackage.REVISION__NAME;
+                default: return -1;
+            }
+        }
+        return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public String toString() {
+        if (eIsProxy()) return super.toString();
+
+        StringBuffer result = new StringBuffer(super.toString());
+        result.append(" (name: ");
+        result.append(name);
+        result.append(')');
+        return result.toString();
+    }
+
+} //RevisionImpl
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/RpcIOImpl.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/RpcIOImpl.java
new file mode 100644 (file)
index 0000000..7bdeec4
--- /dev/null
@@ -0,0 +1,287 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.impl;
+
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Node;
+import com.cisco.yangide.ext.model.RpcIO;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Rpc IO</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.RpcIOImpl#getParent <em>Parent</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.RpcIOImpl#getChildren <em>Children</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.RpcIOImpl#isInput <em>Input</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class RpcIOImpl extends MinimalEObjectImpl.Container implements RpcIO {
+    /**
+     * The cached value of the '{@link #getParent() <em>Parent</em>}' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getParent()
+     * @generated
+     * @ordered
+     */
+    protected Node parent;
+
+    /**
+     * The cached value of the '{@link #getChildren() <em>Children</em>}' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getChildren()
+     * @generated
+     * @ordered
+     */
+    protected EList<Node> children;
+
+    /**
+     * The default value of the '{@link #isInput() <em>Input</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #isInput()
+     * @generated
+     * @ordered
+     */
+    protected static final boolean INPUT_EDEFAULT = false;
+
+    /**
+     * The cached value of the '{@link #isInput() <em>Input</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #isInput()
+     * @generated
+     * @ordered
+     */
+    protected boolean input = INPUT_EDEFAULT;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected RpcIOImpl() {
+        super();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected EClass eStaticClass() {
+        return ModelPackage.Literals.RPC_IO;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node getParent() {
+        if (parent != null && parent.eIsProxy()) {
+            InternalEObject oldParent = (InternalEObject)parent;
+            parent = (Node)eResolveProxy(oldParent);
+            if (parent != oldParent) {
+                if (eNotificationRequired())
+                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, ModelPackage.RPC_IO__PARENT, oldParent, parent));
+            }
+        }
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node basicGetParent() {
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setParent(Node newParent) {
+        Node oldParent = parent;
+        parent = newParent;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.RPC_IO__PARENT, oldParent, parent));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EList<Node> getChildren() {
+        if (children == null) {
+            children = new EObjectContainmentEList<Node>(Node.class, this, ModelPackage.RPC_IO__CHILDREN);
+        }
+        return children;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public boolean isInput() {
+        return input;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setInput(boolean newInput) {
+        boolean oldInput = input;
+        input = newInput;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.RPC_IO__INPUT, oldInput, input));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+        switch (featureID) {
+            case ModelPackage.RPC_IO__CHILDREN:
+                return ((InternalEList<?>)getChildren()).basicRemove(otherEnd, msgs);
+        }
+        return super.eInverseRemove(otherEnd, featureID, msgs);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object eGet(int featureID, boolean resolve, boolean coreType) {
+        switch (featureID) {
+            case ModelPackage.RPC_IO__PARENT:
+                if (resolve) return getParent();
+                return basicGetParent();
+            case ModelPackage.RPC_IO__CHILDREN:
+                return getChildren();
+            case ModelPackage.RPC_IO__INPUT:
+                return isInput();
+        }
+        return super.eGet(featureID, resolve, coreType);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @SuppressWarnings("unchecked")
+    @Override
+    public void eSet(int featureID, Object newValue) {
+        switch (featureID) {
+            case ModelPackage.RPC_IO__PARENT:
+                setParent((Node)newValue);
+                return;
+            case ModelPackage.RPC_IO__CHILDREN:
+                getChildren().clear();
+                getChildren().addAll((Collection<? extends Node>)newValue);
+                return;
+            case ModelPackage.RPC_IO__INPUT:
+                setInput((Boolean)newValue);
+                return;
+        }
+        super.eSet(featureID, newValue);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eUnset(int featureID) {
+        switch (featureID) {
+            case ModelPackage.RPC_IO__PARENT:
+                setParent((Node)null);
+                return;
+            case ModelPackage.RPC_IO__CHILDREN:
+                getChildren().clear();
+                return;
+            case ModelPackage.RPC_IO__INPUT:
+                setInput(INPUT_EDEFAULT);
+                return;
+        }
+        super.eUnset(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public boolean eIsSet(int featureID) {
+        switch (featureID) {
+            case ModelPackage.RPC_IO__PARENT:
+                return parent != null;
+            case ModelPackage.RPC_IO__CHILDREN:
+                return children != null && !children.isEmpty();
+            case ModelPackage.RPC_IO__INPUT:
+                return input != INPUT_EDEFAULT;
+        }
+        return super.eIsSet(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public String toString() {
+        if (eIsProxy()) return super.toString();
+
+        StringBuffer result = new StringBuffer(super.toString());
+        result.append(" (input: ");
+        result.append(input);
+        result.append(')');
+        return result.toString();
+    }
+
+} //RpcIOImpl
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/RpcImpl.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/RpcImpl.java
new file mode 100644 (file)
index 0000000..069554a
--- /dev/null
@@ -0,0 +1,370 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.impl;
+
+import com.cisco.yangide.ext.model.ContainingNode;
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Node;
+import com.cisco.yangide.ext.model.Rpc;
+import com.cisco.yangide.ext.model.Tag;
+import com.cisco.yangide.ext.model.TaggedNode;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Rpc</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.RpcImpl#getParent <em>Parent</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.RpcImpl#getName <em>Name</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.RpcImpl#getChildren <em>Children</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.RpcImpl#getTags <em>Tags</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class RpcImpl extends MinimalEObjectImpl.Container implements Rpc {
+    /**
+     * The cached value of the '{@link #getParent() <em>Parent</em>}' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getParent()
+     * @generated
+     * @ordered
+     */
+    protected Node parent;
+
+    /**
+     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected static final String NAME_EDEFAULT = null;
+
+    /**
+     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected String name = NAME_EDEFAULT;
+
+    /**
+     * The cached value of the '{@link #getChildren() <em>Children</em>}' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getChildren()
+     * @generated
+     * @ordered
+     */
+    protected EList<Node> children;
+
+    /**
+     * The cached value of the '{@link #getTags() <em>Tags</em>}' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getTags()
+     * @generated
+     * @ordered
+     */
+    protected EList<Tag> tags;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected RpcImpl() {
+        super();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected EClass eStaticClass() {
+        return ModelPackage.Literals.RPC;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node getParent() {
+        if (parent != null && parent.eIsProxy()) {
+            InternalEObject oldParent = (InternalEObject)parent;
+            parent = (Node)eResolveProxy(oldParent);
+            if (parent != oldParent) {
+                if (eNotificationRequired())
+                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, ModelPackage.RPC__PARENT, oldParent, parent));
+            }
+        }
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node basicGetParent() {
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setParent(Node newParent) {
+        Node oldParent = parent;
+        parent = newParent;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.RPC__PARENT, oldParent, parent));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setName(String newName) {
+        String oldName = name;
+        name = newName;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.RPC__NAME, oldName, name));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EList<Node> getChildren() {
+        if (children == null) {
+            children = new EObjectContainmentEList<Node>(Node.class, this, ModelPackage.RPC__CHILDREN);
+        }
+        return children;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EList<Tag> getTags() {
+        if (tags == null) {
+            tags = new EObjectContainmentEList<Tag>(Tag.class, this, ModelPackage.RPC__TAGS);
+        }
+        return tags;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+        switch (featureID) {
+            case ModelPackage.RPC__CHILDREN:
+                return ((InternalEList<?>)getChildren()).basicRemove(otherEnd, msgs);
+            case ModelPackage.RPC__TAGS:
+                return ((InternalEList<?>)getTags()).basicRemove(otherEnd, msgs);
+        }
+        return super.eInverseRemove(otherEnd, featureID, msgs);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object eGet(int featureID, boolean resolve, boolean coreType) {
+        switch (featureID) {
+            case ModelPackage.RPC__PARENT:
+                if (resolve) return getParent();
+                return basicGetParent();
+            case ModelPackage.RPC__NAME:
+                return getName();
+            case ModelPackage.RPC__CHILDREN:
+                return getChildren();
+            case ModelPackage.RPC__TAGS:
+                return getTags();
+        }
+        return super.eGet(featureID, resolve, coreType);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @SuppressWarnings("unchecked")
+    @Override
+    public void eSet(int featureID, Object newValue) {
+        switch (featureID) {
+            case ModelPackage.RPC__PARENT:
+                setParent((Node)newValue);
+                return;
+            case ModelPackage.RPC__NAME:
+                setName((String)newValue);
+                return;
+            case ModelPackage.RPC__CHILDREN:
+                getChildren().clear();
+                getChildren().addAll((Collection<? extends Node>)newValue);
+                return;
+            case ModelPackage.RPC__TAGS:
+                getTags().clear();
+                getTags().addAll((Collection<? extends Tag>)newValue);
+                return;
+        }
+        super.eSet(featureID, newValue);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eUnset(int featureID) {
+        switch (featureID) {
+            case ModelPackage.RPC__PARENT:
+                setParent((Node)null);
+                return;
+            case ModelPackage.RPC__NAME:
+                setName(NAME_EDEFAULT);
+                return;
+            case ModelPackage.RPC__CHILDREN:
+                getChildren().clear();
+                return;
+            case ModelPackage.RPC__TAGS:
+                getTags().clear();
+                return;
+        }
+        super.eUnset(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public boolean eIsSet(int featureID) {
+        switch (featureID) {
+            case ModelPackage.RPC__PARENT:
+                return parent != null;
+            case ModelPackage.RPC__NAME:
+                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+            case ModelPackage.RPC__CHILDREN:
+                return children != null && !children.isEmpty();
+            case ModelPackage.RPC__TAGS:
+                return tags != null && !tags.isEmpty();
+        }
+        return super.eIsSet(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
+        if (baseClass == ContainingNode.class) {
+            switch (derivedFeatureID) {
+                case ModelPackage.RPC__CHILDREN: return ModelPackage.CONTAINING_NODE__CHILDREN;
+                default: return -1;
+            }
+        }
+        if (baseClass == TaggedNode.class) {
+            switch (derivedFeatureID) {
+                case ModelPackage.RPC__TAGS: return ModelPackage.TAGGED_NODE__TAGS;
+                default: return -1;
+            }
+        }
+        return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
+        if (baseClass == ContainingNode.class) {
+            switch (baseFeatureID) {
+                case ModelPackage.CONTAINING_NODE__CHILDREN: return ModelPackage.RPC__CHILDREN;
+                default: return -1;
+            }
+        }
+        if (baseClass == TaggedNode.class) {
+            switch (baseFeatureID) {
+                case ModelPackage.TAGGED_NODE__TAGS: return ModelPackage.RPC__TAGS;
+                default: return -1;
+            }
+        }
+        return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public String toString() {
+        if (eIsProxy()) return super.toString();
+
+        StringBuffer result = new StringBuffer(super.toString());
+        result.append(" (name: ");
+        result.append(name);
+        result.append(')');
+        return result.toString();
+    }
+
+} //RpcImpl
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/SubmoduleImpl.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/SubmoduleImpl.java
new file mode 100644 (file)
index 0000000..a770793
--- /dev/null
@@ -0,0 +1,161 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.impl;
+
+import com.cisco.yangide.ext.model.BelongsTo;
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Submodule;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Submodule</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.SubmoduleImpl#getBelongsTo <em>Belongs To</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class SubmoduleImpl extends ModuleImpl implements Submodule {
+    /**
+     * The cached value of the '{@link #getBelongsTo() <em>Belongs To</em>}' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getBelongsTo()
+     * @generated
+     * @ordered
+     */
+    protected BelongsTo belongsTo;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected SubmoduleImpl() {
+        super();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected EClass eStaticClass() {
+        return ModelPackage.Literals.SUBMODULE;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public BelongsTo getBelongsTo() {
+        if (belongsTo != null && belongsTo.eIsProxy()) {
+            InternalEObject oldBelongsTo = (InternalEObject)belongsTo;
+            belongsTo = (BelongsTo)eResolveProxy(oldBelongsTo);
+            if (belongsTo != oldBelongsTo) {
+                if (eNotificationRequired())
+                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, ModelPackage.SUBMODULE__BELONGS_TO, oldBelongsTo, belongsTo));
+            }
+        }
+        return belongsTo;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public BelongsTo basicGetBelongsTo() {
+        return belongsTo;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setBelongsTo(BelongsTo newBelongsTo) {
+        BelongsTo oldBelongsTo = belongsTo;
+        belongsTo = newBelongsTo;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.SUBMODULE__BELONGS_TO, oldBelongsTo, belongsTo));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object eGet(int featureID, boolean resolve, boolean coreType) {
+        switch (featureID) {
+            case ModelPackage.SUBMODULE__BELONGS_TO:
+                if (resolve) return getBelongsTo();
+                return basicGetBelongsTo();
+        }
+        return super.eGet(featureID, resolve, coreType);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eSet(int featureID, Object newValue) {
+        switch (featureID) {
+            case ModelPackage.SUBMODULE__BELONGS_TO:
+                setBelongsTo((BelongsTo)newValue);
+                return;
+        }
+        super.eSet(featureID, newValue);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eUnset(int featureID) {
+        switch (featureID) {
+            case ModelPackage.SUBMODULE__BELONGS_TO:
+                setBelongsTo((BelongsTo)null);
+                return;
+        }
+        super.eUnset(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public boolean eIsSet(int featureID) {
+        switch (featureID) {
+            case ModelPackage.SUBMODULE__BELONGS_TO:
+                return belongsTo != null;
+        }
+        return super.eIsSet(featureID);
+    }
+
+} //SubmoduleImpl
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/TagImpl.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/TagImpl.java
new file mode 100644 (file)
index 0000000..b67f2c8
--- /dev/null
@@ -0,0 +1,222 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.impl;
+
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Tag;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Tag</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.TagImpl#getName <em>Name</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.TagImpl#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class TagImpl extends MinimalEObjectImpl.Container implements Tag {
+    /**
+     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected static final String NAME_EDEFAULT = null;
+
+    /**
+     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected String name = NAME_EDEFAULT;
+
+    /**
+     * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getValue()
+     * @generated
+     * @ordered
+     */
+    protected static final Object VALUE_EDEFAULT = null;
+
+    /**
+     * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getValue()
+     * @generated
+     * @ordered
+     */
+    protected Object value = VALUE_EDEFAULT;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected TagImpl() {
+        super();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected EClass eStaticClass() {
+        return ModelPackage.Literals.TAG;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setName(String newName) {
+        String oldName = name;
+        name = newName;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.TAG__NAME, oldName, name));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Object getValue() {
+        return value;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setValue(Object newValue) {
+        Object oldValue = value;
+        value = newValue;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.TAG__VALUE, oldValue, value));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object eGet(int featureID, boolean resolve, boolean coreType) {
+        switch (featureID) {
+            case ModelPackage.TAG__NAME:
+                return getName();
+            case ModelPackage.TAG__VALUE:
+                return getValue();
+        }
+        return super.eGet(featureID, resolve, coreType);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eSet(int featureID, Object newValue) {
+        switch (featureID) {
+            case ModelPackage.TAG__NAME:
+                setName((String)newValue);
+                return;
+            case ModelPackage.TAG__VALUE:
+                setValue(newValue);
+                return;
+        }
+        super.eSet(featureID, newValue);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eUnset(int featureID) {
+        switch (featureID) {
+            case ModelPackage.TAG__NAME:
+                setName(NAME_EDEFAULT);
+                return;
+            case ModelPackage.TAG__VALUE:
+                setValue(VALUE_EDEFAULT);
+                return;
+        }
+        super.eUnset(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public boolean eIsSet(int featureID) {
+        switch (featureID) {
+            case ModelPackage.TAG__NAME:
+                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+            case ModelPackage.TAG__VALUE:
+                return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
+        }
+        return super.eIsSet(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public String toString() {
+        if (eIsProxy()) return super.toString();
+
+        StringBuffer result = new StringBuffer(super.toString());
+        result.append(" (name: ");
+        result.append(name);
+        result.append(", value: ");
+        result.append(value);
+        result.append(')');
+        return result.toString();
+    }
+
+} //TagImpl
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/TypedefImpl.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/TypedefImpl.java
new file mode 100644 (file)
index 0000000..d64ba79
--- /dev/null
@@ -0,0 +1,401 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.impl;
+
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Node;
+import com.cisco.yangide.ext.model.Tag;
+import com.cisco.yangide.ext.model.TaggedNode;
+import com.cisco.yangide.ext.model.TypedNode;
+import com.cisco.yangide.ext.model.Typedef;
+import com.cisco.yangide.ext.model.Typeref;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Typedef</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.TypedefImpl#getParent <em>Parent</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.TypedefImpl#getName <em>Name</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.TypedefImpl#getTags <em>Tags</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.TypedefImpl#getType <em>Type</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class TypedefImpl extends MinimalEObjectImpl.Container implements Typedef {
+    /**
+     * The cached value of the '{@link #getParent() <em>Parent</em>}' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getParent()
+     * @generated
+     * @ordered
+     */
+    protected Node parent;
+
+    /**
+     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected static final String NAME_EDEFAULT = null;
+
+    /**
+     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected String name = NAME_EDEFAULT;
+
+    /**
+     * The cached value of the '{@link #getTags() <em>Tags</em>}' containment reference list.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getTags()
+     * @generated
+     * @ordered
+     */
+    protected EList<Tag> tags;
+
+    /**
+     * The cached value of the '{@link #getType() <em>Type</em>}' containment reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getType()
+     * @generated
+     * @ordered
+     */
+    protected Typeref type;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected TypedefImpl() {
+        super();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected EClass eStaticClass() {
+        return ModelPackage.Literals.TYPEDEF;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node getParent() {
+        if (parent != null && parent.eIsProxy()) {
+            InternalEObject oldParent = (InternalEObject)parent;
+            parent = (Node)eResolveProxy(oldParent);
+            if (parent != oldParent) {
+                if (eNotificationRequired())
+                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, ModelPackage.TYPEDEF__PARENT, oldParent, parent));
+            }
+        }
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node basicGetParent() {
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setParent(Node newParent) {
+        Node oldParent = parent;
+        parent = newParent;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.TYPEDEF__PARENT, oldParent, parent));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setName(String newName) {
+        String oldName = name;
+        name = newName;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.TYPEDEF__NAME, oldName, name));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public EList<Tag> getTags() {
+        if (tags == null) {
+            tags = new EObjectContainmentEList<Tag>(Tag.class, this, ModelPackage.TYPEDEF__TAGS);
+        }
+        return tags;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Typeref getType() {
+        return type;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public NotificationChain basicSetType(Typeref newType, NotificationChain msgs) {
+        Typeref oldType = type;
+        type = newType;
+        if (eNotificationRequired()) {
+            ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, ModelPackage.TYPEDEF__TYPE, oldType, newType);
+            if (msgs == null) msgs = notification; else msgs.add(notification);
+        }
+        return msgs;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setType(Typeref newType) {
+        if (newType != type) {
+            NotificationChain msgs = null;
+            if (type != null)
+                msgs = ((InternalEObject)type).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - ModelPackage.TYPEDEF__TYPE, null, msgs);
+            if (newType != null)
+                msgs = ((InternalEObject)newType).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - ModelPackage.TYPEDEF__TYPE, null, msgs);
+            msgs = basicSetType(newType, msgs);
+            if (msgs != null) msgs.dispatch();
+        }
+        else if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.TYPEDEF__TYPE, newType, newType));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+        switch (featureID) {
+            case ModelPackage.TYPEDEF__TAGS:
+                return ((InternalEList<?>)getTags()).basicRemove(otherEnd, msgs);
+            case ModelPackage.TYPEDEF__TYPE:
+                return basicSetType(null, msgs);
+        }
+        return super.eInverseRemove(otherEnd, featureID, msgs);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object eGet(int featureID, boolean resolve, boolean coreType) {
+        switch (featureID) {
+            case ModelPackage.TYPEDEF__PARENT:
+                if (resolve) return getParent();
+                return basicGetParent();
+            case ModelPackage.TYPEDEF__NAME:
+                return getName();
+            case ModelPackage.TYPEDEF__TAGS:
+                return getTags();
+            case ModelPackage.TYPEDEF__TYPE:
+                return getType();
+        }
+        return super.eGet(featureID, resolve, coreType);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @SuppressWarnings("unchecked")
+    @Override
+    public void eSet(int featureID, Object newValue) {
+        switch (featureID) {
+            case ModelPackage.TYPEDEF__PARENT:
+                setParent((Node)newValue);
+                return;
+            case ModelPackage.TYPEDEF__NAME:
+                setName((String)newValue);
+                return;
+            case ModelPackage.TYPEDEF__TAGS:
+                getTags().clear();
+                getTags().addAll((Collection<? extends Tag>)newValue);
+                return;
+            case ModelPackage.TYPEDEF__TYPE:
+                setType((Typeref)newValue);
+                return;
+        }
+        super.eSet(featureID, newValue);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eUnset(int featureID) {
+        switch (featureID) {
+            case ModelPackage.TYPEDEF__PARENT:
+                setParent((Node)null);
+                return;
+            case ModelPackage.TYPEDEF__NAME:
+                setName(NAME_EDEFAULT);
+                return;
+            case ModelPackage.TYPEDEF__TAGS:
+                getTags().clear();
+                return;
+            case ModelPackage.TYPEDEF__TYPE:
+                setType((Typeref)null);
+                return;
+        }
+        super.eUnset(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public boolean eIsSet(int featureID) {
+        switch (featureID) {
+            case ModelPackage.TYPEDEF__PARENT:
+                return parent != null;
+            case ModelPackage.TYPEDEF__NAME:
+                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+            case ModelPackage.TYPEDEF__TAGS:
+                return tags != null && !tags.isEmpty();
+            case ModelPackage.TYPEDEF__TYPE:
+                return type != null;
+        }
+        return super.eIsSet(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eBaseStructuralFeatureID(int derivedFeatureID, Class<?> baseClass) {
+        if (baseClass == TaggedNode.class) {
+            switch (derivedFeatureID) {
+                case ModelPackage.TYPEDEF__TAGS: return ModelPackage.TAGGED_NODE__TAGS;
+                default: return -1;
+            }
+        }
+        if (baseClass == TypedNode.class) {
+            switch (derivedFeatureID) {
+                case ModelPackage.TYPEDEF__TYPE: return ModelPackage.TYPED_NODE__TYPE;
+                default: return -1;
+            }
+        }
+        return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public int eDerivedStructuralFeatureID(int baseFeatureID, Class<?> baseClass) {
+        if (baseClass == TaggedNode.class) {
+            switch (baseFeatureID) {
+                case ModelPackage.TAGGED_NODE__TAGS: return ModelPackage.TYPEDEF__TAGS;
+                default: return -1;
+            }
+        }
+        if (baseClass == TypedNode.class) {
+            switch (baseFeatureID) {
+                case ModelPackage.TYPED_NODE__TYPE: return ModelPackage.TYPEDEF__TYPE;
+                default: return -1;
+            }
+        }
+        return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public String toString() {
+        if (eIsProxy()) return super.toString();
+
+        StringBuffer result = new StringBuffer(super.toString());
+        result.append(" (name: ");
+        result.append(name);
+        result.append(')');
+        return result.toString();
+    }
+
+} //TypedefImpl
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/TyperefImpl.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/TyperefImpl.java
new file mode 100644 (file)
index 0000000..a525e63
--- /dev/null
@@ -0,0 +1,230 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.impl;
+
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Node;
+import com.cisco.yangide.ext.model.Typeref;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Typeref</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.TyperefImpl#getParent <em>Parent</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.TyperefImpl#getName <em>Name</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class TyperefImpl extends MinimalEObjectImpl.Container implements Typeref {
+    /**
+     * The cached value of the '{@link #getParent() <em>Parent</em>}' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getParent()
+     * @generated
+     * @ordered
+     */
+    protected Node parent;
+
+    /**
+     * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected static final String NAME_EDEFAULT = null;
+
+    /**
+     * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getName()
+     * @generated
+     * @ordered
+     */
+    protected String name = NAME_EDEFAULT;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected TyperefImpl() {
+        super();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected EClass eStaticClass() {
+        return ModelPackage.Literals.TYPEREF;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node getParent() {
+        if (parent != null && parent.eIsProxy()) {
+            InternalEObject oldParent = (InternalEObject)parent;
+            parent = (Node)eResolveProxy(oldParent);
+            if (parent != oldParent) {
+                if (eNotificationRequired())
+                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, ModelPackage.TYPEREF__PARENT, oldParent, parent));
+            }
+        }
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node basicGetParent() {
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setParent(Node newParent) {
+        Node oldParent = parent;
+        parent = newParent;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.TYPEREF__PARENT, oldParent, parent));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getName() {
+        return name;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setName(String newName) {
+        String oldName = name;
+        name = newName;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.TYPEREF__NAME, oldName, name));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object eGet(int featureID, boolean resolve, boolean coreType) {
+        switch (featureID) {
+            case ModelPackage.TYPEREF__PARENT:
+                if (resolve) return getParent();
+                return basicGetParent();
+            case ModelPackage.TYPEREF__NAME:
+                return getName();
+        }
+        return super.eGet(featureID, resolve, coreType);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eSet(int featureID, Object newValue) {
+        switch (featureID) {
+            case ModelPackage.TYPEREF__PARENT:
+                setParent((Node)newValue);
+                return;
+            case ModelPackage.TYPEREF__NAME:
+                setName((String)newValue);
+                return;
+        }
+        super.eSet(featureID, newValue);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eUnset(int featureID) {
+        switch (featureID) {
+            case ModelPackage.TYPEREF__PARENT:
+                setParent((Node)null);
+                return;
+            case ModelPackage.TYPEREF__NAME:
+                setName(NAME_EDEFAULT);
+                return;
+        }
+        super.eUnset(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public boolean eIsSet(int featureID) {
+        switch (featureID) {
+            case ModelPackage.TYPEREF__PARENT:
+                return parent != null;
+            case ModelPackage.TYPEREF__NAME:
+                return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+        }
+        return super.eIsSet(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public String toString() {
+        if (eIsProxy()) return super.toString();
+
+        StringBuffer result = new StringBuffer(super.toString());
+        result.append(" (name: ");
+        result.append(name);
+        result.append(')');
+        return result.toString();
+    }
+
+} //TyperefImpl
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/UsesImpl.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/impl/UsesImpl.java
new file mode 100644 (file)
index 0000000..78df372
--- /dev/null
@@ -0,0 +1,230 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.impl;
+
+import com.cisco.yangide.ext.model.ModelPackage;
+import com.cisco.yangide.ext.model.Node;
+import com.cisco.yangide.ext.model.Uses;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Uses</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.UsesImpl#getParent <em>Parent</em>}</li>
+ *   <li>{@link com.cisco.yangide.ext.model.impl.UsesImpl#getQName <em>QName</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class UsesImpl extends MinimalEObjectImpl.Container implements Uses {
+    /**
+     * The cached value of the '{@link #getParent() <em>Parent</em>}' reference.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getParent()
+     * @generated
+     * @ordered
+     */
+    protected Node parent;
+
+    /**
+     * The default value of the '{@link #getQName() <em>QName</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getQName()
+     * @generated
+     * @ordered
+     */
+    protected static final String QNAME_EDEFAULT = null;
+
+    /**
+     * The cached value of the '{@link #getQName() <em>QName</em>}' attribute.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @see #getQName()
+     * @generated
+     * @ordered
+     */
+    protected String qName = QNAME_EDEFAULT;
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected UsesImpl() {
+        super();
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    protected EClass eStaticClass() {
+        return ModelPackage.Literals.USES;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node getParent() {
+        if (parent != null && parent.eIsProxy()) {
+            InternalEObject oldParent = (InternalEObject)parent;
+            parent = (Node)eResolveProxy(oldParent);
+            if (parent != oldParent) {
+                if (eNotificationRequired())
+                    eNotify(new ENotificationImpl(this, Notification.RESOLVE, ModelPackage.USES__PARENT, oldParent, parent));
+            }
+        }
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public Node basicGetParent() {
+        return parent;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setParent(Node newParent) {
+        Node oldParent = parent;
+        parent = newParent;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.USES__PARENT, oldParent, parent));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public String getQName() {
+        return qName;
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public void setQName(String newQName) {
+        String oldQName = qName;
+        qName = newQName;
+        if (eNotificationRequired())
+            eNotify(new ENotificationImpl(this, Notification.SET, ModelPackage.USES__QNAME, oldQName, qName));
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public Object eGet(int featureID, boolean resolve, boolean coreType) {
+        switch (featureID) {
+            case ModelPackage.USES__PARENT:
+                if (resolve) return getParent();
+                return basicGetParent();
+            case ModelPackage.USES__QNAME:
+                return getQName();
+        }
+        return super.eGet(featureID, resolve, coreType);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eSet(int featureID, Object newValue) {
+        switch (featureID) {
+            case ModelPackage.USES__PARENT:
+                setParent((Node)newValue);
+                return;
+            case ModelPackage.USES__QNAME:
+                setQName((String)newValue);
+                return;
+        }
+        super.eSet(featureID, newValue);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public void eUnset(int featureID) {
+        switch (featureID) {
+            case ModelPackage.USES__PARENT:
+                setParent((Node)null);
+                return;
+            case ModelPackage.USES__QNAME:
+                setQName(QNAME_EDEFAULT);
+                return;
+        }
+        super.eUnset(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public boolean eIsSet(int featureID) {
+        switch (featureID) {
+            case ModelPackage.USES__PARENT:
+                return parent != null;
+            case ModelPackage.USES__QNAME:
+                return QNAME_EDEFAULT == null ? qName != null : !QNAME_EDEFAULT.equals(qName);
+        }
+        return super.eIsSet(featureID);
+    }
+
+    /**
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    @Override
+    public String toString() {
+        if (eIsProxy()) return super.toString();
+
+        StringBuffer result = new StringBuffer(super.toString());
+        result.append(" (qName: ");
+        result.append(qName);
+        result.append(')');
+        return result.toString();
+    }
+
+} //UsesImpl
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/util/ModelAdapterFactory.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/util/ModelAdapterFactory.java
new file mode 100644 (file)
index 0000000..7636c09
--- /dev/null
@@ -0,0 +1,719 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.util;
+
+import com.cisco.yangide.ext.model.*;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notifier;
+
+import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Adapter Factory</b> for the model.
+ * It provides an adapter <code>createXXX</code> method for each class of the model.
+ * <!-- end-user-doc -->
+ * @see com.cisco.yangide.ext.model.ModelPackage
+ * @generated
+ */
+public class ModelAdapterFactory extends AdapterFactoryImpl {
+    /**
+     * The cached model package.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected static ModelPackage modelPackage;
+
+    /**
+     * Creates an instance of the adapter factory.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public ModelAdapterFactory() {
+        if (modelPackage == null) {
+            modelPackage = ModelPackage.eINSTANCE;
+        }
+    }
+
+    /**
+     * Returns whether this factory is applicable for the type of the object.
+     * <!-- begin-user-doc -->
+     * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
+     * <!-- end-user-doc -->
+     * @return whether this factory is applicable for the type of the object.
+     * @generated
+     */
+    @Override
+    public boolean isFactoryForType(Object object) {
+        if (object == modelPackage) {
+            return true;
+        }
+        if (object instanceof EObject) {
+            return ((EObject)object).eClass().getEPackage() == modelPackage;
+        }
+        return false;
+    }
+
+    /**
+     * The switch that delegates to the <code>createXXX</code> methods.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected ModelSwitch<Adapter> modelSwitch =
+        new ModelSwitch<Adapter>() {
+            @Override
+            public Adapter caseModule(Module object) {
+                return createModuleAdapter();
+            }
+            @Override
+            public Adapter caseGrouping(Grouping object) {
+                return createGroupingAdapter();
+            }
+            @Override
+            public Adapter caseLeaf(Leaf object) {
+                return createLeafAdapter();
+            }
+            @Override
+            public Adapter caseContainer(Container object) {
+                return createContainerAdapter();
+            }
+            @Override
+            public Adapter caseNode(Node object) {
+                return createNodeAdapter();
+            }
+            @Override
+            public Adapter caseNamedNode(NamedNode object) {
+                return createNamedNodeAdapter();
+            }
+            @Override
+            public Adapter caseContainingNode(ContainingNode object) {
+                return createContainingNodeAdapter();
+            }
+            @Override
+            public Adapter caseNamedContainingNode(NamedContainingNode object) {
+                return createNamedContainingNodeAdapter();
+            }
+            @Override
+            public Adapter caseSubmodule(Submodule object) {
+                return createSubmoduleAdapter();
+            }
+            @Override
+            public Adapter caseTypedef(Typedef object) {
+                return createTypedefAdapter();
+            }
+            @Override
+            public Adapter caseChoice(Choice object) {
+                return createChoiceAdapter();
+            }
+            @Override
+            public Adapter caseLeafList(LeafList object) {
+                return createLeafListAdapter();
+            }
+            @Override
+            public Adapter caseAnyxml(Anyxml object) {
+                return createAnyxmlAdapter();
+            }
+            @Override
+            public Adapter caseImport(Import object) {
+                return createImportAdapter();
+            }
+            @Override
+            public Adapter caseInclude(Include object) {
+                return createIncludeAdapter();
+            }
+            @Override
+            public Adapter caseRevision(Revision object) {
+                return createRevisionAdapter();
+            }
+            @Override
+            public Adapter caseBelongsTo(BelongsTo object) {
+                return createBelongsToAdapter();
+            }
+            @Override
+            public Adapter caseList(List object) {
+                return createListAdapter();
+            }
+            @Override
+            public Adapter caseTag(Tag object) {
+                return createTagAdapter();
+            }
+            @Override
+            public Adapter caseTaggedNode(TaggedNode object) {
+                return createTaggedNodeAdapter();
+            }
+            @Override
+            public Adapter caseUses(Uses object) {
+                return createUsesAdapter();
+            }
+            @Override
+            public Adapter caseRpc(Rpc object) {
+                return createRpcAdapter();
+            }
+            @Override
+            public Adapter caseRpcIO(RpcIO object) {
+                return createRpcIOAdapter();
+            }
+            @Override
+            public Adapter caseNotification(Notification object) {
+                return createNotificationAdapter();
+            }
+            @Override
+            public Adapter caseAugment(Augment object) {
+                return createAugmentAdapter();
+            }
+            @Override
+            public Adapter caseExtension(Extension object) {
+                return createExtensionAdapter();
+            }
+            @Override
+            public Adapter caseFeature(Feature object) {
+                return createFeatureAdapter();
+            }
+            @Override
+            public Adapter caseDeviation(Deviation object) {
+                return createDeviationAdapter();
+            }
+            @Override
+            public Adapter caseIdentity(Identity object) {
+                return createIdentityAdapter();
+            }
+            @Override
+            public Adapter caseTypedNode(TypedNode object) {
+                return createTypedNodeAdapter();
+            }
+            @Override
+            public Adapter caseChoiceCase(ChoiceCase object) {
+                return createChoiceCaseAdapter();
+            }
+            @Override
+            public Adapter caseListKey(ListKey object) {
+                return createListKeyAdapter();
+            }
+            @Override
+            public Adapter caseTyperef(Typeref object) {
+                return createTyperefAdapter();
+            }
+            @Override
+            public Adapter caseReferenceNode(ReferenceNode object) {
+                return createReferenceNodeAdapter();
+            }
+            @Override
+            public Adapter defaultCase(EObject object) {
+                return createEObjectAdapter();
+            }
+        };
+
+    /**
+     * Creates an adapter for the <code>target</code>.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @param target the object to adapt.
+     * @return the adapter for the <code>target</code>.
+     * @generated
+     */
+    @Override
+    public Adapter createAdapter(Notifier target) {
+        return modelSwitch.doSwitch((EObject)target);
+    }
+
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.Module <em>Module</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.Module
+     * @generated
+     */
+    public Adapter createModuleAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.Grouping <em>Grouping</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.Grouping
+     * @generated
+     */
+    public Adapter createGroupingAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.Leaf <em>Leaf</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.Leaf
+     * @generated
+     */
+    public Adapter createLeafAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.Container <em>Container</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.Container
+     * @generated
+     */
+    public Adapter createContainerAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.Node <em>Node</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.Node
+     * @generated
+     */
+    public Adapter createNodeAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.NamedNode <em>Named Node</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.NamedNode
+     * @generated
+     */
+    public Adapter createNamedNodeAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.ContainingNode <em>Containing Node</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.ContainingNode
+     * @generated
+     */
+    public Adapter createContainingNodeAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.NamedContainingNode <em>Named Containing Node</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.NamedContainingNode
+     * @generated
+     */
+    public Adapter createNamedContainingNodeAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.Submodule <em>Submodule</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.Submodule
+     * @generated
+     */
+    public Adapter createSubmoduleAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.Typedef <em>Typedef</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.Typedef
+     * @generated
+     */
+    public Adapter createTypedefAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.Choice <em>Choice</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.Choice
+     * @generated
+     */
+    public Adapter createChoiceAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.LeafList <em>Leaf List</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.LeafList
+     * @generated
+     */
+    public Adapter createLeafListAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.Anyxml <em>Anyxml</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.Anyxml
+     * @generated
+     */
+    public Adapter createAnyxmlAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.Import <em>Import</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.Import
+     * @generated
+     */
+    public Adapter createImportAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.Include <em>Include</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.Include
+     * @generated
+     */
+    public Adapter createIncludeAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.Revision <em>Revision</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.Revision
+     * @generated
+     */
+    public Adapter createRevisionAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.BelongsTo <em>Belongs To</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.BelongsTo
+     * @generated
+     */
+    public Adapter createBelongsToAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.List <em>List</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.List
+     * @generated
+     */
+    public Adapter createListAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.Tag <em>Tag</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.Tag
+     * @generated
+     */
+    public Adapter createTagAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.TaggedNode <em>Tagged Node</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.TaggedNode
+     * @generated
+     */
+    public Adapter createTaggedNodeAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.Uses <em>Uses</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.Uses
+     * @generated
+     */
+    public Adapter createUsesAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.Rpc <em>Rpc</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.Rpc
+     * @generated
+     */
+    public Adapter createRpcAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.RpcIO <em>Rpc IO</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.RpcIO
+     * @generated
+     */
+    public Adapter createRpcIOAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.Notification <em>Notification</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.Notification
+     * @generated
+     */
+    public Adapter createNotificationAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.Augment <em>Augment</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.Augment
+     * @generated
+     */
+    public Adapter createAugmentAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.Extension <em>Extension</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.Extension
+     * @generated
+     */
+    public Adapter createExtensionAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.Feature <em>Feature</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.Feature
+     * @generated
+     */
+    public Adapter createFeatureAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.Deviation <em>Deviation</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.Deviation
+     * @generated
+     */
+    public Adapter createDeviationAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.Identity <em>Identity</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.Identity
+     * @generated
+     */
+    public Adapter createIdentityAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.TypedNode <em>Typed Node</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.TypedNode
+     * @generated
+     */
+    public Adapter createTypedNodeAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.ChoiceCase <em>Choice Case</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.ChoiceCase
+     * @generated
+     */
+    public Adapter createChoiceCaseAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.ListKey <em>List Key</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.ListKey
+     * @generated
+     */
+    public Adapter createListKeyAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.Typeref <em>Typeref</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.Typeref
+     * @generated
+     */
+    public Adapter createTyperefAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for an object of class '{@link com.cisco.yangide.ext.model.ReferenceNode <em>Reference Node</em>}'.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null so that we can easily ignore cases;
+     * it's useful to ignore a case when inheritance will catch all the cases anyway.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @see com.cisco.yangide.ext.model.ReferenceNode
+     * @generated
+     */
+    public Adapter createReferenceNodeAdapter() {
+        return null;
+    }
+
+    /**
+     * Creates a new adapter for the default case.
+     * <!-- begin-user-doc -->
+     * This default implementation returns null.
+     * <!-- end-user-doc -->
+     * @return the new adapter.
+     * @generated
+     */
+    public Adapter createEObjectAdapter() {
+        return null;
+    }
+
+} //ModelAdapterFactory
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/util/ModelSwitch.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/util/ModelSwitch.java
new file mode 100644 (file)
index 0000000..d21bb84
--- /dev/null
@@ -0,0 +1,898 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.model.util;
+
+import com.cisco.yangide.ext.model.*;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.util.Switch;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Switch</b> for the model's inheritance hierarchy.
+ * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
+ * to invoke the <code>caseXXX</code> method for each class of the model,
+ * starting with the actual class of the object
+ * and proceeding up the inheritance hierarchy
+ * until a non-null result is returned,
+ * which is the result of the switch.
+ * <!-- end-user-doc -->
+ * @see com.cisco.yangide.ext.model.ModelPackage
+ * @generated
+ */
+public class ModelSwitch<T> extends Switch<T> {
+    /**
+     * The cached model package
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    protected static ModelPackage modelPackage;
+
+    /**
+     * Creates an instance of the switch.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @generated
+     */
+    public ModelSwitch() {
+        if (modelPackage == null) {
+            modelPackage = ModelPackage.eINSTANCE;
+        }
+    }
+
+    /**
+     * Checks whether this is a switch for the given package.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @param ePackage the package in question.
+     * @return whether this is a switch for the given package.
+     * @generated
+     */
+    @Override
+    protected boolean isSwitchFor(EPackage ePackage) {
+        return ePackage == modelPackage;
+    }
+
+    /**
+     * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+     * <!-- begin-user-doc -->
+     * <!-- end-user-doc -->
+     * @return the first non-null result returned by a <code>caseXXX</code> call.
+     * @generated
+     */
+    @Override
+    protected T doSwitch(int classifierID, EObject theEObject) {
+        switch (classifierID) {
+            case ModelPackage.MODULE: {
+                Module module = (Module)theEObject;
+                T result = caseModule(module);
+                if (result == null) result = caseNamedContainingNode(module);
+                if (result == null) result = caseTaggedNode(module);
+                if (result == null) result = caseNamedNode(module);
+                if (result == null) result = caseContainingNode(module);
+                if (result == null) result = caseNode(module);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.GROUPING: {
+                Grouping grouping = (Grouping)theEObject;
+                T result = caseGrouping(grouping);
+                if (result == null) result = caseNamedContainingNode(grouping);
+                if (result == null) result = caseTaggedNode(grouping);
+                if (result == null) result = caseNamedNode(grouping);
+                if (result == null) result = caseContainingNode(grouping);
+                if (result == null) result = caseNode(grouping);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.LEAF: {
+                Leaf leaf = (Leaf)theEObject;
+                T result = caseLeaf(leaf);
+                if (result == null) result = caseNamedNode(leaf);
+                if (result == null) result = caseTaggedNode(leaf);
+                if (result == null) result = caseTypedNode(leaf);
+                if (result == null) result = caseNode(leaf);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.CONTAINER: {
+                Container container = (Container)theEObject;
+                T result = caseContainer(container);
+                if (result == null) result = caseNamedContainingNode(container);
+                if (result == null) result = caseTaggedNode(container);
+                if (result == null) result = caseNamedNode(container);
+                if (result == null) result = caseContainingNode(container);
+                if (result == null) result = caseNode(container);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.NODE: {
+                Node node = (Node)theEObject;
+                T result = caseNode(node);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.NAMED_NODE: {
+                NamedNode namedNode = (NamedNode)theEObject;
+                T result = caseNamedNode(namedNode);
+                if (result == null) result = caseNode(namedNode);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.CONTAINING_NODE: {
+                ContainingNode containingNode = (ContainingNode)theEObject;
+                T result = caseContainingNode(containingNode);
+                if (result == null) result = caseNode(containingNode);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.NAMED_CONTAINING_NODE: {
+                NamedContainingNode namedContainingNode = (NamedContainingNode)theEObject;
+                T result = caseNamedContainingNode(namedContainingNode);
+                if (result == null) result = caseNamedNode(namedContainingNode);
+                if (result == null) result = caseContainingNode(namedContainingNode);
+                if (result == null) result = caseNode(namedContainingNode);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.SUBMODULE: {
+                Submodule submodule = (Submodule)theEObject;
+                T result = caseSubmodule(submodule);
+                if (result == null) result = caseModule(submodule);
+                if (result == null) result = caseNamedContainingNode(submodule);
+                if (result == null) result = caseTaggedNode(submodule);
+                if (result == null) result = caseNamedNode(submodule);
+                if (result == null) result = caseContainingNode(submodule);
+                if (result == null) result = caseNode(submodule);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.TYPEDEF: {
+                Typedef typedef = (Typedef)theEObject;
+                T result = caseTypedef(typedef);
+                if (result == null) result = caseNamedNode(typedef);
+                if (result == null) result = caseTaggedNode(typedef);
+                if (result == null) result = caseTypedNode(typedef);
+                if (result == null) result = caseNode(typedef);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.CHOICE: {
+                Choice choice = (Choice)theEObject;
+                T result = caseChoice(choice);
+                if (result == null) result = caseNamedContainingNode(choice);
+                if (result == null) result = caseTaggedNode(choice);
+                if (result == null) result = caseNamedNode(choice);
+                if (result == null) result = caseContainingNode(choice);
+                if (result == null) result = caseNode(choice);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.LEAF_LIST: {
+                LeafList leafList = (LeafList)theEObject;
+                T result = caseLeafList(leafList);
+                if (result == null) result = caseNamedNode(leafList);
+                if (result == null) result = caseTaggedNode(leafList);
+                if (result == null) result = caseTypedNode(leafList);
+                if (result == null) result = caseNode(leafList);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.ANYXML: {
+                Anyxml anyxml = (Anyxml)theEObject;
+                T result = caseAnyxml(anyxml);
+                if (result == null) result = caseNamedNode(anyxml);
+                if (result == null) result = caseTaggedNode(anyxml);
+                if (result == null) result = caseNode(anyxml);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.IMPORT: {
+                Import import_ = (Import)theEObject;
+                T result = caseImport(import_);
+                if (result == null) result = caseNode(import_);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.INCLUDE: {
+                Include include = (Include)theEObject;
+                T result = caseInclude(include);
+                if (result == null) result = caseNode(include);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.REVISION: {
+                Revision revision = (Revision)theEObject;
+                T result = caseRevision(revision);
+                if (result == null) result = caseTaggedNode(revision);
+                if (result == null) result = caseNamedNode(revision);
+                if (result == null) result = caseNode(revision);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.BELONGS_TO: {
+                BelongsTo belongsTo = (BelongsTo)theEObject;
+                T result = caseBelongsTo(belongsTo);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.LIST: {
+                List list = (List)theEObject;
+                T result = caseList(list);
+                if (result == null) result = caseNamedContainingNode(list);
+                if (result == null) result = caseTaggedNode(list);
+                if (result == null) result = caseNamedNode(list);
+                if (result == null) result = caseContainingNode(list);
+                if (result == null) result = caseNode(list);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.TAG: {
+                Tag tag = (Tag)theEObject;
+                T result = caseTag(tag);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.TAGGED_NODE: {
+                TaggedNode taggedNode = (TaggedNode)theEObject;
+                T result = caseTaggedNode(taggedNode);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.USES: {
+                Uses uses = (Uses)theEObject;
+                T result = caseUses(uses);
+                if (result == null) result = caseNode(uses);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.RPC: {
+                Rpc rpc = (Rpc)theEObject;
+                T result = caseRpc(rpc);
+                if (result == null) result = caseNamedContainingNode(rpc);
+                if (result == null) result = caseTaggedNode(rpc);
+                if (result == null) result = caseNamedNode(rpc);
+                if (result == null) result = caseContainingNode(rpc);
+                if (result == null) result = caseNode(rpc);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.RPC_IO: {
+                RpcIO rpcIO = (RpcIO)theEObject;
+                T result = caseRpcIO(rpcIO);
+                if (result == null) result = caseContainingNode(rpcIO);
+                if (result == null) result = caseNode(rpcIO);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.NOTIFICATION: {
+                Notification notification = (Notification)theEObject;
+                T result = caseNotification(notification);
+                if (result == null) result = caseNamedContainingNode(notification);
+                if (result == null) result = caseNamedNode(notification);
+                if (result == null) result = caseContainingNode(notification);
+                if (result == null) result = caseNode(notification);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.AUGMENT: {
+                Augment augment = (Augment)theEObject;
+                T result = caseAugment(augment);
+                if (result == null) result = caseNamedContainingNode(augment);
+                if (result == null) result = caseNamedNode(augment);
+                if (result == null) result = caseContainingNode(augment);
+                if (result == null) result = caseNode(augment);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.EXTENSION: {
+                Extension extension = (Extension)theEObject;
+                T result = caseExtension(extension);
+                if (result == null) result = caseNamedNode(extension);
+                if (result == null) result = caseNode(extension);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.FEATURE: {
+                Feature feature = (Feature)theEObject;
+                T result = caseFeature(feature);
+                if (result == null) result = caseNamedNode(feature);
+                if (result == null) result = caseNode(feature);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.DEVIATION: {
+                Deviation deviation = (Deviation)theEObject;
+                T result = caseDeviation(deviation);
+                if (result == null) result = caseNamedNode(deviation);
+                if (result == null) result = caseNode(deviation);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.IDENTITY: {
+                Identity identity = (Identity)theEObject;
+                T result = caseIdentity(identity);
+                if (result == null) result = caseNamedNode(identity);
+                if (result == null) result = caseReferenceNode(identity);
+                if (result == null) result = caseNode(identity);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.TYPED_NODE: {
+                TypedNode typedNode = (TypedNode)theEObject;
+                T result = caseTypedNode(typedNode);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.CHOICE_CASE: {
+                ChoiceCase choiceCase = (ChoiceCase)theEObject;
+                T result = caseChoiceCase(choiceCase);
+                if (result == null) result = caseNamedContainingNode(choiceCase);
+                if (result == null) result = caseTaggedNode(choiceCase);
+                if (result == null) result = caseNamedNode(choiceCase);
+                if (result == null) result = caseContainingNode(choiceCase);
+                if (result == null) result = caseNode(choiceCase);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.LIST_KEY: {
+                ListKey listKey = (ListKey)theEObject;
+                T result = caseListKey(listKey);
+                if (result == null) result = caseNamedNode(listKey);
+                if (result == null) result = caseNode(listKey);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.TYPEREF: {
+                Typeref typeref = (Typeref)theEObject;
+                T result = caseTyperef(typeref);
+                if (result == null) result = caseNamedNode(typeref);
+                if (result == null) result = caseNode(typeref);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            case ModelPackage.REFERENCE_NODE: {
+                ReferenceNode referenceNode = (ReferenceNode)theEObject;
+                T result = caseReferenceNode(referenceNode);
+                if (result == null) result = defaultCase(theEObject);
+                return result;
+            }
+            default: return defaultCase(theEObject);
+        }
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Module</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Module</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseModule(Module object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Grouping</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Grouping</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseGrouping(Grouping object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Leaf</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Leaf</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseLeaf(Leaf object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Container</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Container</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseContainer(Container object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Node</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Node</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseNode(Node object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Named Node</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Named Node</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseNamedNode(NamedNode object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Containing Node</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Containing Node</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseContainingNode(ContainingNode object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Named Containing Node</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Named Containing Node</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseNamedContainingNode(NamedContainingNode object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Submodule</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Submodule</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseSubmodule(Submodule object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Typedef</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Typedef</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseTypedef(Typedef object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Choice</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Choice</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseChoice(Choice object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Leaf List</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Leaf List</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseLeafList(LeafList object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Anyxml</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Anyxml</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseAnyxml(Anyxml object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Import</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Import</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseImport(Import object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Include</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Include</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseInclude(Include object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Revision</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Revision</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseRevision(Revision object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Belongs To</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Belongs To</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseBelongsTo(BelongsTo object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>List</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>List</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseList(List object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Tag</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Tag</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseTag(Tag object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Tagged Node</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Tagged Node</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseTaggedNode(TaggedNode object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Uses</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Uses</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseUses(Uses object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Rpc</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Rpc</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseRpc(Rpc object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Rpc IO</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Rpc IO</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseRpcIO(RpcIO object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Notification</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Notification</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseNotification(Notification object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Augment</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Augment</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseAugment(Augment object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Extension</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Extension</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseExtension(Extension object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Feature</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Feature</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseFeature(Feature object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Deviation</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Deviation</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseDeviation(Deviation object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Identity</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Identity</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseIdentity(Identity object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Typed Node</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Typed Node</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseTypedNode(TypedNode object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Choice Case</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Choice Case</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseChoiceCase(ChoiceCase object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>List Key</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>List Key</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseListKey(ListKey object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Typeref</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Typeref</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseTyperef(Typeref object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>Reference Node</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>Reference Node</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+     * @generated
+     */
+    public T caseReferenceNode(ReferenceNode object) {
+        return null;
+    }
+
+    /**
+     * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
+     * <!-- begin-user-doc -->
+     * This implementation returns null;
+     * returning a non-null result will terminate the switch, but this is the last case anyway.
+     * <!-- end-user-doc -->
+     * @param object the target of the switch.
+     * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
+     * @see #doSwitch(org.eclipse.emf.ecore.EObject)
+     * @generated
+     */
+    @Override
+    public T defaultCase(EObject object) {
+        return null;
+    }
+
+} //ModelSwitch
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/AnyxmlValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/AnyxmlValidator.java
new file mode 100644 (file)
index 0000000..6227247
--- /dev/null
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.Anyxml}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface AnyxmlValidator {
+    boolean validate();
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/AugmentValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/AugmentValidator.java
new file mode 100644 (file)
index 0000000..75a2a9e
--- /dev/null
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.Augment}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface AugmentValidator {
+    boolean validate();
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/BelongsToValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/BelongsToValidator.java
new file mode 100644 (file)
index 0000000..0768ae9
--- /dev/null
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+import com.cisco.yangide.ext.model.Module;
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.BelongsTo}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface BelongsToValidator {
+    boolean validate();
+
+    boolean validateOwnerModule(Module value);
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/ChoiceCaseValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/ChoiceCaseValidator.java
new file mode 100644 (file)
index 0000000..e481784
--- /dev/null
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.ChoiceCase}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ChoiceCaseValidator {
+    boolean validate();
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/ChoiceValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/ChoiceValidator.java
new file mode 100644 (file)
index 0000000..f5d5c56
--- /dev/null
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.Choice}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ChoiceValidator {
+    boolean validate();
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/ContainerValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/ContainerValidator.java
new file mode 100644 (file)
index 0000000..5caca69
--- /dev/null
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.Container}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ContainerValidator {
+    boolean validate();
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/ContainingNodeValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/ContainingNodeValidator.java
new file mode 100644 (file)
index 0000000..46a8208
--- /dev/null
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+import com.cisco.yangide.ext.model.Node;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.ContainingNode}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ContainingNodeValidator {
+    boolean validate();
+
+    boolean validateChildren(EList<Node> value);
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/DeviationValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/DeviationValidator.java
new file mode 100644 (file)
index 0000000..c9bf57c
--- /dev/null
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.Deviation}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface DeviationValidator {
+    boolean validate();
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/ExtensionValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/ExtensionValidator.java
new file mode 100644 (file)
index 0000000..26b586f
--- /dev/null
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.Extension}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ExtensionValidator {
+    boolean validate();
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/FeatureValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/FeatureValidator.java
new file mode 100644 (file)
index 0000000..132cc15
--- /dev/null
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.Feature}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface FeatureValidator {
+    boolean validate();
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/GroupingValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/GroupingValidator.java
new file mode 100644 (file)
index 0000000..3d0d0dc
--- /dev/null
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.Grouping}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface GroupingValidator {
+    boolean validate();
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/IdentityValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/IdentityValidator.java
new file mode 100644 (file)
index 0000000..2dbbb06
--- /dev/null
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.Identity}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface IdentityValidator {
+    boolean validate();
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/ImportValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/ImportValidator.java
new file mode 100644 (file)
index 0000000..3116f5c
--- /dev/null
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.Import}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ImportValidator {
+    boolean validate();
+
+    boolean validatePrefix(String value);
+    boolean validateRevisionDate(String value);
+    boolean validateModule(String value);
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/IncludeValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/IncludeValidator.java
new file mode 100644 (file)
index 0000000..15d809b
--- /dev/null
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+import com.cisco.yangide.ext.model.Submodule;
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.Include}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface IncludeValidator {
+    boolean validate();
+
+    boolean validateSubmodule(Submodule value);
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/LeafListValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/LeafListValidator.java
new file mode 100644 (file)
index 0000000..748e2b0
--- /dev/null
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.LeafList}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LeafListValidator {
+    boolean validate();
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/LeafValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/LeafValidator.java
new file mode 100644 (file)
index 0000000..8f17028
--- /dev/null
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.Leaf}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface LeafValidator {
+    boolean validate();
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/ListKeyValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/ListKeyValidator.java
new file mode 100644 (file)
index 0000000..e8fb026
--- /dev/null
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.ListKey}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ListKeyValidator {
+    boolean validate();
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/ListValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/ListValidator.java
new file mode 100644 (file)
index 0000000..596d850
--- /dev/null
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.List}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ListValidator {
+    boolean validate();
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/ModuleValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/ModuleValidator.java
new file mode 100644 (file)
index 0000000..441eec0
--- /dev/null
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+import com.cisco.yangide.ext.model.Revision;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.Module}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ModuleValidator {
+    boolean validate();
+
+    boolean validateNamespace(String value);
+    boolean validateRevisions(EList<Revision> value);
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/NamedContainingNodeValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/NamedContainingNodeValidator.java
new file mode 100644 (file)
index 0000000..9a61099
--- /dev/null
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.NamedContainingNode}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface NamedContainingNodeValidator {
+    boolean validate();
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/NamedNodeValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/NamedNodeValidator.java
new file mode 100644 (file)
index 0000000..8472e8c
--- /dev/null
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.NamedNode}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface NamedNodeValidator {
+    boolean validate();
+
+    boolean validateName(String value);
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/NodeValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/NodeValidator.java
new file mode 100644 (file)
index 0000000..57edf72
--- /dev/null
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+import com.cisco.yangide.ext.model.Node;
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.Node}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface NodeValidator {
+    boolean validate();
+
+    boolean validateParent(Node value);
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/NotificationValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/NotificationValidator.java
new file mode 100644 (file)
index 0000000..499468b
--- /dev/null
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.Notification}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface NotificationValidator {
+    boolean validate();
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/ReferenceNodeValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/ReferenceNodeValidator.java
new file mode 100644 (file)
index 0000000..86afd65
--- /dev/null
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.ReferenceNode}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface ReferenceNodeValidator {
+    boolean validate();
+
+    boolean validateReference(String value);
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/RevisionValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/RevisionValidator.java
new file mode 100644 (file)
index 0000000..101497e
--- /dev/null
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.Revision}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface RevisionValidator {
+    boolean validate();
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/RpcIOValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/RpcIOValidator.java
new file mode 100644 (file)
index 0000000..7e8a5e0
--- /dev/null
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.RpcIO}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface RpcIOValidator {
+    boolean validate();
+
+    boolean validateInput(boolean value);
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/RpcValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/RpcValidator.java
new file mode 100644 (file)
index 0000000..da004de
--- /dev/null
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.Rpc}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface RpcValidator {
+    boolean validate();
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/SubmoduleValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/SubmoduleValidator.java
new file mode 100644 (file)
index 0000000..d47ed0a
--- /dev/null
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+import com.cisco.yangide.ext.model.BelongsTo;
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.Submodule}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface SubmoduleValidator {
+    boolean validate();
+
+    boolean validateBelongsTo(BelongsTo value);
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/TagValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/TagValidator.java
new file mode 100644 (file)
index 0000000..0528b5b
--- /dev/null
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.Tag}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface TagValidator {
+    boolean validate();
+
+    boolean validateName(String value);
+    boolean validateValue(Object value);
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/TaggedNodeValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/TaggedNodeValidator.java
new file mode 100644 (file)
index 0000000..22c0159
--- /dev/null
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+import com.cisco.yangide.ext.model.Tag;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.TaggedNode}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface TaggedNodeValidator {
+    boolean validate();
+
+    boolean validateTags(EList<Tag> value);
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/TypedNodeValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/TypedNodeValidator.java
new file mode 100644 (file)
index 0000000..f91544d
--- /dev/null
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+import com.cisco.yangide.ext.model.Typeref;
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.TypedNode}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface TypedNodeValidator {
+    boolean validate();
+
+    boolean validateType(Typeref value);
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/TypedefValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/TypedefValidator.java
new file mode 100644 (file)
index 0000000..707f03d
--- /dev/null
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.Typedef}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface TypedefValidator {
+    boolean validate();
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/TyperefValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/TyperefValidator.java
new file mode 100644 (file)
index 0000000..6a80aba
--- /dev/null
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.Typeref}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface TyperefValidator {
+    boolean validate();
+
+}
diff --git a/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/UsesValidator.java b/plugins/com.cisco.yangide.ext.model/src/com/cisco/yangide/ext/model/validation/UsesValidator.java
new file mode 100644 (file)
index 0000000..d1fa247
--- /dev/null
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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
+ *******************************************************************************/
+/**
+ *
+ * $Id$
+ */
+package com.cisco.yangide.ext.model.validation;
+
+
+/**
+ * A sample validator interface for {@link com.cisco.yangide.ext.model.Uses}.
+ * This doesn't really do anything, and it's not a real EMF artifact.
+ * It was generated by the org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's code generator can be extended.
+ * This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+ */
+public interface UsesValidator {
+    boolean validate();
+
+    boolean validateQName(String value);
+}
diff --git a/plugins/com.cisco.yangide.ext.model/text/description.txt b/plugins/com.cisco.yangide.ext.model/text/description.txt
new file mode 100644 (file)
index 0000000..fed338a
--- /dev/null
@@ -0,0 +1,94 @@
+Model Model
+
+This model description is not a real EMF artifact. It was generated by the
+org.eclipse.emf.examples.generator.validator plug-in to illustrate how EMF's
+code generator can be extended.
+This can be disabled with -vmargs -Dorg.eclipse.emf.examples.generator.validator=false.
+
+Package model <http://www.example.org/model>
+
+  Class Module -> NamedContainingNode, TaggedNode
+    Attribute namespace : EString<<1..1>>
+    Reference revisions : Revision<<0..*>>
+
+  Class Grouping -> NamedContainingNode, TaggedNode
+
+  Class Leaf -> NamedNode, TaggedNode, TypedNode
+
+  Class Container -> NamedContainingNode, TaggedNode
+
+  Class Node
+    Reference parent : Node
+
+  Class NamedNode -> Node
+    Attribute name : EString
+
+  Class ContainingNode -> Node
+    Reference children : Node<<0..*>>
+
+  Class NamedContainingNode -> NamedNode, ContainingNode
+
+  Class Submodule -> Module
+    Reference belongsTo : BelongsTo<<1..1>>
+
+  Class Typedef -> NamedNode, TaggedNode, TypedNode
+
+  Class Choice -> NamedContainingNode, TaggedNode
+
+  Class LeafList -> NamedNode, TaggedNode, TypedNode
+
+  Class Anyxml -> NamedNode, TaggedNode
+
+  Class Import -> Node
+    Attribute prefix : String<<1..1>>
+    Attribute revisionDate : String
+    Attribute module : String
+
+  Class Include -> Node
+    Reference submodule : Submodule<<1..1>>
+
+  Class Revision -> TaggedNode, NamedNode
+
+  Class BelongsTo
+    Reference ownerModule : Module<<1..1>>
+
+  Class List -> NamedContainingNode, TaggedNode
+
+  Class Tag
+    Attribute name : EString
+    Attribute value : EJavaObject
+
+  Class TaggedNode
+    Reference tags : Tag<<0..*>>
+
+  Class Uses -> Node
+    Attribute qName : String
+
+  Class Rpc -> NamedContainingNode, TaggedNode
+
+  Class RpcIO -> ContainingNode
+    Attribute input : Boolean
+
+  Class Notification -> NamedContainingNode
+
+  Class Augment -> NamedContainingNode
+
+  Class Extension -> NamedNode
+
+  Class Feature -> NamedNode
+
+  Class Deviation -> NamedNode
+
+  Class Identity -> NamedNode, ReferenceNode
+
+  Class TypedNode
+    Reference type : Typeref
+
+  Class ChoiceCase -> NamedContainingNode, TaggedNode
+
+  Class ListKey -> NamedNode
+
+  Class Typeref -> NamedNode
+
+  Class ReferenceNode
+    Attribute reference : String
diff --git a/plugins/com.cisco.yangide.ext.refactoring/.gitignore b/plugins/com.cisco.yangide.ext.refactoring/.gitignore
new file mode 100644 (file)
index 0000000..b77461b
--- /dev/null
@@ -0,0 +1,3 @@
+/target/
+/.settings/
+.classpath
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.ext.refactoring/.project b/plugins/com.cisco.yangide.ext.refactoring/.project
new file mode 100644 (file)
index 0000000..1ddcdce
--- /dev/null
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>com.cisco.yangide.ext.refactoring</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.m2e.core.maven2Builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.m2e.core.maven2Nature</nature>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/plugins/com.cisco.yangide.ext.refactoring/META-INF/MANIFEST.MF b/plugins/com.cisco.yangide.ext.refactoring/META-INF/MANIFEST.MF
new file mode 100644 (file)
index 0000000..c1a467b
--- /dev/null
@@ -0,0 +1,31 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: com.cisco.yangide.ext.refactoring
+Bundle-SymbolicName: com.cisco.yangide.ext.refactoring;singleton:=true
+Bundle-Version: 1.1.1.qualifier
+Bundle-Activator: com.cisco.yangide.ext.refactoring.YangRefactoringPlugin
+Bundle-Vendor: Cisco Systems, Inc.
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.jdt.core;visibility:=reexport,
+ org.eclipse.text,
+ org.eclipse.core.resources,
+ org.eclipse.core.filesystem,
+ com.cisco.yangide.editor,
+ org.eclipse.ui.workbench,
+ org.eclipse.jface,
+ com.cisco.yangide.core,
+ org.eclipse.jface.text,
+ org.eclipse.ui.editors,
+ org.eclipse.ltk.core.refactoring,
+ org.eclipse.ltk.ui.refactoring,
+ org.eclipse.ui.ide,
+ org.eclipse.swt,
+ com.cisco.yangide.ui,
+ org.eclipse.ui.workbench.texteditor
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Bundle-ActivationPolicy: lazy
+Bundle-ClassPath: .
+Export-Package: com.cisco.yangide.ext.refactoring,
+ com.cisco.yangide.ext.refactoring.code,
+ com.cisco.yangide.ext.refactoring.ui
diff --git a/plugins/com.cisco.yangide.ext.refactoring/build.properties b/plugins/com.cisco.yangide.ext.refactoring/build.properties
new file mode 100644 (file)
index 0000000..5e3f75d
--- /dev/null
@@ -0,0 +1,16 @@
+###############################################################################
+# Copyright (c) 2014, 2015 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
+#  
+###############################################################################
+source.. = src/
+output.. = target/classes
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml,\
+               plugin.properties,\
+               icons/
+
diff --git a/plugins/com.cisco.yangide.ext.refactoring/icons/calendar.gif b/plugins/com.cisco.yangide.ext.refactoring/icons/calendar.gif
new file mode 100644 (file)
index 0000000..be2817b
Binary files /dev/null and b/plugins/com.cisco.yangide.ext.refactoring/icons/calendar.gif differ
diff --git a/plugins/com.cisco.yangide.ext.refactoring/plugin.properties b/plugins/com.cisco.yangide.ext.refactoring/plugin.properties
new file mode 100644 (file)
index 0000000..06c6d71
--- /dev/null
@@ -0,0 +1,9 @@
+###############################################################################
+# Copyright (c) 2014, 2015 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
+#  
+###############################################################################
+Refactor=Refac&tor
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.ext.refactoring/plugin.xml b/plugins/com.cisco.yangide.ext.refactoring/plugin.xml
new file mode 100644 (file)
index 0000000..8a09ce5
--- /dev/null
@@ -0,0 +1,156 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<!--
+    Copyright (c) 2014, 2015 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
+     
+ -->
+<!-- ============================================================================== -->
+<plugin>
+    <extension point="com.cisco.yangide.editor.actionGroup">
+       <actionGroup class="com.cisco.yangide.ext.refactoring.RefactorActionGroup" groupName="group.edit"/>
+    </extension>
+    
+    <extension point="org.eclipse.ui.actionSets">
+       <actionSet 
+            id="com.cisco.yangide.ext.actionSet"
+            label="Yang IDE Extensions Actions"
+            visible="false">
+            <menu
+               label="%Refactor"
+               id="com.cisco.yangide.ext.refactoring.menu"
+               path="edit">
+               <separator name="reorgGroup"/>
+            </menu>
+         
+            <action id="com.cisco.yangide.ui.actions.Rename"
+               definitionId="com.cisco.yangide.ext.rename.element"
+               label="Rename..."
+               retarget="true"
+               menubarPath="com.cisco.yangide.ext.refactoring.menu/reorgGroup">
+            </action>
+            <action id="com.cisco.yangide.ui.actions.Inline"
+               definitionId="com.cisco.yangide.ext.group.inline.element"
+               label="Inline Grouping..."
+               retarget="true"
+               menubarPath="com.cisco.yangide.ext.refactoring.menu/reorgGroup">
+            </action>
+            <action id="com.cisco.yangide.ui.actions.Revision"
+               definitionId="com.cisco.yangide.ext.change.revision"
+               label="Change Revision..."
+               retarget="true"
+               menubarPath="com.cisco.yangide.ext.refactoring.menu/reorgGroup">
+            </action>
+            <action id="com.cisco.yangide.ui.actions.ExtractGrouping"
+               definitionId="com.cisco.yangide.ext.extract.grouping"
+               label="Extract Grouping..."
+               retarget="true"
+               menubarPath="com.cisco.yangide.ext.refactoring.menu/reorgGroup">
+            </action>
+       </actionSet>
+    </extension>
+
+    <extension point="org.eclipse.ui.commands">
+        <category id="com.cisco.yangide.ext.refactoring" name="Refactoring"/>
+
+        <command
+            name="Rename - Refactoring"
+            description="Rename the selected element"
+            categoryId="com.cisco.yangide.ext.refactoring"
+            id="com.cisco.yangide.ext.rename.element">
+        </command>
+        <command
+            name="Inline Grouping - Refactoring"
+            description="Inline grouping element in place of reference"
+            categoryId="com.cisco.yangide.ext.refactoring"
+            id="com.cisco.yangide.ext.group.inline.element">
+        </command>
+        <command
+            name="Change Revision - Refactoring"
+            description="Change module revision number and update referenced modules"
+            categoryId="com.cisco.yangide.ext.refactoring"
+            id="com.cisco.yangide.ext.change.revision">
+        </command>
+        <command
+            name="Extract Grouping - Refactoring"
+            description="Extract the selected block of elelemts into reusable grouping elements"
+            categoryId="com.cisco.yangide.ext.refactoring"
+            id="com.cisco.yangide.ext.extract.grouping">
+        </command>
+
+    </extension>
+      
+    <extension point="org.eclipse.ui.bindings">
+        <!-- Rename keys -->    
+        <key
+            sequence="M2+M3+R"
+            commandId="com.cisco.yangide.ext.rename.element"
+            contextId="com.cisco.yangide.ui.Context"
+            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
+        <key
+            platform="carbon"
+            sequence="M2+M3+R"
+            contextId="com.cisco.yangide.ui.Context"
+            commandId=""
+            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
+        <key
+            platform="carbon"
+            sequence="COMMAND+ALT+R"
+            contextId="com.cisco.yangide.ui.Context"
+            commandId="com.cisco.yangide.ext.rename.element"
+            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
+
+        <!-- inline grouping -->
+        <key
+            sequence="M2+M3+I"
+            commandId="com.cisco.yangide.ext.group.inline.element"
+            contextId="com.cisco.yangide.ui.Context"
+            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
+        <key
+            platform="carbon"
+            sequence="M2+M3+I"
+            contextId="com.cisco.yangide.ui.Context"
+            commandId=""
+            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
+        <key
+            platform="carbon"
+            sequence="COMMAND+ALT+I"
+            contextId="com.cisco.yangide.ui.Context"
+            commandId="com.cisco.yangide.ext.group.inline.element"
+            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
+            
+        <!-- extract grouping -->
+        <key
+            sequence="M2+M3+E"
+            commandId="com.cisco.yangide.ext.extract.grouping"
+            contextId="com.cisco.yangide.ui.Context"
+            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
+        <key
+            platform="carbon"
+            sequence="M2+M3+E"
+            contextId="com.cisco.yangide.ui.Context"
+            commandId=""
+            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
+        <key
+            platform="carbon"
+            sequence="COMMAND+ALT+E"
+            contextId="com.cisco.yangide.ui.Context"
+            commandId="com.cisco.yangide.ext.extract.grouping"
+            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
+
+    </extension>
+    
+    <extension point="org.eclipse.ui.actionSetPartAssociations">
+      <actionSetPartAssociation targetID="com.cisco.yangide.ext.actionSet">
+         <part id="com.cisco.yangide.editor.editors.YANGEditor"/>
+      </actionSetPartAssociation>
+   </extension>
+   
+    <extension point="org.eclipse.ltk.core.refactoring.refactoringContributions">
+        <contribution id="com.cisco.yangide.ext.refactoring.rename.grouping" class="com.cisco.yangide.ext.refactoring.scripting.RenameGroupingRefactoringContribution"/>
+    </extension>
+   
+</plugin>
diff --git a/plugins/com.cisco.yangide.ext.refactoring/pom.xml b/plugins/com.cisco.yangide.ext.refactoring/pom.xml
new file mode 100644 (file)
index 0000000..381c304
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2014, 2015 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
+     
+ -->
+<!-- ============================================================================== -->
+<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">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>com.cisco.yangide</groupId>
+    <artifactId>com.cisco.yangide.parent</artifactId>
+    <version>1.1.1-SNAPSHOT</version>
+    <relativePath>../..</relativePath>
+  </parent>
+
+  <artifactId>com.cisco.yangide.ext.refactoring</artifactId>
+  <packaging>eclipse-plugin</packaging>
+  <build>
+    <sourceDirectory>src</sourceDirectory>
+  </build>
+</project>
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/CreateYangFileChange.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/CreateYangFileChange.java
new file mode 100644 (file)
index 0000000..27e98da
--- /dev/null
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+
+import org.eclipse.core.filesystem.EFS;
+import org.eclipse.core.filesystem.IFileInfo;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.ltk.core.refactoring.Change;
+import org.eclipse.ltk.core.refactoring.RefactoringStatus;
+import org.eclipse.ltk.core.refactoring.resource.DeleteResourceChange;
+import org.eclipse.ltk.core.refactoring.resource.ResourceChange;
+import org.eclipse.osgi.util.NLS;
+
+import com.cisco.yangide.ext.refactoring.nls.Messages;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 19, 2014
+ */
+public class CreateYangFileChange extends ResourceChange {
+
+    private IPath path;
+    private String source;
+
+    public CreateYangFileChange(IPath path, String source) {
+        this.path = path;
+        this.source = source;
+    }
+
+    @Override
+    protected IResource getModifiedResource() {
+        return ResourcesPlugin.getWorkspace().getRoot().getFile(path);
+    }
+
+    @Override
+    public String getName() {
+        return NLS.bind(Messages.CreateYangFileChange_name, path.lastSegment());
+    }
+
+    @Override
+    public Change perform(IProgressMonitor pm) throws CoreException {
+        InputStream is = null;
+        try {
+            pm.beginTask(Messages.CreateYangFileChange_taskName, 2);
+
+            IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
+            try {
+                is = new ByteArrayInputStream(source.getBytes("UTF-8")); //$NON-NLS-1$
+                file.create(is, false, new SubProgressMonitor(pm, 1));
+                pm.worked(1);
+
+                return new DeleteResourceChange(file.getFullPath(), true);
+            } catch (UnsupportedEncodingException e) {
+                throw new CoreException(new Status(Status.ERROR, YangRefactoringPlugin.PLUGIN_ID, e.getMessage(), e));
+            }
+        } finally {
+            try {
+                if (is != null) {
+                    is.close();
+                }
+            } catch (IOException e) {
+                throw new CoreException(new Status(Status.ERROR, YangRefactoringPlugin.PLUGIN_ID, e.getMessage(), e));
+            } finally {
+                pm.done();
+            }
+        }
+    }
+
+    @Override
+    public RefactoringStatus isValid(IProgressMonitor pm) throws CoreException {
+        RefactoringStatus result = new RefactoringStatus();
+        IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
+
+        IFileInfo jfile = EFS.getStore(file.getLocationURI()).fetchInfo();
+        if (jfile.exists()) {
+            result.addFatalError(
+                    NLS.bind(Messages.CreateYangFileChange_fileAlreadyExists, file.getFullPath().toString()));
+            return result;
+        }
+        return result;
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/RefactorActionGroup.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/RefactorActionGroup.java
new file mode 100644 (file)
index 0000000..197c61f
--- /dev/null
@@ -0,0 +1,242 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.MenuAdapter;
+import org.eclipse.swt.events.MenuEvent;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.actions.ActionGroup;
+
+import com.cisco.yangide.core.YangModelException;
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.editor.editors.IActionGroup;
+import com.cisco.yangide.editor.editors.YangEditor;
+import com.cisco.yangide.ext.refactoring.actions.ChangeRevisionAction;
+import com.cisco.yangide.ext.refactoring.actions.ExtractGroupingAction;
+import com.cisco.yangide.ext.refactoring.actions.InlineGroupingAction;
+import com.cisco.yangide.ext.refactoring.actions.RenameAction;
+import com.cisco.yangide.ext.refactoring.actions.SelectionDispatchAction;
+import com.cisco.yangide.ext.refactoring.nls.Messages;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 29, 2014
+ */
+public class RefactorActionGroup extends ActionGroup implements IActionGroup {
+
+    private static final String RENAME_ACTION_ID = "com.cisco.yangide.ui.actions.Rename"; //$NON-NLS-1$
+    private static final String RENAME_DEF_ID = "com.cisco.yangide.ext.rename.element"; //$NON-NLS-1$
+
+    private static final String INLINE_GROUP_ACTION_ID = "com.cisco.yangide.ui.actions.Inline"; //$NON-NLS-1$
+    private static final String INLINE_GROUP_DEF_ID = "com.cisco.yangide.ext.group.inline.element"; //$NON-NLS-1$
+
+    private static final String REVISION_ACTION_ID = "com.cisco.yangide.ui.actions.Revision"; //$NON-NLS-1$
+    private static final String REVISION_DEF_ID = "com.cisco.yangide.ext.change.revision"; //$NON-NLS-1$
+
+    private static final String EXTRACT_ACTION_ID = "com.cisco.yangide.ui.actions.ExtractGrouping"; //$NON-NLS-1$
+    private static final String EXTRACT_DEF_ID = "com.cisco.yangide.ext.extract.grouping"; //$NON-NLS-1$
+
+    private static final String REFACTORING_MENU_ID = "com.cisco.yangide.ext.refactoring.menu"; //$NON-NLS-1$
+
+    /** Context menu group id. */
+    private static final String REORG_GROUP_ID = "reorgGroup"; //$NON-NLS-1$
+
+    private YangEditor editor;
+    private String groupName;
+    private ISelectionProvider selectionProvider;
+    private SelectionDispatchAction renameAction;
+    private SelectionDispatchAction inlineAction;
+    private SelectionDispatchAction revisionAction;
+    private SelectionDispatchAction extractAction;
+
+    private final List<SelectionDispatchAction> actions = new ArrayList<SelectionDispatchAction>();
+
+    private static class NoActionAvailable extends Action {
+        public NoActionAvailable() {
+            setEnabled(true);
+            setText(Messages.RefactorActionGroup_noRefactorAvailable);
+        }
+    }
+
+    private Action noActionAvailable = new NoActionAvailable();
+    private StyledText control;
+
+    @Override
+    public void init(YangEditor editor, String groupName) {
+        this.selectionProvider = editor.getSelectionProvider();
+        this.editor = editor;
+        this.groupName = groupName;
+        this.control = (StyledText) editor.getAdapter(Control.class);
+
+        ISelection selection = selectionProvider.getSelection();
+
+        renameAction = new RenameAction(editor);
+        initAction(renameAction, selection, RENAME_DEF_ID);
+        editor.setAction("RenameElement", renameAction); //$NON-NLS-1$
+
+        inlineAction = new InlineGroupingAction(editor);
+        initAction(inlineAction, selection, INLINE_GROUP_DEF_ID);
+        editor.setAction("InlineElement", inlineAction); //$NON-NLS-1$
+
+        revisionAction = new ChangeRevisionAction(editor);
+        initAction(revisionAction, selection, REVISION_DEF_ID);
+        editor.setAction("ChangeRevision", revisionAction); //$NON-NLS-1$
+
+        extractAction = new ExtractGroupingAction(editor);
+        initAction(extractAction, selection, EXTRACT_DEF_ID);
+        editor.setAction("ExtractGrouping", extractAction); //$NON-NLS-1$
+    }
+
+    @Override
+    public void fillActionBars(IActionBars actionBars) {
+        actionBars.setGlobalActionHandler(RENAME_ACTION_ID, renameAction);
+        actionBars.setGlobalActionHandler(INLINE_GROUP_ACTION_ID, inlineAction);
+        actionBars.setGlobalActionHandler(REVISION_ACTION_ID, revisionAction);
+        actionBars.setGlobalActionHandler(EXTRACT_ACTION_ID, extractAction);
+    }
+
+    /**
+     * Retargets the File actions with the corresponding refactoring actions.
+     *
+     * @param actionBars the action bar to register the move and rename action with
+     */
+    public void retargetFileMenuActions(IActionBars actionBars) {
+        actionBars.setGlobalActionHandler(ActionFactory.RENAME.getId(), renameAction);
+    }
+
+    @Override
+    public void fillContextMenu(IMenuManager menu) {
+        addRefactorSubmenu(menu);
+    }
+
+    @Override
+    public void dispose() {
+        disposeAction(renameAction);
+        super.dispose();
+    }
+
+    private void initAction(SelectionDispatchAction action, ISelection selection, String actionDefinitionId) {
+        initUpdatingAction(action, selection, actionDefinitionId);
+    }
+
+    private void initUpdatingAction(SelectionDispatchAction action, ISelection selection, String actionDefinitionId) {
+        action.setActionDefinitionId(actionDefinitionId);
+        action.update(selection);
+        if (selectionProvider != null) {
+            selectionProvider.addSelectionChangedListener(action);
+        }
+        if (control != null) {
+            control.addCaretListener(action);
+        }
+        actions.add(action);
+    }
+
+    private void disposeAction(SelectionDispatchAction action) {
+        if (action != null) {
+            selectionProvider.removeSelectionChangedListener(action);
+            if (!control.isDisposed()) {
+                control.removeCaretListener(action);
+            }
+        }
+    }
+
+    private void addRefactorSubmenu(IMenuManager menu) {
+        MenuManager refactorSubmenu = new MenuManager(Messages.RefactorActionGroup_Refactor, REFACTORING_MENU_ID);
+        if (editor != null) {
+            if (editor.isEditable() && getModule() != null) {
+                refactorSubmenu.addMenuListener(new IMenuListener() {
+                    @Override
+                    public void menuAboutToShow(IMenuManager manager) {
+                        refactorMenuShown(manager);
+                    }
+                });
+            }
+            menu.appendToGroup(groupName, refactorSubmenu);
+            refactorSubmenu.add(noActionAvailable);
+        } else {
+            ISelection selection = selectionProvider.getSelection();
+            for (Iterator<SelectionDispatchAction> iter = actions.iterator(); iter.hasNext();) {
+                iter.next().update(selection);
+            }
+            if (fillRefactorMenu(refactorSubmenu) > 0) {
+                menu.appendToGroup(groupName, refactorSubmenu);
+            }
+        }
+    }
+
+    private int fillRefactorMenu(IMenuManager refactorSubmenu) {
+        int added = 0;
+        refactorSubmenu.add(new Separator(REORG_GROUP_ID));
+        added += addAction(refactorSubmenu, renameAction);
+        added += addAction(refactorSubmenu, inlineAction);
+        added += addAction(refactorSubmenu, revisionAction);
+        added += addAction(refactorSubmenu, extractAction);
+        return added;
+    }
+
+    private int addAction(IMenuManager menu, IAction action) {
+        if (action != null && action.isEnabled()) {
+            menu.add(action);
+            return 1;
+        }
+        return 0;
+    }
+
+    private void refactorMenuShown(IMenuManager refactorSubmenu) {
+        Menu menu = ((MenuManager) refactorSubmenu).getMenu();
+        menu.addMenuListener(new MenuAdapter() {
+            @Override
+            public void menuHidden(MenuEvent e) {
+                refactorMenuHidden();
+            }
+        });
+        ITextSelection textSelection = (ITextSelection) editor.getSelectionProvider().getSelection();
+        for (Iterator<SelectionDispatchAction> iter = actions.iterator(); iter.hasNext();) {
+            SelectionDispatchAction action = iter.next();
+            action.update(textSelection);
+        }
+        refactorSubmenu.removeAll();
+        if (fillRefactorMenu(refactorSubmenu) == 0) {
+            refactorSubmenu.add(noActionAvailable);
+        }
+    }
+
+    private void refactorMenuHidden() {
+        ITextSelection textSelection = (ITextSelection) editor.getSelectionProvider().getSelection();
+        for (Iterator<SelectionDispatchAction> iter = actions.iterator(); iter.hasNext();) {
+            SelectionDispatchAction action = iter.next();
+            action.update(textSelection);
+        }
+    }
+
+    private Module getModule() {
+        try {
+            return editor.getModule();
+        } catch (YangModelException e) {
+            // ignore exception
+            return null;
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/RefactorUtil.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/RefactorUtil.java
new file mode 100644 (file)
index 0000000..3d075d0
--- /dev/null
@@ -0,0 +1,210 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.jar.JarFile;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.preference.IPreferenceStore;
+
+import com.cisco.yangide.core.YangCorePlugin;
+import com.cisco.yangide.core.YangModelException;
+import com.cisco.yangide.core.dom.ASTNode;
+import com.cisco.yangide.core.dom.BaseReference;
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.core.dom.ModuleImport;
+import com.cisco.yangide.core.dom.QName;
+import com.cisco.yangide.core.dom.SubModuleInclude;
+import com.cisco.yangide.core.dom.TypeReference;
+import com.cisco.yangide.core.dom.UsesNode;
+import com.cisco.yangide.core.indexing.ElementIndexInfo;
+import com.cisco.yangide.core.indexing.ElementIndexReferenceInfo;
+import com.cisco.yangide.core.indexing.ElementIndexType;
+import com.cisco.yangide.core.model.YangModelManager;
+import com.cisco.yangide.core.parser.YangFormattingPreferences;
+import com.cisco.yangide.core.parser.YangParserUtil;
+import com.cisco.yangide.ui.YangUIPlugin;
+import com.cisco.yangide.ui.preferences.YangPreferenceConstants;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 1, 2014
+ */
+public final class RefactorUtil {
+
+    /**
+     * Protect from initialization.
+     */
+    private RefactorUtil() {
+        // empty block
+    }
+
+    /**
+     * @param project project
+     * @param node reference node
+     * @return index information about original node that used as reference or <code>null</code> if
+     * node not found.
+     * @see RefactorUtil#resolveIndexInfo(ElementIndexInfo)
+     */
+    public static ElementIndexInfo getByReference(IProject project, ASTNode node) {
+        QName qname = null;
+        ElementIndexType type = null;
+        if (node instanceof UsesNode) {
+            qname = ((UsesNode) node).getGrouping();
+            type = ElementIndexType.GROUPING;
+        } else if (node instanceof TypeReference) {
+            qname = ((TypeReference) node).getType();
+            type = ElementIndexType.TYPE;
+        } else if (node instanceof BaseReference) {
+            qname = ((BaseReference) node).getType();
+            type = ElementIndexType.IDENTITY;
+        } else if (node instanceof ModuleImport) {
+            ModuleImport moduleImport = (ModuleImport) node;
+            qname = new QName(moduleImport.getName(), moduleImport.getPrefix(), moduleImport.getName(),
+                    moduleImport.getRevision());
+            type = ElementIndexType.MODULE;
+        } else if (node instanceof SubModuleInclude) {
+            SubModuleInclude include = (SubModuleInclude) node;
+            qname = new QName(include.getName(), null, include.getName(), include.getRevision());
+            type = ElementIndexType.SUBMODULE;
+        }
+
+        if (qname != null) {
+            ElementIndexInfo[] infos = YangModelManager.search(qname.getModule(), qname.getRevision(), qname.getName(),
+                    type, project, null);
+            if (infos.length > 0) {
+                return infos[0];
+            }
+        }
+        return null;
+    }
+
+    /**
+     * @param info index info
+     * @return resolved AST node or <code>null</code> if node not found
+     */
+    public static ASTNode resolveIndexInfo(ElementIndexInfo info) {
+        try {
+            Module module = null;
+            if (info.getEntry() != null && !info.getEntry().isEmpty()) {
+                module = YangCorePlugin.createJarEntry(new Path(info.getPath()), info.getEntry()).getModule();
+            } else {
+                module = getModule(info.getPath());
+            }
+            return module.getNodeAtPosition(info.getStartPosition());
+        } catch (YangModelException e) {
+            return null;
+        }
+    }
+
+    /**
+     * @param info index info
+     * @return resolved AST node or <code>null</code> if node not found
+     */
+    public static ASTNode resolveIndexInfo(ElementIndexReferenceInfo info) {
+        try {
+            return getModule(info.getPath()).getNodeAtPosition(info.getStartPosition());
+        } catch (YangModelException e) {
+            return null;
+        }
+    }
+
+    /**
+     * @param info index info
+     * @return string content of AST node or <code>null</code> if node not found
+     * @throws CoreException IO errors
+     */
+    public static String loadIndexInfoContent(ElementIndexInfo info) throws CoreException {
+        ASTNode node = resolveIndexInfo(info);
+        if (node != null) {
+            if (info.getEntry() != null && !info.getEntry().isEmpty()) {
+                try (JarFile jarFile = new JarFile(new Path(info.getPath()).toFile())) {
+                    try (InputStreamReader reader = new InputStreamReader(
+                            jarFile.getInputStream(jarFile.getEntry(info.getEntry())), "UTF-8")) { //$NON-NLS-1$
+                        char[] cbuf = new char[node.getBodyLength()];
+                        reader.skip(node.getBodyStartPosition());
+                        reader.read(cbuf, 0, node.getBodyLength());
+                        return new String(cbuf);
+                    }
+                } catch (IOException e) {
+                    throw new CoreException(new Status(IStatus.ERROR, YangRefactoringPlugin.PLUGIN_ID, "Error", e)); //$NON-NLS-1$
+                }
+            } else {
+                IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(info.getPath()));
+                return loadNodeContent(node, file);
+            }
+        }
+        return null;
+    }
+
+    /**
+     * @param node AST node
+     * @param file file where node located
+     * @return string content of node body
+     * @throws CoreException IO errors
+     */
+    public static String loadNodeContent(ASTNode node, IFile file) throws CoreException {
+        try (InputStreamReader reader = new InputStreamReader(file.getContents(), "UTF-8")) { //$NON-NLS-1$
+            char[] cbuf = new char[node.getBodyLength()];
+            reader.skip(node.getBodyStartPosition());
+            reader.read(cbuf, 0, node.getBodyLength());
+            return new String(cbuf);
+        } catch (IOException | CoreException e) {
+            throw new CoreException(new Status(IStatus.ERROR, YangRefactoringPlugin.PLUGIN_ID, "Error", e)); //$NON-NLS-1$
+        }
+    }
+
+    /**
+     * Format code snippet according formating preferences.
+     *
+     * @param snipped code snippet
+     * @param indentationLevel indentation level
+     * @return formatted code
+     */
+    public static String formatCodeSnipped(String snipped, int indentationLevel) {
+        YangFormattingPreferences pref = new YangFormattingPreferences();
+
+        IPreferenceStore store = YangUIPlugin.getDefault().getPreferenceStore();
+        pref.setSpaceForTabs(store.getBoolean(YangPreferenceConstants.FMT_INDENT_SPACE));
+        pref.setIndentSize(store.getInt(YangPreferenceConstants.FMT_INDENT_WIDTH));
+        pref.setCompactImport(store.getBoolean(YangPreferenceConstants.FMT_COMPACT_IMPORT));
+        pref.setFormatComment(store.getBoolean(YangPreferenceConstants.FMT_COMMENT));
+        pref.setFormatStrings(store.getBoolean(YangPreferenceConstants.FMT_STRING));
+        pref.setMaxLineLength(store.getInt(YangPreferenceConstants.FMT_MAX_LINE_LENGTH));
+
+        return YangParserUtil.formatYangSource(pref, snipped.toCharArray(), indentationLevel,
+                System.getProperty("line.separator")); //$NON-NLS-1$
+    }
+
+    /**
+     * @param node node to calculate
+     * @return node level
+     */
+    public static int getNodeLevel(ASTNode node) {
+        int nodeLevel = -1;
+        ASTNode parent = node;
+        while (parent != null) {
+            parent = parent.getParent();
+            nodeLevel++;
+        }
+        return nodeLevel >= 0 ? nodeLevel : 0;
+    }
+
+    private static Module getModule(String path) throws YangModelException {
+        return YangCorePlugin.createYangFile(path).getModule();
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/YangCompositeChange.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/YangCompositeChange.java
new file mode 100644 (file)
index 0000000..81c685e
--- /dev/null
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring;
+
+import java.util.HashMap;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.ltk.core.refactoring.CompositeChange;
+import org.eclipse.ltk.core.refactoring.TextChange;
+import org.eclipse.ltk.core.refactoring.TextFileChange;
+import org.eclipse.text.edits.MultiTextEdit;
+import org.eclipse.text.edits.ReplaceEdit;
+import org.eclipse.text.edits.TextEdit;
+import org.eclipse.text.edits.TextEditGroup;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 7, 2014
+ */
+public class YangCompositeChange extends CompositeChange {
+    private HashMap<String, TextChange> map = new HashMap<>();
+
+    public YangCompositeChange(String name) {
+        super(name);
+    }
+
+    public TextEdit addTextEdit(String path, String changeName, String editName, int pos, int len, String newName) {
+        TextChange change = getChangeOrCreate(path, changeName);
+        ReplaceEdit child = new ReplaceEdit(pos, len, newName);
+        change.getEdit().addChild(child);
+        change.addTextEditGroup(new TextEditGroup(editName, child));
+        return child;
+    }
+
+    private TextChange getChangeOrCreate(String path, String name) {
+        if (!map.containsKey(path)) {
+            IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(path));
+            TextChange change = new TextFileChange(name, file);
+            change.setTextType("yang"); //$NON-NLS-1$
+            MultiTextEdit edit = new MultiTextEdit();
+            change.setEdit(edit);
+            change.setKeepPreviewEdits(true);
+            add(change);
+            map.put(path, change);
+        }
+        return map.get(path);
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/YangRefactoringPlugin.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/YangRefactoringPlugin.java
new file mode 100644 (file)
index 0000000..c042cee
--- /dev/null
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ *
+ * @author Konstantin Zaitsev
+ * date: Jul 29, 2014
+ */
+public class YangRefactoringPlugin extends AbstractUIPlugin {
+
+    /** The plug-in ID */
+    public static final String PLUGIN_ID = "com.cisco.yangide.ext.refactoring"; //$NON-NLS-1$
+
+    /** The shared instance */
+    private static YangRefactoringPlugin plugin;
+
+    @Override
+    public void start(BundleContext context) throws Exception {
+        super.start(context);
+        plugin = this;
+    }
+
+    @Override
+    public void stop(BundleContext context) throws Exception {
+        plugin = null;
+    }
+
+    /**
+     * Returns the shared instance
+     *
+     * @return the shared instance
+     */
+    public static YangRefactoringPlugin getDefault() {
+        return plugin;
+    }
+
+    public IDialogSettings getDialogSettingsSection(String name) {
+        IDialogSettings dialogSettings = getDialogSettings();
+        IDialogSettings section = dialogSettings.getSection(name);
+        if (section == null) {
+            section = dialogSettings.addNewSection(name);
+        }
+        return section;
+    }
+
+    /**
+     * Reports log to Error Log view.
+     *
+     * @param statusErrorID plugin related error ID
+     * @param message error message
+     */
+    public static void log(Throwable e, String message) {
+        log(new Status(IStatus.ERROR, PLUGIN_ID, IStatus.ERROR, message, e));
+    }
+
+    /**
+     * Reports log to Error Log view.
+     *
+     * @param statusErrorID plugin related error ID
+     * @param message error message
+     */
+    public static void log(int statusErrorID, String message) {
+        log(new Status(statusErrorID, PLUGIN_ID, message));
+    }
+
+    /**
+     * Reports log to Error Log view.
+     *
+     * @param status status
+     */
+    public static void log(IStatus status) {
+        getDefault().getLog().log(status);
+    }
+
+    /**
+     * Reports exception to Error Log view.
+     *
+     * @param e exception
+     */
+    public static void log(Throwable e) {
+        log(new Status(IStatus.ERROR, PLUGIN_ID, e.getMessage(), e));
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/actions/ChangeRevisionAction.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/actions/ChangeRevisionAction.java
new file mode 100644 (file)
index 0000000..695ace9
--- /dev/null
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring.actions;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IWorkbenchSite;
+
+import com.cisco.yangide.core.YangModelException;
+import com.cisco.yangide.editor.editors.YangEditor;
+import com.cisco.yangide.ext.refactoring.code.ChangeRevisionRefactoring;
+import com.cisco.yangide.ext.refactoring.nls.Messages;
+import com.cisco.yangide.ext.refactoring.ui.ChangeRevisionRefactoringWizard;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 18, 2014
+ */
+public class ChangeRevisionAction extends SelectionDispatchAction {
+
+    /** Reference to the editor. */
+    private YangEditor editor;
+
+    public ChangeRevisionAction(IWorkbenchSite site) {
+        super(site);
+        setText(Messages.ChangeRevisionAction_text);
+        setToolTipText(Messages.ChangeRevisionAction_description);
+        setDescription(Messages.ChangeRevisionAction_description);
+    }
+
+    public ChangeRevisionAction(YangEditor editor) {
+        this(editor.getSite());
+        this.editor = editor;
+        setEnabled(editor != null);
+    }
+
+    @Override
+    public void selectionChanged(ISelection selection) {
+        setEnabled(editor != null);
+    }
+
+    @Override
+    public void run(ITextSelection selection) {
+        if (editor.getEditorInput() != null && editor.getEditorInput() instanceof IFileEditorInput) {
+            IFile file = ((IFileEditorInput) editor.getEditorInput()).getFile();
+
+            try {
+                ChangeRevisionRefactoring refactoring = new ChangeRevisionRefactoring(file, editor.getModule());
+                ChangeRevisionRefactoringWizard wizard = new ChangeRevisionRefactoringWizard(refactoring);
+
+                RefactoringWizardOpenOperation op = new RefactoringWizardOpenOperation(wizard);
+                op.run(getShell(), Messages.ChangeRevisionAction_name);
+
+            } catch (InterruptedException | YangModelException e) {
+                // do nothing
+            }
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/actions/ExtractGroupingAction.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/actions/ExtractGroupingAction.java
new file mode 100644 (file)
index 0000000..93992b8
--- /dev/null
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring.actions;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IWorkbenchSite;
+
+import com.cisco.yangide.core.YangModelException;
+import com.cisco.yangide.core.dom.ASTNode;
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.editor.editors.YangEditor;
+import com.cisco.yangide.ext.refactoring.RefactorUtil;
+import com.cisco.yangide.ext.refactoring.code.ExtractGroupingRefactoring;
+import com.cisco.yangide.ext.refactoring.nls.Messages;
+import com.cisco.yangide.ext.refactoring.ui.ExtractGroupingRefactoringWizard;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 19, 2014
+ */
+public class ExtractGroupingAction extends SelectionDispatchAction {
+
+    /** Reference to the editor. */
+    private YangEditor editor;
+
+    public ExtractGroupingAction(IWorkbenchSite site) {
+        super(site);
+        setText(Messages.ExtractGroupingAction_text);
+        setToolTipText(Messages.ExtractGroupingAction_description);
+        setDescription(Messages.ExtractGroupingAction_description);
+    }
+
+    public ExtractGroupingAction(YangEditor editor) {
+        this(editor.getSite());
+        this.editor = editor;
+    }
+
+    @Override
+    public void selectionChanged(ITextSelection selection) {
+        setEnabled(getNormalizedSelection(selection) != null);
+    }
+
+    @Override
+    public void run(ITextSelection selection) {
+        if (editor.getEditorInput() != null && editor.getEditorInput() instanceof IFileEditorInput) {
+            IFile file = ((IFileEditorInput) editor.getEditorInput()).getFile();
+            ITextSelection sel = getNormalizedSelection(selection);
+            try {
+                ExtractGroupingRefactoring refactoring = new ExtractGroupingRefactoring(file, editor.getModule(),
+                        sel.getOffset(), sel.getLength());
+                ExtractGroupingRefactoringWizard wizard = new ExtractGroupingRefactoringWizard(refactoring);
+
+                RefactoringWizardOpenOperation op = new RefactoringWizardOpenOperation(wizard);
+                op.run(getShell(), Messages.ExtractGroupingAction_name);
+                editor.reconcileModel();
+            } catch (InterruptedException | YangModelException e) {
+                // do nothing
+            }
+        }
+    }
+
+    private ITextSelection getNormalizedSelection(ITextSelection selection) {
+        if (editor != null) {
+            try {
+                if (selection.getText() != null) {
+                    Module module = editor.getModule();
+                    if (module != null) {
+
+                        String txt = selection.getText().trim();
+                        int offset = selection.getOffset() + selection.getText().indexOf(txt);
+                        ASTNode startNode = module.getNodeAtPosition(offset);
+                        int startLevel = RefactorUtil.getNodeLevel(startNode);
+
+                        ASTNode endNode = module.getNodeAtPosition(offset + txt.length() - 1);
+                        int endLevel = RefactorUtil.getNodeLevel(endNode);
+                        if (endLevel == startLevel && startLevel > 0
+                                && startNode.getParent().equals(endNode.getParent())) {
+                            return new TextSelection(startNode.getStartPosition(),
+                                    endNode.getEndPosition() - startNode.getStartPosition() + 1);
+                        }
+                    }
+                }
+            } catch (YangModelException e) {
+                // ignore exception
+            }
+        }
+        return null;
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/actions/InlineGroupingAction.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/actions/InlineGroupingAction.java
new file mode 100644 (file)
index 0000000..a24c13f
--- /dev/null
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring.actions;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IWorkbenchSite;
+
+import com.cisco.yangide.core.YangModelException;
+import com.cisco.yangide.core.dom.ASTNamedNode;
+import com.cisco.yangide.core.dom.ASTNode;
+import com.cisco.yangide.core.dom.GroupingDefinition;
+import com.cisco.yangide.core.dom.UsesNode;
+import com.cisco.yangide.editor.editors.YangEditor;
+import com.cisco.yangide.ext.refactoring.code.InlineGroupingRefactoring;
+import com.cisco.yangide.ext.refactoring.ui.InlineGroupingRefactoringWizard;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 06, 2014
+ */
+public class InlineGroupingAction extends SelectionDispatchAction {
+
+    private YangEditor editor;
+    private ASTNode node;
+
+    public InlineGroupingAction(IWorkbenchSite site) {
+        super(site);
+        this.node = null;
+        setText("Inline Grouping...");
+        setToolTipText("Inline grouping element in place of reference");
+        setDescription("Inline grouping element in place of reference");
+    }
+
+    public InlineGroupingAction(YangEditor editor) {
+        this(editor.getSite());
+        this.editor = editor;
+    }
+
+    @Override
+    public void selectionChanged(ITextSelection selection) {
+        try {
+            if (editor.getModule() != null) {
+                this.node = editor.getModule().getNodeAtPosition(selection.getOffset());
+            } else {
+                this.node = null;
+            }
+        } catch (YangModelException e) {
+            this.node = null;
+        }
+        setEnabled(node != null && (node instanceof GroupingDefinition || node instanceof UsesNode));
+    }
+
+    @Override
+    public void run(ITextSelection selection) {
+        if (node != null && (node instanceof GroupingDefinition || node instanceof UsesNode)) {
+            IFile file = ((IFileEditorInput) editor.getEditorInput()).getFile();
+            InlineGroupingRefactoring refactoring = new InlineGroupingRefactoring(file, (ASTNamedNode) node);
+            InlineGroupingRefactoringWizard wizard = new InlineGroupingRefactoringWizard(refactoring);
+
+            RefactoringWizardOpenOperation op = new RefactoringWizardOpenOperation(wizard);
+            try {
+                op.run(getShell(), "Inline Grouping");
+            } catch (InterruptedException e) {
+                // do nothing
+            }
+        } else {
+            MessageDialog.openInformation(getShell(), "Inline",
+                    "Operation unavailable on the current selection.\nSelect a grouping or uses element.");
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/actions/RenameAction.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/actions/RenameAction.java
new file mode 100644 (file)
index 0000000..3a8d866
--- /dev/null
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring.actions;
+
+import static com.cisco.yangide.ext.refactoring.actions.RenameSupport.isDirectRename;
+import static com.cisco.yangide.ext.refactoring.actions.RenameSupport.isIndirectRename;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IWorkbenchSite;
+
+import com.cisco.yangide.core.YangModelException;
+import com.cisco.yangide.core.dom.ASTNamedNode;
+import com.cisco.yangide.core.dom.ASTNode;
+import com.cisco.yangide.core.indexing.ElementIndexInfo;
+import com.cisco.yangide.editor.editors.YangEditor;
+import com.cisco.yangide.ext.refactoring.RefactorUtil;
+import com.cisco.yangide.ext.refactoring.ui.RenameLinkedMode;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 29, 2014
+ */
+public class RenameAction extends SelectionDispatchAction {
+
+    private YangEditor editor;
+    private ASTNode node;
+
+    public RenameAction(IWorkbenchSite site) {
+        super(site);
+        this.node = null;
+        setText("Rename...");
+        setToolTipText("Rename the selected element");
+        setDescription("Rename the selected element");
+    }
+
+    public RenameAction(YangEditor editor) {
+        this(editor.getSite());
+        this.editor = editor;
+    }
+
+    @Override
+    public void selectionChanged(ITextSelection selection) {
+
+        try {
+            if (editor.getModule() != null) {
+                this.node = editor.getModule().getNodeAtPosition(selection.getOffset());
+            } else {
+                this.node = null;
+            }
+        } catch (YangModelException e) {
+            this.node = null;
+        }
+
+        boolean enabled = false;
+        if (this.node != null) {
+            if (this.node instanceof ASTNamedNode) {
+                ASTNamedNode nnode = (ASTNamedNode) node;
+                if (nnode.getNameStartPosition() <= selection.getOffset()
+                        && (nnode.getNameStartPosition() + nnode.getNameLength()) >= selection.getOffset()) {
+                    enabled = isDirectRename(nnode) || isIndirectRename(nnode);
+                }
+            }
+        }
+        setEnabled(enabled);
+    }
+
+    @Override
+    public void run(ITextSelection selection) {
+        if (node != null && (isDirectRename(node) || isIndirectRename(node))) {
+            RenameLinkedMode activeLinkedMode = RenameLinkedMode.getActiveLinkedMode();
+            if (activeLinkedMode != null) {
+                if (activeLinkedMode.isCaretInLinkedPosition()) {
+                    activeLinkedMode.startFullDialog();
+                    return;
+                } else {
+                    activeLinkedMode.cancel();
+                }
+            }
+
+            ASTNode originalNode = null;
+            IFile file = ((IFileEditorInput) editor.getEditorInput()).getFile();
+            if (isIndirectRename(node)) {
+                ElementIndexInfo info = RefactorUtil.getByReference(file.getProject(), node);
+                if (info != null) {
+                    if (info.getEntry() != null && !info.getEntry().isEmpty()) {
+                        MessageDialog.openInformation(getShell(), "Rename",
+                                "Operation unavailable on the current selection.\n"
+                                        + "The original element is located in JAR file and cannot be renamed.");
+                        return;
+                    }
+                    originalNode = RefactorUtil.resolveIndexInfo(info);
+                }
+                if (originalNode == null) {
+                    MessageDialog.openInformation(getShell(), "Rename",
+                            "Operation unavailable on the current selection.\n"
+                                    + "Cannot find the original element for the reference.");
+                    return;
+                }
+                file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(info.getPath()));
+            } else {
+                originalNode = node;
+            }
+            new RenameLinkedMode((ASTNamedNode) originalNode, file, (ASTNamedNode) node, editor).start();
+        } else {
+            MessageDialog.openInformation(getShell(), "Rename", "Operation unavailable on the current selection.\n"
+                    + "Select a grouping name, module name, type name or identify name.");
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/actions/RenameSupport.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/actions/RenameSupport.java
new file mode 100644 (file)
index 0000000..302a9d8
--- /dev/null
@@ -0,0 +1,215 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring.actions;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.ltk.core.refactoring.CheckConditionsOperation;
+import org.eclipse.ltk.core.refactoring.PerformRefactoringOperation;
+import org.eclipse.ltk.core.refactoring.participants.RenameRefactoring;
+import org.eclipse.ltk.ui.refactoring.RefactoringWizardOpenOperation;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchWindow;
+
+import com.cisco.yangide.core.YangTypeUtil;
+import com.cisco.yangide.core.dom.ASTNamedNode;
+import com.cisco.yangide.core.dom.ASTNode;
+import com.cisco.yangide.core.dom.ASTVisitor;
+import com.cisco.yangide.core.dom.BaseReference;
+import com.cisco.yangide.core.dom.GroupingDefinition;
+import com.cisco.yangide.core.dom.IdentitySchemaNode;
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.core.dom.ModuleImport;
+import com.cisco.yangide.core.dom.SimpleNode;
+import com.cisco.yangide.core.dom.SubModule;
+import com.cisco.yangide.core.dom.SubModuleInclude;
+import com.cisco.yangide.core.dom.TypeDefinition;
+import com.cisco.yangide.core.dom.TypeReference;
+import com.cisco.yangide.core.dom.UsesNode;
+import com.cisco.yangide.ext.refactoring.YangRefactoringPlugin;
+import com.cisco.yangide.ext.refactoring.rename.RenameGroupingProcessor;
+import com.cisco.yangide.ext.refactoring.rename.RenameIdentityProcessor;
+import com.cisco.yangide.ext.refactoring.rename.RenameModuleProcessor;
+import com.cisco.yangide.ext.refactoring.rename.RenameSubModuleProcessor;
+import com.cisco.yangide.ext.refactoring.rename.RenameTypeProcessor;
+import com.cisco.yangide.ext.refactoring.rename.YangRenameProcessor;
+import com.cisco.yangide.ext.refactoring.ui.RenameRefactoringWizard;
+
+/**
+ * Methods to perform Rename refactoring with dialogs or silent.
+ *
+ * @author Konstantin Zaitsev
+ * date: Aug 4, 2014
+ */
+public class RenameSupport {
+
+    private String newName;
+    private ASTNamedNode node;
+    private IFile file;
+
+    /**
+     * @param file file where node is declared
+     * @param node node with type or group definition
+     * @param newName new name of node
+     */
+    public RenameSupport(IFile file, ASTNamedNode node, String newName) {
+        this.file = file;
+        this.node = node;
+        this.newName = newName;
+    }
+
+    /**
+     * @param shell
+     */
+    public void openDialog(Shell shell) {
+        openDialog(shell, false);
+    }
+
+    /**
+     * @param shell
+     * @param showPreview if <code>true</code> will display preview without the first page
+     * @return refactoring status
+     */
+    public boolean openDialog(Shell shell, boolean showPreview) {
+
+        YangRenameProcessor<?> processor = getProcessor(shell);
+        if (processor == null) {
+            return false;
+        }
+        RenameRefactoring refactoring = new RenameRefactoring(processor);
+        processor.setNewName(newName);
+        processor.setUpdateReferences(true);
+        processor.setFile(file);
+        RenameRefactoringWizard wizard = null;
+        if (showPreview) {
+            wizard = new RenameRefactoringWizard(refactoring) {
+                @Override
+                protected void addUserInputPages() {
+                }
+            };
+            wizard.setForcePreviewReview(showPreview);
+        } else {
+            wizard = new RenameRefactoringWizard(refactoring);
+        }
+        RefactoringWizardOpenOperation op = new RefactoringWizardOpenOperation(wizard);
+        try {
+            return op.run(shell, "Rename") == IDialogConstants.OK_ID;
+        } catch (InterruptedException e) {
+            // do nothing
+        }
+        return false;
+    }
+
+    /**
+     * Performs rename refactoring.
+     *
+     * @param shell
+     * @param window
+     */
+    public void perform(Shell shell, IWorkbenchWindow window) {
+        YangRenameProcessor<?> processor = getProcessor(shell);
+        if (processor != null) {
+            RenameRefactoring refactoring = new RenameRefactoring(processor);
+            processor.setNewName(newName);
+            processor.setUpdateReferences(true);
+            processor.setFile(file);
+            PerformRefactoringOperation op = new PerformRefactoringOperation(refactoring,
+                    CheckConditionsOperation.ALL_CONDITIONS);
+            try {
+                op.run(null);
+            } catch (CoreException e) {
+                YangRefactoringPlugin.log(e);
+            }
+        }
+    }
+
+    /**
+     * @param shell shell
+     * @return create appropriate refactor processor by node type
+     */
+    private YangRenameProcessor<?> getProcessor(Shell shell) {
+        YangRenameProcessor<?> processor = null;
+
+        if (node instanceof GroupingDefinition) {
+            processor = new RenameGroupingProcessor((GroupingDefinition) node);
+        } else if (node instanceof TypeDefinition) {
+            processor = new RenameTypeProcessor((TypeDefinition) node);
+        } else if (node instanceof IdentitySchemaNode) {
+            processor = new RenameIdentityProcessor((IdentitySchemaNode) node);
+        } else if (node instanceof SubModule) {
+            processor = new RenameSubModuleProcessor((SubModule) node);
+        } else if (node instanceof Module) {
+            processor = new RenameModuleProcessor((Module) node);
+        }
+
+        return processor;
+    }
+
+    /**
+     * @param node node to inspect
+     * @return <code>true</code> if node available to rename
+     */
+    public static boolean isDirectRename(ASTNode node) {
+        return node instanceof GroupingDefinition || node instanceof TypeDefinition
+                || node instanceof IdentitySchemaNode || node instanceof Module || node instanceof SubModule;
+    }
+
+    /**
+     * @param node node to inspect
+     * @return <code>true</code> if node is reference to perform indirect renaming
+     */
+    public static boolean isIndirectRename(ASTNode node) {
+        return node instanceof UsesNode
+                || (node instanceof TypeReference && !YangTypeUtil.isBuiltInType(((TypeReference) node).getName()))
+                || node instanceof BaseReference || node instanceof ModuleImport || node instanceof SubModuleInclude;
+    }
+
+    /**
+     * @param module module to find
+     * @param node original node with definition
+     * @return arrays of referenced node with original node
+     */
+    public static ASTNamedNode[] findLocalReferences(Module module, final ASTNamedNode node) {
+        final List<ASTNamedNode> nodes = new ArrayList<>();
+        final String name = node.getName();
+        final SimpleNode<String> modulePrefix = module.getPrefix();
+        module.accept(new ASTVisitor() {
+            @Override
+            public void preVisit(ASTNode n) {
+                if (n instanceof ASTNamedNode) {
+                    ASTNamedNode nn = (ASTNamedNode) n;
+                    if ((nn instanceof TypeDefinition || nn instanceof GroupingDefinition || nn instanceof Module
+                            || nn instanceof SubModule || nn instanceof IdentitySchemaNode)
+                            && nn.getName().equals(name)) {
+                        nodes.add(nn);
+                    } else if (nn instanceof TypeReference && ((TypeReference) nn).getType().getName().equals(name)) {
+                        nodes.add(nn);
+                    } else if (nn instanceof UsesNode && ((UsesNode) nn).getGrouping().getName().equals(name)) {
+                        // We add the node if the prefix on the UsesNode matches the module prefix,
+                        // either implicitly or explicitly.
+                        if (((UsesNode) nn).getGrouping().getPrefix() != null && modulePrefix != null
+                                && ((UsesNode) nn).getGrouping().getPrefix().equals(modulePrefix.getValue())) {
+                            nodes.add(nn);
+                        }
+                    } else if (nn instanceof BaseReference && ((BaseReference) nn).getType().getName().equals(name)) {
+                        nodes.add(nn);
+                    } else if (nn instanceof ModuleImport && ((ModuleImport) nn).getName().equals(name)) {
+                        nodes.add(nn);
+                    } else if (nn instanceof SubModuleInclude && ((SubModuleInclude) nn).getName().equals(name)) {
+                        nodes.add(nn);
+                    }
+                }
+            }
+        });
+        return nodes.toArray(new ASTNamedNode[nodes.size()]);
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/actions/SelectionDispatchAction.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/actions/SelectionDispatchAction.java
new file mode 100644 (file)
index 0000000..b627635
--- /dev/null
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.swt.custom.CaretEvent;
+import org.eclipse.swt.custom.CaretListener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchSite;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 29, 2014
+ */
+public class SelectionDispatchAction extends Action implements ISelectionChangedListener, CaretListener {
+
+    private IWorkbenchSite fSite;
+
+    protected SelectionDispatchAction(IWorkbenchSite site) {
+        fSite = site;
+    }
+
+    public IWorkbenchSite getSite() {
+        return fSite;
+    }
+
+    public ISelection getSelection() {
+        ISelectionProvider selectionProvider = getSelectionProvider();
+        if (selectionProvider != null) {
+            return selectionProvider.getSelection();
+        } else {
+            return null;
+        }
+    }
+
+    public Shell getShell() {
+        return fSite.getShell();
+    }
+
+    public ISelectionProvider getSelectionProvider() {
+        return fSite.getSelectionProvider();
+    }
+
+    public void update(ISelection selection) {
+        dispatchSelectionChanged(selection);
+    }
+
+    public void selectionChanged(IStructuredSelection selection) {
+        selectionChanged((ISelection) selection);
+    }
+
+    public void run(IStructuredSelection selection) {
+        run((ISelection) selection);
+    }
+
+    public void selectionChanged(ITextSelection selection) {
+        selectionChanged((ISelection) selection);
+    }
+
+    public void run(ITextSelection selection) {
+        run((ISelection) selection);
+    }
+
+    public void selectionChanged(ISelection selection) {
+        setEnabled(false);
+    }
+
+    public void run(ISelection selection) {
+    }
+
+    @Override
+    public void run() {
+        dispatchRun(getSelection());
+    }
+
+    @Override
+    public void selectionChanged(SelectionChangedEvent event) {
+        dispatchSelectionChanged(event.getSelection());
+    }
+
+    private void dispatchSelectionChanged(ISelection selection) {
+        if (selection instanceof IStructuredSelection) {
+            selectionChanged((IStructuredSelection) selection);
+        } else if (selection instanceof ITextSelection) {
+            selectionChanged((ITextSelection) selection);
+        } else {
+            selectionChanged(selection);
+        }
+    }
+
+    private void dispatchRun(ISelection selection) {
+        if (selection instanceof IStructuredSelection) {
+            run((IStructuredSelection) selection);
+        } else if (selection instanceof ITextSelection) {
+            run((ITextSelection) selection);
+        } else {
+            run(selection);
+        }
+    }
+
+    @Override
+    public void caretMoved(CaretEvent event) {
+        dispatchSelectionChanged(new TextSelection(event.caretOffset, 0));
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/code/ChangeRevisionRefactoring.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/code/ChangeRevisionRefactoring.java
new file mode 100644 (file)
index 0000000..c36294f
--- /dev/null
@@ -0,0 +1,216 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring.code;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.filebuffers.FileBuffers;
+import org.eclipse.core.filebuffers.LocationKind;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.ltk.core.refactoring.Change;
+import org.eclipse.ltk.core.refactoring.Refactoring;
+import org.eclipse.ltk.core.refactoring.RefactoringStatus;
+
+import com.cisco.yangide.core.YangCorePlugin;
+import com.cisco.yangide.core.dom.ASTNamedNode;
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.core.dom.ModuleImport;
+import com.cisco.yangide.core.dom.QName;
+import com.cisco.yangide.core.indexing.ElementIndexReferenceInfo;
+import com.cisco.yangide.core.indexing.ElementIndexReferenceType;
+import com.cisco.yangide.core.model.YangFile;
+import com.cisco.yangide.core.model.YangModelManager;
+import com.cisco.yangide.ext.refactoring.CreateYangFileChange;
+import com.cisco.yangide.ext.refactoring.RefactorUtil;
+import com.cisco.yangide.ext.refactoring.YangCompositeChange;
+import com.cisco.yangide.ext.refactoring.nls.Messages;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 18, 2014
+ */
+public class ChangeRevisionRefactoring extends Refactoring {
+
+    private IFile file;
+    private Module module;
+    private String revision;
+    private String description;
+    private boolean createNewFile;
+    private List<IPath> references;
+
+    public ChangeRevisionRefactoring(IFile file, Module module) {
+        this.file = file;
+        this.module = module;
+        this.references = new ArrayList<>();
+        this.createNewFile = true;
+    }
+
+    @Override
+    public String getName() {
+        return Messages.ChangeRevisionRefactoring_name;
+    }
+
+    /**
+     * @return the module
+     */
+    public Module getModule() {
+        return module;
+    }
+
+    @Override
+    public RefactoringStatus checkInitialConditions(IProgressMonitor pm)
+            throws CoreException, OperationCanceledException {
+        return new RefactoringStatus();
+    }
+
+    @Override
+    public RefactoringStatus checkFinalConditions(IProgressMonitor pm)
+            throws CoreException, OperationCanceledException {
+        return new RefactoringStatus();
+    }
+
+    @Override
+    public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException {
+        String editName = Messages.ChangeRevisionRefactoring_changeName;
+
+        YangCompositeChange composite = new YangCompositeChange(editName);
+        composite.markAsSynthetic();
+        if (createNewFile) {
+            String source = FileBuffers.getTextFileBufferManager()
+                    .getTextFileBuffer(file.getFullPath(), LocationKind.IFILE).getDocument().get();
+            ASTNamedNode revisionNode = module.getRevisionNode();
+            source = source.substring(0, revisionNode.getStartPosition()) + getFormattedRevision()
+                    + source.substring(revisionNode.getEndPosition() + 1, source.length());
+            IPath path = file.getFullPath();
+            path = path.removeFileExtension();
+            path = path.removeLastSegments(1).append(module.getName() + "@" + revision + ".yang"); //$NON-NLS-1$ //$NON-NLS-2$
+            composite.add(new CreateYangFileChange(path, source));
+        } else {
+            ASTNamedNode revisionNode = module.getRevisionNode();
+            composite.addTextEdit(file.getFullPath().toString(), editName, editName,
+                    revisionNode.getNameStartPosition(), revisionNode.getNameLength(), "\"" + revision + "\""); //$NON-NLS-1$//$NON-NLS-2$
+            composite.addTextEdit(file.getFullPath().toString(), editName, editName,
+                    revisionNode.getDescriptionNode().getStartPosition(),
+                    revisionNode.getDescriptionNode().getLength() + 1, "description \"" //$NON-NLS-1$
+                            + description + "\";"); //$NON-NLS-1$
+        }
+
+        YangCompositeChange refComposite = new YangCompositeChange(
+                Messages.ChangeRevisionRefactoring_updateReferenceChangeName);
+        composite.add(refComposite);
+
+        QName qname = new QName(module.getName(), null, module.getName(), module.getRevision());
+        ElementIndexReferenceInfo[] infos = YangModelManager.getIndexManager().searchReference(qname,
+                ElementIndexReferenceType.IMPORT, file.getProject());
+        for (ElementIndexReferenceInfo info : infos) {
+            if (references.contains(new Path(info.getPath()))) {
+                YangFile yangFile = YangCorePlugin
+                        .createYangFile(ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(info.getPath())));
+                Module refModule = yangFile.getModule();
+                ModuleImport refImport = refModule.getImportByName(module.getName());
+
+                refComposite.addTextEdit(info.getPath(), editName, editName, refImport.getStartPosition(),
+                        refImport.getLength() + 1, getFormattedImport(refImport));
+            }
+        }
+        return composite;
+    }
+
+    /**
+     * @return the revision
+     */
+    public String getRevision() {
+        return revision;
+    }
+
+    /**
+     * @param revision the revision to set
+     */
+    public void setRevision(String revision) {
+        this.revision = revision;
+    }
+
+    /**
+     * @return the description
+     */
+    public String getDescription() {
+        return description;
+    }
+
+    /**
+     * @param description the description to set
+     */
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    /**
+     * @return the createNewFile
+     */
+    public boolean isCreateNewFile() {
+        return createNewFile;
+    }
+
+    /**
+     * @param createNewFile the createNewFile to set
+     */
+    public void setCreateNewFile(boolean createNewFile) {
+        this.createNewFile = createNewFile;
+    }
+
+    /**
+     * @return the file
+     */
+    public IFile getFile() {
+        return file;
+    }
+
+    /**
+     * @return the references
+     */
+    public List<IPath> getReferences() {
+        return references;
+    }
+
+    /**
+     * @param references the references to set
+     */
+    public void setReferences(List<IPath> references) {
+        this.references = references;
+    }
+
+    private String getFormattedRevision() {
+        StringBuilder sb = new StringBuilder();
+        sb.append("revision \"").append(revision).append("\" {\n"); //$NON-NLS-1$ //$NON-NLS-2$
+        if (description != null && !description.isEmpty()) {
+            sb.append("description \"").append(description).append("\";\n"); //$NON-NLS-1$ //$NON-NLS-2$
+        }
+        String reference = module.getRevisionNode().getReference();
+        if (reference != null && !reference.isEmpty()) {
+            sb.append("reference \"").append(reference).append("\";\n"); //$NON-NLS-1$//$NON-NLS-2$
+        }
+        sb.append("}\n"); //$NON-NLS-1$
+        return RefactorUtil.formatCodeSnipped(sb.toString(), 1).trim();
+    }
+
+    private String getFormattedImport(ModuleImport moduleImport) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("import ").append(module.getName()).append("\" {\n"); //$NON-NLS-1$ //$NON-NLS-2$
+        sb.append("prefix ").append(moduleImport.getPrefix()).append(";\n"); //$NON-NLS-1$ //$NON-NLS-2$
+        sb.append("revision-date \"").append(revision).append("\";\n"); //$NON-NLS-1$//$NON-NLS-2$
+        sb.append("}\n"); //$NON-NLS-1$
+        return RefactorUtil.formatCodeSnipped(sb.toString(), 1).trim();
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/code/ExtractGroupingRefactoring.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/code/ExtractGroupingRefactoring.java
new file mode 100644 (file)
index 0000000..2de0c28
--- /dev/null
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring.code;
+
+import org.eclipse.core.filebuffers.FileBuffers;
+import org.eclipse.core.filebuffers.LocationKind;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.ltk.core.refactoring.Change;
+import org.eclipse.ltk.core.refactoring.Refactoring;
+import org.eclipse.ltk.core.refactoring.RefactoringStatus;
+
+import com.cisco.yangide.core.dom.ASTNode;
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.ext.refactoring.RefactorUtil;
+import com.cisco.yangide.ext.refactoring.YangCompositeChange;
+import com.cisco.yangide.ext.refactoring.YangRefactoringPlugin;
+import com.cisco.yangide.ext.refactoring.nls.Messages;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 19, 2014
+ */
+public class ExtractGroupingRefactoring extends Refactoring {
+
+    private final IFile file;
+    private final Module module;
+    private final int length;
+    private final int offset;
+
+    private String groupName;
+
+    public ExtractGroupingRefactoring(IFile file, Module module, int offset, int length) {
+        this.file = file;
+        this.module = module;
+        this.offset = offset;
+        this.length = length;
+    }
+
+    @Override
+    public String getName() {
+        return Messages.ExtractGroupingRefactoring_name;
+    }
+
+    /**
+     * @return the module
+     */
+    public Module getModule() {
+        return module;
+    }
+
+    @Override
+    public RefactoringStatus checkInitialConditions(IProgressMonitor pm)
+            throws CoreException, OperationCanceledException {
+        return new RefactoringStatus();
+    }
+
+    @Override
+    public RefactoringStatus checkFinalConditions(IProgressMonitor pm)
+            throws CoreException, OperationCanceledException {
+        return new RefactoringStatus();
+    }
+
+    @Override
+    public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException {
+        String editName = Messages.ExtractGroupingRefactoring_name;
+
+        YangCompositeChange composite = new YangCompositeChange(editName);
+        composite.markAsSynthetic();
+
+        String path = file.getFullPath().toString();
+        try {
+            String content = FileBuffers.getTextFileBufferManager()
+                    .getTextFileBuffer(file.getFullPath(), LocationKind.IFILE).getDocument().get(offset, length);
+            ASTNode node = module.getNodeAtPosition(offset);
+
+            // find appropriate node to insert extracted grouping
+            while (!(node.getParent() instanceof Module)) {
+                node = node.getParent();
+            }
+            composite.addTextEdit(path, editName, editName, node.getEndPosition() + 2, 0, getGroupingContent(content));
+
+            String uses = "uses " + groupName + ";\n"; //$NON-NLS-1$//$NON-NLS-2$
+            composite.addTextEdit(path, editName, Messages.ExtractGroupingRefactoring_updateReferenceEditName, offset,
+                    length, uses);
+
+        } catch (BadLocationException e) {
+            new CoreException(new Status(Status.ERROR, YangRefactoringPlugin.PLUGIN_ID, e.getMessage(), e));
+        }
+        return composite;
+    }
+
+    /**
+     * @param content
+     * @return
+     */
+    private String getGroupingContent(String content) {
+        StringBuilder sb = new StringBuilder();
+        sb.append("grouping ").append(groupName).append(" {\n"); //$NON-NLS-1$ //$NON-NLS-2$
+        sb.append(content);
+        sb.append("}\n"); //$NON-NLS-1$
+        return RefactorUtil.formatCodeSnipped(sb.toString(), 1);
+    }
+
+    /**
+     * @return the groupName
+     */
+    public String getGroupName() {
+        return groupName;
+    }
+
+    /**
+     * @param groupName the groupName to set
+     */
+    public void setGroupName(String groupName) {
+        this.groupName = groupName;
+    }
+
+    /**
+     * @return the length
+     */
+    public int getLength() {
+        return length;
+    }
+
+    /**
+     * @return the offset
+     */
+    public int getOffset() {
+        return offset;
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/code/InlineGroupingRefactoring.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/code/InlineGroupingRefactoring.java
new file mode 100644 (file)
index 0000000..cff0de9
--- /dev/null
@@ -0,0 +1,193 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring.code;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.ltk.core.refactoring.Change;
+import org.eclipse.ltk.core.refactoring.Refactoring;
+import org.eclipse.ltk.core.refactoring.RefactoringStatus;
+
+import com.cisco.yangide.core.dom.ASTNamedNode;
+import com.cisco.yangide.core.dom.ASTNode;
+import com.cisco.yangide.core.dom.GroupingDefinition;
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.core.dom.QName;
+import com.cisco.yangide.core.dom.UsesNode;
+import com.cisco.yangide.core.indexing.ElementIndexInfo;
+import com.cisco.yangide.core.indexing.ElementIndexReferenceInfo;
+import com.cisco.yangide.core.indexing.ElementIndexReferenceType;
+import com.cisco.yangide.core.model.YangModelManager;
+import com.cisco.yangide.ext.refactoring.RefactorUtil;
+import com.cisco.yangide.ext.refactoring.YangCompositeChange;
+import com.cisco.yangide.ext.refactoring.YangRefactoringPlugin;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 6, 2014
+ */
+public class InlineGroupingRefactoring extends Refactoring {
+
+    private ASTNamedNode node;
+    private boolean deleteGrouping;
+    private boolean inlineAll;
+    private IFile file;
+
+    public InlineGroupingRefactoring(IFile file, ASTNamedNode node) {
+        this.file = file;
+        this.node = node;
+        this.inlineAll = node instanceof GroupingDefinition;
+    }
+
+    @Override
+    public String getName() {
+        return "Inline Grouping";
+    }
+
+    @Override
+    public RefactoringStatus checkInitialConditions(IProgressMonitor pm)
+            throws CoreException, OperationCanceledException {
+        return new RefactoringStatus();
+    }
+
+    @Override
+    public RefactoringStatus checkFinalConditions(IProgressMonitor pm)
+            throws CoreException, OperationCanceledException {
+        return new RefactoringStatus();
+    }
+
+    /**
+     * @return the node
+     */
+    public ASTNamedNode getNode() {
+        return node;
+    }
+
+    /**
+     * @return the deleteGrouping
+     */
+    public boolean isDeleteGrouping() {
+        return deleteGrouping;
+    }
+
+    /**
+     * @param deleteGrouping the deleteGrouping to set
+     */
+    public void setDeleteGrouping(boolean deleteGrouping) {
+        this.deleteGrouping = deleteGrouping;
+    }
+
+    /**
+     * @return the inlineAll
+     */
+    public boolean isInlineAll() {
+        return inlineAll;
+    }
+
+    /**
+     * @param inlineAll the inlineAll to set
+     */
+    public void setInlineAll(boolean inlineAll) {
+        this.inlineAll = inlineAll;
+    }
+
+    @Override
+    public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException {
+        String editName = "Inline grouping";
+
+        IFile groupFile = file;
+        ASTNamedNode groupNode = node;
+        String groupContent = null;
+
+        // get content of grouping element
+        if (node instanceof UsesNode) {
+            ElementIndexInfo ref = RefactorUtil.getByReference(file.getProject(), node);
+            groupContent = RefactorUtil.loadIndexInfoContent(ref);
+            groupNode = (ASTNamedNode) RefactorUtil.resolveIndexInfo(ref);
+            groupFile = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(ref.getPath()));
+        } else {
+            groupContent = RefactorUtil.loadNodeContent(groupNode, groupFile);
+        }
+
+        groupContent = trimGroupContent(groupContent);
+        groupContent = formatGroupContent(groupContent, node);
+
+        if (groupContent == null || groupNode == null) {
+            throw new CoreException(
+                    new Status(IStatus.ERROR, YangRefactoringPlugin.PLUGIN_ID, "Cannot get grouping content"));
+        }
+
+        YangCompositeChange composite = new YangCompositeChange("Inline");
+        composite.markAsSynthetic();
+
+        if (!isInlineAll()) { // in this case UsesNode is selected
+            composite.addTextEdit(file.getFullPath().toString(), editName, editName, node.getStartPosition(),
+                    node.getLength() + 1, groupContent);
+        } else { // inline all occurrence
+            if (isDeleteGrouping()) { // delete orignal group
+                composite.addTextEdit(groupFile.getFullPath().toString(), editName, "Delete grouping declaration",
+                        groupNode.getStartPosition(), groupNode.getLength() + 1, "");
+            }
+
+            Module module = (Module) groupNode.getModule();
+            QName qname = new QName(module.getName(), null, groupNode.getName(), module.getRevision());
+            ElementIndexReferenceInfo[] infos = YangModelManager.getIndexManager().searchReference(qname,
+                    ElementIndexReferenceType.USES, groupFile.getProject());
+
+            pm.beginTask("Inline references", infos.length);
+            for (ElementIndexReferenceInfo info : infos) {
+                ASTNode usesNode = RefactorUtil.resolveIndexInfo(info);
+                String content = formatGroupContent(groupContent, usesNode);
+                composite.addTextEdit(info.getPath(), editName, editName, usesNode.getStartPosition(),
+                        usesNode.getLength() + 1, content);
+                pm.worked(1);
+            }
+            pm.done();
+        }
+        return composite;
+    }
+
+    /**
+     * Removed brackets from group body content.
+     *
+     * @param content
+     * @return trimmed group body
+     */
+    private String trimGroupContent(String content) {
+        if (content == null) {
+            return null;
+        }
+        String str = content.trim();
+        if (str.indexOf('{') >= 0) {
+            str = str.substring(str.indexOf('{') + 1, str.length());
+        }
+        if (str.lastIndexOf('}') >= 0) {
+            str = str.substring(0, str.lastIndexOf('}'));
+        }
+
+        return str;
+    }
+
+    /**
+     * @param content content to forma
+     * @param node ast node for replacement to calculate indentation level
+     * @return formatted string
+     */
+    private String formatGroupContent(String content, ASTNode node) {
+        if (content == null) {
+            return null;
+        }
+        return RefactorUtil.formatCodeSnipped(content, RefactorUtil.getNodeLevel(node));
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/nls/Messages.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/nls/Messages.java
new file mode 100644 (file)
index 0000000..81f345f
--- /dev/null
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring.nls;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 18, 2014
+ */
+public class Messages extends NLS {
+    private static final String BUNDLE_NAME = "com.cisco.yangide.ext.refactoring.nls.messages"; //$NON-NLS-1$
+    public static String ChangeRevisionAction_description;
+    public static String ChangeRevisionAction_name;
+    public static String ChangeRevisionAction_text;
+    public static String ChangeRevisionInputWizardPage_description;
+    public static String ChangeRevisionInputWizardPage_descriptionLabel;
+    public static String ChangeRevisionInputWizardPage_newFileCheckLabel;
+    public static String ChangeRevisionInputWizardPage_refGroupLabel;
+    public static String ChangeRevisionInputWizardPage_refTableDeselectAllBtn;
+    public static String ChangeRevisionInputWizardPage_refTableName;
+    public static String ChangeRevisionInputWizardPage_refTablePath;
+    public static String ChangeRevisionInputWizardPage_refTableProject;
+    public static String ChangeRevisionInputWizardPage_refTableSellectAllBtn;
+    public static String ChangeRevisionInputWizardPage_revisionLabel;
+    public static String ChangeRevisionRefactoring_changeName;
+    public static String ChangeRevisionRefactoring_name;
+    public static String ChangeRevisionRefactoring_updateReferenceChangeName;
+    public static String CreateYangFileChange_fileAlreadyExists;
+    public static String CreateYangFileChange_name;
+    public static String CreateYangFileChange_taskName;
+    public static String ExtractGroupingAction_description;
+    public static String ExtractGroupingAction_name;
+    public static String ExtractGroupingAction_text;
+    public static String ExtractGroupingInputWizardPage_description;
+    public static String ExtractGroupingInputWizardPage_groupingNameLabel;
+    public static String ExtractGroupingRefactoring_name;
+    public static String ExtractGroupingRefactoring_updateReferenceEditName;
+    public static String RefactorActionGroup_Refactor;
+    public static String RefactorActionGroup_noRefactorAvailable;
+    public static String RevisionDialog_title;
+
+    static {
+        // initialize resource bundle
+        NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+    }
+
+    private Messages() {
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/nls/messages.properties b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/nls/messages.properties
new file mode 100644 (file)
index 0000000..d534364
--- /dev/null
@@ -0,0 +1,37 @@
+###############################################################################
+# Copyright (c) 2014, 2015 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
+#  
+###############################################################################
+ChangeRevisionAction_description=Change module revision and update referenced modules
+ChangeRevisionAction_name=Change Revision
+ChangeRevisionAction_text=Change Revision...
+ChangeRevisionInputWizardPage_description=Change Module Revision
+ChangeRevisionInputWizardPage_descriptionLabel=Description: 
+ChangeRevisionInputWizardPage_newFileCheckLabel=&Create a new file
+ChangeRevisionInputWizardPage_refGroupLabel=Update revision in referenced modules: 
+ChangeRevisionInputWizardPage_refTableDeselectAllBtn=Deselect All
+ChangeRevisionInputWizardPage_refTableName=Name
+ChangeRevisionInputWizardPage_refTablePath=Path
+ChangeRevisionInputWizardPage_refTableProject=Project
+ChangeRevisionInputWizardPage_refTableSellectAllBtn=Select All
+ChangeRevisionInputWizardPage_revisionLabel=Revision: 
+ChangeRevisionRefactoring_changeName=Change Revision
+ChangeRevisionRefactoring_name=Change Revision
+ChangeRevisionRefactoring_updateReferenceChangeName=Update References
+CreateYangFileChange_fileAlreadyExists=File "{0}" already exists
+CreateYangFileChange_name=Create file: {0}
+CreateYangFileChange_taskName=Create Yang file
+ExtractGroupingAction_description=Extract block of elements into reusable grouping
+ExtractGroupingAction_name=Extract Grouping
+ExtractGroupingAction_text=Extract Grouping...
+ExtractGroupingInputWizardPage_description=Extract Grouping
+ExtractGroupingInputWizardPage_groupingNameLabel=Grouping name: 
+ExtractGroupingRefactoring_name=Extract Grouping
+ExtractGroupingRefactoring_updateReferenceEditName=Update reference
+RefactorActionGroup_Refactor=Refactor
+RefactorActionGroup_noRefactorAvailable=<no refactor available>
+RevisionDialog_title=Select date for revision
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/rename/RenameGroupingProcessor.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/rename/RenameGroupingProcessor.java
new file mode 100644 (file)
index 0000000..42b4ea8
--- /dev/null
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring.rename;
+
+import com.cisco.yangide.core.dom.GroupingDefinition;
+import com.cisco.yangide.core.indexing.ElementIndexReferenceType;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 30, 2014
+ */
+public class RenameGroupingProcessor extends YangRenameProcessor<GroupingDefinition> {
+
+    public RenameGroupingProcessor(GroupingDefinition grouping) {
+        super(grouping);
+    }
+
+    @Override
+    public String getIdentifier() {
+        return "com.cisco.yangide.ext.refactoring.rename.RenameGroupingProcessor";
+    }
+
+    @Override
+    protected ElementIndexReferenceType getReferenceType() {
+        return ElementIndexReferenceType.USES;
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/rename/RenameIdentityProcessor.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/rename/RenameIdentityProcessor.java
new file mode 100644 (file)
index 0000000..41da89d
--- /dev/null
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring.rename;
+
+import com.cisco.yangide.core.dom.IdentitySchemaNode;
+import com.cisco.yangide.core.indexing.ElementIndexReferenceType;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 6, 2014
+ */
+public class RenameIdentityProcessor extends YangRenameProcessor<IdentitySchemaNode> {
+
+    public RenameIdentityProcessor(IdentitySchemaNode type) {
+        super(type);
+    }
+
+    @Override
+    public String getIdentifier() {
+        return "com.cisco.yangide.ext.refactoring.rename.RenameIdentityProcessor";
+    }
+
+    @Override
+    protected ElementIndexReferenceType getReferenceType() {
+        return ElementIndexReferenceType.IDENTITY_REF;
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/rename/RenameModuleProcessor.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/rename/RenameModuleProcessor.java
new file mode 100644 (file)
index 0000000..ea2a795
--- /dev/null
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring.rename;
+
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.core.indexing.ElementIndexReferenceType;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 6, 2014
+ */
+public class RenameModuleProcessor extends YangRenameProcessor<Module> {
+
+    public RenameModuleProcessor(Module module) {
+        super(module);
+    }
+
+    @Override
+    public String getIdentifier() {
+        return "com.cisco.yangide.ext.refactoring.rename.RenameModuleProcessor";
+    }
+
+    @Override
+    protected ElementIndexReferenceType getReferenceType() {
+        return ElementIndexReferenceType.IMPORT;
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/rename/RenameSubModuleProcessor.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/rename/RenameSubModuleProcessor.java
new file mode 100644 (file)
index 0000000..ea0e56c
--- /dev/null
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring.rename;
+
+import com.cisco.yangide.core.dom.QName;
+import com.cisco.yangide.core.dom.SubModule;
+import com.cisco.yangide.core.indexing.ElementIndexReferenceInfo;
+import com.cisco.yangide.core.indexing.ElementIndexReferenceType;
+import com.cisco.yangide.core.model.YangModelManager;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 6, 2014
+ */
+public class RenameSubModuleProcessor extends YangRenameProcessor<SubModule> {
+
+    public RenameSubModuleProcessor(SubModule subModule) {
+        super(subModule);
+    }
+
+    @Override
+    public String getIdentifier() {
+        return "com.cisco.yangide.ext.refactoring.rename.RenameSubModuleProcessor";
+    }
+
+    @Override
+    protected ElementIndexReferenceType getReferenceType() {
+        return ElementIndexReferenceType.INCLUDE;
+    }
+
+    @Override
+    protected ElementIndexReferenceInfo[] getReferences() {
+        SubModule subModule = getNode();
+        QName qname = new QName(subModule.getName(), null, subModule.getName(), subModule.getRevision());
+        return YangModelManager.getIndexManager().searchReference(qname, getReferenceType(), getFile().getProject());
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/rename/RenameTypeProcessor.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/rename/RenameTypeProcessor.java
new file mode 100644 (file)
index 0000000..b3cc6d8
--- /dev/null
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring.rename;
+
+import com.cisco.yangide.core.dom.TypeDefinition;
+import com.cisco.yangide.core.indexing.ElementIndexReferenceType;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 2, 2014
+ */
+public class RenameTypeProcessor extends YangRenameProcessor<TypeDefinition> {
+
+    public RenameTypeProcessor(TypeDefinition type) {
+        super(type);
+    }
+
+    @Override
+    public String getIdentifier() {
+        return "com.cisco.yangide.ext.refactoring.rename.RenameTypeProcessor";
+    }
+
+    @Override
+    protected ElementIndexReferenceType getReferenceType() {
+        return ElementIndexReferenceType.TYPE_REF;
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/rename/YangRenameProcessor.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/rename/YangRenameProcessor.java
new file mode 100644 (file)
index 0000000..ca04d13
--- /dev/null
@@ -0,0 +1,164 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring.rename;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.ltk.core.refactoring.Change;
+import org.eclipse.ltk.core.refactoring.RefactoringStatus;
+import org.eclipse.ltk.core.refactoring.participants.CheckConditionsContext;
+import org.eclipse.ltk.core.refactoring.participants.RefactoringParticipant;
+import org.eclipse.ltk.core.refactoring.participants.RenameProcessor;
+import org.eclipse.ltk.core.refactoring.participants.SharableParticipants;
+
+import com.cisco.yangide.core.dom.ASTNamedNode;
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.core.dom.QName;
+import com.cisco.yangide.core.indexing.ElementIndexReferenceInfo;
+import com.cisco.yangide.core.indexing.ElementIndexReferenceType;
+import com.cisco.yangide.core.model.YangModelManager;
+import com.cisco.yangide.ext.refactoring.YangCompositeChange;
+
+/**
+ * @author Konstantin Zaitsev
+ * @param <T> original AST node to rename
+ * date: Jul 30, 2014
+ */
+public abstract class YangRenameProcessor<T extends ASTNamedNode> extends RenameProcessor {
+    private String newName;
+    private boolean updateReferences;
+    private IFile file;
+    private T node;
+
+    public YangRenameProcessor(T node) {
+        this.node = node;
+    }
+
+    /**
+     * @return the newName
+     */
+    public String getNewName() {
+        return newName;
+    }
+
+    /**
+     * @param newName the newName to set
+     */
+    public void setNewName(String newName) {
+        this.newName = newName;
+    }
+
+    /**
+     * @param selection
+     */
+    public void setUpdateReferences(boolean updateReferences) {
+        this.updateReferences = updateReferences;
+    }
+
+    /**
+     * @return the updateReferences
+     */
+    public boolean isUpdateReferences() {
+        return updateReferences;
+    }
+
+    /**
+     * @return the file
+     */
+    public IFile getFile() {
+        return file;
+    }
+
+    /**
+     * @param file the file to set
+     */
+    public void setFile(IFile file) {
+        this.file = file;
+    }
+
+    @Override
+    public String getProcessorName() {
+        return "Rename grouping element";
+    }
+
+    @Override
+    public boolean isApplicable() throws CoreException {
+        return node != null;
+    }
+
+    @Override
+    public Object[] getElements() {
+        return new Object[] { node };
+    }
+
+    @Override
+    public RefactoringStatus checkInitialConditions(IProgressMonitor pm)
+            throws CoreException, OperationCanceledException {
+        return new RefactoringStatus();
+    }
+
+    @Override
+    public RefactoringStatus checkFinalConditions(IProgressMonitor pm, CheckConditionsContext context)
+            throws CoreException, OperationCanceledException {
+        return new RefactoringStatus();
+    }
+
+    @Override
+    public RefactoringParticipant[] loadParticipants(RefactoringStatus status, SharableParticipants sharedParticipants)
+            throws CoreException {
+        return null;
+    }
+
+    @Override
+    public Change createChange(IProgressMonitor pm) throws CoreException, OperationCanceledException {
+        String changeName = "Rename element in file";
+        String editName = "Update reference";
+
+        ElementIndexReferenceInfo[] infos = getReferences();
+
+        YangCompositeChange composite = new YangCompositeChange("Rename");
+        composite.markAsSynthetic();
+
+        composite.addTextEdit(file.getFullPath().toString(), changeName, editName, node.getNameStartPosition(),
+                node.getNameLength(), getNewName());
+        for (ElementIndexReferenceInfo info : infos) {
+            String name = getNewName();
+            if (!info.getPath().equals(file.getFullPath().toString())
+                    && info.getType() != ElementIndexReferenceType.IMPORT
+                    && info.getType() != ElementIndexReferenceType.INCLUDE) {
+                String newName = getNewName();
+                if (newName.startsWith("\"")) {
+                    name = '"' + info.getReference().getPrefix() + ":" + newName.substring(1, newName.length() - 2)
+                            + '"';
+                } else {
+                    name = info.getReference().getPrefix() + ":" + newName;
+                }
+            }
+            composite.addTextEdit(info.getPath(), changeName, editName, info.getStartPosition(), info.getLength(),
+                    name);
+        }
+        return composite;
+    }
+
+    protected ElementIndexReferenceInfo[] getReferences() {
+        Module module = (Module) node.getModule();
+        QName qname = new QName(module.getName(), null, node.getName(), module.getRevision());
+        return YangModelManager.getIndexManager().searchReference(qname, getReferenceType(), getFile().getProject());
+    }
+
+    protected abstract ElementIndexReferenceType getReferenceType();
+
+    /**
+     * @return the node
+     */
+    public T getNode() {
+        return node;
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/scripting/RenameGroupingRefactoringContribution.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/scripting/RenameGroupingRefactoringContribution.java
new file mode 100644 (file)
index 0000000..7a466dd
--- /dev/null
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring.scripting;
+
+import java.util.Map;
+
+import org.eclipse.ltk.core.refactoring.RefactoringContribution;
+import org.eclipse.ltk.core.refactoring.RefactoringDescriptor;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 29, 2014
+ */
+public class RenameGroupingRefactoringContribution extends RefactoringContribution {
+
+    @Override
+    public RefactoringDescriptor createDescriptor(String id, String project, String description, String comment,
+            @SuppressWarnings("rawtypes") Map arguments, int flags) throws IllegalArgumentException {
+        return null;
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/ChangeRevisionInputWizardPage.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/ChangeRevisionInputWizardPage.java
new file mode 100644 (file)
index 0000000..4764036
--- /dev/null
@@ -0,0 +1,265 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring.ui;
+
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.jface.window.Window;
+import org.eclipse.ltk.ui.refactoring.UserInputWizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.Text;
+
+import com.cisco.yangide.core.dom.Module;
+import com.cisco.yangide.core.dom.QName;
+import com.cisco.yangide.core.indexing.ElementIndexReferenceInfo;
+import com.cisco.yangide.core.indexing.ElementIndexReferenceType;
+import com.cisco.yangide.core.model.YangModelManager;
+import com.cisco.yangide.ext.refactoring.code.ChangeRevisionRefactoring;
+import com.cisco.yangide.ext.refactoring.nls.Messages;
+import com.cisco.yangide.ui.internal.IYangUIConstants;
+import com.cisco.yangide.ui.internal.YangUIImages;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 18, 2014
+ */
+public class ChangeRevisionInputWizardPage extends UserInputWizardPage {
+    private Text revisionTxt;
+    private Text descriptionTxt;
+    private Button newFileCheck;
+    private TableViewer table;
+    private IFile[] files;
+
+    public ChangeRevisionInputWizardPage() {
+        super("RevisionInputPage"); //$NON-NLS-1$
+        setDescription(Messages.ChangeRevisionInputWizardPage_description);
+    }
+
+    @Override
+    public void createControl(Composite parent) {
+        Composite content = new Composite(parent, SWT.NONE);
+        GridLayoutFactory.swtDefaults().numColumns(3).spacing(0, 5).applyTo(content);
+
+        new Label(content, SWT.NONE).setText(Messages.ChangeRevisionInputWizardPage_revisionLabel);
+        revisionTxt = new Text(content, SWT.BORDER);
+        revisionTxt.setEditable(false);
+        Button revisionBtn = new Button(content, SWT.FLAT | SWT.PUSH);
+        GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.TOP).hint(24, 24).applyTo(revisionBtn);
+        revisionBtn.setImage(RefactoringImages.getImage(RefactoringImages.IMG_CALENDAR));
+        revisionBtn.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                RevisionDialog dialog = new RevisionDialog(getShell());
+                try {
+                    dialog.setRevision(revisionTxt.getText());
+                } catch (ParseException ex) {
+                    setErrorMessage(ex.getMessage());
+                    setPageComplete(false);
+                }
+                if (dialog.open() == Window.OK) {
+                    revisionTxt.setText(dialog.getRevision());
+                    setState();
+                }
+            }
+        });
+
+        new Label(content, SWT.NONE).setText(Messages.ChangeRevisionInputWizardPage_descriptionLabel);
+        descriptionTxt = new Text(content, SWT.BORDER | SWT.MULTI);
+        GridDataFactory.fillDefaults().span(4, 1).align(SWT.FILL, SWT.TOP).grab(true, false).hint(SWT.DEFAULT, 50)
+                .applyTo(descriptionTxt);
+
+        descriptionTxt.addFocusListener(new FocusAdapter() {
+            @Override
+            public void focusLost(FocusEvent e) {
+                setState();
+            }
+        });
+
+        newFileCheck = new Button(content, SWT.CHECK);
+        GridDataFactory.fillDefaults().span(3, 1).align(SWT.FILL, SWT.TOP).applyTo(newFileCheck);
+        newFileCheck.setText(Messages.ChangeRevisionInputWizardPage_newFileCheckLabel);
+        newFileCheck.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                setState();
+            }
+        });
+
+        Label tableLabel = new Label(content, SWT.NONE);
+        tableLabel.setText(Messages.ChangeRevisionInputWizardPage_refGroupLabel);
+        GridDataFactory.fillDefaults().span(3, 1).align(SWT.FILL, SWT.TOP).grab(true, false).applyTo(tableLabel);
+
+        Composite group = new Composite(content, SWT.NONE);
+        GridLayoutFactory.swtDefaults().margins(0, 0).numColumns(2).applyTo(group);
+        GridDataFactory.fillDefaults().span(3, 1).grab(true, true).align(SWT.FILL, SWT.TOP).applyTo(group);
+
+        table = new TableViewer(group, SWT.CHECK | SWT.BORDER);
+        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, true).hint(SWT.DEFAULT, 200)
+                .applyTo(table.getControl());
+        table.setContentProvider(ArrayContentProvider.getInstance());
+        table.getTable().setHeaderVisible(true);
+        table.getTable().setLinesVisible(true);
+
+        TableViewerColumn viewerColumn = new TableViewerColumn(table, SWT.NONE);
+        TableColumn column = viewerColumn.getColumn();
+        column.setText(Messages.ChangeRevisionInputWizardPage_refTableName);
+        column.setWidth(250);
+        column.setResizable(true);
+        viewerColumn.setLabelProvider(new ColumnLabelProvider() {
+            @Override
+            public Image getImage(Object element) {
+                return YangUIImages.getImage(IYangUIConstants.IMG_YANG_FILE);
+            }
+
+            @Override
+            public String getText(Object element) {
+                IFile file = (IFile) element;
+                return file.getName();
+            }
+        });
+
+        viewerColumn = new TableViewerColumn(table, SWT.NONE);
+        column = viewerColumn.getColumn();
+        column.setText(Messages.ChangeRevisionInputWizardPage_refTablePath);
+        column.setWidth(300);
+        column.setResizable(true);
+        viewerColumn.setLabelProvider(new ColumnLabelProvider() {
+            @Override
+            public String getText(Object element) {
+                IFile file = (IFile) element;
+                return file.getProjectRelativePath().toString();
+            }
+        });
+
+        viewerColumn = new TableViewerColumn(table, SWT.NONE);
+        column = viewerColumn.getColumn();
+        column.setText(Messages.ChangeRevisionInputWizardPage_refTableProject);
+        column.setWidth(200);
+        column.setResizable(true);
+        viewerColumn.setLabelProvider(new ColumnLabelProvider() {
+            @Override
+            public String getText(Object element) {
+                IFile file = (IFile) element;
+                return file.getProject().getName();
+            }
+        });
+
+        Composite controls = new Composite(group, SWT.NONE);
+        GridLayoutFactory.swtDefaults().margins(0, 0).applyTo(controls);
+        GridDataFactory.fillDefaults().align(SWT.BEGINNING, SWT.TOP).applyTo(controls);
+
+        Button tableSelectAllBtn = new Button(controls, SWT.PUSH);
+        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).applyTo(tableSelectAllBtn);
+        tableSelectAllBtn.setText(Messages.ChangeRevisionInputWizardPage_refTableSellectAllBtn);
+        tableSelectAllBtn.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                for (int i = 0; i < table.getTable().getItemCount(); i++) {
+                    table.getTable().getItem(i).setChecked(true);
+                }
+                setState();
+            }
+        });
+
+        Button tableDeselectAllBtn = new Button(controls, SWT.PUSH);
+        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).applyTo(tableDeselectAllBtn);
+        tableDeselectAllBtn.setText(Messages.ChangeRevisionInputWizardPage_refTableDeselectAllBtn);
+        tableDeselectAllBtn.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                for (int i = 0; i < table.getTable().getItemCount(); i++) {
+                    table.getTable().getItem(i).setChecked(false);
+                }
+                setState();
+            }
+        });
+        table.getTable().addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                setState();
+            }
+        });
+
+        Dialog.applyDialogFont(content);
+        setControl(content);
+    }
+
+    @Override
+    public void setVisible(boolean visible) {
+        if (visible) {
+            loadState();
+        }
+        super.setVisible(visible);
+    }
+
+    private void setState() {
+        ChangeRevisionRefactoring refactoring = (ChangeRevisionRefactoring) getRefactoring();
+        refactoring.setCreateNewFile(newFileCheck.getSelection());
+        refactoring.setRevision(revisionTxt.getText());
+        refactoring.setDescription(descriptionTxt.getText());
+
+        List<IPath> refs = new ArrayList<>();
+        for (int i = 0; i < table.getTable().getItemCount(); i++) {
+            if (table.getTable().getItem(i).getChecked()) {
+                refs.add(files[i].getFullPath());
+            }
+        }
+        refactoring.setReferences(refs);
+    }
+
+    private void loadState() {
+        ChangeRevisionRefactoring refactoring = (ChangeRevisionRefactoring) getRefactoring();
+        Module module = refactoring.getModule();
+
+        if (refactoring.getRevision() == null) {
+            refactoring.setRevision(RevisionDialog.DF.format(new Date()));
+        }
+
+        revisionTxt.setText(refactoring.getRevision());
+        descriptionTxt.setText(refactoring.getDescription() != null ? refactoring.getDescription() : ""); //$NON-NLS-1$
+        newFileCheck.setSelection(refactoring.isCreateNewFile());
+
+        QName name = new QName(module.getName(), null, module.getName(), module.getRevision());
+        ElementIndexReferenceInfo[] reference = YangModelManager.getIndexManager().searchReference(name,
+                ElementIndexReferenceType.IMPORT, null);
+        files = new IFile[reference.length];
+
+        for (int i = 0; i < reference.length; i++) {
+            files[i] = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(reference[i].getPath()));
+        }
+        table.setInput(files);
+
+        for (int i = 0; i < files.length; i++) {
+            table.getTable().getItem(i).setChecked(refactoring.getReferences().contains(files[i].getFullPath()));
+        }
+
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/ChangeRevisionRefactoringWizard.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/ChangeRevisionRefactoringWizard.java
new file mode 100644 (file)
index 0000000..41f347d
--- /dev/null
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring.ui;
+
+import org.eclipse.ltk.core.refactoring.Refactoring;
+import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 18, 2014
+ */
+public class ChangeRevisionRefactoringWizard extends RefactoringWizard {
+
+    public ChangeRevisionRefactoringWizard(Refactoring refactoring) {
+        super(refactoring, DIALOG_BASED_USER_INTERFACE);
+    }
+
+    @Override
+    protected void addUserInputPages() {
+        addPage(new ChangeRevisionInputWizardPage());
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/EditorHighlightingSynchronizer.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/EditorHighlightingSynchronizer.java
new file mode 100644 (file)
index 0000000..6193845
--- /dev/null
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring.ui;
+
+import org.eclipse.jface.text.link.ILinkedModeListener;
+import org.eclipse.jface.text.link.LinkedModeModel;
+
+import com.cisco.yangide.editor.editors.YangEditor;
+import com.cisco.yangide.editor.editors.YangSourceViewer;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 4, 2014
+ */
+public class EditorHighlightingSynchronizer implements ILinkedModeListener {
+
+    private final YangEditor editor;
+    private final boolean fWasOccurrencesOn;
+
+    /**
+     * Creates a new synchronizer.
+     *
+     * @param editor the java editor the occurrences markers of which will be synchronized with the
+     * linked mode
+     */
+    public EditorHighlightingSynchronizer(YangEditor editor) {
+        this.editor = editor;
+        fWasOccurrencesOn = editor.isMarkingOccurrences();
+
+        if (fWasOccurrencesOn && !isEditorDisposed()) {
+            editor.uninstallOccurrencesFinder();
+        }
+
+        if (!isEditorDisposed()) {
+            ((YangSourceViewer) editor.getViewer()).getReconciler().uninstall();
+        }
+    }
+
+    @Override
+    public void left(LinkedModeModel environment, int flags) {
+        if (fWasOccurrencesOn && !isEditorDisposed()) {
+            editor.installOccurrencesFinder(true);
+        }
+        if (!isEditorDisposed()) {
+            ((YangSourceViewer) editor.getViewer()).getReconciler().install(editor.getViewer());
+        }
+    }
+
+    private boolean isEditorDisposed() {
+        return editor == null || editor.getSelectionProvider() == null;
+    }
+
+    @Override
+    public void suspend(LinkedModeModel environment) {
+    }
+
+    @Override
+    public void resume(LinkedModeModel environment, int flags) {
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/ExtractGroupingInputWizardPage.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/ExtractGroupingInputWizardPage.java
new file mode 100644 (file)
index 0000000..6cebdbe
--- /dev/null
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring.ui;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.ltk.ui.refactoring.UserInputWizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+import com.cisco.yangide.ext.refactoring.code.ExtractGroupingRefactoring;
+import com.cisco.yangide.ext.refactoring.nls.Messages;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 19, 2014
+ */
+public class ExtractGroupingInputWizardPage extends UserInputWizardPage {
+    private Text groupNameTxt;
+
+    public ExtractGroupingInputWizardPage() {
+        super("ExtractGroupingInputPage"); //$NON-NLS-1$
+        setDescription(Messages.ExtractGroupingInputWizardPage_description);
+    }
+
+    @Override
+    public void createControl(Composite parent) {
+        Composite content = new Composite(parent, SWT.NONE);
+        GridLayoutFactory.swtDefaults().numColumns(2).spacing(0, 5).applyTo(content);
+
+        new Label(content, SWT.NONE).setText(Messages.ExtractGroupingInputWizardPage_groupingNameLabel);
+        groupNameTxt = new Text(content, SWT.BORDER);
+        groupNameTxt.addModifyListener(new ModifyListener() {
+            @Override
+            public void modifyText(ModifyEvent e) {
+                setState();
+            }
+        });
+        GridDataFactory.fillDefaults().align(SWT.FILL, SWT.TOP).grab(true, false).applyTo(groupNameTxt);
+
+        Dialog.applyDialogFont(content);
+        setControl(content);
+    }
+
+    @Override
+    public void setVisible(boolean visible) {
+        if (visible) {
+            loadState();
+        }
+        super.setVisible(visible);
+    }
+
+    private void setState() {
+        ExtractGroupingRefactoring refactoring = (ExtractGroupingRefactoring) getRefactoring();
+        refactoring.setGroupName(groupNameTxt.getText());
+    }
+
+    private void loadState() {
+        ExtractGroupingRefactoring refactoring = (ExtractGroupingRefactoring) getRefactoring();
+        if (refactoring.getGroupName() == null) {
+            refactoring.setGroupName("extracted"); //$NON-NLS-1$
+        }
+        groupNameTxt.setText(refactoring.getGroupName());
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/ExtractGroupingRefactoringWizard.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/ExtractGroupingRefactoringWizard.java
new file mode 100644 (file)
index 0000000..172ddd2
--- /dev/null
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring.ui;
+
+import org.eclipse.ltk.core.refactoring.Refactoring;
+import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 19, 2014
+ */
+public class ExtractGroupingRefactoringWizard extends RefactoringWizard {
+
+    public ExtractGroupingRefactoringWizard(Refactoring refactoring) {
+        super(refactoring, DIALOG_BASED_USER_INTERFACE);
+    }
+
+    @Override
+    protected void addUserInputPages() {
+        addPage(new ExtractGroupingInputWizardPage());
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/InlineGroupingInputWizardPage.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/InlineGroupingInputWizardPage.java
new file mode 100644 (file)
index 0000000..7df98b5
--- /dev/null
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring.ui;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.ltk.ui.refactoring.UserInputWizardPage;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+
+import com.cisco.yangide.core.dom.ASTNamedNode;
+import com.cisco.yangide.core.dom.UsesNode;
+import com.cisco.yangide.ext.refactoring.code.InlineGroupingRefactoring;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 30, 2014
+ */
+public class InlineGroupingInputWizardPage extends UserInputWizardPage {
+    private ASTNamedNode node;
+    private Button allInlineSel;
+    private Button deleteGroupCheck;
+    private Button singleInlineSel;
+
+    // private Button updateReferences;
+
+    public InlineGroupingInputWizardPage(ASTNamedNode node) {
+        super("InlineInputPage");
+        this.node = node;
+        setDescription("Inline Grouping");
+    }
+
+    @Override
+    public void createControl(Composite parent) {
+        Composite content = new Composite(parent, SWT.NONE);
+        GridLayout layout = new GridLayout(1, false);
+        layout.verticalSpacing = 5;
+        content.setLayout(layout);
+
+        String name = node instanceof UsesNode ? ((UsesNode) node).getGrouping().getName() : node.getName();
+        new Label(content, SWT.NONE).setText(NLS.bind("Inline grouping {0}:", name));
+
+        allInlineSel = new Button(content, SWT.RADIO);
+        allInlineSel.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+        allInlineSel.setText("&All references");
+        allInlineSel.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                setState();
+            }
+        });
+
+        deleteGroupCheck = new Button(content, SWT.CHECK);
+        GridData gd = new GridData(SWT.FILL, SWT.TOP, true, false);
+        gd.horizontalIndent = 15;
+        deleteGroupCheck.setLayoutData(gd);
+        deleteGroupCheck.setText("&Delete grouping declaration");
+        deleteGroupCheck.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                setState();
+            }
+
+        });
+
+        singleInlineSel = new Button(content, SWT.RADIO);
+        singleInlineSel.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+        singleInlineSel.setText("&Only the selected reference");
+        singleInlineSel.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                setState();
+            }
+        });
+
+        Dialog.applyDialogFont(content);
+        setControl(content);
+    }
+
+    @Override
+    public void setVisible(boolean visible) {
+        if (visible) {
+            loadState();
+        }
+        super.setVisible(visible);
+    }
+
+    private void setState() {
+        deleteGroupCheck.setEnabled(allInlineSel.getSelection());
+
+        InlineGroupingRefactoring refactoring = (InlineGroupingRefactoring) getRefactoring();
+        refactoring.setInlineAll(allInlineSel.getSelection());
+        refactoring.setDeleteGrouping(deleteGroupCheck.getSelection());
+    }
+
+    private void loadState() {
+        InlineGroupingRefactoring refactoring = (InlineGroupingRefactoring) getRefactoring();
+
+        singleInlineSel.setEnabled(node instanceof UsesNode);
+
+        allInlineSel.setSelection(refactoring.isInlineAll());
+        singleInlineSel.setSelection(!refactoring.isInlineAll());
+
+        deleteGroupCheck.setEnabled(allInlineSel.getSelection());
+        deleteGroupCheck.setSelection(refactoring.isDeleteGrouping());
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/InlineGroupingRefactoringWizard.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/InlineGroupingRefactoringWizard.java
new file mode 100644 (file)
index 0000000..2563c55
--- /dev/null
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring.ui;
+
+import org.eclipse.ltk.core.refactoring.Refactoring;
+import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
+
+import com.cisco.yangide.ext.refactoring.code.InlineGroupingRefactoring;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 6, 2014
+ */
+public class InlineGroupingRefactoringWizard extends RefactoringWizard {
+
+    public InlineGroupingRefactoringWizard(Refactoring refactoring) {
+        super(refactoring, DIALOG_BASED_USER_INTERFACE);
+    }
+
+    @Override
+    protected void addUserInputPages() {
+        addPage(new InlineGroupingInputWizardPage(((InlineGroupingRefactoring) getRefactoring()).getNode()));
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/RefactoringImages.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/RefactoringImages.java
new file mode 100644 (file)
index 0000000..fbcada7
--- /dev/null
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring.ui;
+
+import java.net.URL;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.graphics.Image;
+import org.osgi.framework.Bundle;
+
+import com.cisco.yangide.ext.refactoring.YangRefactoringPlugin;
+import com.cisco.yangide.ui.YangUIPlugin;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 18, 2014
+ */
+public final class RefactoringImages {
+    public static final String IMG_CALENDAR = "calendar"; //$NON-NLS-1$
+
+    private static ImageRegistry registry;
+
+    /**
+     * Declare all images
+     */
+    private static void declareImages() {
+        declareRegistryImage(IMG_CALENDAR, "icons/calendar.gif"); //$NON-NLS-1$
+    }
+
+    private final static void declareRegistryImage(String key, String path) {
+        ImageDescriptor desc = ImageDescriptor.getMissingImageDescriptor();
+        Bundle bundle = Platform.getBundle(YangRefactoringPlugin.PLUGIN_ID);
+        URL url = null;
+        if (bundle != null) {
+            url = FileLocator.find(bundle, new Path(path), null);
+            desc = ImageDescriptor.createFromURL(url);
+        }
+        registry.put(key, desc);
+    }
+
+    /**
+     * Returns the ImageRegistry.
+     */
+    public static ImageRegistry getImageRegistry() {
+        if (registry == null) {
+            registry = new ImageRegistry(YangUIPlugin.getStandardDisplay());
+            declareImages();
+        }
+        return registry;
+    }
+
+    public static Image getImage(String key) {
+        return getImageRegistry().get(key);
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/RenameInformationPopup.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/RenameInformationPopup.java
new file mode 100644 (file)
index 0000000..d4c5aa7
--- /dev/null
@@ -0,0 +1,842 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring.ui;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuListener2;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.bindings.keys.IKeyLookup;
+import org.eclipse.jface.bindings.keys.KeyLookupFactory;
+import org.eclipse.jface.bindings.keys.KeyStroke;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.text.ITextListener;
+import org.eclipse.jface.text.ITextViewerExtension5;
+import org.eclipse.jface.text.IViewportListener;
+import org.eclipse.jface.text.IWidgetTokenKeeper;
+import org.eclipse.jface.text.IWidgetTokenKeeperExtension;
+import org.eclipse.jface.text.IWidgetTokenOwner;
+import org.eclipse.jface.text.IWidgetTokenOwnerExtension;
+import org.eclipse.jface.text.TextEvent;
+import org.eclipse.jface.text.link.LinkedPosition;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.util.Geometry;
+import org.eclipse.jface.util.Util;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.ControlAdapter;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.ControlListener;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.events.PaintEvent;
+import org.eclipse.swt.events.PaintListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.ShellAdapter;
+import org.eclipse.swt.events.ShellEvent;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.graphics.Region;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+import org.eclipse.swt.widgets.Tracker;
+import org.eclipse.ui.IPartListener2;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchPartReference;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.keys.IBindingService;
+import org.eclipse.ui.progress.UIJob;
+
+import com.cisco.yangide.editor.editors.YangEditor;
+import com.cisco.yangide.ext.refactoring.YangRefactoringPlugin;
+import com.cisco.yangide.ui.internal.IYangUIConstants;
+import com.cisco.yangide.ui.internal.YangUIImages;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 4, 2014
+ */
+public class RenameInformationPopup implements IWidgetTokenKeeper, IWidgetTokenKeeperExtension {
+
+    private class PopupVisibilityManager
+            implements IPartListener2, ControlListener, MouseListener, KeyListener, ITextListener, IViewportListener {
+
+        public void start() {
+            editor.getSite().getWorkbenchWindow().getPartService().addPartListener(this);
+            final ISourceViewer viewer = editor.getViewer();
+            final StyledText textWidget = viewer.getTextWidget();
+            textWidget.addControlListener(this);
+            textWidget.addMouseListener(this);
+            textWidget.addKeyListener(this);
+            editor.getSite().getShell().addControlListener(this);
+            viewer.addTextListener(this);
+            viewer.addViewportListener(this);
+            fPopup.addDisposeListener(new DisposeListener() {
+                @Override
+                public void widgetDisposed(DisposeEvent e) {
+                    editor.getSite().getWorkbenchWindow().getPartService()
+                            .removePartListener(PopupVisibilityManager.this);
+                    if (!textWidget.isDisposed()) {
+                        textWidget.removeControlListener(PopupVisibilityManager.this);
+                        textWidget.removeMouseListener(PopupVisibilityManager.this);
+                        textWidget.removeKeyListener(PopupVisibilityManager.this);
+                    }
+                    editor.getSite().getShell().removeControlListener(PopupVisibilityManager.this);
+                    viewer.removeTextListener(PopupVisibilityManager.this);
+                    viewer.removeViewportListener(PopupVisibilityManager.this);
+                    if (fMenuManager != null) {
+                        fMenuManager.dispose();
+                        fMenuManager = null;
+                    }
+                    renameLinkedMode.cancel();
+                }
+            });
+        }
+
+        @Override
+        public void partActivated(IWorkbenchPartReference partRef) {
+            IWorkbenchPart fPart = editor.getEditorSite().getPart();
+            if (partRef.getPart(false) == fPart) {
+                updateVisibility();
+            }
+        }
+
+        @Override
+        public void partBroughtToTop(IWorkbenchPartReference partRef) {
+        }
+
+        @Override
+        public void partClosed(IWorkbenchPartReference partRef) {
+        }
+
+        @Override
+        public void partDeactivated(IWorkbenchPartReference partRef) {
+            IWorkbenchPart fPart = editor.getEditorSite().getPart();
+            if (fPopup != null && !fPopup.isDisposed() && partRef.getPart(false) == fPart) {
+                fPopup.setVisible(false);
+            }
+        }
+
+        @Override
+        public void partHidden(IWorkbenchPartReference partRef) {
+        }
+
+        @Override
+        public void partInputChanged(IWorkbenchPartReference partRef) {
+        }
+
+        @Override
+        public void partOpened(IWorkbenchPartReference partRef) {
+        }
+
+        @Override
+        public void partVisible(IWorkbenchPartReference partRef) {
+        }
+
+        @Override
+        public void controlMoved(ControlEvent e) {
+            updatePopupLocation(true);
+            updateVisibility(); // only for hiding outside editor area
+        }
+
+        @Override
+        public void controlResized(ControlEvent e) {
+            updatePopupLocation(true);
+            updateVisibility(); // only for hiding outside editor area
+        }
+
+        @Override
+        public void mouseDoubleClick(MouseEvent e) {
+        }
+
+        @Override
+        public void mouseDown(MouseEvent e) {
+        }
+
+        @Override
+        public void mouseUp(MouseEvent e) {
+            updatePopupLocation(false);
+            updateVisibility();
+        }
+
+        @Override
+        public void keyPressed(KeyEvent e) {
+            updatePopupLocation(false);
+            updateVisibility();
+        }
+
+        @Override
+        public void keyReleased(KeyEvent e) {
+        }
+
+        @Override
+        public void textChanged(TextEvent event) {
+            if (!event.getViewerRedrawState()) {
+                return;
+            }
+            updatePopupLocation(false);
+            updateVisibility(); // only for hiding outside editor area
+        }
+
+        @Override
+        public void viewportChanged(int verticalOffset) {
+            updatePopupLocation(true);
+            updateVisibility(); // only for hiding outside editor area
+        }
+    }
+
+    /**
+     * Cached platform flag for dealing with platform-specific issue:
+     * https://bugs.eclipse.org/bugs/show_bug.cgi?id=219326 : Shell with custom region and
+     * SWT.NO_TRIM still has border
+     */
+    private static boolean MAC = Util.isMac();
+
+    private static final int WIDGET_PRIORITY = 1000;
+
+    private static final String DIALOG_SETTINGS_SECTION = "RenameInformationPopup"; //$NON-NLS-1$
+    private static final String SNAP_POSITION_KEY = "snap_position"; //$NON-NLS-1$
+
+    private static final int SNAP_POSITION_UNDER_RIGHT_FIELD = 0;
+    private static final int SNAP_POSITION_OVER_RIGHT_FIELD = 1;
+    private static final int SNAP_POSITION_UNDER_LEFT_FIELD = 2;
+    private static final int SNAP_POSITION_OVER_LEFT_FIELD = 3;
+    private static final int SNAP_POSITION_LOWER_RIGHT = 4;
+
+    private static final int POPUP_VISIBILITY_DELAY = 300;
+
+    /**
+     * Offset of info hover arrow from the left or right side.
+     */
+    private static final int HAO = 10;
+
+    /**
+     * Width of info hover arrow.
+     */
+    private static final int HAW = 8;
+
+    /**
+     * Height of info hover arrow.
+     */
+    private static final int HAH = 10;
+
+    /**
+     * Gap between linked position and popup.
+     */
+    private static final int GAP = 2;
+
+    private final YangEditor editor;
+    private final RenameLinkedMode renameLinkedMode;
+
+    private int fSnapPosition;
+    private boolean fSnapPositionChanged;
+    private Shell fPopup;
+    private GridLayout fPopupLayout;
+    private Region fRegion;
+
+    private MenuManager fMenuManager;
+    private ToolBar fToolBar;
+    private String fOpenDialogBinding = ""; //$NON-NLS-1$
+    private boolean fIsMenuUp = false;
+
+    private boolean fDelayJobFinished = false;
+
+    public RenameInformationPopup(YangEditor editor, RenameLinkedMode renameLinkedMode) {
+        this.editor = editor;
+        this.renameLinkedMode = renameLinkedMode;
+        restoreSnapPosition();
+    }
+
+    private void restoreSnapPosition() {
+        IDialogSettings settings = getDialogSettings();
+        try {
+            fSnapPosition = settings.getInt(SNAP_POSITION_KEY);
+        } catch (NumberFormatException e) {
+            // default:
+            fSnapPosition = SNAP_POSITION_UNDER_LEFT_FIELD;
+        }
+        fSnapPositionChanged = true;
+    }
+
+    private IDialogSettings getDialogSettings() {
+        return YangRefactoringPlugin.getDefault().getDialogSettingsSection(DIALOG_SETTINGS_SECTION);
+    }
+
+    public void open() {
+        // Must cache here, since editor context is not available in menu from popup shell:
+        fOpenDialogBinding = getOpenDialogBinding();
+
+        Shell workbenchShell = editor.getSite().getShell();
+        final Display display = workbenchShell.getDisplay();
+
+        fPopup = new Shell(workbenchShell, SWT.ON_TOP | SWT.NO_TRIM | SWT.TOOL);
+        fPopupLayout = new GridLayout(2, false);
+        fPopupLayout.marginWidth = 1;
+        fPopupLayout.marginHeight = 1;
+        fPopupLayout.marginLeft = 4;
+        fPopupLayout.horizontalSpacing = 0;
+        fPopup.setLayout(fPopupLayout);
+
+        createContent(fPopup);
+        updatePopupLocation(true);
+        new PopupVisibilityManager().start();
+
+        // Leave linked mode when popup loses focus
+        // (except when focus goes back to workbench window or menu is open):
+        fPopup.addShellListener(new ShellAdapter() {
+            @Override
+            public void shellDeactivated(ShellEvent e) {
+                if (fIsMenuUp) {
+                    return;
+                }
+
+                final Shell editorShell = editor.getSite().getShell();
+                display.asyncExec(new Runnable() {
+                    // post to UI thread since editor shell only gets activated after popup has lost
+                    // focus
+                    @Override
+                    public void run() {
+                        Shell activeShell = display.getActiveShell();
+                        if (activeShell != editorShell) {
+                            renameLinkedMode.cancel();
+                        }
+                    }
+                });
+            }
+        });
+
+        if (!MAC) { // carbon and cocoa draw their own border...
+            fPopup.addPaintListener(new PaintListener() {
+                @Override
+                public void paintControl(PaintEvent pe) {
+                    pe.gc.drawPolygon(getPolygon(true));
+                }
+            });
+        }
+
+        UIJob delayJob = new UIJob(display, "delayed RenameInformationPopup") {
+            @Override
+            public IStatus runInUIThread(IProgressMonitor monitor) {
+                fDelayJobFinished = true;
+                if (fPopup != null && !fPopup.isDisposed()) {
+                    updateVisibility();
+                }
+                return Status.OK_STATUS;
+            }
+        };
+        delayJob.setSystem(true);
+        delayJob.setPriority(Job.INTERACTIVE);
+        delayJob.schedule(POPUP_VISIBILITY_DELAY);
+    }
+
+    public void close() {
+        if (fPopup != null) {
+            if (!fPopup.isDisposed()) {
+                fPopup.close();
+            }
+            fPopup = null;
+        }
+        releaseWidgetToken();
+        if (fRegion != null) {
+            if (!fRegion.isDisposed()) {
+                fRegion.dispose();
+            }
+        }
+    }
+
+    public Shell getShell() {
+        return fPopup;
+    }
+
+    private void updatePopupLocation(boolean force) {
+        if (!force && fSnapPosition == SNAP_POSITION_LOWER_RIGHT) {
+            return;
+        }
+
+        packPopup();
+        Point loc = computePopupLocation(fSnapPosition);
+        if (loc != null && !loc.equals(fPopup.getLocation())) {
+            fPopup.setLocation(loc);
+            // XXX workaround for https://bugs.eclipse.org/bugs/show_bug.cgi?id=170774
+            // fPopup.moveBelow(fEditor.getSite().getShell().getShells()[0]);
+        }
+    }
+
+    private void updateVisibility() {
+        if (fPopup != null && !fPopup.isDisposed() && fDelayJobFinished) {
+            boolean visible = false;
+            // TODO: Check for visibility of linked position, not whether popup is outside of
+            // editor?
+            if (renameLinkedMode.isCaretInLinkedPosition()) {
+                StyledText textWidget = editor.getViewer().getTextWidget();
+                Rectangle eArea = Geometry.toDisplay(textWidget, textWidget.getClientArea());
+                Rectangle pBounds = fPopup.getBounds();
+                pBounds.x -= GAP;
+                pBounds.y -= GAP;
+                pBounds.width += 2 * GAP;
+                pBounds.height += 2 * GAP;
+                if (eArea.intersects(pBounds)) {
+                    visible = true;
+                }
+            }
+            if (visible && !fPopup.isVisible()) {
+                ISourceViewer viewer = editor.getViewer();
+                if (viewer instanceof IWidgetTokenOwnerExtension) {
+                    IWidgetTokenOwnerExtension widgetTokenOwnerExtension = (IWidgetTokenOwnerExtension) viewer;
+                    widgetTokenOwnerExtension.requestWidgetToken(this, WIDGET_PRIORITY);
+                }
+            } else if (!visible && fPopup.isVisible()) {
+                releaseWidgetToken();
+            }
+            fPopup.setVisible(visible);
+        }
+    }
+
+    private void releaseWidgetToken() {
+        ISourceViewer viewer = editor.getViewer();
+        if (viewer instanceof IWidgetTokenOwner) {
+            IWidgetTokenOwner widgetTokenOwner = (IWidgetTokenOwner) viewer;
+            widgetTokenOwner.releaseWidgetToken(this);
+        }
+    }
+
+    /**
+     * @param snapPosition one of the SNAP_POSITION_* constants
+     * @return the location in display coordinates or <code>null</code> iff not visible
+     */
+    private Point computePopupLocation(int snapPosition) {
+        if (fPopup == null || fPopup.isDisposed()) {
+            return null;
+        }
+
+        switch (snapPosition) {
+        case SNAP_POSITION_LOWER_RIGHT: {
+            StyledText eWidget = editor.getViewer().getTextWidget();
+            Rectangle eBounds = eWidget.getClientArea();
+            Point eLowerRight = eWidget.toDisplay(eBounds.x + eBounds.width, eBounds.y + eBounds.height);
+            Point pSize = getExtent();
+            return new Point(eLowerRight.x - pSize.x - 5, eLowerRight.y - pSize.y - 5);
+        }
+
+        case SNAP_POSITION_UNDER_RIGHT_FIELD:
+        case SNAP_POSITION_OVER_RIGHT_FIELD: {
+            LinkedPosition position = renameLinkedMode.getCurrentLinkedPosition();
+            if (position == null) {
+                return null;
+            }
+            ISourceViewer viewer = editor.getViewer();
+            ITextViewerExtension5 viewer5 = (ITextViewerExtension5) viewer;
+            int widgetOffset = viewer5.modelOffset2WidgetOffset(position.offset + position.length);
+
+            StyledText textWidget = viewer.getTextWidget();
+            Point pos = textWidget.getLocationAtOffset(widgetOffset);
+            Point pSize = getExtent();
+            if (snapPosition == SNAP_POSITION_OVER_RIGHT_FIELD) {
+                pos.y -= pSize.y + GAP;
+            } else {
+                pos.y += textWidget.getLineHeight(widgetOffset) + GAP;
+            }
+            pos.x += GAP;
+            Point dPos = textWidget.toDisplay(pos);
+            Rectangle displayBounds = textWidget.getDisplay().getClientArea();
+            Rectangle dPopupRect = Geometry.createRectangle(dPos, pSize);
+            Geometry.moveInside(dPopupRect, displayBounds);
+            return new Point(dPopupRect.x, dPopupRect.y);
+        }
+
+        case SNAP_POSITION_UNDER_LEFT_FIELD:
+        case SNAP_POSITION_OVER_LEFT_FIELD:
+        default: // same as SNAP_POSITION_UNDER_LEFT_FIELD
+        {
+            LinkedPosition position = renameLinkedMode.getCurrentLinkedPosition();
+            if (position == null) {
+                return null;
+            }
+            ISourceViewer viewer = editor.getViewer();
+            ITextViewerExtension5 viewer5 = (ITextViewerExtension5) viewer;
+            int widgetOffset = viewer5
+                    .modelOffset2WidgetOffset(position.offset/* + position.length */);
+
+            StyledText textWidget = viewer.getTextWidget();
+            Point pos = textWidget.getLocationAtOffset(widgetOffset);
+            Point pSize = getExtent();
+            pSize.y += HAH + 1;
+            pos.x -= HAO;
+            if (snapPosition == SNAP_POSITION_OVER_LEFT_FIELD) {
+                pos.y -= pSize.y;
+            } else {
+                pos.y += textWidget.getLineHeight(widgetOffset);
+            }
+            Point dPos = textWidget.toDisplay(pos);
+            Rectangle displayBounds = textWidget.getDisplay().getClientArea();
+            Rectangle dPopupRect = Geometry.createRectangle(dPos, pSize);
+            Geometry.moveInside(dPopupRect, displayBounds);
+            return new Point(dPopupRect.x, dPopupRect.y);
+        }
+
+        }
+    }
+
+    private void addMoveSupport(final Shell popupShell, final Control movedControl) {
+        movedControl.addMouseListener(new MouseAdapter() {
+
+            @Override
+            public void mouseDown(final MouseEvent downEvent) {
+                if (downEvent.button != 1) {
+                    return;
+                }
+
+                final Point POPUP_SOURCE = popupShell.getLocation();
+                final StyledText textWidget = editor.getViewer().getTextWidget();
+                Point pSize = getExtent();
+                int originalSnapPosition = fSnapPosition;
+
+                /*
+                 * Feature in Tracker: it is not possible to directly control the feedback, see
+                 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=121300 and
+                 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=121298#c1 .
+                 *
+                 * Workaround is to have an offscreen rectangle for tracking mouse movement and a
+                 * manually updated rectangle for the actual drop target.
+                 */
+                final Tracker tracker = new Tracker(textWidget, SWT.NONE);
+
+                final Point[] LOCATIONS = { textWidget.toControl(computePopupLocation(SNAP_POSITION_UNDER_RIGHT_FIELD)),
+                        textWidget.toControl(computePopupLocation(SNAP_POSITION_OVER_RIGHT_FIELD)),
+                        textWidget.toControl(computePopupLocation(SNAP_POSITION_UNDER_LEFT_FIELD)),
+                        textWidget.toControl(computePopupLocation(SNAP_POSITION_OVER_LEFT_FIELD)),
+                        textWidget.toControl(computePopupLocation(SNAP_POSITION_LOWER_RIGHT)) };
+
+                final Rectangle[] DROP_TARGETS = { Geometry.createRectangle(LOCATIONS[0], pSize),
+                        Geometry.createRectangle(LOCATIONS[1], pSize),
+                        new Rectangle(LOCATIONS[2].x, LOCATIONS[2].y + HAH, pSize.x, pSize.y),
+                        Geometry.createRectangle(LOCATIONS[3], pSize), Geometry.createRectangle(LOCATIONS[4], pSize) };
+                final Rectangle MOUSE_MOVE_SOURCE = new Rectangle(1000000, 0, 0, 0);
+                tracker.setRectangles(new Rectangle[] { MOUSE_MOVE_SOURCE, DROP_TARGETS[fSnapPosition] });
+                tracker.setStippled(true);
+
+                ControlListener moveListener = new ControlAdapter() {
+                    /*
+                     * @see
+                     * org.eclipse.swt.events.ControlAdapter#controlMoved(org.eclipse.swt.events
+                     * .ControlEvent)
+                     */
+                    @Override
+                    public void controlMoved(ControlEvent moveEvent) {
+                        Rectangle[] currentRects = tracker.getRectangles();
+                        final Rectangle mouseMoveCurrent = currentRects[0];
+                        Point popupLoc = new Point(POPUP_SOURCE.x + mouseMoveCurrent.x - MOUSE_MOVE_SOURCE.x,
+                                POPUP_SOURCE.y + mouseMoveCurrent.y - MOUSE_MOVE_SOURCE.y);
+
+                        popupShell.setLocation(popupLoc);
+
+                        Point ePopupLoc = textWidget.toControl(popupLoc);
+                        int minDist = Integer.MAX_VALUE;
+                        for (int snapPos = 0; snapPos < DROP_TARGETS.length; snapPos++) {
+                            int dist = Geometry.distanceSquared(ePopupLoc, LOCATIONS[snapPos]);
+                            if (dist < minDist) {
+                                minDist = dist;
+                                fSnapPosition = snapPos;
+                                fSnapPositionChanged = true;
+                                currentRects[1] = DROP_TARGETS[snapPos];
+                            }
+                        }
+                        tracker.setRectangles(currentRects);
+                    }
+                };
+                tracker.addControlListener(moveListener);
+                boolean committed = tracker.open();
+                tracker.close();
+                tracker.dispose();
+                if (committed) {
+                    getDialogSettings().put(SNAP_POSITION_KEY, fSnapPosition);
+                } else {
+                    fSnapPosition = originalSnapPosition;
+                    fSnapPositionChanged = true;
+                }
+                updatePopupLocation(true);
+                activateEditor();
+            }
+        });
+    }
+
+    private void packPopup() {
+        if (!fSnapPositionChanged) {
+            return;
+        }
+        fSnapPositionChanged = false;
+
+        boolean isUnderLeft = fSnapPosition == SNAP_POSITION_UNDER_LEFT_FIELD;
+        boolean isOverLeft = fSnapPosition == SNAP_POSITION_OVER_LEFT_FIELD;
+        fPopupLayout.marginTop = isUnderLeft ? HAH : 0;
+        fPopupLayout.marginBottom = isOverLeft ? HAH + 1 : 0;
+        fPopup.pack();
+
+        Region oldRegion = fRegion;
+        if (isUnderLeft || isOverLeft) {
+            fRegion = new Region();
+            fRegion.add(getPolygon(false));
+            fPopup.setRegion(fRegion);
+            Rectangle bounds = fRegion.getBounds();
+            fPopup.setSize(bounds.width, bounds.height + 1);
+        } else {
+            fRegion = null;
+            fPopup.setRegion(null);
+        }
+
+        if (oldRegion != null) {
+            oldRegion.dispose();
+        }
+    }
+
+    private Point getExtent() {
+        Point e = fPopup.getSize();
+        switch (fSnapPosition) {
+        case SNAP_POSITION_UNDER_LEFT_FIELD:
+            e.y -= HAH;
+            break;
+        case SNAP_POSITION_OVER_LEFT_FIELD:
+            e.y -= HAH + 1;
+            break;
+        }
+        return e;
+    }
+
+    private int[] getPolygon(boolean border) {
+        Point e = getExtent();
+        int b = border ? 1 : 0;
+        boolean isRTL = (fPopup.getStyle() & SWT.RIGHT_TO_LEFT) != 0;
+        int ha1 = isRTL ? e.x - HAO : HAO + HAW;
+        int ha2 = isRTL ? e.x - HAO - HAW / 2 : HAO + HAW / 2;
+        int ha3 = isRTL ? e.x - HAO - HAW : HAO;
+        int[] poly;
+        switch (fSnapPosition) {
+        case SNAP_POSITION_OVER_LEFT_FIELD:
+            poly = new int[] { 0, 0, e.x - b, 0, e.x - b, e.y - b, ha1, e.y - b, ha2, e.y + HAH - b, ha3, e.y - b, 0,
+                    e.y - b, 0, 0 };
+            break;
+
+        case SNAP_POSITION_UNDER_LEFT_FIELD:
+            poly = new int[] { 0, HAH, ha3 + b, HAH, ha2, b, ha1 - b, HAH, e.x - b, HAH, e.x - b, e.y + HAH - b, 0,
+                    e.y + HAH - b, 0, HAH };
+            break;
+
+        default:
+            poly = new int[] { 0, 0, e.x - b, 0, e.x - b, e.y - b, 0, e.y - b, 0, 0 };
+            break;
+        }
+        return poly;
+    }
+
+    private void createContent(Composite parent) {
+        Display display = parent.getDisplay();
+        Color foreground = display.getSystemColor(SWT.COLOR_INFO_FOREGROUND);
+        Color background = display.getSystemColor(SWT.COLOR_INFO_BACKGROUND);
+        addMoveSupport(fPopup, parent);
+
+        StyledText hint = new StyledText(fPopup, SWT.READ_ONLY | SWT.SINGLE);
+        String enterKeyName = getEnterBinding();
+        String hintTemplate = "Enter new name, press {0} to refactor";
+        hint.setText(NLS.bind(hintTemplate, enterKeyName));
+        hint.setForeground(foreground);
+        hint.setStyleRange(new StyleRange(hintTemplate.indexOf("{0}"), enterKeyName.length(), null, null, SWT.BOLD)); //$NON-NLS-1$
+        hint.setEnabled(false); // text must not be selectable
+        addMoveSupport(fPopup, hint);
+
+        addViewMenu(parent);
+
+        recursiveSetBackgroundColor(parent, background);
+
+    }
+
+    private ToolBar addViewMenu(final Composite parent) {
+        fToolBar = new ToolBar(parent, SWT.FLAT);
+        final ToolItem menuButton = new ToolItem(fToolBar, SWT.PUSH, 0);
+        menuButton.setImage(YangUIImages.getImage(IYangUIConstants.IMG_LT_VIEW_MENU));
+        menuButton.setToolTipText("Menu");
+        fToolBar.addMouseListener(new MouseAdapter() {
+            @Override
+            public void mouseDown(MouseEvent e) {
+                showMenu(fToolBar);
+            }
+        });
+        menuButton.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                showMenu(fToolBar);
+            }
+        });
+        fToolBar.pack();
+        return fToolBar;
+    }
+
+    private void showMenu(ToolBar toolBar) {
+        Menu menu = getMenuManager().createContextMenu(toolBar);
+        menu.setLocation(toolBar.toDisplay(0, toolBar.getSize().y));
+        fIsMenuUp = true;
+        menu.setVisible(true);
+    }
+
+    private MenuManager getMenuManager() {
+        if (fMenuManager != null) {
+            return fMenuManager;
+        }
+
+        fMenuManager = new MenuManager();
+        fMenuManager.setRemoveAllWhenShown(true);
+
+        fMenuManager.addMenuListener(new IMenuListener2() {
+            @Override
+            public void menuAboutToHide(IMenuManager manager) {
+                fIsMenuUp = false;
+            }
+
+            @Override
+            public void menuAboutToShow(IMenuManager manager) {
+                boolean canRefactor = !renameLinkedMode.isOriginalName();
+
+                IAction refactorAction = new Action("Refactor") {
+                    @Override
+                    public void run() {
+                        activateEditor();
+                        renameLinkedMode.doRename(false);
+                    }
+                };
+                refactorAction.setAccelerator(SWT.CR);
+                refactorAction.setEnabled(canRefactor);
+                manager.add(refactorAction);
+
+                IAction previewAction = new Action("Pre&view...") {
+                    @Override
+                    public void run() {
+                        activateEditor();
+                        renameLinkedMode.doRename(true);
+                    }
+                };
+                previewAction.setAccelerator(SWT.CTRL | SWT.CR);
+                previewAction.setEnabled(canRefactor);
+                manager.add(previewAction);
+
+                IAction openDialogAction = new Action("&Open Rename Dialog..." + '\t' + fOpenDialogBinding) {
+                    @Override
+                    public void run() {
+                        activateEditor();
+                        renameLinkedMode.startFullDialog();
+                    }
+                };
+                manager.add(openDialogAction);
+
+                manager.add(new Separator());
+
+                MenuManager subMenuManager = new MenuManager("&Snap To");
+                addMoveMenuItem(subMenuManager, SNAP_POSITION_UNDER_LEFT_FIELD, "&Under Left");
+                addMoveMenuItem(subMenuManager, SNAP_POSITION_UNDER_RIGHT_FIELD, "U&nder Right");
+                addMoveMenuItem(subMenuManager, SNAP_POSITION_OVER_LEFT_FIELD, "&Over Left");
+                addMoveMenuItem(subMenuManager, SNAP_POSITION_OVER_RIGHT_FIELD, "O&ver Right");
+                addMoveMenuItem(subMenuManager, SNAP_POSITION_LOWER_RIGHT, "&Bottom Right");
+                manager.add(subMenuManager);
+            }
+        });
+        return fMenuManager;
+    }
+
+    private void addMoveMenuItem(IMenuManager manager, final int snapPosition, String text) {
+        IAction action = new Action(text, IAction.AS_RADIO_BUTTON) {
+            @Override
+            public void run() {
+                fSnapPosition = snapPosition;
+                fSnapPositionChanged = true;
+                getDialogSettings().put(SNAP_POSITION_KEY, fSnapPosition);
+                updatePopupLocation(true);
+                activateEditor();
+            }
+        };
+        action.setChecked(fSnapPosition == snapPosition);
+        manager.add(action);
+    }
+
+    private static String getEnterBinding() {
+        return KeyStroke.getInstance(KeyLookupFactory.getDefault().formalKeyLookup(IKeyLookup.CR_NAME)).format();
+    }
+
+    private static String getOpenDialogBinding() {
+        IBindingService bindingService = (IBindingService) PlatformUI.getWorkbench().getAdapter(IBindingService.class);
+        if (bindingService == null) {
+            return ""; //$NON-NLS-1$
+        }
+        String binding = bindingService.getBestActiveBindingFormattedFor("com.cisco.yangide.ui.actions.Rename");
+        return binding == null ? "" : binding; //$NON-NLS-1$
+    }
+
+    private static void recursiveSetBackgroundColor(Control control, Color color) {
+        control.setBackground(color);
+        if (control instanceof Composite) {
+            Control[] children = ((Composite) control).getChildren();
+            for (int i = 0; i < children.length; i++) {
+                recursiveSetBackgroundColor(children[i], color);
+            }
+        }
+    }
+
+    public boolean ownsFocusShell() {
+        if (fIsMenuUp) {
+            return true;
+        }
+        if (fPopup == null || fPopup.isDisposed()) {
+            return false;
+        }
+        Shell activeShell = fPopup.getDisplay().getActiveShell();
+        if (fPopup == activeShell) {
+            return true;
+        }
+        return false;
+    }
+
+    private void activateEditor() {
+        editor.getSite().getShell().setActive();
+    }
+
+    @Override
+    public boolean requestWidgetToken(IWidgetTokenOwner owner) {
+        return false;
+    }
+
+    @Override
+    public boolean requestWidgetToken(IWidgetTokenOwner owner, int priority) {
+        return false;
+    }
+
+    @Override
+    public boolean setFocus(IWidgetTokenOwner owner) {
+        if (fToolBar != null && !fToolBar.isDisposed()) {
+            showMenu(fToolBar);
+        }
+        return true;
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/RenameInputWizardPage.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/RenameInputWizardPage.java
new file mode 100644 (file)
index 0000000..f3fa76a
--- /dev/null
@@ -0,0 +1,138 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring.ui;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.ltk.core.refactoring.RefactoringStatus;
+import org.eclipse.ltk.core.refactoring.participants.RenameRefactoring;
+import org.eclipse.ltk.ui.refactoring.UserInputWizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+import com.cisco.yangide.ext.refactoring.rename.YangRenameProcessor;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 30, 2014
+ */
+public class RenameInputWizardPage extends UserInputWizardPage {
+    // private Button updateReferences;
+    private Text newNameTxt;
+    private String initialValue;
+
+    public RenameInputWizardPage(String description, String initialValue) {
+        super("RenameInputPage");
+        this.initialValue = initialValue == null ? "" : initialValue;
+        setDescription(description);
+    }
+
+    @Override
+    public void createControl(Composite parent) {
+        Composite content = new Composite(parent, SWT.NONE);
+        content.setLayout(new GridLayout(2, false));
+
+        new Label(content, SWT.NONE).setText("New name:");
+
+        newNameTxt = new Text(content, SWT.BORDER);
+        newNameTxt.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+        newNameTxt.addModifyListener(new ModifyListener() {
+            @Override
+            public void modifyText(ModifyEvent e) {
+                textModified();
+            }
+        });
+        newNameTxt.setText(initialValue);
+        newNameTxt.selectAll();
+
+        new Label(content, SWT.NONE).setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, false, 2, 1));
+
+        // updateReferences = new Button(content, SWT.CHECK);
+        // updateReferences.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, true, false, 2, 1));
+        // updateReferences.setText("Update references");
+        // updateReferences.setSelection(true);
+
+        // final YangRenameProcessor processor = (YangRenameProcessor) ((RenameRefactoring)
+        // getRefactoring())
+        // .getProcessor();
+
+        // processor.setUpdateReferences(updateReferences.getSelection());
+        // updateReferences.addSelectionListener(new SelectionAdapter() {
+        // @Override
+        // public void widgetSelected(SelectionEvent e) {
+        // processor.setUpdateReferences(updateReferences.getSelection());
+        // }
+        // });
+
+        Dialog.applyDialogFont(content);
+        setControl(content);
+    }
+
+    /**
+     * Checks the page's state and issues a corresponding error message. The page validation is
+     * computed by calling <code>validatePage</code>.
+     */
+    protected void textModified() {
+        String txt = newNameTxt.getText();
+        if ("".equals(txt)) { //$NON-NLS-1$
+            setPageComplete(false);
+            setErrorMessage(null);
+            setMessage(null);
+            return;
+        }
+        if (initialValue.equals(txt)) {
+            setPageComplete(false);
+            setErrorMessage(null);
+            setMessage(null);
+            return;
+        }
+
+        RefactoringStatus status = validateTextField(txt);
+        if (status == null) {
+            status = new RefactoringStatus();
+        }
+        setPageComplete(status);
+    }
+
+    private RefactoringStatus validateTextField(String txt) {
+        YangRenameProcessor<?> processor = (YangRenameProcessor<?>) ((RenameRefactoring) getRefactoring())
+                .getProcessor();
+        processor.setNewName(txt);
+        return null;
+    }
+
+    @Override
+    public void setVisible(boolean visible) {
+        if (visible) {
+            YangRenameProcessor<?> processor = (YangRenameProcessor<?>) ((RenameRefactoring) getRefactoring())
+                    .getProcessor();
+            if (processor != null) {
+                String newName = processor.getNewName();
+                if (newName != null && newName.length() > 0 && !newName.equals(initialValue)) {
+                    newNameTxt.setText(newName);
+                    newNameTxt.setSelection(0, newName.length());
+                }
+            }
+        }
+        super.setVisible(visible);
+    }
+
+    protected boolean getBooleanSetting(String key, boolean defaultValue) {
+        String update = getRefactoringSettings().get(key);
+        if (update != null) {
+            return Boolean.valueOf(update).booleanValue();
+        } else {
+            return defaultValue;
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/RenameLinkedMode.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/RenameLinkedMode.java
new file mode 100644 (file)
index 0000000..48ccd63
--- /dev/null
@@ -0,0 +1,495 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring.ui;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Arrays;
+import java.util.Comparator;
+
+import org.eclipse.core.commands.operations.IOperationHistory;
+import org.eclipse.core.commands.operations.IUndoContext;
+import org.eclipse.core.commands.operations.IUndoableOperation;
+import org.eclipse.core.commands.operations.OperationHistoryFactory;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.DocumentEvent;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IEditingSupport;
+import org.eclipse.jface.text.IEditingSupportRegistry;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextViewerExtension6;
+import org.eclipse.jface.text.IUndoManager;
+import org.eclipse.jface.text.IUndoManagerExtension;
+import org.eclipse.jface.text.link.ILinkedModeListener;
+import org.eclipse.jface.text.link.LinkedModeModel;
+import org.eclipse.jface.text.link.LinkedModeUI;
+import org.eclipse.jface.text.link.LinkedModeUI.ExitFlags;
+import org.eclipse.jface.text.link.LinkedModeUI.IExitPolicy;
+import org.eclipse.jface.text.link.LinkedPosition;
+import org.eclipse.jface.text.link.LinkedPositionGroup;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.SourceViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.VerifyEvent;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.texteditor.link.EditorLinkedModeUI;
+
+import com.cisco.yangide.core.YangModelException;
+import com.cisco.yangide.core.dom.ASTNamedNode;
+import com.cisco.yangide.editor.editors.YangEditor;
+import com.cisco.yangide.ext.refactoring.YangRefactoringPlugin;
+import com.cisco.yangide.ext.refactoring.actions.RenameSupport;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Aug 4, 2014
+ */
+public class RenameLinkedMode {
+
+    private class FocusEditingSupport implements IEditingSupport {
+        @Override
+        public boolean ownsFocusShell() {
+            if (fInfoPopup == null) {
+                return false;
+            }
+            if (fInfoPopup.ownsFocusShell()) {
+                return true;
+            }
+
+            Shell editorShell = editor.getSite().getShell();
+            Shell activeShell = editorShell.getDisplay().getActiveShell();
+            if (editorShell == activeShell) {
+                return true;
+            }
+            return false;
+        }
+
+        @Override
+        public boolean isOriginator(DocumentEvent event, IRegion subjectRegion) {
+            return false; // leave on external modification outside positions
+        }
+    }
+
+    private class EditorSynchronizer implements ILinkedModeListener {
+        @Override
+        public void left(LinkedModeModel model, int flags) {
+            linkedModeLeft();
+            if ((flags & ILinkedModeListener.UPDATE_CARET) != 0) {
+                doRename(fShowPreview);
+            }
+        }
+
+        @Override
+        public void resume(LinkedModeModel model, int flags) {
+        }
+
+        @Override
+        public void suspend(LinkedModeModel model) {
+        }
+    }
+
+    private class ExitPolicy implements IExitPolicy {
+        private IDocument document;
+
+        public ExitPolicy(IDocument document) {
+            this.document = document;
+        }
+
+        @Override
+        public ExitFlags doExit(LinkedModeModel model, VerifyEvent event, int offset, int length) {
+            fShowPreview = (event.stateMask & SWT.CTRL) != 0
+                    && (event.character == SWT.CR || event.character == SWT.LF);
+            if (length == 0 && (event.character == SWT.BS || event.character == SWT.DEL)) {
+                LinkedPosition position = model
+                        .findPosition(new LinkedPosition(document, offset, 0, LinkedPositionGroup.NO_STOP));
+                if (position != null) {
+                    if (event.character == SWT.BS) {
+                        if (offset - 1 < position.getOffset()) {
+                            // skip backspace at beginning of linked position
+                            event.doit = false;
+                        }
+                    } else /* event.character == SWT.DEL */ {
+                        if (offset + 1 > position.getOffset() + position.getLength()) {
+                            // skip delete at end of linked position
+                            event.doit = false;
+                        }
+                    }
+                }
+            }
+
+            return null; // don't change behavior
+        }
+    }
+
+    private static RenameLinkedMode fgActiveLinkedMode;
+
+    private final YangEditor editor;
+    /** Original definition node */
+    private final ASTNamedNode originalNode;
+
+    private RenameInformationPopup fInfoPopup;
+
+    private Point fOriginalSelection;
+    private String fOriginalName;
+    /** Selected in editor node. */
+    private ASTNamedNode selectedNode;
+
+    private LinkedPosition fNamePosition;
+    private LinkedModeModel fLinkedModeModel;
+    private LinkedPositionGroup fLinkedPositionGroup;
+    private final FocusEditingSupport fFocusEditingSupport;
+    private boolean fShowPreview;
+    private IUndoableOperation fStartingUndoOperation;
+
+    private IFile originalFile;
+
+    public RenameLinkedMode(ASTNamedNode originalNode, IFile originalFile, ASTNamedNode selectedNode,
+            YangEditor editor) {
+        this.editor = editor;
+        this.originalFile = originalFile;
+        this.originalNode = originalNode;
+        this.selectedNode = selectedNode;
+        fFocusEditingSupport = new FocusEditingSupport();
+    }
+
+    public static RenameLinkedMode getActiveLinkedMode() {
+        if (fgActiveLinkedMode != null) {
+            ISourceViewer viewer = fgActiveLinkedMode.editor.getViewer();
+            if (viewer != null) {
+                StyledText textWidget = viewer.getTextWidget();
+                if (textWidget != null && !textWidget.isDisposed()) {
+                    return fgActiveLinkedMode;
+                }
+            }
+            // make sure we don't hold onto the active linked mode if anything went wrong with
+            // canceling:
+            fgActiveLinkedMode = null;
+        }
+        return null;
+    }
+
+    public void start() {
+        if (getActiveLinkedMode() != null) {
+            // for safety; should already be handled in RenameJavaElementAction
+            fgActiveLinkedMode.startFullDialog();
+            return;
+        }
+
+        ISourceViewer viewer = editor.getViewer();
+        IDocument document = viewer.getDocument();
+        fOriginalSelection = viewer.getSelectedRange();
+        int offset = fOriginalSelection.x;
+
+        try {
+            if (viewer instanceof ITextViewerExtension6) {
+                IUndoManager undoManager = ((ITextViewerExtension6) viewer).getUndoManager();
+                if (undoManager instanceof IUndoManagerExtension) {
+                    IUndoManagerExtension undoManagerExtension = (IUndoManagerExtension) undoManager;
+                    IUndoContext undoContext = undoManagerExtension.getUndoContext();
+                    IOperationHistory operationHistory = OperationHistoryFactory.getOperationHistory();
+                    fStartingUndoOperation = operationHistory.getUndoOperation(undoContext);
+                }
+            }
+
+            fOriginalName = selectedNode.getName();
+            if (fOriginalName.indexOf(':') > 0) {
+                fOriginalName = fOriginalName.substring(fOriginalName.indexOf(':'), fOriginalName.length());
+            }
+            final int pos = selectedNode.getNameStartPosition();
+            fLinkedPositionGroup = new LinkedPositionGroup();
+
+            ASTNamedNode[] sameNodes = RenameSupport.findLocalReferences(editor.getModule(), originalNode);
+
+            Arrays.sort(sameNodes, new Comparator<ASTNamedNode>() {
+                @Override
+                public int compare(ASTNamedNode o1, ASTNamedNode o2) {
+                    return rank(o1) - rank(o2);
+                }
+
+                /**
+                 * Returns the absolute rank of an <code>ASTNode</code>. Nodes preceding
+                 * <code>pos</code> are ranked last.
+                 *
+                 * @param node the node to compute the rank for
+                 * @return the rank of the node with respect to the invocation offset
+                 */
+                private int rank(ASTNamedNode node) {
+                    int relativeRank = node.getNameStartPosition() + node.getNameLength() - pos;
+                    if (relativeRank < 0) {
+                        return Integer.MAX_VALUE + relativeRank;
+                    } else {
+                        return relativeRank;
+                    }
+                }
+            });
+            for (int i = 0; i < sameNodes.length; i++) {
+                ASTNamedNode elem = sameNodes[i];
+                String name = elem.getName();
+                int elPrefixOffset = name.indexOf(':');
+                int elPos = elem.getNameStartPosition();
+                int elLength = elem.getNameLength();
+
+                // normalize quote
+                if (name.length() + 2 == elLength) {
+                    elPos++;
+                    elLength -= 2;
+                }
+                // normalize prefixes
+                if (elPrefixOffset > 0) {
+                    elPos += elPrefixOffset + 1;
+                    elLength = elLength - elPrefixOffset - 1;
+                }
+                LinkedPosition linkedPosition = new LinkedPosition(document, elPos, elLength, i);
+                if (i == 0) {
+                    fNamePosition = linkedPosition;
+                }
+                fLinkedPositionGroup.addPosition(linkedPosition);
+            }
+
+            fLinkedModeModel = new LinkedModeModel();
+            fLinkedModeModel.addGroup(fLinkedPositionGroup);
+            fLinkedModeModel.forceInstall();
+            fLinkedModeModel.addLinkingListener(new EditorHighlightingSynchronizer(editor));
+            fLinkedModeModel.addLinkingListener(new EditorSynchronizer());
+
+            LinkedModeUI ui = new EditorLinkedModeUI(fLinkedModeModel, viewer);
+            ui.setExitPosition(viewer, offset, 0, Integer.MAX_VALUE);
+            ui.setExitPolicy(new ExitPolicy(document));
+            ui.enter();
+
+            // by default, full word is selected;
+            // restore original selection
+            viewer.setSelectedRange(fOriginalSelection.x, fOriginalSelection.y);
+
+            if (viewer instanceof IEditingSupportRegistry) {
+                IEditingSupportRegistry registry = (IEditingSupportRegistry) viewer;
+                registry.register(fFocusEditingSupport);
+            }
+
+            openSecondaryPopup();
+            // startAnimation();
+            fgActiveLinkedMode = this;
+
+        } catch (BadLocationException | YangModelException e) {
+            YangRefactoringPlugin.log(e);
+        }
+    }
+
+    void doRename(boolean showPreview) {
+        cancel();
+
+        Image image = null;
+        Label label = null;
+
+        fShowPreview |= showPreview;
+        try {
+            ISourceViewer viewer = editor.getViewer();
+            if (viewer instanceof SourceViewer) {
+                SourceViewer sourceViewer = (SourceViewer) viewer;
+                Control viewerControl = sourceViewer.getControl();
+                if (viewerControl instanceof Composite) {
+                    Composite composite = (Composite) viewerControl;
+                    Display display = composite.getDisplay();
+
+                    // Flush pending redraw requests:
+                    while (!display.isDisposed() && display.readAndDispatch()) {
+                    }
+
+                    // Copy editor area:
+                    GC gc = new GC(composite);
+                    Point size;
+                    try {
+                        size = composite.getSize();
+                        image = new Image(gc.getDevice(), size.x, size.y);
+                        gc.copyArea(image, 0, 0);
+                    } finally {
+                        gc.dispose();
+                        gc = null;
+                    }
+
+                    // Persist editor area while executing refactoring:
+                    label = new Label(composite, SWT.NONE);
+                    label.setImage(image);
+                    label.setBounds(0, 0, size.x, size.y);
+                    label.moveAbove(null);
+                }
+            }
+
+            String newName = fNamePosition.getContent();
+            if (fOriginalName.equals(newName)) {
+                return;
+            }
+            RenameSupport renameSupport = undoAndCreateRenameSupport(newName);
+            if (renameSupport == null) {
+                return;
+            }
+
+            Shell shell = editor.getSite().getShell();
+            boolean executed;
+            if (fShowPreview) {
+                executed = renameSupport.openDialog(shell, true);
+            } else {
+                renameSupport.perform(shell, editor.getSite().getWorkbenchWindow());
+                executed = true;
+            }
+            if (executed) {
+                restoreFullSelection();
+            }
+            editor.reconcileModel();
+        } catch (BadLocationException | CoreException e) {
+            YangRefactoringPlugin.log(e);
+        } finally {
+            if (label != null) {
+                label.dispose();
+            }
+            if (image != null) {
+                image.dispose();
+            }
+        }
+    }
+
+    public void cancel() {
+        if (fLinkedModeModel != null) {
+            fLinkedModeModel.exit(ILinkedModeListener.NONE);
+        }
+        linkedModeLeft();
+    }
+
+    private void restoreFullSelection() {
+        if (fOriginalSelection.y != 0) {
+            int originalOffset = fOriginalSelection.x;
+            LinkedPosition[] positions = fLinkedPositionGroup.getPositions();
+            for (int i = 0; i < positions.length; i++) {
+                LinkedPosition position = positions[i];
+                if (!position.isDeleted() && position.includes(originalOffset)) {
+                    editor.getViewer().setSelectedRange(position.offset, position.length);
+                    return;
+                }
+            }
+        }
+    }
+
+    private RenameSupport undoAndCreateRenameSupport(String newName) throws CoreException {
+        // Assumption: the linked mode model should be shut down by now.
+
+        final ISourceViewer viewer = editor.getViewer();
+
+        try {
+            if (!fOriginalName.equals(newName)) {
+                editor.getSite().getWorkbenchWindow().run(false, true, new IRunnableWithProgress() {
+                    @Override
+                    public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+                        if (viewer instanceof ITextViewerExtension6) {
+                            IUndoManager undoManager = ((ITextViewerExtension6) viewer).getUndoManager();
+                            if (undoManager instanceof IUndoManagerExtension) {
+                                IUndoManagerExtension undoManagerExtension = (IUndoManagerExtension) undoManager;
+                                IUndoContext undoContext = undoManagerExtension.getUndoContext();
+                                IOperationHistory operationHistory = OperationHistoryFactory.getOperationHistory();
+                                while (undoManager.undoable()) {
+                                    if (fStartingUndoOperation != null && fStartingUndoOperation
+                                            .equals(operationHistory.getUndoOperation(undoContext))) {
+                                        return;
+                                    }
+                                    undoManager.undo();
+                                }
+                            }
+                        }
+                    }
+                });
+            }
+        } catch (InvocationTargetException e) {
+            throw new CoreException(
+                    new Status(IStatus.ERROR, YangRefactoringPlugin.PLUGIN_ID, "Error saving editor", e));
+        } catch (InterruptedException e) {
+            // canceling is OK
+            return null;
+        } finally {
+            editor.reconcileModel();
+        }
+
+        viewer.setSelectedRange(fOriginalSelection.x, fOriginalSelection.y);
+
+        if (newName.length() == 0) {
+            return null;
+        }
+        return new RenameSupport(originalFile, originalNode, newName);
+    }
+
+    public void startFullDialog() {
+        cancel();
+
+        try {
+            String newName = fNamePosition.getContent();
+            RenameSupport renameSupport = undoAndCreateRenameSupport(newName);
+            if (renameSupport != null) {
+                renameSupport.openDialog(editor.getSite().getShell());
+            }
+        } catch (BadLocationException | CoreException e) {
+            YangRefactoringPlugin.log(e);
+        }
+    }
+
+    private void linkedModeLeft() {
+        fgActiveLinkedMode = null;
+        if (fInfoPopup != null) {
+            fInfoPopup.close();
+        }
+
+        ISourceViewer viewer = editor.getViewer();
+        if (viewer instanceof IEditingSupportRegistry) {
+            IEditingSupportRegistry registry = (IEditingSupportRegistry) viewer;
+            registry.unregister(fFocusEditingSupport);
+        }
+    }
+
+    private void openSecondaryPopup() {
+        fInfoPopup = new RenameInformationPopup(editor, this);
+        fInfoPopup.open();
+    }
+
+    public boolean isCaretInLinkedPosition() {
+        return getCurrentLinkedPosition() != null;
+    }
+
+    public LinkedPosition getCurrentLinkedPosition() {
+        Point selection = editor.getViewer().getSelectedRange();
+        int start = selection.x;
+        int end = start + selection.y;
+        LinkedPosition[] positions = fLinkedPositionGroup.getPositions();
+        for (int i = 0; i < positions.length; i++) {
+            LinkedPosition position = positions[i];
+            if (position.includes(start) && position.includes(end)) {
+                return position;
+            }
+        }
+        return null;
+    }
+
+    public boolean isOriginalName() {
+        try {
+            String newName = fNamePosition.getContent();
+            return fOriginalName.equals(newName);
+        } catch (BadLocationException e) {
+            return false;
+        }
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/RenameRefactoringWizard.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/RenameRefactoringWizard.java
new file mode 100644 (file)
index 0000000..caafc7a
--- /dev/null
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring.ui;
+
+import org.eclipse.ltk.core.refactoring.Refactoring;
+import org.eclipse.ltk.core.refactoring.participants.RenameRefactoring;
+import org.eclipse.ltk.ui.refactoring.RefactoringWizard;
+
+import com.cisco.yangide.ext.refactoring.rename.YangRenameProcessor;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 30, 2014
+ */
+public class RenameRefactoringWizard extends RefactoringWizard {
+
+    public RenameRefactoringWizard(Refactoring refactoring) {
+        super(refactoring, DIALOG_BASED_USER_INTERFACE);
+    }
+
+    @Override
+    protected void addUserInputPages() {
+        YangRenameProcessor<?> processor = (YangRenameProcessor<?>) ((RenameRefactoring) getRefactoring())
+                .getProcessor();
+        String initialSetting = processor.getNewName();
+        RenameInputWizardPage inputPage = new RenameInputWizardPage("Rename Element", initialSetting);
+        // inputPage.setImageDescriptor(fInputPageImageDescriptor);
+        addPage(inputPage);
+    }
+}
diff --git a/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/RevisionDialog.java b/plugins/com.cisco.yangide.ext.refactoring/src/com/cisco/yangide/ext/refactoring/ui/RevisionDialog.java
new file mode 100644 (file)
index 0000000..55ae5c0
--- /dev/null
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ext.refactoring.ui;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Locale;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.DateTime;
+import org.eclipse.swt.widgets.Shell;
+
+import com.cisco.yangide.ext.refactoring.nls.Messages;
+
+/**
+ * Displays calendar dialog to select revision.
+ *
+ * @author Konstantin Zaitsev
+ * date: Aug 18, 2014
+ */
+public class RevisionDialog extends Dialog {
+
+    /** Date format for revision. */
+    static SimpleDateFormat DF = new SimpleDateFormat("yyyy-MM-dd", Locale.US); //$NON-NLS-1$
+
+    /** Calendar widget. */
+    private DateTime dateTime;
+
+    /** Revision date. */
+    private Date revision;
+
+    /**
+     * @param parentShell
+     */
+    protected RevisionDialog(Shell parentShell) {
+        super(parentShell);
+    }
+
+    @Override
+    protected void configureShell(Shell newShell) {
+        super.configureShell(newShell);
+        newShell.setImage(RefactoringImages.getImage(RefactoringImages.IMG_CALENDAR));
+        newShell.setText(Messages.RevisionDialog_title);
+    }
+
+    @Override
+    protected Control createDialogArea(Composite parent) {
+        Composite content = (Composite) super.createDialogArea(parent);
+        dateTime = new DateTime(content, SWT.CALENDAR);
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(revision);
+        dateTime.setYear(cal.get(Calendar.YEAR));
+        dateTime.setMonth(cal.get(Calendar.MONTH));
+        dateTime.setDay(cal.get(Calendar.DATE));
+        dateTime.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                Calendar cal = Calendar.getInstance();
+                cal.set(dateTime.getYear(), dateTime.getMonth(), dateTime.getDay());
+                revision = cal.getTime();
+            }
+        });
+        return content;
+    }
+
+    /**
+     * @return the revision
+     */
+    public String getRevision() {
+        return DF.format(revision);
+    }
+
+    /**
+     * @param revision the revision to set
+     * @throws ParseException
+     */
+    public void setRevision(String revision) throws ParseException {
+        this.revision = DF.parse(revision);
+    }
+}
diff --git a/plugins/com.cisco.yangide.m2e.yang.tests/.gitignore b/plugins/com.cisco.yangide.m2e.yang.tests/.gitignore
new file mode 100644 (file)
index 0000000..b77461b
--- /dev/null
@@ -0,0 +1,3 @@
+/target/
+/.settings/
+.classpath
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.m2e.yang.tests/.project b/plugins/com.cisco.yangide.m2e.yang.tests/.project
new file mode 100644 (file)
index 0000000..f9b3310
--- /dev/null
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>com.cisco.yangide.m2e.yang.tests</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.m2e.core.maven2Builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.m2e.core.maven2Nature</nature>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/plugins/com.cisco.yangide.m2e.yang.tests/META-INF/MANIFEST.MF b/plugins/com.cisco.yangide.m2e.yang.tests/META-INF/MANIFEST.MF
new file mode 100644 (file)
index 0000000..d3e586c
--- /dev/null
@@ -0,0 +1,14 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Tests Plug-in
+Bundle-SymbolicName: com.cisco.yangide.m2e.yang.tests
+Bundle-Version: 1.1.1.qualifier
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Require-Bundle: org.eclipse.m2e.tests.common;bundle-version="1.4.0",
+ org.junit,
+ org.eclipse.m2e.core;bundle-version="1.4.0",
+ org.eclipse.core.resources,
+ org.eclipse.core.runtime,
+ org.eclipse.jdt.core,
+ com.cisco.yangide.m2e.yang;bundle-version="0.1.0"
+Bundle-Vendor: Cisco Systems, Inc.
diff --git a/plugins/com.cisco.yangide.m2e.yang.tests/build.properties b/plugins/com.cisco.yangide.m2e.yang.tests/build.properties
new file mode 100644 (file)
index 0000000..7d1074b
--- /dev/null
@@ -0,0 +1,12 @@
+###############################################################################
+# Copyright (c) 2014, 2015 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
+#  
+###############################################################################
+source.. = src/
+output.. = target/classes/
+bin.includes = META-INF/,\
+               .
diff --git a/plugins/com.cisco.yangide.m2e.yang.tests/plugin_customization.ini b/plugins/com.cisco.yangide.m2e.yang.tests/plugin_customization.ini
new file mode 100644 (file)
index 0000000..7f038f7
--- /dev/null
@@ -0,0 +1 @@
+org.eclipse.m2e.core/eclipse.m2.updateIndexes=false
diff --git a/plugins/com.cisco.yangide.m2e.yang.tests/pom.xml b/plugins/com.cisco.yangide.m2e.yang.tests/pom.xml
new file mode 100644 (file)
index 0000000..6a66feb
--- /dev/null
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2014, 2015 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
+     
+ -->
+<!--                                                                                -->
+<!-- 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">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>com.cisco.yangide</groupId>
+    <artifactId>com.cisco.yangide.parent</artifactId>
+    <version>1.1.1-SNAPSHOT</version>
+    <relativePath>../..</relativePath>
+  </parent>
+  
+  <artifactId>com.cisco.yangide.m2e.yang.tests</artifactId>
+  <packaging>eclipse-test-plugin</packaging>
+  <version>1.1.1-SNAPSHOT</version>
+  
+  <build>
+    <sourceDirectory>src</sourceDirectory>
+  </build>
+</project>
diff --git a/plugins/com.cisco.yangide.m2e.yang.tests/projects/yang/yang-p001/pom.xml b/plugins/com.cisco.yangide.m2e.yang.tests/projects/yang/yang-p001/pom.xml
new file mode 100644 (file)
index 0000000..8b51abe
--- /dev/null
@@ -0,0 +1,85 @@
+<!--
+    Copyright (c) 2014, 2015 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
+     
+ -->
+<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/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>com.cisco.yangide.m2e.yang.tests</groupId>
+  <artifactId>yang-p001</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+
+  <properties>
+      <maven.compiler.source>1.7</maven.compiler.source>
+      <maven.compiler.target>1.7</maven.compiler.target>
+  </properties>
+
+  <build>
+      <plugins>
+          <plugin>
+              <groupId>org.opendaylight.yangtools</groupId>
+              <artifactId>yang-maven-plugin</artifactId>
+              <version>0.6.2-Helium</version>
+              <executions>
+                  <execution>
+                    <id>generate-sources</id>
+                      <goals>
+                          <goal>generate-sources</goal>
+                      </goals>
+                      <configuration>
+                          <yangFilesRootDir>src/main/yang</yangFilesRootDir>
+                          <codeGenerators>
+                              <generator>
+                                  <codeGeneratorClass>
+                                      org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl
+                                  </codeGeneratorClass>
+                                  <outputBaseDir>
+                                      target/generated-sources/sal
+                                  </outputBaseDir>
+                              </generator>
+                          </codeGenerators>
+                          <inspectDependencies>false</inspectDependencies>
+                      </configuration>
+                  </execution>
+              </executions>
+
+              <dependencies>
+                  <dependency>
+                      <groupId>org.opendaylight.yangtools</groupId>
+                      <artifactId>maven-sal-api-gen-plugin</artifactId>
+                      <version>0.6.2-Helium</version>
+                      <type>jar</type>
+                  </dependency>
+              </dependencies>
+          </plugin>
+          <plugin>
+              <groupId>org.codehaus.mojo</groupId>
+              <artifactId>build-helper-maven-plugin</artifactId>
+              <executions>
+                  <execution>
+                      <phase>generate-sources</phase>
+                      <goals>
+                          <goal>add-source</goal>
+                      </goals>
+                      <configuration>
+                          <sources>
+                              <source>target/generated-sources/sal</source>
+                          </sources>
+                      </configuration>
+                  </execution>
+              </executions>
+          </plugin>
+      </plugins>
+  </build>
+  <dependencies>
+      <dependency>
+          <groupId>org.opendaylight.yangtools</groupId>
+          <artifactId>yang-binding</artifactId>
+          <version>0.6.2-Helium</version>
+      </dependency>
+  </dependencies>
+</project>
diff --git a/plugins/com.cisco.yangide.m2e.yang.tests/projects/yang/yang-p001/src/main/yang/simple-string-demo.yang b/plugins/com.cisco.yangide.m2e.yang.tests/projects/yang/yang-p001/src/main/yang/simple-string-demo.yang
new file mode 100644 (file)
index 0000000..99899ff
--- /dev/null
@@ -0,0 +1,22 @@
+       module simple-string-demo {
+
+    namespace "urn:simple:string:demo";
+    prefix "sbd";
+
+    organization "OPEN DAYLIGHT";
+    contact "http://www.opendaylight.org/";
+
+    revision 2013-06-18 {
+        
+    }
+       // This is also comment
+    typedef typedef-string {
+        type string {
+            length "50";
+            pattern "[0-9A-F]\.*";
+            pattern "[B-D]*";
+            pattern "[4-7]*";
+        }
+    }
+
+}
diff --git a/plugins/com.cisco.yangide.m2e.yang.tests/settings.xml b/plugins/com.cisco.yangide.m2e.yang.tests/settings.xml
new file mode 100644 (file)
index 0000000..98467e2
--- /dev/null
@@ -0,0 +1,45 @@
+<!--
+    Copyright (c) 2014, 2015 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
+     
+ -->
+<settings>
+
+  <profiles>
+    <profile>
+      <id>test</id>
+      <pluginRepositories>
+        <pluginRepository>
+          <id>opendaylight-release</id>
+          <name>opendaylight-release</name>
+          <url>http://nexus.opendaylight.org/content/repositories/opendaylight.release/</url>
+        </pluginRepository>
+        <pluginRepository>
+          <id>opendaylight-snapshot</id>
+          <name>opendaylight-snapshot</name>
+          <url>http://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/</url>
+        </pluginRepository>
+      </pluginRepositories>
+      <repositories>
+         <repository>
+             <id>opendaylight-release</id>
+             <name>opendaylight-release</name>
+             <url>http://nexus.opendaylight.org/content/repositories/opendaylight.release/</url>
+         </repository>
+         <repository>
+             <id>opendaylight-snapshot</id>
+             <name>opendaylight-snapshot</name>
+             <url>http://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/</url>
+         </repository>
+      </repositories>
+    </profile>
+  </profiles>
+
+  <activeProfiles>
+    <activeProfile>test</activeProfile>
+  </activeProfiles>
+
+</settings>
diff --git a/plugins/com.cisco.yangide.m2e.yang.tests/src/com/cisco/yangide/m2e/yang/tests/YangGenerationTest.java b/plugins/com.cisco.yangide.m2e.yang.tests/src/com/cisco/yangide/m2e/yang/tests/YangGenerationTest.java
new file mode 100644 (file)
index 0000000..545aecc
--- /dev/null
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.m2e.yang.tests;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.m2e.core.project.ResolverConfiguration;
+import org.eclipse.m2e.tests.common.AbstractMavenProjectTestCase;
+import org.eclipse.m2e.tests.common.ClasspathHelpers;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 14, 2014
+ */
+@SuppressWarnings("restriction")
+public class YangGenerationTest extends AbstractMavenProjectTestCase {
+    public void test_p001_simple() throws Exception {
+        ResolverConfiguration configuration = new ResolverConfiguration();
+        IProject project1 = importProject("projects/yang/yang-p001/pom.xml", configuration);
+        waitForJobsToComplete();
+
+        project1.build(IncrementalProjectBuilder.FULL_BUILD, monitor);
+        project1.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, monitor);
+        waitForJobsToComplete();
+
+        // assertNoErrors(project1);
+
+        IJavaProject javaProject1 = JavaCore.create(project1);
+        IClasspathEntry[] cp1 = javaProject1.getRawClasspath();
+
+        assertNotNull(ClasspathHelpers.getClasspathEntry(cp1, "/yang-p001/target/generated-sources/sal"));
+        assertNotNull(ClasspathHelpers.getClasspathEntry(cp1, "/yang-p001/src/main/yang"));
+
+        IFile file = project1
+                .getFile("target/generated-sources/sal/org/opendaylight/yang/gen/v1/urn/simple/string/demo/rev130618/TypedefString.java");
+        assertTrue(file.isSynchronized(IResource.DEPTH_ZERO));
+        assertTrue(file.isDerived(IResource.CHECK_ANCESTORS));
+    }
+}
diff --git a/plugins/com.cisco.yangide.m2e.yang/.gitignore b/plugins/com.cisco.yangide.m2e.yang/.gitignore
new file mode 100644 (file)
index 0000000..1a79925
--- /dev/null
@@ -0,0 +1,4 @@
+/bin/
+/target/
+/.settings/
+.classpath
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.m2e.yang/.project b/plugins/com.cisco.yangide.m2e.yang/.project
new file mode 100644 (file)
index 0000000..9b18cac
--- /dev/null
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>com.cisco.yangide.m2e.yang</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.m2e.core.maven2Builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.m2e.core.maven2Nature</nature>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/plugins/com.cisco.yangide.m2e.yang/META-INF/MANIFEST.MF b/plugins/com.cisco.yangide.m2e.yang/META-INF/MANIFEST.MF
new file mode 100644 (file)
index 0000000..453b275
--- /dev/null
@@ -0,0 +1,20 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: com.cisco.yangide.m2e.yang
+Bundle-SymbolicName: com.cisco.yangide.m2e.yang;singleton:=true
+Bundle-Version: 1.1.1.qualifier
+Bundle-Vendor: Cisco Systems, Inc.
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Require-Bundle: org.eclipse.core.resources,
+ org.eclipse.core.runtime,
+ org.eclipse.m2e.jdt;bundle-version="1.4.0",
+ org.eclipse.m2e.core;bundle-version="1.4.0",
+ org.eclipse.m2e.maven.runtime;bundle-version="1.4.0",
+ org.eclipse.jdt.core,
+ com.cisco.yangide.core;bundle-version="0.1.0",
+ com.cisco.yangide.ui;bundle-version="0.1.0",
+ org.eclipse.core.filesystem;bundle-version="1.3.100",
+ org.eclipse.ui;bundle-version="3.7.0"
+Bundle-ClassPath: .
+Bundle-Activator: com.cisco.yangide.m2e.yang.YangM2EPlugin
+Bundle-ActivationPolicy: lazy
diff --git a/plugins/com.cisco.yangide.m2e.yang/build.properties b/plugins/com.cisco.yangide.m2e.yang/build.properties
new file mode 100644 (file)
index 0000000..ea85411
--- /dev/null
@@ -0,0 +1,14 @@
+###############################################################################
+# Copyright (c) 2014, 2015 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
+#  
+###############################################################################
+source.. = src/
+output.. = target/classes
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml,\
+               lifecycle-mapping-metadata.xml
diff --git a/plugins/com.cisco.yangide.m2e.yang/lifecycle-mapping-metadata.xml b/plugins/com.cisco.yangide.m2e.yang/lifecycle-mapping-metadata.xml
new file mode 100644 (file)
index 0000000..475a91e
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2014, 2015 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
+     
+ -->
+<!--                                                                                -->
+<!-- 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                  -->
+<!-- ============================================================================== -->
+<lifecycleMappingMetadata>
+  <pluginExecutions>
+    <pluginExecution>
+      <pluginExecutionFilter>
+        <groupId>org.opendaylight.yangtools</groupId>
+        <artifactId>yang-maven-plugin</artifactId>
+        <versionRange>[0.5.0,)</versionRange>
+        <goals>
+          <goal>generate-sources</goal>
+        </goals>
+      </pluginExecutionFilter>
+      <action>
+        <configurator>
+          <id>com.cisco.yangide.m2e.yang.YangProjectConfigurator</id>
+        </configurator>
+      </action>
+    </pluginExecution>
+  </pluginExecutions>
+</lifecycleMappingMetadata>
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.m2e.yang/plugin.xml b/plugins/com.cisco.yangide.m2e.yang/plugin.xml
new file mode 100644 (file)
index 0000000..50a40c8
--- /dev/null
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<!--
+    Copyright (c) 2014, 2015 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
+     
+ -->
+<!--                                                                                -->
+<!-- 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                  -->
+<!-- ============================================================================== -->
+<plugin>
+   <extension point="org.eclipse.m2e.core.projectConfigurators">
+      <configurator
+            class="com.cisco.yangide.m2e.yang.YangProjectConfigurator"
+            id="com.cisco.yangide.m2e.yang.YangProjectConfigurator"
+            name="YANG Project Configurator"/>
+   </extension>
+
+   <extension point="org.eclipse.m2e.core.mavenProjectChangedListeners">
+      <listener class="com.cisco.yangide.m2e.yang.MavenProjectChangedListener"/>
+   </extension>
+
+   <extension
+         point="org.eclipse.m2e.core.lifecycleMappings">
+      <lifecycleMapping
+            name="YANG Lifecycle Mapping"
+            class="com.cisco.yangide.m2e.yang.LifecycleMapping"
+            id="org.eclipse.m2e.jdt.JarLifecycleMapping">
+      </lifecycleMapping>
+   </extension>
+
+   <extension
+         point="org.eclipse.m2e.core.lifecycleMappings">
+      <lifecycleMapping
+            name="YANG Lifecycle Mapping"
+            class="com.cisco.yangide.m2e.yang.LifecycleMapping"
+            id="DEFAULT">
+      </lifecycleMapping>
+   </extension>
+   <extension point="org.eclipse.m2e.core.lifecycleMappingMetadataSource"/>
+</plugin>
diff --git a/plugins/com.cisco.yangide.m2e.yang/pom.xml b/plugins/com.cisco.yangide.m2e.yang/pom.xml
new file mode 100644 (file)
index 0000000..a94b220
--- /dev/null
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2014, 2015 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
+     
+ -->
+<!--                                                                                -->
+<!-- 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">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>com.cisco.yangide</groupId>
+    <artifactId>com.cisco.yangide.parent</artifactId>
+    <version>1.1.1-SNAPSHOT</version>
+    <relativePath>../..</relativePath>
+  </parent>
+
+  <artifactId>com.cisco.yangide.m2e.yang</artifactId>
+  <packaging>eclipse-plugin</packaging>
+  <version>1.1.1-SNAPSHOT</version>
+  <build>
+    <sourceDirectory>src</sourceDirectory>
+  </build>
+</project>
diff --git a/plugins/com.cisco.yangide.m2e.yang/src/com/cisco/yangide/m2e/yang/LifecycleMapping.java b/plugins/com.cisco.yangide.m2e.yang/src/com/cisco/yangide/m2e/yang/LifecycleMapping.java
new file mode 100644 (file)
index 0000000..d6067a7
--- /dev/null
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.m2e.yang;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.maven.plugin.MojoExecution;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.m2e.core.internal.lifecyclemapping.LifecycleMappingFactory;
+import org.eclipse.m2e.core.internal.project.registry.MavenProjectFacade;
+import org.eclipse.m2e.core.internal.project.registry.ProjectRegistryManager;
+import org.eclipse.m2e.core.lifecyclemapping.model.IPluginExecutionMetadata;
+import org.eclipse.m2e.core.project.IMavenProjectFacade;
+import org.eclipse.m2e.core.project.configurator.AbstractBuildParticipant;
+import org.eclipse.m2e.core.project.configurator.AbstractCustomizableLifecycleMapping;
+import org.eclipse.m2e.core.project.configurator.AbstractProjectConfigurator;
+import org.eclipse.m2e.core.project.configurator.MojoExecutionKey;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 3, 2014
+ */
+@SuppressWarnings("restriction")
+public class LifecycleMapping extends AbstractCustomizableLifecycleMapping {
+
+    @Override
+    public List<AbstractProjectConfigurator> getProjectConfigurators(IMavenProjectFacade projectFacade,
+            IProgressMonitor monitor) {
+        Map<String, AbstractProjectConfigurator> configurators = LifecycleMappingFactory
+                .getProjectConfigurators(projectFacade);
+        if (!configurators.containsKey(YangProjectConfigurator.class.getName())) {
+            configurators.put(YangProjectConfigurator.class.getName(), new YangProjectConfigurator());
+        }
+        return new ArrayList<AbstractProjectConfigurator>(configurators.values());
+    }
+
+    @Override
+    public Map<MojoExecutionKey, List<AbstractBuildParticipant>> getBuildParticipants(
+            IMavenProjectFacade projectFacade, IProgressMonitor monitor) throws CoreException {
+        Map<MojoExecutionKey, List<AbstractBuildParticipant>> result = new LinkedHashMap<MojoExecutionKey, List<AbstractBuildParticipant>>();
+
+        Map<MojoExecutionKey, List<IPluginExecutionMetadata>> mapping = projectFacade.getMojoExecutionMapping();
+        Map<String, AbstractProjectConfigurator> configurators = LifecycleMappingFactory
+                .getProjectConfigurators(projectFacade);
+        if (!configurators.containsKey(YangProjectConfigurator.class.getName())) {
+            try {
+                configurators.put(YangProjectConfigurator.class.getName(), new YangProjectConfigurator());
+            } catch (UnsupportedOperationException e) {
+                // ignore error
+            }
+        }
+        List<MojoExecution> mojoExecutions = ((MavenProjectFacade) projectFacade).getExecutionPlan(
+                ProjectRegistryManager.LIFECYCLE_DEFAULT, monitor);
+
+        if (mojoExecutions != null && mapping != null) { // null if execution plan could not be
+                                                         // calculated
+            for (MojoExecution mojoExecution : mojoExecutions) {
+                MojoExecutionKey mojoExecutionKey = new MojoExecutionKey(mojoExecution);
+                List<IPluginExecutionMetadata> executionMetadatas = mapping.get(mojoExecutionKey);
+                List<AbstractBuildParticipant> executionMappings = new ArrayList<AbstractBuildParticipant>();
+                if (executionMetadatas != null) {
+                    for (IPluginExecutionMetadata executionMetadata : executionMetadatas) {
+                        if (mojoExecutionKey.getArtifactId().equals(YangM2EPlugin.YANG_MAVEN_PLUGIN)) {
+                            executionMappings.add(new YangBuildParticipant(projectFacade.getMojoExecution(
+                                    mojoExecutionKey, monitor), true));
+                        } else {
+                            switch (executionMetadata.getAction()) {
+                            case execute:
+                                executionMappings.add(LifecycleMappingFactory.createMojoExecutionBuildParicipant(
+                                        projectFacade, projectFacade.getMojoExecution(mojoExecutionKey, monitor),
+                                        executionMetadata));
+                                break;
+                            case configurator:
+                                String configuratorId = LifecycleMappingFactory
+                                        .getProjectConfiguratorId(executionMetadata);
+                                AbstractProjectConfigurator configurator = configurators.get(configuratorId);
+                                if (configurator == null) {
+                                    break;
+                                }
+                                AbstractBuildParticipant buildParticipant = configurator.getBuildParticipant(
+                                        projectFacade, projectFacade.getMojoExecution(mojoExecutionKey, monitor),
+                                        executionMetadata);
+                                if (buildParticipant != null) {
+                                    executionMappings.add(buildParticipant);
+                                }
+                                break;
+                            case ignore:
+                            case error:
+                                break;
+                            default:
+                                throw new IllegalArgumentException("Missing handling for action="
+                                        + executionMetadata.getAction());
+                            }
+                        }
+                    }
+                }
+
+                result.put(mojoExecutionKey, executionMappings);
+            }
+        }
+
+        return result;
+    }
+}
diff --git a/plugins/com.cisco.yangide.m2e.yang/src/com/cisco/yangide/m2e/yang/MavenProjectChangedListener.java b/plugins/com.cisco.yangide.m2e.yang/src/com/cisco/yangide/m2e/yang/MavenProjectChangedListener.java
new file mode 100644 (file)
index 0000000..91486f8
--- /dev/null
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.m2e.yang;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.m2e.core.internal.project.registry.MavenProjectFacade;
+import org.eclipse.m2e.core.project.IMavenProjectChangedListener;
+import org.eclipse.m2e.core.project.MavenProjectChangedEvent;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 2, 2014
+ */
+@SuppressWarnings("restriction")
+public class MavenProjectChangedListener implements IMavenProjectChangedListener {
+
+    @Override
+    public void mavenProjectChanged(MavenProjectChangedEvent[] events, IProgressMonitor monitor) {
+        for (MavenProjectChangedEvent event : events) {
+            if (event.getMavenProject() != null) {
+                event.getMavenProject().setSessionProperty(MavenProjectFacade.PROP_LIFECYCLE_MAPPING,
+                        new LifecycleMapping());
+            }
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.m2e.yang/src/com/cisco/yangide/m2e/yang/YangBuildParticipant.java b/plugins/com.cisco.yangide.m2e.yang/src/com/cisco/yangide/m2e/yang/YangBuildParticipant.java
new file mode 100644 (file)
index 0000000..0d15907
--- /dev/null
@@ -0,0 +1,154 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.m2e.yang;
+
+import java.io.File;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.maven.plugin.MojoExecution;
+import org.codehaus.plexus.util.Scanner;
+import org.eclipse.core.filesystem.URIUtil;
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.m2e.core.MavenPlugin;
+import org.eclipse.m2e.core.embedder.IMaven;
+import org.eclipse.m2e.core.project.configurator.MojoExecutionBuildParticipant;
+import org.sonatype.plexus.build.incremental.BuildContext;
+
+import com.cisco.yangide.core.YangCorePlugin;
+import com.cisco.yangide.core.YangModelException;
+import com.cisco.yangide.core.indexing.IJob;
+import com.cisco.yangide.core.indexing.JobAdapter;
+import com.cisco.yangide.core.model.YangModelManager;
+import com.cisco.yangide.core.parser.IYangValidationListener;
+import com.cisco.yangide.core.parser.YangParserUtil;
+import com.cisco.yangide.ui.YangUIPlugin;
+import com.cisco.yangide.ui.preferences.YangPreferenceConstants;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 2, 2014
+ */
+public class YangBuildParticipant extends MojoExecutionBuildParticipant {
+
+    public YangBuildParticipant(MojoExecution execution, boolean runOnIncremental) {
+        super(execution, runOnIncremental);
+    }
+
+    @Override
+    public Set<IProject> build(final int kind, IProgressMonitor monitor) throws Exception {
+        long dt = System.currentTimeMillis();
+
+        IMaven maven = MavenPlugin.getMaven();
+        BuildContext buildContext = getBuildContext();
+        String projectName = getMavenProjectFacade().getProject().getName();
+
+        File source = maven.getMojoParameterValue(getSession().getCurrentProject(), getMojoExecution(),
+                YangM2EPlugin.YANG_FILES_ROOT_DIR, File.class, monitor);
+        if (source == null) {
+            source = new File(getSession().getCurrentProject().getBasedir(), YangM2EPlugin.YANG_FILES_ROOT_DIR_DEFAULT);
+        }
+        Scanner ds = buildContext.newScanner(source);
+        ds.scan();
+        final String[] includedFiles = ds.getIncludedFiles();
+        if (includedFiles == null || includedFiles.length <= 0) {
+            return null;
+        }
+        // clear markers before build
+        getMavenProjectFacade().getProject().deleteMarkers(YangCorePlugin.YANGIDE_PROBLEM_MARKER, true,
+                IResource.DEPTH_INFINITE);
+
+        Set<File> outputDirs = new HashSet<>();
+        YangGeneratorConfiguration[] confs = maven.getMojoParameterValue(getSession().getCurrentProject(),
+                getMojoExecution(), YangM2EPlugin.YANG_CODE_GENERATORS, YangGeneratorConfiguration[].class, monitor);
+        if (confs != null) {
+            for (YangGeneratorConfiguration conf : confs) {
+                if (conf.getOutputBaseDir() != null) {
+                    outputDirs.add(conf.getOutputBaseDir());
+                }
+            }
+        }
+
+        boolean isCleanRequired = YangUIPlugin.getDefault().getPreferenceStore()
+                .getBoolean(YangPreferenceConstants.M2E_PLUGIN_CLEAN_TARGET);
+
+        if (isCleanRequired) {
+            long dt2 = System.currentTimeMillis();
+            for (File outputDir : outputDirs) {
+                IContainer[] containers = ResourcesPlugin.getWorkspace().getRoot()
+                        .findContainersForLocationURI(URIUtil.toURI(outputDir.getAbsolutePath()));
+                if (containers != null && containers.length > 0) {
+                    containers[0].delete(true, monitor);
+                }
+            }
+            YangM2EPlugin.traceTime(projectName, "clean classes", dt2, System.currentTimeMillis());
+        }
+
+        Set<IProject> result = super.build(kind, monitor);
+
+        for (Throwable ex : getSession().getResult().getExceptions()) {
+            YangCorePlugin.log(ex);
+        }
+
+        for (File outputDir : outputDirs) {
+            buildContext.refresh(outputDir);
+        }
+
+        final IProject curProject = getMavenProjectFacade().getProject();
+        curProject.touch(monitor);
+
+        final File basedir = ds.getBasedir();
+
+        // wait index job
+        long dt3 = System.currentTimeMillis();
+        if (kind == FULL_BUILD) {
+            YangModelManager.getIndexManager().indexAll(curProject);
+        }
+        YangModelManager.getIndexManager().performConcurrentJob(new JobAdapter() {
+            @Override
+            public boolean execute(IProgressMonitor progress) {
+                validate(basedir, includedFiles);
+                return false;
+            }
+        }, IJob.WaitUntilReady, monitor);
+        YangM2EPlugin.traceTime(projectName, "yang index", dt3, System.currentTimeMillis());
+
+        YangM2EPlugin.traceTime(projectName, "total", dt, System.currentTimeMillis());
+        return result;
+    }
+
+    private void validate(File basedir, String[] includedFiles) {
+        for (String path : includedFiles) {
+            final IFile ifile = YangCorePlugin.getIFileFromFile(new File(basedir, path));
+            if (ifile != null) {
+                try {
+                    YangParserUtil.validateYangFile(YangCorePlugin.createYangFile(ifile).getBuffer().getContents()
+                            .toCharArray(), ifile.getProject(), new IYangValidationListener() {
+
+                        @Override
+                        public void validationError(String msg, int lineNumber, int charStart, int charEnd) {
+                            YangCorePlugin.createProblemMarker(ifile, msg, lineNumber, charStart, charEnd);
+                        }
+
+                        @Override
+                        public void syntaxError(String msg, int lineNumber, int charStart, int charEnd) {
+                            YangCorePlugin.createProblemMarker(ifile, msg, lineNumber, charStart, charEnd);
+                        }
+                    });
+                } catch (YangModelException e) {
+                    YangCorePlugin.log(e);
+                }
+            }
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.m2e.yang/src/com/cisco/yangide/m2e/yang/YangGeneratorConfiguration.java b/plugins/com.cisco.yangide.m2e.yang/src/com/cisco/yangide/m2e/yang/YangGeneratorConfiguration.java
new file mode 100644 (file)
index 0000000..cb835db
--- /dev/null
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.m2e.yang;
+
+import java.io.File;
+import java.util.Map;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 2, 2014
+ */
+public class YangGeneratorConfiguration {
+    private String codeGeneratorClass;
+    private File outputBaseDir;
+    private File resourceBaseDir;
+    private Map<String, String> additionalConfiguration;
+
+    /**
+     * @return the codeGeneratorClass
+     */
+    public String getCodeGeneratorClass() {
+        return codeGeneratorClass;
+    }
+
+    /**
+     * @param codeGeneratorClass the codeGeneratorClass to set
+     */
+    public void setCodeGeneratorClass(String codeGeneratorClass) {
+        this.codeGeneratorClass = codeGeneratorClass;
+    }
+
+    /**
+     * @return the outputBaseDir
+     */
+    public File getOutputBaseDir() {
+        return outputBaseDir;
+    }
+
+    /**
+     * @param outputBaseDir the outputBaseDir to set
+     */
+    public void setOutputBaseDir(File outputBaseDir) {
+        this.outputBaseDir = outputBaseDir;
+    }
+
+    /**
+     * @return the resourceBaseDir
+     */
+    public File getResourceBaseDir() {
+        return resourceBaseDir;
+    }
+
+    /**
+     * @param resourceBaseDir the resourceBaseDir to set
+     */
+    public void setResourceBaseDir(File resourceBaseDir) {
+        this.resourceBaseDir = resourceBaseDir;
+    }
+
+    /**
+     * @return the additionalConfiguration
+     */
+    public Map<String, String> getAdditionalConfiguration() {
+        return additionalConfiguration;
+    }
+
+    /**
+     * @param additionalConfiguration the additionalConfiguration to set
+     */
+    public void setAdditionalConfiguration(Map<String, String> additionalConfiguration) {
+        this.additionalConfiguration = additionalConfiguration;
+    }
+}
diff --git a/plugins/com.cisco.yangide.m2e.yang/src/com/cisco/yangide/m2e/yang/YangM2EPlugin.java b/plugins/com.cisco.yangide.m2e.yang/src/com/cisco/yangide/m2e/yang/YangM2EPlugin.java
new file mode 100644 (file)
index 0000000..311f9dd
--- /dev/null
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.m2e.yang;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.core.runtime.Status;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+
+import com.cisco.yangide.core.YangCorePlugin;
+import com.cisco.yangide.ui.YangUIPlugin;
+import com.cisco.yangide.ui.preferences.YangPreferenceConstants;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 2, 2014
+ */
+public class YangM2EPlugin extends Plugin implements BundleActivator {
+    // The plug-in ID
+    public static final String PLUGIN_ID = "com.cisco.yangide.m2e.yang"; //$NON-NLS-1$
+
+    public static final String YANG_FILES_ROOT_DIR = "yangFilesRootDir";
+    public static final String YANG_FILES_ROOT_DIR_DEFAULT = "src/main/yang";
+    public static final String YANG_MAVEN_PLUGIN = "yang-maven-plugin";
+    public static final String YANG_CODE_GENERATORS = "codeGenerators";
+
+    // The shared instance
+    private static YangM2EPlugin plugin;
+
+    @Override
+    public void start(BundleContext context) throws Exception {
+        super.start(context);
+        plugin = this;
+        YangCorePlugin.getDefault();
+    }
+
+    @Override
+    public void stop(BundleContext context) throws Exception {
+        plugin = null;
+        super.stop(context);
+    }
+
+    /**
+     * Returns the shared instance
+     *
+     * @return the shared instance
+     */
+    public static YangM2EPlugin getDefault() {
+        return plugin;
+    }
+
+    public static void traceTime(String category, String message, long start, long end) {
+        if (YangUIPlugin.getDefault().getPreferenceStore().getBoolean(YangPreferenceConstants.ENABLE_TRACING)) {
+            Status status = new Status(IStatus.INFO, YangM2EPlugin.PLUGIN_ID, "[" + category + "] " + message + ": "
+                    + (end - start) + "ms");
+            YangM2EPlugin.getDefault().getLog().log(status);
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.m2e.yang/src/com/cisco/yangide/m2e/yang/YangProjectConfigurator.java b/plugins/com.cisco.yangide.m2e.yang/src/com/cisco/yangide/m2e/yang/YangProjectConfigurator.java
new file mode 100644 (file)
index 0000000..5b65c20
--- /dev/null
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.m2e.yang;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.maven.plugin.MojoExecution;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.m2e.core.internal.lifecyclemapping.LifecycleMappingFactory;
+import org.eclipse.m2e.core.lifecyclemapping.model.IPluginExecutionMetadata;
+import org.eclipse.m2e.core.lifecyclemapping.model.PluginExecutionAction;
+import org.eclipse.m2e.core.project.IMavenProjectFacade;
+import org.eclipse.m2e.core.project.configurator.AbstractBuildParticipant;
+import org.eclipse.m2e.core.project.configurator.MojoExecutionKey;
+import org.eclipse.m2e.core.project.configurator.ProjectConfigurationRequest;
+import org.eclipse.m2e.jdt.AbstractSourcesGenerationProjectConfigurator;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 2, 2014
+ */
+@SuppressWarnings("restriction")
+public class YangProjectConfigurator extends AbstractSourcesGenerationProjectConfigurator {
+
+    @Override
+    public AbstractBuildParticipant getBuildParticipant(IMavenProjectFacade projectFacade, MojoExecution execution,
+            IPluginExecutionMetadata executionMetadata) {
+        return new YangBuildParticipant(execution, true);
+    }
+
+    /**
+     * Returns list of MojoExecutions this configurator is enabled for.
+     */
+    @Override
+    protected List<MojoExecution> getMojoExecutions(ProjectConfigurationRequest request, IProgressMonitor monitor)
+            throws CoreException {
+        IMavenProjectFacade projectFacade = request.getMavenProjectFacade();
+
+        Map<String, Set<MojoExecutionKey>> configuratorExecutions = getPatchedConfiguratorExecutions(projectFacade);
+
+        ArrayList<MojoExecution> executions = new ArrayList<MojoExecution>();
+
+        Set<MojoExecutionKey> executionKeys = configuratorExecutions.get(getId());
+        if (executionKeys != null) {
+            for (MojoExecutionKey key : executionKeys) {
+                executions.add(projectFacade.getMojoExecution(key, monitor));
+            }
+        }
+
+        return executions;
+    }
+
+    @Override
+    protected File[] getSourceFolders(ProjectConfigurationRequest request, MojoExecution mojoExecution,
+            IProgressMonitor monitor) throws CoreException {
+        YangGeneratorConfiguration[] confs = getParameterValue(request.getMavenProject(),
+                YangM2EPlugin.YANG_CODE_GENERATORS, YangGeneratorConfiguration[].class, mojoExecution, monitor);
+        if (confs == null) {
+            return new File[0];
+        }
+        File[] sources = new File[confs.length + 1];
+        sources[0] = getParameterValue(request.getMavenProject(), YangM2EPlugin.YANG_FILES_ROOT_DIR, File.class,
+                mojoExecution, monitor);
+        // set default value
+        if (sources[0] == null) {
+            sources[0] = new File(request.getMavenProject().getBasedir(), YangM2EPlugin.YANG_FILES_ROOT_DIR_DEFAULT);
+        }
+        for (int i = 0; i < confs.length; i++) {
+            sources[i + 1] = confs[i].getOutputBaseDir();
+        }
+        return sources;
+    }
+
+    private Map<String, Set<MojoExecutionKey>> getPatchedConfiguratorExecutions(IMavenProjectFacade projectFacade) {
+        Map<String, Set<MojoExecutionKey>> configuratorExecutions = new HashMap<String, Set<MojoExecutionKey>>();
+        Map<MojoExecutionKey, List<IPluginExecutionMetadata>> executionMapping = projectFacade
+                .getMojoExecutionMapping();
+        for (Map.Entry<MojoExecutionKey, List<IPluginExecutionMetadata>> entry : executionMapping.entrySet()) {
+            List<IPluginExecutionMetadata> metadatas = entry.getValue();
+            if (metadatas != null) {
+                if (entry.getKey().getArtifactId().equals(YangM2EPlugin.YANG_MAVEN_PLUGIN)) {
+                    String configuratorId = this.getClass().getName();
+                    Set<MojoExecutionKey> executions = configuratorExecutions.get(configuratorId);
+                    if (executions == null) {
+                        executions = new LinkedHashSet<MojoExecutionKey>();
+                        configuratorExecutions.put(configuratorId, executions);
+                    }
+                    executions.add(entry.getKey());
+                } else {
+                    for (IPluginExecutionMetadata metadata : metadatas) {
+                        if (metadata.getAction() == PluginExecutionAction.configurator) {
+                            String configuratorId = LifecycleMappingFactory.getProjectConfiguratorId(metadata);
+                            if (configuratorId != null) {
+                                Set<MojoExecutionKey> executions = configuratorExecutions.get(configuratorId);
+                                if (executions == null) {
+                                    executions = new LinkedHashSet<MojoExecutionKey>();
+                                    configuratorExecutions.put(configuratorId, executions);
+                                }
+                                executions.add(entry.getKey());
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return configuratorExecutions;
+    }
+}
diff --git a/plugins/com.cisco.yangide.ui/.gitignore b/plugins/com.cisco.yangide.ui/.gitignore
new file mode 100644 (file)
index 0000000..1a79925
--- /dev/null
@@ -0,0 +1,4 @@
+/bin/
+/target/
+/.settings/
+.classpath
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.ui/.project b/plugins/com.cisco.yangide.ui/.project
new file mode 100644 (file)
index 0000000..a9f3136
--- /dev/null
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>com.cisco.yangide.ui</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.m2e.core.maven2Builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.m2e.core.maven2Nature</nature>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/plugins/com.cisco.yangide.ui/META-INF/MANIFEST.MF b/plugins/com.cisco.yangide.ui/META-INF/MANIFEST.MF
new file mode 100644 (file)
index 0000000..d93ff30
--- /dev/null
@@ -0,0 +1,25 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: com.cisco.yangide.ui
+Bundle-SymbolicName: com.cisco.yangide.ui;singleton:=true
+Bundle-Version: 1.1.1.qualifier
+Bundle-Activator: com.cisco.yangide.ui.YangUIPlugin
+Bundle-Vendor: Cisco Systems, Inc.
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.text,
+ org.eclipse.core.resources,
+ org.eclipse.ui.workbench,
+ org.eclipse.m2e.core.ui;bundle-version="1.4.0",
+ org.eclipse.m2e.maven.runtime,
+ org.eclipse.m2e.core,
+ org.eclipse.jdt.core,
+ org.eclipse.ui.ide
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-ActivationPolicy: lazy
+Bundle-ClassPath: .
+Export-Package: com.cisco.yangide.ui,
+ com.cisco.yangide.ui.internal,
+ com.cisco.yangide.ui.nls,
+ com.cisco.yangide.ui.preferences
diff --git a/plugins/com.cisco.yangide.ui/build.properties b/plugins/com.cisco.yangide.ui/build.properties
new file mode 100644 (file)
index 0000000..1d910b5
--- /dev/null
@@ -0,0 +1,16 @@
+###############################################################################
+# Copyright (c) 2014, 2015 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
+#  
+###############################################################################
+source.. = src/
+output.. = target/classes
+bin.includes = META-INF/,\
+               .,\
+               plugin.properties,\
+               plugin.xml,\
+               resources/,\
+               icons/
diff --git a/plugins/com.cisco.yangide.ui/icons/full/elcl16/view_menu.gif b/plugins/com.cisco.yangide.ui/icons/full/elcl16/view_menu.gif
new file mode 100644 (file)
index 0000000..a7c4918
Binary files /dev/null and b/plugins/com.cisco.yangide.ui/icons/full/elcl16/view_menu.gif differ
diff --git a/plugins/com.cisco.yangide.ui/icons/full/etool16/newfile_wiz.png b/plugins/com.cisco.yangide.ui/icons/full/etool16/newfile_wiz.png
new file mode 100644 (file)
index 0000000..d1bac8b
Binary files /dev/null and b/plugins/com.cisco.yangide.ui/icons/full/etool16/newfile_wiz.png differ
diff --git a/plugins/com.cisco.yangide.ui/icons/full/etool16/newprj_wiz.png b/plugins/com.cisco.yangide.ui/icons/full/etool16/newprj_wiz.png
new file mode 100644 (file)
index 0000000..48c0b9e
Binary files /dev/null and b/plugins/com.cisco.yangide.ui/icons/full/etool16/newprj_wiz.png differ
diff --git a/plugins/com.cisco.yangide.ui/icons/full/obj16/augment_obj.gif b/plugins/com.cisco.yangide.ui/icons/full/obj16/augment_obj.gif
new file mode 100644 (file)
index 0000000..a751669
Binary files /dev/null and b/plugins/com.cisco.yangide.ui/icons/full/obj16/augment_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ui/icons/full/obj16/container_obj.gif b/plugins/com.cisco.yangide.ui/icons/full/obj16/container_obj.gif
new file mode 100644 (file)
index 0000000..2556b45
Binary files /dev/null and b/plugins/com.cisco.yangide.ui/icons/full/obj16/container_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ui/icons/full/obj16/custom_type_obj.gif b/plugins/com.cisco.yangide.ui/icons/full/obj16/custom_type_obj.gif
new file mode 100644 (file)
index 0000000..5ba5b91
Binary files /dev/null and b/plugins/com.cisco.yangide.ui/icons/full/obj16/custom_type_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ui/icons/full/obj16/deviation_obj.gif b/plugins/com.cisco.yangide.ui/icons/full/obj16/deviation_obj.gif
new file mode 100644 (file)
index 0000000..8535665
Binary files /dev/null and b/plugins/com.cisco.yangide.ui/icons/full/obj16/deviation_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ui/icons/full/obj16/error_alt_obj.gif b/plugins/com.cisco.yangide.ui/icons/full/obj16/error_alt_obj.gif
new file mode 100644 (file)
index 0000000..eb6b8da
Binary files /dev/null and b/plugins/com.cisco.yangide.ui/icons/full/obj16/error_alt_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ui/icons/full/obj16/error_obj.gif b/plugins/com.cisco.yangide.ui/icons/full/obj16/error_obj.gif
new file mode 100644 (file)
index 0000000..0bc6068
Binary files /dev/null and b/plugins/com.cisco.yangide.ui/icons/full/obj16/error_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ui/icons/full/obj16/extension_obj.gif b/plugins/com.cisco.yangide.ui/icons/full/obj16/extension_obj.gif
new file mode 100644 (file)
index 0000000..27d5648
Binary files /dev/null and b/plugins/com.cisco.yangide.ui/icons/full/obj16/extension_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ui/icons/full/obj16/grouping_obj.gif b/plugins/com.cisco.yangide.ui/icons/full/obj16/grouping_obj.gif
new file mode 100644 (file)
index 0000000..27bf10e
Binary files /dev/null and b/plugins/com.cisco.yangide.ui/icons/full/obj16/grouping_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ui/icons/full/obj16/identity_obj.gif b/plugins/com.cisco.yangide.ui/icons/full/obj16/identity_obj.gif
new file mode 100644 (file)
index 0000000..fdde5fb
Binary files /dev/null and b/plugins/com.cisco.yangide.ui/icons/full/obj16/identity_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ui/icons/full/obj16/import_obj.gif b/plugins/com.cisco.yangide.ui/icons/full/obj16/import_obj.gif
new file mode 100644 (file)
index 0000000..b0e9130
Binary files /dev/null and b/plugins/com.cisco.yangide.ui/icons/full/obj16/import_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ui/icons/full/obj16/include_obj.gif b/plugins/com.cisco.yangide.ui/icons/full/obj16/include_obj.gif
new file mode 100644 (file)
index 0000000..de0e6f9
Binary files /dev/null and b/plugins/com.cisco.yangide.ui/icons/full/obj16/include_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ui/icons/full/obj16/keyword_obj.gif b/plugins/com.cisco.yangide.ui/icons/full/obj16/keyword_obj.gif
new file mode 100644 (file)
index 0000000..bb84c7b
Binary files /dev/null and b/plugins/com.cisco.yangide.ui/icons/full/obj16/keyword_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ui/icons/full/obj16/leaf_obj.gif b/plugins/com.cisco.yangide.ui/icons/full/obj16/leaf_obj.gif
new file mode 100644 (file)
index 0000000..c88284a
Binary files /dev/null and b/plugins/com.cisco.yangide.ui/icons/full/obj16/leaf_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ui/icons/full/obj16/module_obj.gif b/plugins/com.cisco.yangide.ui/icons/full/obj16/module_obj.gif
new file mode 100644 (file)
index 0000000..bf043f9
Binary files /dev/null and b/plugins/com.cisco.yangide.ui/icons/full/obj16/module_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ui/icons/full/obj16/notification_obj.gif b/plugins/com.cisco.yangide.ui/icons/full/obj16/notification_obj.gif
new file mode 100644 (file)
index 0000000..d11c996
Binary files /dev/null and b/plugins/com.cisco.yangide.ui/icons/full/obj16/notification_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ui/icons/full/obj16/rpc_input_obj.gif b/plugins/com.cisco.yangide.ui/icons/full/obj16/rpc_input_obj.gif
new file mode 100644 (file)
index 0000000..d38085a
Binary files /dev/null and b/plugins/com.cisco.yangide.ui/icons/full/obj16/rpc_input_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ui/icons/full/obj16/rpc_obj.gif b/plugins/com.cisco.yangide.ui/icons/full/obj16/rpc_obj.gif
new file mode 100644 (file)
index 0000000..30c5c10
Binary files /dev/null and b/plugins/com.cisco.yangide.ui/icons/full/obj16/rpc_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ui/icons/full/obj16/rpc_output_obj.gif b/plugins/com.cisco.yangide.ui/icons/full/obj16/rpc_output_obj.gif
new file mode 100644 (file)
index 0000000..5a0837d
Binary files /dev/null and b/plugins/com.cisco.yangide.ui/icons/full/obj16/rpc_output_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ui/icons/full/obj16/submodule_obj.gif b/plugins/com.cisco.yangide.ui/icons/full/obj16/submodule_obj.gif
new file mode 100644 (file)
index 0000000..f4a1ea1
Binary files /dev/null and b/plugins/com.cisco.yangide.ui/icons/full/obj16/submodule_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ui/icons/full/obj16/template_obj.gif b/plugins/com.cisco.yangide.ui/icons/full/obj16/template_obj.gif
new file mode 100644 (file)
index 0000000..fdde5fb
Binary files /dev/null and b/plugins/com.cisco.yangide.ui/icons/full/obj16/template_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ui/icons/full/obj16/type_obj.gif b/plugins/com.cisco.yangide.ui/icons/full/obj16/type_obj.gif
new file mode 100644 (file)
index 0000000..d4848c0
Binary files /dev/null and b/plugins/com.cisco.yangide.ui/icons/full/obj16/type_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ui/icons/full/obj16/uses_obj.gif b/plugins/com.cisco.yangide.ui/icons/full/obj16/uses_obj.gif
new file mode 100644 (file)
index 0000000..695e5a5
Binary files /dev/null and b/plugins/com.cisco.yangide.ui/icons/full/obj16/uses_obj.gif differ
diff --git a/plugins/com.cisco.yangide.ui/icons/full/obj16/yang_file.png b/plugins/com.cisco.yangide.ui/icons/full/obj16/yang_file.png
new file mode 100644 (file)
index 0000000..9a69984
Binary files /dev/null and b/plugins/com.cisco.yangide.ui/icons/full/obj16/yang_file.png differ
diff --git a/plugins/com.cisco.yangide.ui/icons/full/wizban/newfile_wiz.png b/plugins/com.cisco.yangide.ui/icons/full/wizban/newfile_wiz.png
new file mode 100644 (file)
index 0000000..051cd6c
Binary files /dev/null and b/plugins/com.cisco.yangide.ui/icons/full/wizban/newfile_wiz.png differ
diff --git a/plugins/com.cisco.yangide.ui/icons/full/wizban/newprj_wiz.png b/plugins/com.cisco.yangide.ui/icons/full/wizban/newprj_wiz.png
new file mode 100644 (file)
index 0000000..f6cbb4a
Binary files /dev/null and b/plugins/com.cisco.yangide.ui/icons/full/wizban/newprj_wiz.png differ
diff --git a/plugins/com.cisco.yangide.ui/plugin.properties b/plugins/com.cisco.yangide.ui/plugin.properties
new file mode 100644 (file)
index 0000000..6eb63e3
--- /dev/null
@@ -0,0 +1,15 @@
+###############################################################################
+# Copyright (c) 2014, 2015 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
+#  
+###############################################################################
+
+yang.wizard.category.name=YANG
+yang.wizard.project.name=YANG Project
+yang.wizard.project.description=Create a YANG Project
+
+yang.wizard.file.name=YANG File
+yang.wizard.file.description=Create a YANG File
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.ui/plugin.xml b/plugins/com.cisco.yangide.ui/plugin.xml
new file mode 100644 (file)
index 0000000..6c8cb8d
--- /dev/null
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<!--
+    Copyright (c) 2014, 2015 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
+     
+ -->
+<!--                                                                                -->
+<!-- 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                  -->
+<!-- ============================================================================== -->
+<plugin>
+    <extension point="org.eclipse.ui.contexts">
+       <context
+             id="com.cisco.yangide.ui.Context"
+             name="YANG Editor"
+             parentId="org.eclipse.ui.textEditorScope"/>
+    </extension>
+    
+    <extension point="org.eclipse.ui.commands">
+      <category
+           name="Source"
+           description="YANG Source Actions"
+           id="com.cisco.yangide.category.source">
+      </category>
+      <category
+           name="Navigate"
+           description="YANG Navigate Actions"
+           id="com.cisco.yangide.category.navigate">
+      </category>
+      <category
+           name="Search"
+           description="YANG Search Actions"
+           id="com.cisco.yangide.category.search">
+      </category>
+    </extension>
+    
+    <extension point="org.eclipse.ui.newWizards">
+      <category id="com.cisco.yangide.yang" name="%yang.wizard.category.name"/>
+
+      <wizard id="com.cisco.yangide.ui.wizards.YangProjectWizard"
+            category="com.cisco.yangide.yang"
+            class="com.cisco.yangide.ui.wizards.YangProjectWizard"
+            icon="icons/full/etool16/newprj_wiz.png"
+            name="%yang.wizard.project.name"
+            project="true">
+         <description>%yang.wizard.project.description</description>
+      </wizard>
+
+      <wizard id="com.cisco.yangide.ui.wizards.YangFileWizard"
+            category="com.cisco.yangide.yang"
+            class="com.cisco.yangide.ui.wizards.YangFileWizard"
+            icon="icons/full/etool16/newfile_wiz.png"
+            name="%yang.wizard.file.name"
+            project="false">
+         <description>%yang.wizard.file.description</description>
+         <selection class="org.eclipse.core.resources.IResource"/>
+      </wizard>
+    </extension>
+   
+    <extension point="org.eclipse.core.runtime.preferences">
+      <initializer
+            class="com.cisco.yangide.ui.internal.preferences.YangUIPreferenceInitializer">
+      </initializer>
+    </extension>
+    
+    <extension point="org.eclipse.ui.preferencePages">
+      <page
+            class="com.cisco.yangide.ui.internal.preferences.YangBasePreferencePage"
+            id="com.cisco.yangide.ui.preferences.YANGBasePreferencePage"
+            name="YANG">
+      </page>
+    </extension>
+</plugin>
diff --git a/plugins/com.cisco.yangide.ui/pom.xml b/plugins/com.cisco.yangide.ui/pom.xml
new file mode 100644 (file)
index 0000000..85e1e9a
--- /dev/null
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    Copyright (c) 2014, 2015 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
+     
+ -->
+<!--                                                                                -->
+<!-- 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">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>com.cisco.yangide</groupId>
+    <artifactId>com.cisco.yangide.parent</artifactId>
+    <version>1.1.1-SNAPSHOT</version>
+    <relativePath>../..</relativePath>
+  </parent>
+
+  <artifactId>com.cisco.yangide.ui</artifactId>
+  <packaging>eclipse-plugin</packaging>
+  <version>1.1.1-SNAPSHOT</version>
+  <build>
+    <sourceDirectory>src</sourceDirectory>
+  </build>
+</project>
diff --git a/plugins/com.cisco.yangide.ui/resources/yang/acme-system.yang b/plugins/com.cisco.yangide.ui/resources/yang/acme-system.yang
new file mode 100644 (file)
index 0000000..fde8f8f
--- /dev/null
@@ -0,0 +1,50 @@
+// Contents of "acme-system.yang"
+module acme-system {
+    namespace "http://acme.example.com/system";
+    prefix "acme";
+    
+    organization "ACME Inc.";
+    contact "joe@acme.example.com";
+    
+    description
+        "The module for entities implementing the ACME system.";
+    
+    revision 2007-06-09 {
+        description "Initial revision.";
+    }
+    
+    container system {
+        leaf host-name {
+            type string;
+            description "Hostname for this system";
+        }
+    
+        leaf-list domain-search {
+            type string;
+            description "List of domain names to search";
+        }
+    
+        container login {
+            leaf message {
+                type string;
+                description
+                    "Message given at start of login session";
+            }
+    
+            list user {
+                key "name";
+                leaf name {
+                    type string;
+                }
+    
+                leaf full-name {
+                    type string;
+                }
+                
+                leaf class {
+                    type string;
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.ui/resources/yang/new_yang_file.yang b/plugins/com.cisco.yangide.ui/resources/yang/new_yang_file.yang
new file mode 100644 (file)
index 0000000..5980b35
--- /dev/null
@@ -0,0 +1,10 @@
+// Contents of "%MODULE%"
+module %MODULE% {
+    namespace "%NAMESPACE%";
+    prefix "%PREFIX%";
+
+    revision %REVISION% {
+        description "%REVISION_DESC%";
+    }
+
+}
\ No newline at end of file
diff --git a/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/YangUIPlugin.java b/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/YangUIPlugin.java
new file mode 100644 (file)
index 0000000..fdee307
--- /dev/null
@@ -0,0 +1,128 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ui;
+
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class YangUIPlugin extends AbstractUIPlugin {
+
+    // The plug-in ID
+    public static final String PLUGIN_ID = "com.cisco.yangide.ui"; //$NON-NLS-1$
+
+    // The shared instance
+    private static YangUIPlugin plugin;
+
+    /**
+     * The constructor
+     */
+    public YangUIPlugin() {
+    }
+
+    @Override
+    public void start(BundleContext context) throws Exception {
+        super.start(context);
+        plugin = this;
+    }
+
+    @Override
+    public void stop(BundleContext context) throws Exception {
+        plugin = null;
+        super.stop(context);
+    }
+
+    /**
+     * Returns the shared instance
+     *
+     * @return the shared instance
+     */
+    public static YangUIPlugin getDefault() {
+        return plugin;
+    }
+
+    public static IWorkspace getWorkspace() {
+        return ResourcesPlugin.getWorkspace();
+    }
+
+    public static IWorkbenchPage getActivePage() {
+        IWorkbenchWindow window = getDefault().getWorkbench().getActiveWorkbenchWindow();
+        if (window == null) {
+            return null;
+        }
+        return window.getActivePage();
+    }
+
+    public static IWorkbenchWindow getActiveWorkbenchWindow() {
+        return getDefault().getWorkbench().getActiveWorkbenchWindow();
+    }
+
+    public static Shell getActiveWorkbenchShell() {
+        IWorkbenchWindow window = getActiveWorkbenchWindow();
+        if (window != null) {
+            return window.getShell();
+        }
+        return null;
+    }
+
+    public static void log(String message, Throwable e) {
+        log(new Status(IStatus.ERROR, PLUGIN_ID, IStatus.ERROR, message, e));
+    }
+
+    public static void log(int statusErrorID, String message) {
+        log(new Status(statusErrorID, PLUGIN_ID, message));
+    }
+
+    /*
+     * Add a log entry
+     */
+    public static void log(IStatus status) {
+        getDefault().getLog().log(status);
+    }
+
+    public static void log(Throwable e) {
+        log(new Status(IStatus.ERROR, PLUGIN_ID, e.getMessage(), e));
+    }
+
+    /**
+     * Returns the standard display to be used. The method first checks, if the thread calling this
+     * method has an associated display. If so, this display is returned. Otherwise the method
+     * returns the default display.
+     */
+    public static Display getStandardDisplay() {
+        Display display = Display.getCurrent();
+        if (display == null) {
+            display = Display.getDefault();
+        }
+        return display;
+    }
+
+    /**
+     * Configurable option value: {@value} .
+     *
+     * @category OptionValue
+     */
+    public static final String TAB = "tab"; //$NON-NLS-1$
+    /**
+     * Configurable option value: {@value} .
+     *
+     * @category OptionValue
+     */
+    public static final String SPACE = "space"; //$NON-NLS-1$
+
+}
diff --git a/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/internal/IYangUIConstants.java b/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/internal/IYangUIConstants.java
new file mode 100644 (file)
index 0000000..8c4973a
--- /dev/null
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ui.internal;
+
+/**
+ * @author Alexey Kholupko
+ * date: Jul 14, 2014
+ */
+public interface IYangUIConstants {
+    public static final String PLUGIN_ID = "com.cisco.yangide.ui"; //$NON-NLS-1$;
+
+    public static final String IMG_TEMPLATE_PROPOSAL = PLUGIN_ID + ".template_obj"; //$NON-NLS-1$
+    public static final String IMG_IMPORT_PROPOSAL = PLUGIN_ID + ".import_obj";
+    public static final String IMG_KEYWORD_PROPOSAL = PLUGIN_ID + ".keyword_obj";
+    public static final String IMG_TYPE_PROPOSAL = PLUGIN_ID + ".type_obj";
+    public static final String IMG_CUSTOM_TYPE_PROPOSAL = PLUGIN_ID + ".custom_type_obj";
+    public static final String IMG_GROUPING_PROPOSAL = PLUGIN_ID + ".grouping_obj";
+    public static final String IMG_CONTAINER_PROPOSAL = PLUGIN_ID + ".container_obj";
+    public static final String IMG_LEAF_PROPOSAL = PLUGIN_ID + ".leaf_obj";
+    public static final String IMG_MODULE_PROPOSAL = PLUGIN_ID + ".module_obj";
+    public static final String IMG_SUBMODULE_PROPOSAL = PLUGIN_ID + ".submodule_obj";
+    public static final String IMG_USES_PROPOSAL = PLUGIN_ID + ".uses_obj";
+    public static final String IMG_INCLUDE_PROPOSAL = PLUGIN_ID + ".include_obj";
+    public static final String IMG_AUGMENT_PROPOSAL = PLUGIN_ID + ".augment_obj";
+    public static final String IMG_DEVIATION_PROPOSAL = PLUGIN_ID + ".deviation_obj";
+    public static final String IMG_EXTENSION_PROPOSAL = PLUGIN_ID + ".extension_obj";
+    public static final String IMG_IDENTITY_PROPOSAL = PLUGIN_ID + ".identity_obj";
+    public static final String IMG_NOTIFICATION_PROPOSAL = PLUGIN_ID + ".notification_obj";
+    public static final String IMG_RPC_INPUT_PROPOSAL = PLUGIN_ID + ".rpc_input_obj";
+    public static final String IMG_RPC_OUTPUT_PROPOSAL = PLUGIN_ID + ".rpc_output_obj";
+    public static final String IMG_RPC_PROPOSAL = PLUGIN_ID + ".rpc_obj";
+
+    public static final String IMG_NEW_PROJECT_WIZ = PLUGIN_ID + ".new_project_wiz";
+    public static final String IMG_NEW_FILE_WIZ = PLUGIN_ID + ".new_file_wiz";
+
+    public static final String IMG_ERROR_MARKER = PLUGIN_ID + ".error_marker";
+    public static final String IMG_ERROR_MARKER_ALT = PLUGIN_ID + ".error_marker_alt";
+
+    public static final String IMG_LT_VIEW_MENU = PLUGIN_ID + ".lt_view_menu";
+
+    public static final String IMG_YANG_FILE = PLUGIN_ID + ".yang_file";
+}
diff --git a/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/internal/ImageDescriptorRegistry.java b/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/internal/ImageDescriptorRegistry.java
new file mode 100644 (file)
index 0000000..577d086
--- /dev/null
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ui.internal;
+
+import java.util.HashMap;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+
+import com.cisco.yangide.ui.YangUIPlugin;
+
+/**
+ * A registry that maps <code>ImageDescriptors</code> to <code>Image</code>.
+ *
+ * @author Konstantin Zaitsev
+ * date: Jul 14, 2014
+ */
+public class ImageDescriptorRegistry {
+
+    private HashMap<ImageDescriptor, Image> fRegistry = new HashMap<>(10);
+    private Display fDisplay;
+
+    /**
+     * Creates a new image descriptor registry for the current or default display, respectively.
+     */
+    public ImageDescriptorRegistry() {
+        this(YangUIPlugin.getStandardDisplay());
+    }
+
+    /**
+     * Creates a new image descriptor registry for the given display. All images managed by this
+     * registry will be disposed when the display gets disposed.
+     *
+     * @param display the display the images managed by this registry are allocated for
+     */
+    public ImageDescriptorRegistry(Display display) {
+        fDisplay = display;
+        Assert.isNotNull(fDisplay);
+        hookDisplay();
+    }
+
+    /**
+     * Returns the image associated with the given image descriptor.
+     *
+     * @param descriptor the image descriptor for which the registry manages an image
+     * @return the image associated with the image descriptor or <code>null</code> if the image
+     * descriptor can't create the requested image.
+     */
+    public Image get(ImageDescriptor descriptor) {
+        if (descriptor == null) {
+            descriptor = ImageDescriptor.getMissingImageDescriptor();
+        }
+
+        Image result = fRegistry.get(descriptor);
+        if (result != null) {
+            return result;
+        }
+
+        Assert.isTrue(fDisplay == YangUIPlugin.getStandardDisplay());
+        result = descriptor.createImage();
+        if (result != null) {
+            fRegistry.put(descriptor, result);
+        }
+        return result;
+    }
+
+    /**
+     * Disposes all images managed by this registry.
+     */
+    public void dispose() {
+        for (Image image : fRegistry.values()) {
+            image.dispose();
+        }
+        fRegistry.clear();
+    }
+
+    private void hookDisplay() {
+        fDisplay.disposeExec(new Runnable() {
+            @Override
+            public void run() {
+                dispose();
+            }
+        });
+    }
+}
diff --git a/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/internal/YangUIImages.java b/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/internal/YangUIImages.java
new file mode 100644 (file)
index 0000000..ee7945d
--- /dev/null
@@ -0,0 +1,179 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ui.internal;
+
+import java.net.URL;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.resource.CompositeImageDescriptor;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.graphics.Image;
+import org.osgi.framework.Bundle;
+
+import com.cisco.yangide.ui.YangUIPlugin;
+
+/**
+ * The images provided by the external tools plugin.
+ *
+ * @author Konstantin Zaitsev
+ * date: Jul 14, 2014
+ */
+public class YangUIImages {
+
+    /**
+     * The image registry containing <code>Image</code>s.
+     */
+    private static ImageRegistry imageRegistry;
+
+    /**
+     * The registry for composite images
+     */
+    private static ImageDescriptorRegistry imageDescriptorRegistry;
+
+    private static String ICONS_PATH = "$nl$/icons/full/"; //$NON-NLS-1$
+
+    // Use IPath and toOSString to build the names to ensure they have the slashes correct
+    private final static String LOCALTOOL = ICONS_PATH + "elcl16/"; //basic colors - size 16x16 //$NON-NLS-1$
+    private final static String OBJECT = ICONS_PATH + "obj16/"; //basic colors - size 16x16 //$NON-NLS-1$
+    @SuppressWarnings("unused")
+    private final static String OVR = ICONS_PATH + "ovr16/"; //basic colors - size 7x8 //$NON-NLS-1$
+    private final static String WIZ = ICONS_PATH + "wizban/"; //$NON-NLS-1$
+    @SuppressWarnings("unused")
+    private static final String T_ETOOL = ICONS_PATH + "etool16"; //$NON-NLS-1$
+
+    /**
+     * Declare all images
+     */
+    private static void declareImages() {
+        // Editor images
+        declareRegistryImage(IYangUIConstants.IMG_TEMPLATE_PROPOSAL, OBJECT + "template_obj.gif"); //$NON-NLS-1$
+        declareRegistryImage(IYangUIConstants.IMG_IMPORT_PROPOSAL, OBJECT + "import_obj.gif"); //$NON-NLS-1$
+        declareRegistryImage(IYangUIConstants.IMG_KEYWORD_PROPOSAL, OBJECT + "keyword_obj.gif"); //$NON-NLS-1$
+        declareRegistryImage(IYangUIConstants.IMG_TYPE_PROPOSAL, OBJECT + "type_obj.gif"); //$NON-NLS-1$
+        declareRegistryImage(IYangUIConstants.IMG_CUSTOM_TYPE_PROPOSAL, OBJECT + "custom_type_obj.gif"); //$NON-NLS-1$
+        declareRegistryImage(IYangUIConstants.IMG_GROUPING_PROPOSAL, OBJECT + "grouping_obj.gif"); //$NON-NLS-1$
+        declareRegistryImage(IYangUIConstants.IMG_CONTAINER_PROPOSAL, OBJECT + "container_obj.gif"); //$NON-NLS-1$
+        declareRegistryImage(IYangUIConstants.IMG_LEAF_PROPOSAL, OBJECT + "leaf_obj.gif"); //$NON-NLS-1$
+        declareRegistryImage(IYangUIConstants.IMG_MODULE_PROPOSAL, OBJECT + "module_obj.gif"); //$NON-NLS-1$
+        declareRegistryImage(IYangUIConstants.IMG_SUBMODULE_PROPOSAL, OBJECT + "submodule_obj.gif"); //$NON-NLS-1$
+        declareRegistryImage(IYangUIConstants.IMG_USES_PROPOSAL, OBJECT + "uses_obj.gif"); //$NON-NLS-1$
+        declareRegistryImage(IYangUIConstants.IMG_INCLUDE_PROPOSAL, OBJECT + "include_obj.gif"); //$NON-NLS-1$
+        declareRegistryImage(IYangUIConstants.IMG_AUGMENT_PROPOSAL, OBJECT + "augment_obj.gif"); //$NON-NLS-1$
+        declareRegistryImage(IYangUIConstants.IMG_DEVIATION_PROPOSAL, OBJECT + "deviation_obj.gif"); //$NON-NLS-1$
+        declareRegistryImage(IYangUIConstants.IMG_EXTENSION_PROPOSAL, OBJECT + "extension_obj.gif"); //$NON-NLS-1$
+        declareRegistryImage(IYangUIConstants.IMG_IDENTITY_PROPOSAL, OBJECT + "identity_obj.gif"); //$NON-NLS-1$
+        declareRegistryImage(IYangUIConstants.IMG_NOTIFICATION_PROPOSAL, OBJECT + "notification_obj.gif"); //$NON-NLS-1$
+        declareRegistryImage(IYangUIConstants.IMG_RPC_INPUT_PROPOSAL, OBJECT + "rpc_input_obj.gif"); //$NON-NLS-1$
+        declareRegistryImage(IYangUIConstants.IMG_RPC_OUTPUT_PROPOSAL, OBJECT + "rpc_output_obj.gif"); //$NON-NLS-1$
+        declareRegistryImage(IYangUIConstants.IMG_RPC_PROPOSAL, OBJECT + "rpc_obj.gif"); //$NON-NLS-1$
+        declareRegistryImage(IYangUIConstants.IMG_YANG_FILE, OBJECT + "yang_file.png"); //$NON-NLS-1$
+
+        // Marker images
+        declareRegistryImage(IYangUIConstants.IMG_ERROR_MARKER, OBJECT + "error_obj.gif"); //$NON-NLS-1$
+        declareRegistryImage(IYangUIConstants.IMG_ERROR_MARKER_ALT, OBJECT + "error_alt_obj.gif"); //$NON-NLS-1$
+
+        // Wizard images
+        declareRegistryImage(IYangUIConstants.IMG_NEW_PROJECT_WIZ, WIZ + "newprj_wiz.png"); //$NON-NLS-1$
+        declareRegistryImage(IYangUIConstants.IMG_NEW_FILE_WIZ, WIZ + "newfile_wiz.png"); //$NON-NLS-1$
+
+        // local tools
+        declareRegistryImage(IYangUIConstants.IMG_LT_VIEW_MENU, LOCALTOOL + "view_menu.gif"); //$NON-NLS-1$
+    }
+
+    /**
+     * Declare an Image in the registry table.
+     *
+     * @param key The key to use when registering the image
+     * @param path The path where the image can be found. This path is relative to where this plugin
+     * class is found (i.e. typically the packages directory)
+     */
+    private final static void declareRegistryImage(String key, String path) {
+        ImageDescriptor desc = ImageDescriptor.getMissingImageDescriptor();
+        Bundle bundle = Platform.getBundle(YangUIPlugin.PLUGIN_ID);
+        URL url = null;
+        if (bundle != null) {
+            url = FileLocator.find(bundle, new Path(path), null);
+            desc = ImageDescriptor.createFromURL(url);
+        }
+        imageRegistry.put(key, desc);
+    }
+
+    /**
+     * Returns the ImageRegistry.
+     */
+    public static ImageRegistry getImageRegistry() {
+        if (imageRegistry == null) {
+            initializeImageRegistry();
+        }
+        return imageRegistry;
+    }
+
+    /**
+     * Initialize the image registry by declaring all of the required graphics. This involves
+     * creating JFace image descriptors describing how to create/find the image should it be needed.
+     * The image is not actually allocated until requested. Prefix conventions Wizard Banners
+     * WIZBAN_ Preference Banners PREF_BAN_ Property Page Banners PROPBAN_ Color toolbar CTOOL_
+     * Enable toolbar ETOOL_ Disable toolbar DTOOL_ Local enabled toolbar ELCL_ Local Disable
+     * toolbar DLCL_ Object large OBJL_ Object small OBJS_ View VIEW_ Product images PROD_ Misc
+     * images MISC_ Where are the images? The images (typically gifs) are found in the same location
+     * as this plugin class. This may mean the same package directory as the package holding this
+     * class. The images are declared using this.getClass() to ensure they are looked up via this
+     * plugin class.
+     *
+     * @see org.eclipse.jface.resource.ImageRegistry
+     */
+    public static ImageRegistry initializeImageRegistry() {
+        imageRegistry = new ImageRegistry(YangUIPlugin.getStandardDisplay());
+        declareImages();
+        return imageRegistry;
+    }
+
+    /**
+     * Returns the <code>Image<code> identified by the given key,
+     * or <code>null</code> if it does not exist.
+     */
+    public static Image getImage(String key) {
+        return getImageRegistry().get(key);
+    }
+
+    /**
+     * Returns the <code>ImageDescriptor<code> identified by the given key,
+     * or <code>null</code> if it does not exist.
+     */
+    public static ImageDescriptor getImageDescriptor(String key) {
+        return getImageRegistry().getDescriptor(key);
+    }
+
+    /**
+     * Returns the image for the given composite descriptor.
+     */
+    public synchronized static Image getImage(CompositeImageDescriptor imageDescriptor) {
+        if (imageDescriptorRegistry == null) {
+            imageDescriptorRegistry = new ImageDescriptorRegistry();
+        }
+        return imageDescriptorRegistry.get(imageDescriptor);
+    }
+
+    public static void disposeImageDescriptorRegistry() {
+        if (imageDescriptorRegistry != null) {
+            imageDescriptorRegistry.dispose();
+        }
+    }
+
+    /**
+     * Returns whether the images have been initialized.
+     *
+     * @return whether the images have been initialized
+     */
+    public synchronized static boolean isInitialized() {
+        return imageDescriptorRegistry != null;
+    }
+}
diff --git a/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/internal/preferences/YangBasePreferencePage.java b/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/internal/preferences/YangBasePreferencePage.java
new file mode 100644 (file)
index 0000000..ff383ec
--- /dev/null
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ui.internal.preferences;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+
+import com.cisco.yangide.ui.YangUIPlugin;
+import com.cisco.yangide.ui.nls.Messages;
+import com.cisco.yangide.ui.preferences.YangPreferenceConstants;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 14, 2014
+ */
+public class YangBasePreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
+
+    private Button cleanBtn;
+    private Button tracingBtn;
+
+    @Override
+    public void init(IWorkbench workbench) {
+        this.setPreferenceStore(YangUIPlugin.getDefault().getPreferenceStore());
+    }
+
+    @Override
+    protected Control createContents(Composite parent) {
+        Composite pageArea = new Composite(parent, SWT.NONE);
+        GridLayout layout = new GridLayout(1, true);
+        pageArea.setLayout(layout);
+
+        cleanBtn = new Button(pageArea, SWT.CHECK);
+        cleanBtn.setText(Messages.pref_Base_cleanCodeGen);
+        cleanBtn.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false));
+        cleanBtn.setSelection(getPreferenceStore().getBoolean(YangPreferenceConstants.M2E_PLUGIN_CLEAN_TARGET));
+
+        tracingBtn = new Button(pageArea, SWT.CHECK);
+        tracingBtn.setText(Messages.pref_Base_enableTracing);
+        tracingBtn.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false));
+        tracingBtn.setSelection(getPreferenceStore().getBoolean(YangPreferenceConstants.ENABLE_TRACING));
+        Dialog.applyDialogFont(pageArea);
+
+        return pageArea;
+    }
+
+    @Override
+    public boolean performOk() {
+        getPreferenceStore().setValue(YangPreferenceConstants.M2E_PLUGIN_CLEAN_TARGET, cleanBtn.getSelection());
+        getPreferenceStore().setValue(YangPreferenceConstants.ENABLE_TRACING, tracingBtn.getSelection());
+        return true;
+    }
+
+    @Override
+    protected void performDefaults() {
+        cleanBtn.setSelection(getPreferenceStore().getDefaultBoolean(YangPreferenceConstants.M2E_PLUGIN_CLEAN_TARGET));
+        tracingBtn.setSelection(getPreferenceStore().getDefaultBoolean(YangPreferenceConstants.ENABLE_TRACING));
+        super.performDefaults();
+    }
+}
diff --git a/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/internal/preferences/YangUIPreferenceInitializer.java b/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/internal/preferences/YangUIPreferenceInitializer.java
new file mode 100644 (file)
index 0000000..2ef26a7
--- /dev/null
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ui.internal.preferences;
+
+import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferenceConverter;
+import org.eclipse.swt.graphics.RGB;
+
+import com.cisco.yangide.ui.YangUIPlugin;
+import com.cisco.yangide.ui.preferences.IYangColorConstants;
+import com.cisco.yangide.ui.preferences.YangPreferenceConstants;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 4, 2014
+ */
+public class YangUIPreferenceInitializer extends AbstractPreferenceInitializer {
+
+    @Override
+    public void initializeDefaultPreferences() {
+        IPreferenceStore store = YangUIPlugin.getDefault().getPreferenceStore();
+
+        store.setDefault(YangPreferenceConstants.M2E_PLUGIN_CLEAN_TARGET, true);
+
+        // store.setDefault(YangPreferenceConstants.P_STRING, "Default value");
+        store.setDefault(YangPreferenceConstants.EDITOR_CLOSE_BRACES, true);
+        store.setDefault(YangPreferenceConstants.EDITOR_SMART_PASTE, true);
+        store.setDefault(YangPreferenceConstants.EDITOR_SMART_TAB, true);
+        store.setDefault(YangPreferenceConstants.EDITOR_SMART_INDENT_AFTER_NEWLINE, true);
+
+        PreferenceConverter.setDefault(store, IYangColorConstants.YANG_COMMENT, new RGB(128, 32, 32));
+        PreferenceConverter.setDefault(store, IYangColorConstants.YANG_IDENTIFIER, new RGB(0, 0, 0));
+        PreferenceConverter.setDefault(store, IYangColorConstants.YANG_KEYWORD, new RGB(0, 0, 128));
+        PreferenceConverter.setDefault(store, IYangColorConstants.YANG_STRING, new RGB(0, 128, 0));
+        PreferenceConverter.setDefault(store, IYangColorConstants.YANG_TYPE, new RGB(0, 128, 128));
+        PreferenceConverter.setDefault(store, IYangColorConstants.YANG_NUMBER, new RGB(128, 0, 128));
+
+        PreferenceConverter.setDefault(store, IYangColorConstants.EDITOR_MATCHING_BRACKETS_COLOR,
+                new RGB(200, 200, 200));
+
+        // formatter settings
+        store.setDefault(YangPreferenceConstants.FMT_INDENT_SPACE, true);
+        store.setDefault(YangPreferenceConstants.FMT_INDENT_WIDTH, 4);
+        store.setDefault(YangPreferenceConstants.FMT_MAX_LINE_LENGTH, 60);
+        store.setDefault(YangPreferenceConstants.FMT_COMMENT, false);
+        store.setDefault(YangPreferenceConstants.FMT_STRING, true);
+        store.setDefault(YangPreferenceConstants.FMT_COMPACT_IMPORT, true);
+
+        store.setDefault(YangPreferenceConstants.ENABLE_TRACING, false);
+    }
+}
diff --git a/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/nls/Messages.java b/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/nls/Messages.java
new file mode 100644 (file)
index 0000000..d914b08
--- /dev/null
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ui.nls;
+
+import org.eclipse.osgi.util.NLS;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 3, 2014
+ */
+public class Messages extends NLS {
+    private static final String BUNDLE_NAME = "com.cisco.yangide.ui.nls.messages"; //$NON-NLS-1$
+    public static String pref_Base_cleanCodeGen;
+    public static String pref_Base_enableTracing;
+    static {
+        // initialize resource bundle
+        NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+    }
+
+    private Messages() {
+    }
+}
diff --git a/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/nls/messages.properties b/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/nls/messages.properties
new file mode 100644 (file)
index 0000000..845c1b2
--- /dev/null
@@ -0,0 +1,11 @@
+###############################################################################
+# Copyright (c) 2014, 2015 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
+#  
+###############################################################################
+
+pref_Base_cleanCodeGen=Clean generated code before M2E YANG code generation
+pref_Base_enableTracing=Enable tracing
diff --git a/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/preferences/IYangColorConstants.java b/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/preferences/IYangColorConstants.java
new file mode 100644 (file)
index 0000000..5cbed98
--- /dev/null
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ui.preferences;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 14, 2014
+ */
+public interface IYangColorConstants {
+
+    String YANG_STRING = "yang_string";
+    String YANG_COMMENT = "yang_comment";
+    String YANG_KEYWORD = "yang_keyword";
+    String YANG_IDENTIFIER = "yang_identifier";
+    String YANG_TYPE = "yang_built-in_type";
+    String YANG_NUMBER = "yang_number";
+
+    String EDITOR_MATCHING_BRACKETS_COLOR = "yang_matching_brackets_color";
+
+}
diff --git a/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/preferences/OverlayPreferenceStore.java b/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/preferences/OverlayPreferenceStore.java
new file mode 100644 (file)
index 0000000..98a6ff3
--- /dev/null
@@ -0,0 +1,549 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ui.preferences;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferenceStore;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+
+/**
+ * An overlaying preference store.
+ *
+ * @author Konstantin Zaitsev
+ * date: Jul 14, 2014
+ */
+public class OverlayPreferenceStore implements IPreferenceStore {
+
+    public static final class TypeDescriptor {
+        private TypeDescriptor() {
+        }
+    }
+
+    public static final TypeDescriptor BOOLEAN = new TypeDescriptor();
+    public static final TypeDescriptor DOUBLE = new TypeDescriptor();
+    public static final TypeDescriptor FLOAT = new TypeDescriptor();
+    public static final TypeDescriptor INT = new TypeDescriptor();
+    public static final TypeDescriptor LONG = new TypeDescriptor();
+    public static final TypeDescriptor STRING = new TypeDescriptor();
+
+    public static class OverlayKey {
+
+        TypeDescriptor fDescriptor;
+        String fKey;
+
+        public OverlayKey(TypeDescriptor descriptor, String key) {
+            fDescriptor = descriptor;
+            fKey = key;
+        }
+    }
+
+    private class PropertyListener implements IPropertyChangeListener {
+
+        /*
+         * @see IPropertyChangeListener#propertyChange(PropertyChangeEvent)
+         */
+        @Override
+        public void propertyChange(PropertyChangeEvent event) {
+            OverlayKey key = findOverlayKey(event.getProperty());
+            if (key != null) {
+                propagateProperty(fParent, key, fStore);
+            }
+        }
+    }
+
+    private IPreferenceStore fParent;
+    private IPreferenceStore fStore;
+    private OverlayKey[] fOverlayKeys;
+
+    private PropertyListener fPropertyListener;
+    private boolean fLoaded;
+
+    public OverlayPreferenceStore(IPreferenceStore parent, OverlayKey[] overlayKeys) {
+        fParent = parent;
+        fOverlayKeys = overlayKeys;
+        fStore = new PreferenceStore();
+    }
+
+    private OverlayKey findOverlayKey(String key) {
+        for (int i = 0; i < fOverlayKeys.length; i++) {
+            if (fOverlayKeys[i].fKey.equals(key)) {
+                return fOverlayKeys[i];
+            }
+        }
+        return null;
+    }
+
+    private boolean covers(String key) {
+        return (findOverlayKey(key) != null);
+    }
+
+    private void propagateProperty(IPreferenceStore orgin, OverlayKey key, IPreferenceStore target) {
+
+        if (orgin.isDefault(key.fKey)) {
+            if (!target.isDefault(key.fKey)) {
+                target.setToDefault(key.fKey);
+            }
+            return;
+        }
+
+        TypeDescriptor d = key.fDescriptor;
+        if (BOOLEAN == d) {
+
+            boolean originValue = orgin.getBoolean(key.fKey);
+            boolean targetValue = target.getBoolean(key.fKey);
+            if (targetValue != originValue) {
+                target.setValue(key.fKey, originValue);
+            }
+
+        } else if (DOUBLE == d) {
+
+            double originValue = orgin.getDouble(key.fKey);
+            double targetValue = target.getDouble(key.fKey);
+            if (targetValue != originValue) {
+                target.setValue(key.fKey, originValue);
+            }
+
+        } else if (FLOAT == d) {
+
+            float originValue = orgin.getFloat(key.fKey);
+            float targetValue = target.getFloat(key.fKey);
+            if (targetValue != originValue) {
+                target.setValue(key.fKey, originValue);
+            }
+
+        } else if (INT == d) {
+
+            int originValue = orgin.getInt(key.fKey);
+            int targetValue = target.getInt(key.fKey);
+            if (targetValue != originValue) {
+                target.setValue(key.fKey, originValue);
+            }
+
+        } else if (LONG == d) {
+
+            long originValue = orgin.getLong(key.fKey);
+            long targetValue = target.getLong(key.fKey);
+            if (targetValue != originValue) {
+                target.setValue(key.fKey, originValue);
+            }
+
+        } else if (STRING == d) {
+
+            String originValue = orgin.getString(key.fKey);
+            String targetValue = target.getString(key.fKey);
+            if (targetValue != null && originValue != null && !targetValue.equals(originValue)) {
+                target.setValue(key.fKey, originValue);
+            }
+
+        }
+    }
+
+    public void propagate() {
+        for (int i = 0; i < fOverlayKeys.length; i++) {
+            propagateProperty(fStore, fOverlayKeys[i], fParent);
+        }
+    }
+
+    private void loadProperty(IPreferenceStore orgin, OverlayKey key, IPreferenceStore target,
+            boolean forceInitialization) {
+        TypeDescriptor d = key.fDescriptor;
+        if (BOOLEAN == d) {
+
+            if (forceInitialization) {
+                target.setValue(key.fKey, true);
+            }
+            target.setValue(key.fKey, orgin.getBoolean(key.fKey));
+            target.setDefault(key.fKey, orgin.getDefaultBoolean(key.fKey));
+
+        } else if (DOUBLE == d) {
+
+            if (forceInitialization) {
+                target.setValue(key.fKey, 1.0D);
+            }
+            target.setValue(key.fKey, orgin.getDouble(key.fKey));
+            target.setDefault(key.fKey, orgin.getDefaultDouble(key.fKey));
+
+        } else if (FLOAT == d) {
+
+            if (forceInitialization) {
+                target.setValue(key.fKey, 1.0F);
+            }
+            target.setValue(key.fKey, orgin.getFloat(key.fKey));
+            target.setDefault(key.fKey, orgin.getDefaultFloat(key.fKey));
+
+        } else if (INT == d) {
+
+            if (forceInitialization) {
+                target.setValue(key.fKey, 1);
+            }
+            target.setValue(key.fKey, orgin.getInt(key.fKey));
+            target.setDefault(key.fKey, orgin.getDefaultInt(key.fKey));
+
+        } else if (LONG == d) {
+
+            if (forceInitialization) {
+                target.setValue(key.fKey, 1L);
+            }
+            target.setValue(key.fKey, orgin.getLong(key.fKey));
+            target.setDefault(key.fKey, orgin.getDefaultLong(key.fKey));
+
+        } else if (STRING == d) {
+
+            if (forceInitialization) {
+                target.setValue(key.fKey, "1"); //$NON-NLS-1$
+            }
+            target.setValue(key.fKey, orgin.getString(key.fKey));
+            target.setDefault(key.fKey, orgin.getDefaultString(key.fKey));
+
+        }
+    }
+
+    public void load() {
+        for (int i = 0; i < fOverlayKeys.length; i++) {
+            loadProperty(fParent, fOverlayKeys[i], fStore, true);
+        }
+
+        fLoaded = true;
+
+    }
+
+    public void loadDefaults() {
+        for (int i = 0; i < fOverlayKeys.length; i++) {
+            setToDefault(fOverlayKeys[i].fKey);
+        }
+    }
+
+    public void start() {
+        if (fPropertyListener == null) {
+            fPropertyListener = new PropertyListener();
+            fParent.addPropertyChangeListener(fPropertyListener);
+        }
+    }
+
+    public void stop() {
+        if (fPropertyListener != null) {
+            fParent.removePropertyChangeListener(fPropertyListener);
+            fPropertyListener = null;
+        }
+    }
+
+    /*
+     * @see IPreferenceStore#addPropertyChangeListener(IPropertyChangeListener)
+     */
+    @Override
+    public void addPropertyChangeListener(IPropertyChangeListener listener) {
+        fStore.addPropertyChangeListener(listener);
+    }
+
+    /*
+     * @see IPreferenceStore#removePropertyChangeListener(IPropertyChangeListener)
+     */
+    @Override
+    public void removePropertyChangeListener(IPropertyChangeListener listener) {
+        fStore.removePropertyChangeListener(listener);
+    }
+
+    /*
+     * @see IPreferenceStore#firePropertyChangeEvent(String, Object, Object)
+     */
+    @Override
+    public void firePropertyChangeEvent(String name, Object oldValue, Object newValue) {
+        fStore.firePropertyChangeEvent(name, oldValue, newValue);
+    }
+
+    /*
+     * @see IPreferenceStore#contains(String)
+     */
+    @Override
+    public boolean contains(String name) {
+        return fStore.contains(name);
+    }
+
+    /*
+     * @see IPreferenceStore#getBoolean(String)
+     */
+    @Override
+    public boolean getBoolean(String name) {
+        return fStore.getBoolean(name);
+    }
+
+    /*
+     * @see IPreferenceStore#getDefaultBoolean(String)
+     */
+    @Override
+    public boolean getDefaultBoolean(String name) {
+        return fStore.getDefaultBoolean(name);
+    }
+
+    /*
+     * @see IPreferenceStore#getDefaultDouble(String)
+     */
+    @Override
+    public double getDefaultDouble(String name) {
+        return fStore.getDefaultDouble(name);
+    }
+
+    /*
+     * @see IPreferenceStore#getDefaultFloat(String)
+     */
+    @Override
+    public float getDefaultFloat(String name) {
+        return fStore.getDefaultFloat(name);
+    }
+
+    /*
+     * @see IPreferenceStore#getDefaultInt(String)
+     */
+    @Override
+    public int getDefaultInt(String name) {
+        return fStore.getDefaultInt(name);
+    }
+
+    /*
+     * @see IPreferenceStore#getDefaultLong(String)
+     */
+    @Override
+    public long getDefaultLong(String name) {
+        return fStore.getDefaultLong(name);
+    }
+
+    /*
+     * @see IPreferenceStore#getDefaultString(String)
+     */
+    @Override
+    public String getDefaultString(String name) {
+        return fStore.getDefaultString(name);
+    }
+
+    /*
+     * @see IPreferenceStore#getDouble(String)
+     */
+    @Override
+    public double getDouble(String name) {
+        return fStore.getDouble(name);
+    }
+
+    /*
+     * @see IPreferenceStore#getFloat(String)
+     */
+    @Override
+    public float getFloat(String name) {
+        return fStore.getFloat(name);
+    }
+
+    /*
+     * @see IPreferenceStore#getInt(String)
+     */
+    @Override
+    public int getInt(String name) {
+        return fStore.getInt(name);
+    }
+
+    /*
+     * @see IPreferenceStore#getLong(String)
+     */
+    @Override
+    public long getLong(String name) {
+        return fStore.getLong(name);
+    }
+
+    /*
+     * @see IPreferenceStore#getString(String)
+     */
+    @Override
+    public String getString(String name) {
+        return fStore.getString(name);
+    }
+
+    /*
+     * @see IPreferenceStore#isDefault(String)
+     */
+    @Override
+    public boolean isDefault(String name) {
+        return fStore.isDefault(name);
+    }
+
+    /*
+     * @see IPreferenceStore#needsSaving()
+     */
+    @Override
+    public boolean needsSaving() {
+        return fStore.needsSaving();
+    }
+
+    /*
+     * @see IPreferenceStore#putValue(String, String)
+     */
+    @Override
+    public void putValue(String name, String value) {
+        if (covers(name)) {
+            fStore.putValue(name, value);
+        }
+    }
+
+    /*
+     * @see IPreferenceStore#setDefault(String, double)
+     */
+    @Override
+    public void setDefault(String name, double value) {
+        if (covers(name)) {
+            fStore.setDefault(name, value);
+        }
+    }
+
+    /*
+     * @see IPreferenceStore#setDefault(String, float)
+     */
+    @Override
+    public void setDefault(String name, float value) {
+        if (covers(name)) {
+            fStore.setDefault(name, value);
+        }
+    }
+
+    /*
+     * @see IPreferenceStore#setDefault(String, int)
+     */
+    @Override
+    public void setDefault(String name, int value) {
+        if (covers(name)) {
+            fStore.setDefault(name, value);
+        }
+    }
+
+    /*
+     * @see IPreferenceStore#setDefault(String, long)
+     */
+    @Override
+    public void setDefault(String name, long value) {
+        if (covers(name)) {
+            fStore.setDefault(name, value);
+        }
+    }
+
+    /*
+     * @see IPreferenceStore#setDefault(String, String)
+     */
+    @Override
+    public void setDefault(String name, String value) {
+        if (covers(name)) {
+            fStore.setDefault(name, value);
+        }
+    }
+
+    /*
+     * @see IPreferenceStore#setDefault(String, boolean)
+     */
+    @Override
+    public void setDefault(String name, boolean value) {
+        if (covers(name)) {
+            fStore.setDefault(name, value);
+        }
+    }
+
+    /*
+     * @see IPreferenceStore#setToDefault(String)
+     */
+    @Override
+    public void setToDefault(String name) {
+        fStore.setToDefault(name);
+    }
+
+    /*
+     * @see IPreferenceStore#setValue(String, double)
+     */
+    @Override
+    public void setValue(String name, double value) {
+        if (covers(name)) {
+            fStore.setValue(name, value);
+        }
+    }
+
+    /*
+     * @see IPreferenceStore#setValue(String, float)
+     */
+    @Override
+    public void setValue(String name, float value) {
+        if (covers(name)) {
+            fStore.setValue(name, value);
+        }
+    }
+
+    /*
+     * @see IPreferenceStore#setValue(String, int)
+     */
+    @Override
+    public void setValue(String name, int value) {
+        if (covers(name)) {
+            fStore.setValue(name, value);
+        }
+    }
+
+    /*
+     * @see IPreferenceStore#setValue(String, long)
+     */
+    @Override
+    public void setValue(String name, long value) {
+        if (covers(name)) {
+            fStore.setValue(name, value);
+        }
+    }
+
+    /*
+     * @see IPreferenceStore#setValue(String, String)
+     */
+    @Override
+    public void setValue(String name, String value) {
+        if (covers(name)) {
+            fStore.setValue(name, value);
+        }
+    }
+
+    /*
+     * @see IPreferenceStore#setValue(String, boolean)
+     */
+    @Override
+    public void setValue(String name, boolean value) {
+        if (covers(name)) {
+            fStore.setValue(name, value);
+        }
+    }
+
+    /**
+     * The keys to add to the list of overlay keys.
+     * <p>
+     * Note: This method must be called before {@link #load()} is called.
+     * </p>
+     *
+     * @param keys
+     * @since 3.0
+     */
+    public void addKeys(OverlayKey[] keys) {
+        Assert.isTrue(!fLoaded);
+        Assert.isNotNull(keys);
+
+        int overlayKeysLength = fOverlayKeys.length;
+        OverlayKey[] result = new OverlayKey[keys.length + overlayKeysLength];
+
+        for (int i = 0, length = overlayKeysLength; i < length; i++) {
+            result[i] = fOverlayKeys[i];
+        }
+
+        for (int i = 0, length = keys.length; i < length; i++) {
+            result[overlayKeysLength + i] = keys[i];
+        }
+
+        fOverlayKeys = result;
+
+        if (fLoaded) {
+            load();
+        }
+    }
+}
diff --git a/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/preferences/YangPreferenceConstants.java b/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/preferences/YangPreferenceConstants.java
new file mode 100644 (file)
index 0000000..9662451
--- /dev/null
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ui.preferences;
+
+/**
+ * Constant definitions for plug-in preferences wizard generated, might be usefull later
+ */
+public class YangPreferenceConstants {
+
+    /**
+     * A named preference that controls whether the 'smart paste' feature is enabled.
+     * <p>
+     * Value is of type <code>Boolean</code>.
+     * </p>
+     *
+     * @since 2.1
+     */
+    public final static String EDITOR_SMART_PASTE = "smartPaste"; //$NON-NLS-1$
+
+    /**
+     * A named preference that controls whether the 'close brackets' feature is enabled.
+     * <p>
+     * Value is of type <code>Boolean</code>.
+     * </p>
+     *
+     * @since 2.1
+     */
+    public final static String EDITOR_CLOSE_BRACES = "closeBraces"; //$NON-NLS-1$
+    /**
+     * A named preference that controls the smart tab behavior.
+     * <p>
+     * Value is of type <code>Boolean</code>.
+     *
+     * @since 3.0
+     */
+    public static final String EDITOR_SMART_TAB = "smart_tab"; //$NON-NLS-1$
+    /**
+     * A named preference that controls whether on Enter key the indentation should be smart or the
+     * same as previous line.
+     * <p>
+     * Value is of type <code>Boolean</code>.
+     * </p>
+     *
+     * @since 3.7
+     */
+    public final static String EDITOR_SMART_INDENT_AFTER_NEWLINE = "smartIndentAfterNewline"; //$NON-NLS-1$
+
+    public final static String M2E_PLUGIN_CLEAN_TARGET = "m2ePluginCleanTarget";
+
+    // formatter preferences
+    public final static String FMT_INDENT_SPACE = "fmtIndentSpace";
+    public final static String FMT_INDENT_WIDTH = "fmtIndentWidth";
+    public final static String FMT_COMMENT = "fmtComment";
+    public final static String FMT_STRING = "fmtString";
+    public final static String FMT_MAX_LINE_LENGTH = "fmtMaxLineLength";
+    public final static String FMT_COMPACT_IMPORT = "fmtCompactImport";
+
+    public final static String ENABLE_TRACING = "enableTracing";
+}
diff --git a/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/wizards/CodeGeneratorConfig.java b/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/wizards/CodeGeneratorConfig.java
new file mode 100644 (file)
index 0000000..96ab1d4
--- /dev/null
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ui.wizards;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 27, 2014
+ */
+public class CodeGeneratorConfig {
+    private String groupId;
+    private String artifactId;
+    private String version = "1.0.0";
+    private String genClassName;
+    private String genOutputDirectory = "target/generated-sources/gen1";
+
+    /**
+     * @return the groupId
+     */
+    public String getGroupId() {
+        return groupId;
+    }
+
+    /**
+     * @param groupId the groupId to set
+     */
+    public void setGroupId(String groupId) {
+        this.groupId = groupId;
+    }
+
+    /**
+     * @return the artifactId
+     */
+    public String getArtifactId() {
+        return artifactId;
+    }
+
+    /**
+     * @param artifactId the artifactId to set
+     */
+    public void setArtifactId(String artifactId) {
+        this.artifactId = artifactId;
+    }
+
+    /**
+     * @return the version
+     */
+    public String getVersion() {
+        return version;
+    }
+
+    /**
+     * @param version the version to set
+     */
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+    /**
+     * @return the genClassName
+     */
+    public String getGenClassName() {
+        return genClassName;
+    }
+
+    /**
+     * @param genClassName the genClassName to set
+     */
+    public void setGenClassName(String genClassName) {
+        this.genClassName = genClassName;
+    }
+
+    /**
+     * @return the genOutputDirectory
+     */
+    public String getGenOutputDirectory() {
+        return genOutputDirectory;
+    }
+
+    /**
+     * @param genOutputDirectory the genOutputDirectory to set
+     */
+    public void setGenOutputDirectory(String genOutputDirectory) {
+        this.genOutputDirectory = genOutputDirectory;
+    }
+}
diff --git a/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/wizards/YangCodeGeneratorDialog.java b/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/wizards/YangCodeGeneratorDialog.java
new file mode 100644 (file)
index 0000000..edfc4c5
--- /dev/null
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ui.wizards;
+
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 27, 2014
+ */
+public class YangCodeGeneratorDialog extends TitleAreaDialog {
+
+    private Text groupIdTxt;
+    private Text artifactIdTxt;
+    private Text versionTxt;
+    private Text genClassNameTxt;
+    private Text genOutputDirectoryTxt;
+
+    private CodeGeneratorConfig config;
+
+    public YangCodeGeneratorDialog(Shell shell) {
+        this(shell, new CodeGeneratorConfig());
+    }
+
+    public YangCodeGeneratorDialog(Shell shell, CodeGeneratorConfig config) {
+        super(shell);
+        this.config = config;
+    }
+
+    @Override
+    protected void configureShell(Shell newShell) {
+        super.configureShell(newShell);
+        newShell.setText("Code Generator Configuration");
+    }
+
+    @Override
+    public void create() {
+        super.create();
+        setTitle("Code Generator Configuration");
+        setMessage("Specify Maven parameters for code generator configuration", IMessageProvider.INFORMATION);
+    }
+
+    @Override
+    protected Control createDialogArea(Composite parent) {
+        Composite area = (Composite) super.createDialogArea(parent);
+        Composite container = new Composite(area, SWT.NONE);
+        container.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+        GridLayout layout = new GridLayout(2, false);
+        container.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+        container.setLayout(layout);
+
+        groupIdTxt = createTextInput(container, "Maven Group ID:", config.getGroupId());
+        artifactIdTxt = createTextInput(container, "Maven Artifact ID:", config.getArtifactId());
+        versionTxt = createTextInput(container, "Maven Artifact Version:", config.getVersion());
+        genClassNameTxt = createTextInput(container, "Generator Class Name:", config.getGenClassName());
+        genOutputDirectoryTxt = createTextInput(container, "Generator Output Directory:",
+                config.getGenOutputDirectory());
+
+        return area;
+    }
+
+    @Override
+    protected void okPressed() {
+        config.setGroupId(groupIdTxt.getText());
+        config.setArtifactId(artifactIdTxt.getText());
+        config.setVersion(versionTxt.getText());
+        config.setGenClassName(genClassNameTxt.getText());
+        config.setGenOutputDirectory(genOutputDirectoryTxt.getText());
+        super.okPressed();
+    }
+
+    @Override
+    protected boolean isResizable() {
+        return true;
+    }
+
+    private Text createTextInput(Composite parent, String label, String defValue) {
+        new Label(parent, SWT.NONE).setText(label);
+
+        Text text = new Text(parent, SWT.BORDER);
+        text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+        text.setText(defValue != null ? defValue : "");
+        return text;
+    }
+
+    /**
+     * @return the config
+     */
+    public CodeGeneratorConfig getConfig() {
+        return config;
+    }
+}
diff --git a/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/wizards/YangFileWizard.java b/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/wizards/YangFileWizard.java
new file mode 100644 (file)
index 0000000..8a71229
--- /dev/null
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ui.wizards;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard;
+
+import com.cisco.yangide.ui.YangUIPlugin;
+import com.cisco.yangide.ui.internal.IYangUIConstants;
+import com.cisco.yangide.ui.internal.YangUIImages;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 15, 2014
+ */
+public class YangFileWizard extends Wizard implements INewWizard {
+
+    private YangFileWizardPage yangPage;
+    private WizardNewFileCreationPage filePage;
+    private IWorkbench workbench;
+
+    /**
+     * Constructor.
+     */
+    public YangFileWizard() {
+        setWindowTitle("New YANG File");
+        setDefaultPageImageDescriptor(YangUIImages.getImageDescriptor(IYangUIConstants.IMG_NEW_FILE_WIZ));
+        setNeedsProgressMonitor(true);
+    }
+
+    @Override
+    public void init(IWorkbench workbench, IStructuredSelection selection) {
+        this.workbench = workbench;
+        filePage = new WizardNewFileCreationPage("filePage", selection);
+        filePage.setAllowExistingResources(false);
+        filePage.setFileExtension("yang");
+        filePage.setTitle("YANG File");
+        filePage.setDescription("Create a new YANG file");
+
+        yangPage = new YangFileWizardPage(filePage);
+        addPage(filePage);
+        addPage(yangPage);
+    }
+
+    @Override
+    public boolean performFinish() {
+        if (yangPage.getModule().isEmpty()) {
+            yangPage.init();
+        }
+        try {
+            getContainer().run(false, false, new IRunnableWithProgress() {
+
+                @Override
+                public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+                    IFile file = filePage.createNewFile();
+                    try {
+                        file.setContents(getTemplateContent(), true, false, monitor);
+                    } catch (CoreException | IOException e) {
+                        YangUIPlugin.log(e);
+                    }
+
+                    BasicNewResourceWizard.selectAndReveal(file, workbench.getActiveWorkbenchWindow());
+
+                    // Open editor on new file.
+                    IWorkbenchWindow dw = workbench.getActiveWorkbenchWindow();
+                    try {
+                        if (dw != null) {
+                            IWorkbenchPage page = dw.getActivePage();
+                            if (page != null) {
+                                IDE.openEditor(page, file, true);
+                            }
+                        }
+                    } catch (PartInitException e) {
+                        YangUIPlugin.log(e);
+                    }
+                }
+            });
+        } catch (InvocationTargetException | InterruptedException e) {
+            YangUIPlugin.log(e);
+        }
+        return true;
+    }
+
+    /**
+     * @return InputStream of template with replaced placeholders.
+     * @throws IOException read errors
+     */
+    private InputStream getTemplateContent() throws IOException {
+        StringBuilder sb = new StringBuilder();
+
+        char[] buff = new char[1024];
+        int len = 0;
+        Path templatePath = new Path("resources/yang/new_yang_file.yang");
+        try (InputStreamReader in = new InputStreamReader(FileLocator.openStream(YangUIPlugin.getDefault().getBundle(),
+                templatePath, false), "UTF-8")) {
+            while ((len = in.read(buff)) > 0) {
+                sb.append(buff, 0, len);
+            }
+        }
+        String str = sb.toString();
+        str = str.replaceAll("%MODULE%", yangPage.getModule());
+        str = str.replaceAll("%NAMESPACE%", yangPage.getNamespace());
+        str = str.replaceAll("%PREFIX%", yangPage.getPrefix());
+        str = str.replaceAll("%REVISION%", yangPage.getRevision());
+        str = str.replaceAll("%REVISION_DESC%", yangPage.getRevisionDesc());
+
+        return new ByteArrayInputStream(str.toString().getBytes("UTF-8"));
+    }
+}
diff --git a/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/wizards/YangFileWizardPage.java b/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/wizards/YangFileWizardPage.java
new file mode 100644 (file)
index 0000000..4c14e22
--- /dev/null
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ui.wizards;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jul 15, 2014
+ */
+public class YangFileWizardPage extends WizardPage {
+    private DateFormat DF = new SimpleDateFormat("yyyy-MM-dd");
+    private Text moduleTxt;
+    private Text namespaceTxt;
+    private Text prefixTxt;
+    private Text revisionTxt;
+    private Text revisionDescTxt;
+    private WizardNewFileCreationPage filePage;
+
+    protected YangFileWizardPage(WizardNewFileCreationPage filePage) {
+        super("yangFilePage");
+        this.filePage = filePage;
+        setTitle("YANG File");
+        setDescription("Create a new YANG file");
+    }
+
+    @Override
+    public void createControl(Composite parent) {
+        initializeDialogUnits(parent);
+        Composite container = new Composite(parent, SWT.NULL);
+        container.setLayout(new GridLayout(1, false));
+
+        Composite group1 = new Composite(container, SWT.NONE);
+        group1.setLayout(new GridLayout(2, false));
+        group1.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+
+        new Label(group1, SWT.NONE).setText("Module Name:");
+        moduleTxt = new Text(group1, SWT.BORDER);
+        moduleTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+        new Label(group1, SWT.NONE).setText("Namespace:");
+        namespaceTxt = new Text(group1, SWT.BORDER);
+        namespaceTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+        new Label(group1, SWT.NONE).setText("Prefix:");
+        prefixTxt = new Text(group1, SWT.BORDER);
+        prefixTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+        new Label(group1, SWT.NONE).setText("Revision:");
+        revisionTxt = new Text(group1, SWT.BORDER);
+        revisionTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+        revisionTxt.setText(DF.format(new Date()));
+
+        Label revisionDescLabel = new Label(group1, SWT.NONE);
+        revisionDescLabel.setText("Revision Description:");
+        revisionDescLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 2, 1));
+
+        revisionDescTxt = new Text(group1, SWT.MULTI | SWT.BORDER | SWT.WRAP);
+        GridData gridData = new GridData(SWT.FILL, SWT.CENTER, true, true, 2, 1);
+        gridData.heightHint = 50;
+        revisionDescTxt.setLayoutData(gridData);
+        revisionDescTxt.setText("Initial revision");
+
+        setControl(container);
+    }
+
+    @Override
+    public void setVisible(boolean visible) {
+        init();
+        super.setVisible(visible);
+    }
+
+    /**
+     * Initializes fields from file page.
+     */
+    public void init() {
+        String name = filePage.getFileName();
+        if (name.indexOf('.') > 0) {
+            name = name.substring(0, name.indexOf('.'));
+        }
+        moduleTxt.setText(name);
+        namespaceTxt.setText("urn:opendaylight:" + name);
+        prefixTxt.setText(name);
+    }
+
+    /**
+     * @return the module
+     */
+    public String getModule() {
+        return moduleTxt.getText();
+    }
+
+    /**
+     * @return the namespace
+     */
+    public String getNamespace() {
+        return namespaceTxt.getText();
+    }
+
+    /**
+     * @return the prefix
+     */
+    public String getPrefix() {
+        return prefixTxt.getText();
+    }
+
+    /**
+     * @return the revision
+     */
+    public String getRevision() {
+        return revisionTxt.getText();
+    }
+
+    /**
+     * @return the revision description
+     */
+    public String getRevisionDesc() {
+        return revisionDescTxt.getText();
+    }
+}
diff --git a/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/wizards/YangProjectWizard.java b/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/wizards/YangProjectWizard.java
new file mode 100644 (file)
index 0000000..cb52a12
--- /dev/null
@@ -0,0 +1,253 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ui.wizards;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.maven.model.Build;
+import org.apache.maven.model.Dependency;
+import org.apache.maven.model.Model;
+import org.apache.maven.model.Plugin;
+import org.apache.maven.model.PluginExecution;
+import org.apache.maven.model.Repository;
+import org.codehaus.plexus.util.xml.Xpp3Dom;
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.m2e.core.MavenPlugin;
+import org.eclipse.m2e.core.ui.internal.wizards.MavenProjectWizard;
+import org.eclipse.ui.IWorkbench;
+
+import com.cisco.yangide.ui.YangUIPlugin;
+import com.cisco.yangide.ui.internal.IYangUIConstants;
+import com.cisco.yangide.ui.internal.YangUIImages;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 26, 2014
+ */
+@SuppressWarnings("restriction")
+public class YangProjectWizard extends MavenProjectWizard {
+
+    /** Default source location. */
+    public static final String SRC_MAIN_YANG = "src/main/yang";
+
+    /** YANG tools configuration page. */
+    private YangProjectWizardPage yangPage;
+
+    /**
+     * Constructor.
+     */
+    public YangProjectWizard() {
+        super();
+        setWindowTitle("New YANG Project");
+        setDefaultPageImageDescriptor(YangUIImages.getImageDescriptor(IYangUIConstants.IMG_NEW_PROJECT_WIZ));
+    }
+
+    @Override
+    public void addPages() {
+        yangPage = new YangProjectWizardPage();
+        addPage(yangPage);
+        super.addPages();
+    }
+
+    @Override
+    public void init(IWorkbench workbench, IStructuredSelection selection) {
+        super.init(workbench, selection);
+    }
+
+    @Override
+    public boolean performFinish() {
+        boolean res = super.performFinish();
+        if (!res) {
+            return false;
+        }
+        final boolean doCreateDemoFile = yangPage.createExampleFile();
+        final IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(getModel().getArtifactId());
+        final String yangRoot = yangPage.getRootDir();
+        final IFolder folder = project.getFolder(yangRoot);
+
+        final String yangVersion = yangPage.getYangVersion();
+
+        final List<CodeGeneratorConfig> generators = yangPage.getCodeGenerators();
+
+        Job updateJob = new Job("Yang Project update") {
+            @Override
+            public IStatus run(IProgressMonitor monitor) {
+                try {
+                    createFolder(folder);
+
+                    IFile pomFile = project.getFile("pom.xml");
+                    Model model = MavenPlugin.getMavenModelManager().readMavenModel(pomFile);
+                    updateModel(model, yangVersion, generators, yangRoot);
+
+                    pomFile.delete(true, new NullProgressMonitor());
+                    MavenPlugin.getMavenModelManager().createMavenModel(pomFile, model);
+                    MavenPlugin.getProjectConfigurationManager().updateProjectConfiguration(project,
+                            new NullProgressMonitor());
+
+                    if (doCreateDemoFile) {
+                        InputStream demoFileContents = null;
+                        try {
+                            Path demoPath = new Path("resources/yang/acme-system.yang");
+                            demoFileContents = FileLocator.openStream(YangUIPlugin.getDefault().getBundle(), demoPath,
+                                    false);
+
+                            folder.getFile("acme-system.yang").create(demoFileContents, true, null);
+                        } finally {
+                            if (demoFileContents != null) {
+                                demoFileContents.close();
+                            }
+                        }
+                    }
+                    // Add yang folder to java classpath
+                    IJavaProject javaProject = JavaCore.create(project);
+                    List<IClasspathEntry> classpath = new ArrayList<>(Arrays.asList(javaProject.getRawClasspath()));
+                    IClasspathEntry yangSrc = JavaCore.newSourceEntry(folder.getFullPath());
+                    boolean hasSame = false;
+                    for (IClasspathEntry ee : classpath) {
+                        if (ee.getPath().equals(yangSrc.getPath())) {
+                            hasSame = true;
+                            break;
+                        }
+                    }
+                    if (!hasSame) {
+                        classpath.add(yangSrc);
+                        javaProject.setRawClasspath(classpath.toArray(new IClasspathEntry[0]),
+                                new NullProgressMonitor());
+                    }
+
+                } catch (CoreException e) {
+                    YangUIPlugin.log(e.getMessage(), e);
+                } catch (IOException e) {
+                    YangUIPlugin.log(e.getMessage(), e);
+                }
+                return Status.OK_STATUS;
+            }
+        };
+        updateJob.setRule(MavenPlugin.getProjectConfigurationManager().getRule());
+        updateJob.schedule();
+        return true;
+    }
+
+    private void createFolder(IFolder folder) {
+        if (!folder.exists()) {
+            IContainer parent = folder.getParent();
+            if (parent instanceof IFolder) {
+                createFolder((IFolder) parent);
+            }
+            try {
+                if (!folder.exists()) {
+                    folder.create(true, true, new NullProgressMonitor());
+                }
+            } catch (CoreException e) {
+                YangUIPlugin.log(e);
+            }
+        }
+    }
+
+    public void updateModel(Model model, String yangVersion, List<CodeGeneratorConfig> generators, String yangRoot) {
+        // Model model = super.getModel();
+        model.setBuild(new Build());
+        Plugin plugin = new Plugin();
+        plugin.setGroupId("org.opendaylight.yangtools");
+        plugin.setArtifactId("yang-maven-plugin");
+        plugin.setVersion(yangVersion);
+
+        for (CodeGeneratorConfig genConf : generators) {
+            Dependency dependency = new Dependency();
+            dependency.setGroupId(genConf.getGroupId());
+            dependency.setArtifactId(genConf.getArtifactId());
+            dependency.setVersion(genConf.getVersion());
+            dependency.setType("jar");
+            plugin.addDependency(dependency);
+        }
+
+        PluginExecution pluginExecution = new PluginExecution();
+        pluginExecution.setId("generate-sources");
+        pluginExecution.addGoal("generate-sources");
+        Xpp3Dom config = new Xpp3Dom("configuration");
+
+        Xpp3Dom codeGenerators = new Xpp3Dom("codeGenerators");
+        for (CodeGeneratorConfig genConf : generators) {
+            Xpp3Dom generator = new Xpp3Dom("generator");
+            generator.addChild(createSingleParameter("codeGeneratorClass", genConf.getGenClassName()));
+            generator.addChild(createSingleParameter("outputBaseDir", genConf.getGenOutputDirectory()));
+            codeGenerators.addChild(generator);
+        }
+        config.addChild(createSingleParameter("yangFilesRootDir", yangRoot));
+        config.addChild(codeGenerators);
+        config.addChild(createSingleParameter("inspectDependencies", "true"));
+        pluginExecution.setConfiguration(config);
+
+        plugin.addExecution(pluginExecution);
+        model.getBuild().addPlugin(plugin);
+        model.addPluginRepository(createRepoParameter("opendaylight-release",
+                "http://nexus.opendaylight.org/content/repositories/opendaylight.release/"));
+        model.addPluginRepository(createRepoParameter("opendaylight-snapshot",
+                "http://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/"));
+        model.addRepository(createRepoParameter("opendaylight-release",
+                "http://nexus.opendaylight.org/content/repositories/opendaylight.release/"));
+        model.addRepository(createRepoParameter("opendaylight-snapshot",
+                "http://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/"));
+
+        model.getProperties().put("maven.compiler.source", "1.8");
+        model.getProperties().put("maven.compiler.target", "1.8");
+
+        Dependency dependency2 = new Dependency();
+        dependency2.setGroupId("org.opendaylight.yangtools");
+        dependency2.setArtifactId("yang-binding");
+        dependency2.setVersion(yangVersion);
+        dependency2.setType("jar");
+        model.addDependency(dependency2);
+    }
+
+    /**
+     * Creates single configuration parameter.
+     *
+     * @param name name
+     * @param value value
+     * @return config parameter
+     */
+    private Xpp3Dom createSingleParameter(String name, String value) {
+        Xpp3Dom parameter = new Xpp3Dom(name);
+        parameter.setValue(value);
+        return parameter;
+    }
+
+    /**
+     * @param name name
+     * @param url url
+     * @return repository configuration by name and url
+     */
+    private Repository createRepoParameter(String name, String url) {
+        Repository r = new Repository();
+        r.setId(name);
+        r.setName(name);
+        r.setUrl(url);
+        return r;
+    }
+}
diff --git a/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/wizards/YangProjectWizardPage.java b/plugins/com.cisco.yangide.ui/src/com/cisco/yangide/ui/wizards/YangProjectWizardPage.java
new file mode 100644 (file)
index 0000000..37d7c89
--- /dev/null
@@ -0,0 +1,258 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 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 com.cisco.yangide.ui.wizards;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * @author Konstantin Zaitsev
+ * date: Jun 27, 2014
+ */
+class YangProjectWizardPage extends WizardPage {
+
+    private Text rootDirTxt;
+    private Combo yangVersion;
+    private Button exampleFileChk;
+    private Table generatorsTable;
+    private TableViewer generatorsViewer;
+    private Button removeBtn;
+    private Button editBtn;
+    private Button addBtn;
+
+    protected YangProjectWizardPage() {
+        super("yangProjectPage");
+        setTitle("YANG Tools Configuration");
+        setDescription("Specify YANG Code Generators Parameters");
+    }
+
+    @Override
+    public void createControl(Composite parent) {
+        Composite container = new Composite(parent, SWT.NULL);
+        container.setLayout(new GridLayout(1, false));
+
+        Composite group1 = new Composite(container, SWT.NONE);
+        group1.setLayout(new GridLayout(2, false));
+        group1.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
+
+        new Label(group1, SWT.NONE).setText("YANG Tools Version:");
+        yangVersion = new Combo(group1, SWT.BORDER | SWT.READ_ONLY);
+        yangVersion.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+
+        new Label(group1, SWT.NONE).setText("YANG Files Root Directory:");
+        rootDirTxt = new Text(group1, SWT.BORDER);
+        rootDirTxt.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+        rootDirTxt.setText(YangProjectWizard.SRC_MAIN_YANG);
+
+        Composite group2 = new Composite(container, SWT.NONE);
+        group2.setLayout(new GridLayout(2, false));
+        group2.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, true));
+
+        privateCreateGeneratorControls(group2);
+
+        exampleFileChk = new Button(group2, SWT.CHECK);
+        exampleFileChk.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
+        exampleFileChk.setText("Create Example YANG File");
+        exampleFileChk.setSelection(true);
+
+        setControl(container);
+
+        // add default values
+        // TODO KOS: load version from repository
+        yangVersion.add("0.6.2-Helium");
+        yangVersion.add("0.6.1");
+        yangVersion.add("0.6.0");
+        yangVersion.add("0.5.8");
+        yangVersion.select(0);
+
+        // default generator
+        CodeGeneratorConfig config = new CodeGeneratorConfig();
+        config.setGroupId("org.opendaylight.yangtools");
+        config.setArtifactId("maven-sal-api-gen-plugin");
+        config.setVersion(yangVersion.getText());
+        config.setGenClassName("org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl");
+        config.setGenOutputDirectory("target/generated-sources/sal");
+        generatorsViewer.add(config);
+    }
+
+    /**
+     * @param parent
+     */
+    private void privateCreateGeneratorControls(Composite parent) {
+        Label label = new Label(parent, SWT.NONE);
+        label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, true, 2, 1));
+        label.setText("Source Code Generators:");
+
+        generatorsViewer = new TableViewer(parent, SWT.BORDER | SWT.FULL_SELECTION);
+        generatorsTable = generatorsViewer.getTable();
+        generatorsTable.setLinesVisible(true);
+        generatorsTable.setHeaderVisible(true);
+        generatorsTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+        generatorsTable.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                validate();
+            }
+        });
+        createTableColum(generatorsTable, "Group ID", 120);
+        createTableColum(generatorsTable, "Artifact ID", 120);
+        createTableColum(generatorsTable, "Version", 100);
+        createTableColum(generatorsTable, "Generator Class Name", 200);
+        createTableColum(generatorsTable, "Output Directory", 200);
+
+        generatorsViewer.setLabelProvider(new ITableLabelProvider() {
+
+            @Override
+            public void removeListener(ILabelProviderListener listener) {
+            }
+
+            @Override
+            public boolean isLabelProperty(Object element, String property) {
+                return false;
+            }
+
+            @Override
+            public void dispose() {
+            }
+
+            @Override
+            public void addListener(ILabelProviderListener listener) {
+            }
+
+            @Override
+            public String getColumnText(Object element, int columnIndex) {
+                if (element instanceof CodeGeneratorConfig) {
+                    CodeGeneratorConfig conf = (CodeGeneratorConfig) element;
+                    String txt = null;
+                    switch (columnIndex) {
+                    case 0:
+                        txt = conf.getGroupId();
+                        break;
+                    case 1:
+                        txt = conf.getArtifactId();
+                        break;
+                    case 2:
+                        txt = conf.getVersion();
+                        break;
+                    case 3:
+                        txt = conf.getGenClassName();
+                        break;
+                    case 4:
+                        txt = conf.getGenOutputDirectory();
+                        break;
+                    }
+                    return txt != null ? txt : "";
+                }
+                return "";
+            }
+
+            @Override
+            public Image getColumnImage(Object element, int columnIndex) {
+                return null;
+            }
+        });
+
+        Composite group = new Composite(parent, SWT.NONE);
+        group.setLayout(new GridLayout(1, false));
+        group.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, true));
+
+        addBtn = new Button(group, SWT.NONE);
+        addBtn.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
+        addBtn.setText("Add...");
+        addBtn.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                YangCodeGeneratorDialog dialog = new YangCodeGeneratorDialog(getShell());
+                if (dialog.open() == Window.OK) {
+                    generatorsViewer.add(dialog.getConfig());
+                }
+            }
+        });
+
+        editBtn = new Button(group, SWT.NONE);
+        editBtn.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
+        editBtn.setText("Edit...");
+        editBtn.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                CodeGeneratorConfig config = (CodeGeneratorConfig) generatorsViewer.getElementAt(generatorsTable
+                        .getSelectionIndex());
+                YangCodeGeneratorDialog dialog = new YangCodeGeneratorDialog(getShell(), config);
+                if (dialog.open() == Window.OK) {
+                    generatorsViewer.update(dialog.getConfig(), null);
+                }
+            }
+        });
+
+        removeBtn = new Button(group, SWT.NONE);
+        removeBtn.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
+        removeBtn.setText("Remove");
+        removeBtn.addSelectionListener(new SelectionAdapter() {
+            @Override
+            public void widgetSelected(SelectionEvent e) {
+                if (generatorsTable.getSelectionCount() > 1) {
+                    generatorsTable.remove(generatorsTable.getSelectionIndices());
+                    validate();
+                }
+            }
+        });
+        validate();
+    }
+
+    private TableColumn createTableColum(Table table, String name, int width) {
+        TableColumn tableColumn = new TableColumn(table, SWT.NONE);
+        tableColumn.setWidth(width);
+        tableColumn.setText(name);
+        return tableColumn;
+    }
+
+    private void validate() {
+        editBtn.setEnabled(generatorsTable.getSelectionCount() == 1);
+        removeBtn.setEnabled(generatorsTable.getItemCount() > 1);
+    }
+
+    public boolean createExampleFile() {
+        return exampleFileChk.getSelection();
+    }
+
+    public String getRootDir() {
+        return rootDirTxt.getText();
+    }
+
+    public String getYangVersion() {
+        return yangVersion.getText();
+    }
+
+    public List<CodeGeneratorConfig> getCodeGenerators() {
+        List<CodeGeneratorConfig> list = new ArrayList<CodeGeneratorConfig>();
+        for (TableItem item : generatorsTable.getItems()) {
+            list.add((CodeGeneratorConfig) item.getData());
+        }
+        return list;
+    }
+}
diff --git a/pom.xml b/pom.xml
new file mode 100644 (file)
index 0000000..1e9f7c7
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- ============================================================================== -->
+<!-- Copyright (c) 2014 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                  -->
+<!-- ============================================================================== -->
+<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">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>com.cisco.yangide</groupId>
+  <artifactId>com.cisco.yangide.parent</artifactId>
+  <version>1.1.1-SNAPSHOT</version>
+  <packaging>pom</packaging>
+  <name>YANG IDE Parent</name>
+
+  <parent>
+    <groupId>org.opendaylight.odlparent</groupId>
+    <artifactId>odlparent</artifactId>
+    <version>1.6.0-SNAPSHOT</version>
+  </parent>
+
+  <properties>
+    <tycho-version>0.24.0</tycho-version>
+    <tycho-extras-version>0.24.0</tycho-extras-version>
+  </properties>
+
+  <modules>
+    <!-- plugins -->
+    <module>plugins/com.cisco.yangide.core</module>
+    <module>plugins/com.cisco.yangide.ui</module>
+    <module>plugins/com.cisco.yangide.editor</module>
+    <module>plugins/com.cisco.yangide.m2e.yang</module>
+    <!-- ext plugins -->
+    <module>plugins/com.cisco.yangide.ext.refactoring</module>
+    <module>plugins/com.cisco.yangide.ext.model</module>
+    <module>plugins/com.cisco.yangide.ext.model.editor</module>
+    <!-- features -->
+    <module>features/com.cisco.yangide.m2e.yang.feature</module>
+    <module>features/com.cisco.yangide.feature</module>
+    <!-- tests -->
+<!--
+    <module>plugins/com.cisco.yangide.m2e.yang.tests</module>
+    <module>plugins/com.cisco.yangide.core.tests</module>
+-->
+    <!-- other -->
+    <module>product/target-platform</module>
+    <module>product/update-site</module>
+  </modules>
+
+  <repositories>
+    <repository>
+      <layout>p2</layout>
+      <id>mars</id>
+      <url>http://download.eclipse.org/releases/mars/</url>
+    </repository>
+    <repository>
+      <layout>p2</layout>
+      <id>sonatype</id>
+      <url>https://repository.sonatype.org/content/repositories/forge-sites/m2e-extras/0.15.0/N/0.15.0.201206251206/</url>
+    </repository>
+    <!--repository>
+      <layout>p2</layout>
+      <id>emf-compare</id>
+      <url>http://download.eclipse.org/modeling/emf/compare/updates/releases/</url>
+    </repository-->
+  </repositories>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.eclipse.tycho</groupId>
+        <artifactId>tycho-maven-plugin</artifactId>
+        <version>${tycho-version}</version>
+        <extensions>true</extensions>
+      </plugin>
+      <plugin>
+        <groupId>org.eclipse.tycho</groupId>
+        <artifactId>tycho-source-plugin</artifactId>
+        <version>${tycho-version}</version>
+        <executions>
+          <execution>
+            <id>plugin-source</id>
+            <goals>
+              <goal>plugin-source</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.eclipse.tycho.extras</groupId>
+        <artifactId>tycho-source-feature-plugin</artifactId>
+        <version>${tycho-extras-version}</version>
+        <executions>
+          <execution>
+            <id>source-feature</id>
+            <phase>package</phase>
+            <goals>
+              <goal>source-feature</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.eclipse.tycho</groupId>
+        <artifactId>tycho-p2-plugin</artifactId>
+        <version>${tycho-version}</version>
+        <executions>
+          <execution>
+            <id>attach-p2-metadata</id>
+            <phase>package</phase>
+            <goals>
+              <goal>p2-metadata</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.eclipse.tycho</groupId>
+        <artifactId>target-platform-configuration</artifactId>
+        <version>${tycho-version}</version>
+        <configuration>
+          <target>
+            <artifact>
+              <groupId>com.cisco.yangide</groupId>
+              <artifactId>com.cisco.yangide.target-platform</artifactId>
+              <version>1.1.1-SNAPSHOT</version>
+            </artifact>
+          </target>
+          <environments>
+            <environment>
+              <os>linux</os>
+              <ws>gtk</ws>
+              <arch>x86</arch>
+            </environment>
+            <environment>
+              <os>linux</os>
+              <ws>gtk</ws>
+              <arch>x86_64</arch>
+            </environment>
+            <environment>
+              <os>win32</os>
+              <ws>win32</ws>
+              <arch>x86</arch>
+            </environment>
+            <environment>
+              <os>win32</os>
+              <ws>win32</ws>
+              <arch>x86_64</arch>
+            </environment>
+            <environment>
+              <os>macosx</os>
+              <ws>cocoa</ws>
+              <arch>x86_64</arch>
+            </environment>
+          </environments>
+        </configuration>
+      </plugin>
+         <plugin>
+               <!-- This project is NOT producing an API, so there's no point in generating 
+                       javadoc for it. -->
+               <groupId>org.apache.maven.plugins</groupId>
+               <artifactId>maven-javadoc-plugin</artifactId>
+               <configuration>
+                       <skip>true</skip>
+               </configuration>
+         </plugin>
+    </plugins>
+  </build>
+
+  <profiles>
+    <profile>
+      <id>test</id>
+      <modules>
+        <module>tests</module>
+      </modules>
+    </profile>
+
+  </profiles>
+</project>
diff --git a/product/codeformatter.xml b/product/codeformatter.xml
new file mode 100644 (file)
index 0000000..e9a5f85
--- /dev/null
@@ -0,0 +1,291 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<profiles version="12">
+<profile kind="CodeFormatterProfile" name="Yang IDE" version="12">
+<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="2"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
+<setting id="org.eclipse.jdt.core.compiler.source" value="1.7"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="120"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="0"/>
+<setting id="org.eclipse.jdt.core.compiler.problem.assertIdentifier" value="error"/>
+<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.compiler.problem.enumIdentifier" value="error"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
+<setting id="org.eclipse.jdt.core.compiler.compliance" value="1.7"/>
+<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode" value="enabled"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="100"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.wrap_before_binary_operator" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.compiler.codegen.targetPlatform" value="1.7"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="80"/>
+<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
+</profile>
+</profiles>
diff --git a/product/codetemplates.xml b/product/codetemplates.xml
new file mode 100644 (file)
index 0000000..a8606d8
--- /dev/null
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><templates><template autoinsert="true" context="gettercomment_context" deleted="false" description="Comment for getter method" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name="gettercomment">/**
+ * @return the ${bare_field_name}
+ */</template><template autoinsert="true" context="settercomment_context" deleted="false" description="Comment for setter method" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.settercomment" name="settercomment">/**
+ * @param ${param} the ${bare_field_name} to set
+ */</template><template autoinsert="true" context="constructorcomment_context" deleted="false" description="Comment for created constructors" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name="constructorcomment">/**
+ * ${tags}
+ */</template><template autoinsert="false" context="filecomment_context" deleted="false" description="Comment for created Java files" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.filecomment" name="filecomment">/*
+ * Copyright (c) 2014 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
+ */ </template><template autoinsert="false" context="typecomment_context" deleted="false" description="Comment for created types" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.typecomment" name="typecomment">/**
+ * @author ${user}
+ * @date   ${date}
+ * ${tags}
+ */</template><template autoinsert="true" context="fieldcomment_context" deleted="false" description="Comment for fields" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name="fieldcomment">/**
+ * 
+ */</template><template autoinsert="true" context="methodcomment_context" deleted="false" description="Comment for non-overriding methods" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name="methodcomment">/**
+ * ${tags}
+ */</template><template autoinsert="false" context="overridecomment_context" deleted="false" description="Comment for overriding methods" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name="overridecomment"/><template autoinsert="true" context="delegatecomment_context" deleted="false" description="Comment for delegate methods" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name="delegatecomment">/**
+ * ${tags}
+ * ${see_to_target}
+ */</template><template autoinsert="true" context="newtype_context" deleted="false" description="Newly created files" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.newtype" name="newtype">${filecomment}
+${package_declaration}
+
+${typecomment}
+${type_declaration}</template><template autoinsert="true" context="classbody_context" deleted="false" description="Code in new class type bodies" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.classbody" name="classbody">
+</template><template autoinsert="true" context="interfacebody_context" deleted="false" description="Code in new interface type bodies" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name="interfacebody">
+</template><template autoinsert="true" context="enumbody_context" deleted="false" description="Code in new enum type bodies" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.enumbody" name="enumbody">
+</template><template autoinsert="true" context="annotationbody_context" deleted="false" description="Code in new annotation type bodies" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name="annotationbody">
+</template><template autoinsert="true" context="catchblock_context" deleted="false" description="Code in new catch blocks" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.catchblock" name="catchblock">// ${todo} Auto-generated catch block
+${exception_var}.printStackTrace();</template><template autoinsert="true" context="methodbody_context" deleted="false" description="Code in created method stubs" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.methodbody" name="methodbody">// ${todo} Auto-generated method stub
+${body_statement}</template><template autoinsert="true" context="constructorbody_context" deleted="false" description="Code in created constructor stubs" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name="constructorbody">${body_statement}
+// ${todo} Auto-generated constructor stub</template><template autoinsert="true" context="getterbody_context" deleted="false" description="Code in created getters" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.getterbody" name="getterbody">return ${field};</template><template autoinsert="true" context="setterbody_context" deleted="false" description="Code in created setters" enabled="true" id="org.eclipse.jdt.ui.text.codetemplates.setterbody" name="setterbody">${field} = ${param};</template></templates>
\ No newline at end of file
diff --git a/product/m2e-yang-catalog.xml b/product/m2e-yang-catalog.xml
new file mode 100644 (file)
index 0000000..4ce8eb6
--- /dev/null
@@ -0,0 +1,25 @@
+<catalog>
+  <catalogItems>
+    <catalogItem>
+      <categoryId>org.eclipse.m2e.discovery.category.lifecycles</categoryId>
+      <m2e-versions>1.4,1.5</m2e-versions>
+      <description>yang</description>
+      <groupId>lifecycles</groupId>
+      <id>org.eclipse.m2e.discovery.lifecyclemapping.yang</id>
+      <kind>lifecycles</kind>
+      <license>EPL</license>
+      <name>yang</name>
+      <provider>Cisco Systems, Inc.</provider>
+      <p2>
+        <repositoryUrl>@REPO_URL@</repositoryUrl>
+        <iuId>com.cisco.yangide.m2e.yang.feature.group</iuId>
+        <lifecycleMappingIU>
+          <iuId>com.cisco.yangide.m2e.yang</iuId>
+        </lifecycleMappingIU>
+      </p2>
+      <overview>
+        <summary>yang</summary>
+      </overview>
+    </catalogItem>  
+  </catalogItems>
+</catalog>
\ No newline at end of file
diff --git a/product/rfc6020.pdf b/product/rfc6020.pdf
new file mode 100644 (file)
index 0000000..7dec37b
Binary files /dev/null and b/product/rfc6020.pdf differ
diff --git a/product/target-platform/.gitignore b/product/target-platform/.gitignore
new file mode 100644 (file)
index 0000000..b83d222
--- /dev/null
@@ -0,0 +1 @@
+/target/
diff --git a/product/target-platform/.project b/product/target-platform/.project
new file mode 100644 (file)
index 0000000..381e4a7
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>com.cisco.yangide.target-platform</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.m2e.core.maven2Builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.m2e.core.maven2Nature</nature>
+       </natures>
+</projectDescription>
diff --git a/product/target-platform/.settings/org.eclipse.core.resources.prefs b/product/target-platform/.settings/org.eclipse.core.resources.prefs
new file mode 100644 (file)
index 0000000..99f26c0
--- /dev/null
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/product/target-platform/com.cisco.yangide.target-platform.target b/product/target-platform/com.cisco.yangide.target-platform.target
new file mode 100644 (file)
index 0000000..08ae975
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?pde version="3.8"?><target includeMode="feature" name="YANG IDE Target Platform" sequenceNumber="26">
+<locations>
+<location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit">
+<unit id="com.google.guava" version="15.0.0.v201403281430"/>
+<unit id="com.google.guava.source" version="15.0.0.v201403281430"/>
+<repository location="http://download.eclipse.org/tools/orbit/downloads/drops/R20140525021250/repository/"/>
+</location>
+<location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit">
+<unit id="org.eclipse.rcp.sdk.id" version="4.5.1.M20150904-0015"/>
+<unit id="org.eclipse.graphiti.feature.feature.group" version="0.12.1.v20150916-0905"/>
+<unit id="org.sonatype.m2e.mavenarchiver.feature.feature.group" version="0.17.0.201502101659-signed-20150525172209"/>
+<unit id="org.eclipse.emf.sdk.feature.group" version="2.11.1.v20150806-0404"/>
+<unit id="org.eclipse.emf.compare.source.feature.group" version="3.1.1.201509120604"/>
+<unit id="org.eclipse.graphiti.feature.tools.feature.group" version="0.12.1.v20150916-0905"/>
+<unit id="org.eclipse.graphiti.sdk.feature.feature.group" version="0.12.1.v20150916-0905"/>
+<unit id="org.eclipse.emf.compare.feature.group" version="3.1.1.201509120604"/>
+<unit id="org.eclipse.sdk.ide" version="4.5.1.M20150904-0015"/>
+<unit id="org.eclipse.graphiti.sdk.plus.feature.feature.group" version="0.12.1.v20150916-0905"/>
+<unit id="org.eclipse.m2e.sdk.feature.feature.group" version="1.6.2.20150902-0002"/>
+<unit id="org.eclipse.emf.compare.ide.ui.feature.group" version="3.1.1.201509120604"/>
+<unit id="org.eclipse.gef.feature.group" version="3.10.1.201508170204"/>
+<unit id="org.eclipse.m2e.feature.feature.group" version="1.6.2.20150902-0002"/>
+<unit id="org.eclipse.gef.sdk.feature.group" version="3.10.1.201508170204"/>
+<unit id="org.eclipse.jdt.feature.group" version="3.11.1.v20150904-0015"/>
+<repository location="http://download.eclipse.org/releases/mars/"/>
+</location>
+<location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="planner" includeSource="true" type="InstallableUnit">
+<unit id="org.sonatype.m2e.buildhelper.feature.feature.group" version="0.15.0.201206251206"/>
+<repository location="https://repository.sonatype.org/content/repositories/forge-sites/m2e-extras/0.15.0/N/0.15.0.201206251206/"/>
+</location>
+</locations>
+</target>
diff --git a/product/target-platform/pom.xml b/product/target-platform/pom.xml
new file mode 100644 (file)
index 0000000..0d5d761
--- /dev/null
@@ -0,0 +1,17 @@
+<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/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>com.cisco.yangide</groupId>
+    <artifactId>com.cisco.yangide.parent</artifactId>
+    <version>1.1.1-SNAPSHOT</version>
+    <relativePath>../..</relativePath>
+  </parent>
+  
+  <artifactId>com.cisco.yangide.target-platform</artifactId>
+  <packaging>eclipse-target-definition</packaging>
+  <version>1.1.1-SNAPSHOT</version>
+
+</project>
\ No newline at end of file
diff --git a/product/update-site/category.xml b/product/update-site/category.xml
new file mode 100644 (file)
index 0000000..200e5f8
--- /dev/null
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<site>
+   <feature url="features/com.cisco.yangide.feature_1.1.1.qualifier.jar" id="com.cisco.yangide.feature" version="1.1.1.qualifier">
+      <category name="yang-ide"/>
+   </feature>
+   <feature url="features/com.cisco.yangide.m2e.yang.feature_1.1.1.qualifier.jar" id="com.cisco.yangide.m2e.yang.feature" version="1.1.1.qualifier">
+      <category name="yang-ide"/>
+   </feature>
+   <feature url="features/com.cisco.yangide.feature.source_1.1.1.qualifier.jar" id="com.cisco.yangide.feature.source" version="1.1.1.qualifier">
+      <category name="yang-ide"/>
+   </feature>
+   <feature url="features/com.cisco.yangide.m2e.yang.feature.source_1.1.1.qualifier.jar" id="com.cisco.yangide.m2e.yang.feature.source" version="1.1.1.qualifier">
+      <category name="yang-ide"/>
+   </feature>
+   <category-def name="yang-ide" label="YANG IDE"/>
+</site>
diff --git a/product/update-site/pom.xml b/product/update-site/pom.xml
new file mode 100644 (file)
index 0000000..9e43623
--- /dev/null
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>com.cisco.yangide</groupId>
+    <artifactId>com.cisco.yangide.parent</artifactId>
+    <version>1.1.1-SNAPSHOT</version>
+    <relativePath>../..</relativePath>
+  </parent>
+  
+  <artifactId>com.cisco.yangide.update-site</artifactId>
+  <packaging>eclipse-repository</packaging>
+  <version>1.1.1-SNAPSHOT</version>
+</project>
diff --git a/product/yang-ide/.project b/product/yang-ide/.project
new file mode 100644 (file)
index 0000000..e1aed4b
--- /dev/null
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>yang-ide</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+       </buildSpec>
+       <natures>
+       </natures>
+</projectDescription>
diff --git a/samples/yang-module1/.gitignore b/samples/yang-module1/.gitignore
new file mode 100644 (file)
index 0000000..b77461b
--- /dev/null
@@ -0,0 +1,3 @@
+/target/
+/.settings/
+.classpath
\ No newline at end of file
diff --git a/samples/yang-module1/.project b/samples/yang-module1/.project
new file mode 100644 (file)
index 0000000..441d568
--- /dev/null
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>yang-module1</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.m2e.core.maven2Builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+               <nature>org.eclipse.m2e.core.maven2Nature</nature>
+       </natures>
+</projectDescription>
diff --git a/samples/yang-module1/pom.xml b/samples/yang-module1/pom.xml
new file mode 100644 (file)
index 0000000..31650ae
--- /dev/null
@@ -0,0 +1,81 @@
+<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">
+       <modelVersion>4.0.0</modelVersion>
+       <groupId>yang-test</groupId>
+       <artifactId>yang-module1</artifactId>
+       <version>0.0.1-SNAPSHOT</version>
+       <properties>
+               <maven.compiler.source>1.7</maven.compiler.source>
+               <maven.compiler.target>1.7</maven.compiler.target>
+       </properties>
+       <dependencies>
+               <dependency>
+                       <groupId>org.opendaylight.yangtools</groupId>
+                       <artifactId>yang-binding</artifactId>
+                       <version>0.6.2-Helium</version>
+               </dependency>
+               <dependency>
+                       <groupId>yang-test</groupId>
+                       <artifactId>yang-module2</artifactId>
+                       <version>0.0.1-SNAPSHOT</version>
+               </dependency>
+       </dependencies>
+       <repositories>
+               <repository>
+                       <id>opendaylight-release</id>
+                       <name>opendaylight-release</name>
+                       <url>http://nexus.opendaylight.org/content/repositories/opendaylight.release/</url>
+               </repository>
+               <repository>
+                       <id>opendaylight-snapshot</id>
+                       <name>opendaylight-snapshot</name>
+                       <url>http://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/</url>
+               </repository>
+       </repositories>
+       <pluginRepositories>
+               <pluginRepository>
+                       <id>opendaylight-release</id>
+                       <name>opendaylight-release</name>
+                       <url>http://nexus.opendaylight.org/content/repositories/opendaylight.release/</url>
+               </pluginRepository>
+               <pluginRepository>
+                       <id>opendaylight-snapshot</id>
+                       <name>opendaylight-snapshot</name>
+                       <url>http://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/</url>
+               </pluginRepository>
+       </pluginRepositories>
+       <build>
+               <plugins>
+                       <plugin>
+                               <groupId>org.opendaylight.yangtools</groupId>
+                               <artifactId>yang-maven-plugin</artifactId>
+                               <version>0.6.2-Helium</version>
+                               <executions>
+                                       <execution>
+                                               <id>generate-sources</id>
+                                               <goals>
+                                                       <goal>generate-sources</goal>
+                                               </goals>
+                                               <configuration>
+                                                       <yangFilesRootDir>src/main/yang</yangFilesRootDir>
+                                                       <codeGenerators>
+                                                               <generator>
+                                                                       <codeGeneratorClass>org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl</codeGeneratorClass>
+                                                                       <outputBaseDir>target/generated-sources/sal</outputBaseDir>
+                                                               </generator>
+                                                       </codeGenerators>
+                                                       <inspectDependencies>true</inspectDependencies>
+                                               </configuration>
+                                       </execution>
+                               </executions>
+                               <dependencies>
+                                       <dependency>
+                                               <groupId>org.opendaylight.yangtools</groupId>
+                                               <artifactId>maven-sal-api-gen-plugin</artifactId>
+                                               <version>0.6.2-Helium</version>
+                                       </dependency>
+                               </dependencies>
+                       </plugin>
+               </plugins>
+       </build>
+</project>
\ No newline at end of file
diff --git a/samples/yang-module1/src/main/yang/acme-system.yang b/samples/yang-module1/src/main/yang/acme-system.yang
new file mode 100644 (file)
index 0000000..b1451a2
--- /dev/null
@@ -0,0 +1,52 @@
+// Contents of "acme-system.yang"
+module acme-system {
+    namespace "http://acme.example.com/system";
+    prefix "acme";
+    
+    import yang-ext {prefix ext; revision-date "2013-07-09";}
+    
+    organization "ACME Inc.";
+    contact "joe@acme.example.com";
+    
+    description
+        "The module for entities implementing the ACME system.";
+    
+    revision 2007-06-09 {
+        description "Initial revision.";
+    }
+    
+    container system {
+        leaf host-name {
+            type string;
+            description "Hostname for this system";
+        }
+    
+        leaf-list domain-search {
+            type string;
+            description "List of domain names to search";
+        }
+    
+        container login {
+            leaf message {
+                type string;
+                description
+                    "Message given at start of login session";
+            }
+    
+            list user {
+                key "name";
+                leaf name {
+                    type string;
+                }
+    
+                leaf full-name {
+                    type string;
+                }
+                
+                leaf class {
+                    type string;
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/samples/yang-module2/.gitignore b/samples/yang-module2/.gitignore
new file mode 100644 (file)
index 0000000..b77461b
--- /dev/null
@@ -0,0 +1,3 @@
+/target/
+/.settings/
+.classpath
\ No newline at end of file
diff --git a/samples/yang-module2/.project b/samples/yang-module2/.project
new file mode 100644 (file)
index 0000000..510b8ea
--- /dev/null
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>yang-module2</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.m2e.core.maven2Builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+               <nature>org.eclipse.m2e.core.maven2Nature</nature>
+       </natures>
+</projectDescription>
diff --git a/samples/yang-module2/pom.xml b/samples/yang-module2/pom.xml
new file mode 100644 (file)
index 0000000..1972781
--- /dev/null
@@ -0,0 +1,75 @@
+<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">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>yang-test</groupId>
+  <artifactId>yang-module2</artifactId>
+  <version>0.0.1-SNAPSHOT</version>
+  <properties>
+    <maven.compiler.source>1.7</maven.compiler.source>
+    <maven.compiler.target>1.7</maven.compiler.target>
+  </properties>
+  <dependencies>
+    <dependency>
+      <groupId>org.opendaylight.yangtools</groupId>
+      <artifactId>yang-binding</artifactId>
+      <version>0.6.2-Helium</version>
+    </dependency>
+  </dependencies>
+  <repositories>
+    <repository>
+      <id>opendaylight-release</id>
+      <name>opendaylight-release</name>
+      <url>http://nexus.opendaylight.org/content/repositories/opendaylight.release/</url>
+    </repository>
+    <repository>
+      <id>opendaylight-snapshot</id>
+      <name>opendaylight-snapshot</name>
+      <url>http://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/</url>
+    </repository>
+  </repositories>
+  <pluginRepositories>
+    <pluginRepository>
+      <id>opendaylight-release</id>
+      <name>opendaylight-release</name>
+      <url>http://nexus.opendaylight.org/content/repositories/opendaylight.release/</url>
+    </pluginRepository>
+    <pluginRepository>
+      <id>opendaylight-snapshot</id>
+      <name>opendaylight-snapshot</name>
+      <url>http://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/</url>
+    </pluginRepository>
+  </pluginRepositories>
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.opendaylight.yangtools</groupId>
+        <artifactId>yang-maven-plugin</artifactId>
+        <version>0.6.2-Helium</version>
+        <executions>
+          <execution>
+            <id>generate-sources</id>
+            <goals>
+              <goal>generate-sources</goal>
+            </goals>
+            <configuration>
+              <yangFilesRootDir>src/main/yang</yangFilesRootDir>
+              <codeGenerators>
+                <generator>
+                  <codeGeneratorClass>org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl</codeGeneratorClass>
+                  <outputBaseDir>target/generated-sources/sal</outputBaseDir>
+                </generator>
+              </codeGenerators>
+              <inspectDependencies>true</inspectDependencies>
+            </configuration>
+          </execution>
+        </executions>
+        <dependencies>
+          <dependency>
+            <groupId>org.opendaylight.yangtools</groupId>
+            <artifactId>maven-sal-api-gen-plugin</artifactId>
+            <version>0.6.2-Helium</version>
+          </dependency>
+        </dependencies>
+      </plugin>
+    </plugins>
+  </build>
+</project>
\ No newline at end of file
diff --git a/samples/yang-module2/src/main/yang/yang-ext.yang b/samples/yang-module2/src/main/yang/yang-ext.yang
new file mode 100644 (file)
index 0000000..0fbe94d
--- /dev/null
@@ -0,0 +1,79 @@
+module yang-ext {
+    yang-version 1;
+    namespace "urn:opendaylight:yang:extension:yang-ext";
+    prefix "ext";
+    
+    contact "Anton Tkacik <ttkacik@cisco.com>";
+
+    description 
+            "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";
+
+    revision "2013-07-09" {
+        description "";
+    }
+
+    // Augmentation name
+
+    extension "augment-identifier" {
+        description 
+           "YANG language extension which assigns an identifier to 
+            augmentation. Augment identifier is used to identify
+            specific augment statement by name. 
+
+            The identifier syntax is defined formally defined by the rule
+            'identifier' in Section 12 of RFC 6020.
+
+            All augment identifiers defined in a namespace MUST be unique.
+            The namespace of augment identifiers is shared by module and
+            its submodules.";
+
+            /*
+                Discussion:
+                This extension allows for ease of development / debug
+                of YANG modules and it is suitable for code generation,
+                where each augment statement is nicely identified by
+                unique name instead of combination of augment target
+                and when condition. 
+            */
+        argument "identifier";
+    }
+
+
+    // Context-aware RPCs
+
+    grouping rpc-context-ref {
+        description 
+           "A reference to RPC context.";
+        leaf context-instance {
+            type instance-identifier;
+            description "Pointer to the context. ";
+        }
+    }
+
+    extension "rpc-context-instance" {
+        description
+           "YANG language extension which defines enclosing (parent) 
+            schema node as referencable context for RPCs.
+
+            The argument is identity which is used to identify RPC context
+            type.";
+
+        argument "context-type";
+    }
+
+    extension "context-reference" {
+        argument "context-type";
+    }
+
+    extension "context-instance" {
+        argument "context-type";
+    }
+    
+    extension "instance-target" {
+       argument "path";
+    }
+}
diff --git a/tests/com.cisco.yangide.editor.test/.gitignore b/tests/com.cisco.yangide.editor.test/.gitignore
new file mode 100644 (file)
index 0000000..b77461b
--- /dev/null
@@ -0,0 +1,3 @@
+/target/
+/.settings/
+.classpath
\ No newline at end of file
diff --git a/tests/com.cisco.yangide.editor.test/.project b/tests/com.cisco.yangide.editor.test/.project
new file mode 100644 (file)
index 0000000..b235f67
--- /dev/null
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>com.cisco.yangide.editor.test</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.rcptt.core.builder.q7Builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.m2e.core.maven2Builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.m2e.core.maven2Nature</nature>
+               <nature>org.eclipse.rcptt.core.rcpttnature</nature>
+       </natures>
+</projectDescription>
diff --git a/tests/com.cisco.yangide.editor.test/Contexts/ModelFlowProjectFolder.ctx b/tests/com.cisco.yangide.editor.test/Contexts/ModelFlowProjectFolder.ctx
new file mode 100644 (file)
index 0000000..1846cf2
--- /dev/null
@@ -0,0 +1,88 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Context-Type: org.eclipse.rcptt.ctx.filesystem
+Element-Name: ModelFlowProjectFolder
+Element-Type: context
+Element-Version: 2.0
+Id: _JCn2oBPREeSaxLxF-fnitg
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/25/14 3:30 PM
+
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf
+Content-Type: q7/binary
+Entry-Name: .q7.content
+
+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
+dFBLBQYAAAAAAQABADYAAACrEAAAAAA=
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf--
diff --git a/tests/com.cisco.yangide.editor.test/Contexts/YangIDEpreferencesContext.ctx b/tests/com.cisco.yangide.editor.test/Contexts/YangIDEpreferencesContext.ctx
new file mode 100644 (file)
index 0000000..9915929
--- /dev/null
@@ -0,0 +1,210 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Context-Type: org.eclipse.rcptt.ctx.preferences
+Element-Name: YangIDEpreferencesContext
+Element-Type: context
+Element-Version: 2.0
+Id: _zefAMAwDEeSdascDp4ftXw
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/25/14 12:57 PM
+
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf
+Content-Type: q7/binary
+Entry-Name: .q7.content
+
+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
+dFBLBQYAAAAAAQABADYAAABDLQAAAAA=
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf--
diff --git a/tests/com.cisco.yangide.editor.test/Contexts/YangIDEworkbenchCleanContext.ctx b/tests/com.cisco.yangide.editor.test/Contexts/YangIDEworkbenchCleanContext.ctx
new file mode 100644 (file)
index 0000000..6a4fead
--- /dev/null
@@ -0,0 +1,23 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Context-Type: org.eclipse.rcptt.ctx.workbench
+Element-Name: YangIDEworkbenchCleanContext
+Element-Type: context
+Element-Version: 2.0
+Id: _WP1mMBPOEeSaxLxF-fnitg
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/25/14 2:36 PM
+
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf
+Content-Type: q7/binary
+Entry-Name: .q7.content
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSVkU1LAzEQhu+C/yHk3sR6kmW3BXWF
+lZYuCFZPku5O09hkErLZj59vWm3rwSK9Tp5n5p1JOh2MJh34RlnM6JjdUAJY2VqhzGgb1qM7Op1cX6XW
+SwaVVq4B5isXAmsqQOGVTZbWb1dR2jxYDDAEMhiVHFve7lrGIdgksZ7RTQgu4bzve2aNZLEvf5sXB+T8
+mKN5eN6Ze4QbW4PmBzD61gMlKAxk9F2gLB7z/phRg8CfoJSoOqMfy3Js5vflIocXMcyGp9EaVZCUuLiC
+gyqoDorI/Y72WQfWKvYsOlGeKBoPRUjaKeibyR94KaqtkJAPTseEPuXf5BnJ1fEELQZlgM2sfI3AP0Yc
+sS+y0tuVBnOJsj8JhkUbtEI4WSm/4Ocj/wVQSwcINx3awyABAABRAgAAUEsBAhQAFAAICAgAAAAhADcd
+2sMgAQAAUQIAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAFYBAAAAAA==
+
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf--
diff --git a/tests/com.cisco.yangide.editor.test/Contexts/YangIDEworkbenchFileContext.ctx b/tests/com.cisco.yangide.editor.test/Contexts/YangIDEworkbenchFileContext.ctx
new file mode 100644 (file)
index 0000000..416539c
--- /dev/null
@@ -0,0 +1,24 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Context-Type: org.eclipse.rcptt.ctx.workbench
+Element-Name: YangIDEworkbenchFileContext
+Element-Type: context
+Element-Version: 2.0
+Id: _aHkbQAwDEeSdascDp4ftXw
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 1:06 PM
+
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf
+Content-Type: q7/binary
+Entry-Name: .q7.content
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTFk19v0zAUxd+R+A6R32N3gwcUJZsQ
+LaJoiKJJsD0h17lNTP1P9m3dfntuMtrSaRPaE6/275x7zk1cX++sKbYQk/auYRd8wgpwyrfadQ3b4Kp8
+x66vXr+qfew4KKNDAh5VQORJgZNR++qHj+slifoP3iHssNhZXR0tLwdLGuJSRecN6xFDJUTOmXvbcfIV
+d1/mRySdI/nNSFxOJheE3dyqHqwstUsonYKD6vlwR7PD9eA2IsL6Fow4gKT3kQydtNCwe+m6+XSWD80+
+agN/2rFCtw37KT+tl9/e5+kMbluZ1DS8XeFdZkWg3gEU6i3Mifs72a8W+Ubzz3IrFyeK0XaLooZWo4+p
+oAVUuA9wLn208SHObBTQQIl9w8Yy5cr4XNJqUCfUKokUlbBSO7GnPsIHcK3cG931+BjlA8HE/8lyosph
+3HmYrYacrp7Y40KqtexgtguGvlysxQP5jCi0lHzjUFvgN777TsA/FDRiPOSL6JcG7Esk47/i8OsGjXZw
+UtXiBe+I+N9QSwcIvYSAkIYBAACfAwAAUEsBAhQAFAAICAgAAAAhAL2EgJCGAQAAnwMAAAgAAAAAAAAA
+AAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAALwBAAAAAA==
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf--
diff --git a/tests/com.cisco.yangide.editor.test/Contexts/YangIDEworkspaceCleanContext.ctx b/tests/com.cisco.yangide.editor.test/Contexts/YangIDEworkspaceCleanContext.ctx
new file mode 100644 (file)
index 0000000..1104256
--- /dev/null
@@ -0,0 +1,21 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Context-Type: org.eclipse.rcptt.ctx.workspace
+Element-Name: YangIDEworkspaceCleanContext
+Element-Type: context
+Element-Version: 2.0
+Id: _kWZHoBPCEeSaxLxF-fnitg
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/25/14 1:25 PM
+
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf
+Content-Type: q7/binary
+Entry-Name: .q7.content
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSVkEFrg0AQhe+B/Idl7u62OQXRCLWW
+CC0EckjbS1jWdbuos6LTuj8/a6heS2/D43vvzUyS+a5lP3oYrcMUHvkDMI3KVRZNCt9UR3vIDttN4gbD
+tWptP2o+qJ6IK/J8ckMz9lLp+LJMuUPSnpjvbLzm7ubc0IRjHPQUvoj6WIhpmrjrDA/h4v2tXJA/ulb7
+wsz2OycCJ1YOGMou0B8STflcrHreaom/awKzVQrX5vJ5dE+nvNBn6V/9S1SjJQPhcMYSNaNIYn6D+O8f
+gukGUEsHCJu5mEDNAAAAZAEAAFBLAQIUABQACAgIAAAAIQCbuZhAzQAAAGQBAAAIAAAAAAAAAAAAAAAA
+AAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAAADAQAAAAA=
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf--
diff --git a/tests/com.cisco.yangide.editor.test/Contexts/YangIDEworkspaceComplexContext.ctx b/tests/com.cisco.yangide.editor.test/Contexts/YangIDEworkspaceComplexContext.ctx
new file mode 100644 (file)
index 0000000..ec7516e
--- /dev/null
@@ -0,0 +1,5522 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Context-Type: org.eclipse.rcptt.ctx.workspace
+Element-Name: YangIDEworkspaceComplexContext
+Element-Type: context
+Element-Version: 2.0
+Id: _CN8X4Av8EeSdascDp4ftXw
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 12:37 PM
+
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupDescriptionOutputBuilder.java-e985d70c-afef-3285-a537-84a8c4efc1e1
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupDescriptionOutputBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupDescriptionOutputBuilder.java-e985d70c-afef-3285-a537-84a8c4efc1e1--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/flow/table/and/statistics/map/FlowTableAndStatisticsMap.java-3cacb548-1828-3a7b-8029-4773fe230af0
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/flow/table/and/statistics/map/FlowTableAndStatisticsMap.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStVN9vmzAQfkfif7DylETFCVSZNNJ2
+iqZtqrbsV/syTXtw4CDWsI3AaYeq/u87YzI8qUmTtkaygfPd993dZ5cs+c1yIKrKqSpBpqwpeL7WtGEy
+pzlIehPSTSX/N2aFuqWarQqgtWaa15onNa3gJjwNo3Dm2plM3T2ClXPf46JUlT4SVKgUCjeWbkroUKev
+oxn9ABIqnlwb3Kt/2x6B00oVtQVOlBBK0m+fmYDDvVZcphzXt2tepF+y4x0vU5CaZ9zQPt57sckF+h/g
+vLOwtlFONcNp9Iq2ZbxMnxr0WRKh79HaEljItG/lkpUfoUFG5pmMx75HxmSp0k0BRGLT4vaHGS6VwEAF
+LVTQw7Rbr5I1CEZKpte9788hJhO7EWITIW4jxH2EN5gMr7mS59E0PA3CKAhnIwcL03LwAkxr8gzrL8Nv
+4nvlZlXwhHCpocpYAmRnqdABB/zRmEhtPzqNnr1sK3cyuDixsI5GXxj6iSraEnv4xuiM7rk82yfIC9+7
+s5q0jl2LWjIJybhkBWkvFZwXy3fk/KibiCYVMA3DwWGqHJwMejnix15RDUbz+ZZ1d95JDrp7HY7m1mRn
+e+DMGJPvoJFOTb5WXLCqIVgFojLyA8mTTxifXONtst09sS/7SmhQcWkRfe/eTH8BUEsHCO9aFgPqAQAA
+mgYAAFBLAQIUABQACAgIAAAAIQDvWhYD6gEAAJoGAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBL
+BQYAAAAAAQABADYAAAAgAgAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/flow/table/and/statistics/map/FlowTableAndStatisticsMap.java-3cacb548-1828-3a7b-8029-4773fe230af0--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/MeterStatisticsUpdatedBuilder.java-d1332861-7e04-3652-b8e1-5a8a7a0cd6da
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/MeterStatisticsUpdatedBuilder.java
+
+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
+BgAAAAABAAEANgAAABcKAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/MeterStatisticsUpdatedBuilder.java-d1332861-7e04-3652-b8e1-5a8a7a0cd6da--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/$YangModuleInfoImpl.java-65b6a64d-6bd2-3bf4-b822-b3ebabd163be
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/$YangModuleInfoImpl.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTNVl1P2zAUfUfiP1jVJIKgLgGmjU+N
+Iab1gTKte5mmPbjJberh2FHsFCrEf9914tA4pAw2CS2q1CQ39/j6nnNPkrHomiVAVJ5QlYGM2ULwZGbo
+gsmEJiDpPKRFLv1gpnJDtWGGa8MjTXOYh3vhbrhPjtbXeGrD3YhGKaEr7AmXMcf/73hxqeJCwFBO1TL/
+F5szWhgu6BhM1+3PTM+8UKRSmiiVCKB4miqJf0JAZOgwTQvDJgIeQ3FFhzIrzNjkwNKO4NXFbQSZ4Upi
+MCsmgkdkyiUTJBJMa/LG38AwzQRBDAEpSKOJHyV362vrawSPLOdzZoCUXawRWw8PR+NvZ6PzC3JCJNx0
+rRRsHrUBKyTcDjaXSJYCZveaRPTt/vpL9npHfwDQGYtKFNTBYRPp0CIdPhMJNcI1dtEC7e6Ee/1wtx/u
+/yFFqyKP4AszM5s2uLz4dtYfjj4NrIIGT22q1FgN3rkEmGO/n6ekoh7i6p5etrZi3VHVIikBM5QYkhEE
+m5Zf4o4cDDbsgURXy32br05WmzhdlWowThRuCo5PSynUORinLI6Dl411qmIQzbk2iwzcdO8c7L6lHbVS
+b///XsNUqBtqciY1i+zQOW8Jd/ZeY3Uu5zi1Kl+4Tb8PD15j2TIItwaknZCHS1fEu50XFtHSMSqlaYDo
+itniahpgqc2khgui0su/ky5x0tL27OJf3Xie6SotaM6rV8+UBDUkqrYQwhO4PcwsVzeloIdo2QkTY1Qh
+PFhv0KsXIxs9suU7wxbpbRCuScq1RtvoNZe+X56afNFetSoKd6Q0ePNzTyJmohkJGvZPwKt6MCAPNQlg
+19tkUhjcB+Rgi5HKzKyH3QBCSRKrRzXdN83pw9Uc8pzH4DmO80Hs9Qh9uNNerEEf/QXgV2fHnaC1V/8N
+8Kh+Y6wst4w+H7opTMSv1DguG+90t1nJR5MmW3f/obSvugTdpednyNk1VNffLc8lquNtYo3Et4xO7h6/
+Hl8mDqOqk9brrbz3seAihpzoiXuvebcDnKWSl3NLULBZnjKpJI+YqEbDM+EJZZn116D3o7ciUH8ZYbft
+6Yqntv0PIPdweb0yo/mhU1JbXT7xvP+V05LDyryKDu1SWuSsyPrptaOW0IQuqVmyir/fUEsHCHrfLaJV
+AwAAHgwAAFBLAQIUABQACAgIAAAAIQB63y2iVQMAAB4MAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVu
+dFBLBQYAAAAAAQABADYAAACLAwAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/$YangModuleInfoImpl.java-65b6a64d-6bd2-3bf4-b822-b3ebabd163be--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetFlowStatisticsFromFlowTableOutputBuilder.java-26ef2b00-d2ee-379e-8353-86948c27be22
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetFlowStatisticsFromFlowTableOutputBuilder.java
+
+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
+AAAAAAEAAQA2AAAAcggAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetFlowStatisticsFromFlowTableOutputBuilder.java-26ef2b00-d2ee-379e-8353-86948c27be22--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/flow/capable/node/connector/queue/statistics/FlowCapableNodeConnectorQueueStatistics.java-97a67e45-8a8f-3315-89ad-832c9ab52fdb
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/flow/capable/node/connector/queue/statistics/FlowCapableNodeConnectorQueueStatistics.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS1U11PwjAUfV+y/9DwBIQVNiKJIBpC
+1CcwhEfjQ+nutsaunVuHEuN/t/vQTcHAEuySLt167j333HMjQp+JD0jGPpYRCJfsOPMDhXdE+NgHgbc2
+TmPx8+dLCingRBHFEsVogmPY2kPbsUfY4/IVUxKRDQcspAuYSiGAKhnvwSamwcJIxupweiUlTwoiVIah
+FHi1JCGcjtow4TL9ngeMuw9ec+As9UMQKqvlCPhPqUItAa9LpXYRlIINLp0LfA8CYkZXmTbrujTZ0+92
+TQN10UK6KQckdPnj/EO26nmsXFurypPfWtMAQoIiooIK9tjWJMd18DgHjyvwjabHEibF1BnYQ8t2LHvU
+yTprlZ21ss5a353dy97/t8tPWR1904jSDWcUMaEg9ggFdKeDzIsYSx1i/hXhl7Aarhe8KV1+eSjtcXW2
+GTiRynWvyF9z2fk4NJnDpoQPW9Y03gvTFpfKBuVZKPKYIBzl86v32eIWTRsNPaYxEAXt1lHvtnqtyrT6
+0MRcrc6kHLyPbPsEUEsHCBnaAeCKAQAAHQUAAFBLAQIUABQACAgIAAAAIQAZ2gHgigEAAB0FAAAIAAAA
+AAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAADAAQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/flow/capable/node/connector/queue/statistics/FlowCapableNodeConnectorQueueStatistics.java-97a67e45-8a8f-3315-89ad-832c9ab52fdb--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupDescriptionInput.java-d5e2b7ad-b2f7-31f7-92c9-4a6057f5e551
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupDescriptionInput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStUlFPwjAQfl+y/9DsCQgUJi86REPE
+EB/AqI/Gh647SnVrm+5GJMb/brdhBgkESbwtXXq77+6+784w/sEEEG0F1QZUwjapFCukG6YEFaDoOqSF
+Vfs/hdWFoTkylDlKnlML63AYOhv5nsyMtng4I2qd5nVurrNMK/q0YBn8HRVLlUj3nTJkj/E7cDyBPcpB
+qjUo1HZTNz+4DK/oQidwpxXCJz7D8vyuJoXIXFIWpyWl8ul3Or5HOmSukyIFohzZqHKUtpuyV2naazSt
+ol74CjJGDMNVA3ttOTLRLjiqwFEDvnWcZC61Gl8MwmEvDN3bFvBbJYGcW2nQBfQPe6UyBb6VJfu+Z4o4
+lZxIJ4xdMg5kBjgrIdMG8VACXLwzp55rLa8v+5J2a2czva1jR7jr/1pFeqzLG9/7qqdTF9/Sq3JwspSK
+paRaS3dO5vdkfNYuU26BIbSCk0MKukEzHXepNA/ao+3qfJfHD1BLBwjZ+3wDZwEAAKADAABQSwECFAAU
+AAgICAAAACEA2ft8A2cBAACgAwAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2
+AAAAnQEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupDescriptionInput.java-d5e2b7ad-b2f7-31f7-92c9-4a6057f5e551--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/$YangModelBindingProvider.java-6ae49d7d-fd7d-3a56-9b1a-65922018d8c1
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/$YangModelBindingProvider.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSVULEKwjAQ3Qv9hwwOdQlUwaWbWwfB
+1TFNr/EwXmpyKRTx301pUQQdPG457t67916v9EUZEM4b6XqgVo0WzZnlqMhIAySHUkZPn8tbhAgysGIM
+jDpID0O5LTflrsqzPOtjY1GLDklZoa0KQaxOie/gWrB7pBbJHL0bsAUv8NpbuAJx+C6CnbNhltPMUPmT
+6z59F6kWBX8SRgs1dU4Y4PdUrCdasZQHTmm87Cw3dfKQwuKaUiakoVhXM+SRZ6mfUEsHCKnTJmO+AAAA
+ZQEAAFBLAQIUABQACAgIAAAAIQCp0yZjvgAAAGUBAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBL
+BQYAAAAAAQABADYAAAD0AAAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/$YangModelBindingProvider.java-6ae49d7d-fd7d-3a56-9b1a-65922018d8c1--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/NodeMeterConfigStatsBuilder.java-25e612c4-89b9-3951-b400-721254b52383
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/NodeMeterConfigStatsBuilder.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS1VcGO0zAQvSPxD9NeNgFkUe2NUkD0
+1APsYY8IISd1UhfHCbZTtEL9d2wnbVLbCY26ZKV0Fb+ZefP8xq5w+hPnBEqRo7IifIufGM13Cj1hnqOc
+cHRYoFrwy8WCKCKQVFhRqWgqkSCHxf1CP8uXL2hRlUI9W0bEyy2R9t2ivpj3uuQZzR91gNQ1zV9VJ4ym
+kDIsJXzVcBf3uaZsSwT8MWjQTyXoASsCLhB+FOESNqgpM1Igik0Jgz3ChKjQGiRYknM686gdlcjjByuL
+1PIqN0UUL1syXg9etWB4v7ogSm9dUJ9zievaBRmo5RE6YFZf2b+FLj2qBj+BHSSGXrBpTn4HQzZFxSJT
+JvbqtP6ytk4hoxyzEX+aRKCnh5GCcBXGdObtNbLHB4yYGa+1Sf7+2UYvxOCDccnmxJJsN/olMpySS9F6
+wv1XOsjq2dv344VA7Q400k+a83744LaPGdwb3dvG1+vt08OBCEG3xPPD9Lm+YrYn1KdcwQ7L3Vqr49dp
+9sJgtLwF0b3fL5aXELMoiKyZ0qvu4nmhCX91+vAaoiig7Ap4zVgMH+EtvPO7Qx3R2CtkBWnST1chKUtG
+MAfyq8ZMRt2QPiR7kuoLMtl72tAM7FFiaIfWe7SUuDjuWmJuMp2kk2A4WaYZXpFN+8ieMHpTZ5Yg6r7c
+mH7wQCzVTg/TCoKzZhCxIeIaSJMd8UKAqRXLlApM52wk7h9dBjo9AtE4XTCa+W5szTLA5FaRw9bpga7x
+dWfkRyUoz0GVzT/+qLvQ89HY/q7spTqEiubBG/Db3B3U06RlVEhzMDj9XWONsS02ETb1oAFOhQcd0Gz5
+QHSrBsKVuQej+RvwOrRJ/E9upNfXKpjJCfNt5saEbeSkuft+F6POC77B7LmpX38BUEsHCJDFdveeAgAA
+dAwAAFBLAQIUABQACAgIAAAAIQCQxXb3ngIAAHQMAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBL
+BQYAAAAAAQABADYAAADUAgAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/NodeMeterConfigStatsBuilder.java-25e612c4-89b9-3951-b400-721254b52383--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/node/connector/statistics/and/port/number/map/NodeConnectorStatisticsAndPortNumberMapKey.java-66047f4f-a0c0-3941-91c8-6ea9806cf22e
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/node/connector/statistics/and/port/number/map/NodeConnectorStatisticsAndPortNumberMapKey.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStVl1P2zAUfUfiP1x4Ie0mQylFZR0b
+W3lB22AS2l6maXITNzVL7Mx2OlUT/33XdUI++4VIHhLZ5557zz3XaRPq/6YhA6lCIhMmArqIeDgzZEFF
+SEImyLxHUiWqm4lUhmhDDdeG+5ooNu/1e6e9MyJkwIgvhWC+kaqMoSJwcSKNJ0yRmCaj/T0e27Ud03Mx
+ZwLpFy7xybB3QW4x8TjPexM8l/qFlFXLuX/CfhDBV0TeLoFfNnbASBlpV/CEi4Dj8yZA6XzKmcJYeyfp
+JOI++BHVGrZM+4kt9vcAM0csRjoNBevbLSnewT+kwCtRfE4Ng2VDfJhyQSOIpAhBM8Vp9J0pzaX4dnMN
+lzAc9Ienp2eD8/P+4ORs2B8OLj6PwBG5yJyu5if8Eg2Ds/xO//bKvU3UnVyavcyMa1JHoJKWeiz80T2O
+u92MogtjxVCQBgq+TBYwVTKGe5kqn8Hd5AHDSQ59CrlKqKIxaIfKwHIJzjHHL6J+LTTLv1U7HLSxU+3K
+OsuQJWSmtuRVcitm8Lyu6bx7ubqbM6V4wCrJuDAwo3o2xuAqrZs7u4+zFzMU0++Nim27oZhOI4M75Y2n
+RRfWzRdegec1O3QJIo2iDryHE3jT0ECK0jqjhmJHvJ3OCX4yGBXA/qQ00t4DnVMS2Q+ImzU7RRX1fAqe
+NdVWWN8rlWBUykqFPVYJMLBQ2E4wxWrWMKD3Y/sFQ2sOloWQYuUZlDsMuTQzptDFHQ5GxxY4qgpY7Xit
++GW/bM7mMTpYEbJGc033IzDcxxzeQWPEsoloz/2cJjdHY8NsFsN4bxT+mIGR7qV6IOuwjymPAvRokj2x
+S+zvKpR3uIP3Pw7Lpy0/OlOutD3XJWEbvF5lnAUv2VotzfO0euqMbInKukBoYv8teIevoSKi5lFbRL38
+ywZBLaIxLGV4cyBq0Uc/jzqkcLo8KvbGl/9QSwcIfMCy+cQCAACFCgAAUEsBAhQAFAAICAgAAAAhAHzA
+svnEAgAAhQoAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAPoCAAAAAA==
+
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/node/connector/statistics/and/port/number/map/NodeConnectorStatisticsAndPortNumberMapKey.java-66047f4f-a0c0-3941-91c8-6ea9806cf22e--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/queue/id/and/statistics/map/QueueIdAndStatisticsMapBuilder.java-91eed612-174f-359e-91c9-11de7267d0d7
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/queue/id/and/statistics/map/QueueIdAndStatisticsMapBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/queue/id/and/statistics/map/QueueIdAndStatisticsMapBuilder.java-91eed612-174f-359e-91c9-11de7267d0d7--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GroupFeaturesUpdated.java-bdd2115e-34b3-36dc-9d58-0407aca46ad2
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GroupFeaturesUpdated.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU0tv2zAMvgfIfxByaoNGiZdLlz6G
+oK9TEux1KnZgZNrRKkuCTKczhv33yZYzp2iGwkFlQ7JEkfz8faQF8QQpMuNSbizqGEol0w3xEnTKU9R8
+G/HC6ZfG1JnC8pyAZE5S5NzhNppGflz0ezKzxlHHiFJvUZNxZQg1OY8+8qWJ8dh4iTLPnBzoHARJo3cI
+J1O+KBRJC46+teb5M7i3cpExKg9ZhckyH/PzErIOXmupY+nXWyBYrX+ioO6+Nxup4lVyLC1BOCot7jSb
+ROf8oTq9R6DCYf4FrSq7A5sXaeYVhLU6gpGlIZlIAZUU3rt6xsNhv8eGbGHiQiHTnulZfVCN/Zij+p9G
+bTHWt76KDWbALNCmdXs88YTM9p1ntfOsdf7kWZG5h3H1YRJNR1Hk39OQIWkIGhU2BsJ4fPj4R5Vu3O/Z
+Yq2kYFITugQEshcsfw+X/V0/8Bd5SHnYNApftlVyfRYsexRfvle/8kOodglf10Vj+G8LNfaqc/99ttL2
+e7+DuMHUMFTDEiyRGhSrW8rP88Udu+rUh1w4jxRPBm9qPDgbtOL6zWEdB6cXTSn+qaa/UEsHCHNEIgGx
+AQAAKQUAAFBLAQIUABQACAgIAAAAIQBzRCIBsQEAACkFAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVu
+dFBLBQYAAAAAAQABADYAAADnAQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GroupFeaturesUpdated.java-bdd2115e-34b3-36dc-9d58-0407aca46ad2--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAggregateFlowStatisticsFromFlowTableForAllFlowsInputBuilder.java-c345ad6c-d74c-353c-a20f-e84fde530819
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAggregateFlowStatisticsFromFlowTableForAllFlowsInputBuilder.java
+
+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
+bnRQSwUGAAAAAAEAAQA2AAAAPAgAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAggregateFlowStatisticsFromFlowTableForAllFlowsInputBuilder.java-c345ad6c-d74c-353c-a20f-e84fde530819--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/node/connector/statistics/BytesBuilder.java-2aa4b178-6302-3176-b37f-e0ca14f972fc
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/node/connector/statistics/BytesBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/node/connector/statistics/BytesBuilder.java-2aa4b178-6302-3176-b37f-e0ca14f972fc--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/QueueIdAndStatisticsMap.java-0f13e262-046e-3cce-98ea-252cd61153bf
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/QueueIdAndStatisticsMap.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStUlFLwzAQfi/0P4Q+bcNmZoM9dE4Z
+6IPglLFH8eGW3LrMNqltOhzifzdNN1vBTQVTSEm+++67+y4Z8GeIkeg8pjpDJWCXyHht6A5UTGNUdMto
+mauv4EuJJdLCgJGFkbygOW7ZkA3YaOx7Ms10br7PaLROijo312mqFZ3fQ4q/Zy2lEtL+r8HAw3KD3DTc
+DWyBlkYm9M6WZe+rr9/r+R7pkZkWZYJEWbXIXVSrrRS6psKmKRe14GtMgWRg1g3tsWMdidrkyJGjhnxl
+HZGF1GoyOGfDkA1CNurWClKEoERLKEwh65/Anirhvu9l5TKRnEhlMF8BRzKvOLdiqsTikzCDzIbbha/G
+1lfUh8Yu33urjamBfU4nyMlKKkiIG4ndp7MbMvnTHCnPEQx2gh/9Cc6Cxhh7ONF+0B2PD+VWg734r7e6
+h6SgVrQdYUXpEW8vSYzmCNbpujrfq+0DUEsHCCHmuW5aAQAAWAMAAFBLAQIUABQACAgIAAAAIQAh5rlu
+WgEAAFgDAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAACQAQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/QueueIdAndStatisticsMap.java-0f13e262-046e-3cce-98ea-252cd61153bf--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/nodes/node/meter/MeterConfigStats.java-adb17149-7d95-3784-b1ed-48a49dc869f0
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/nodes/node/meter/MeterConfigStats.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS1U1FvgjAQfifhPzQ8qZFi54uibjFm
+j7osPi57qKVAs9ISWtzIsv++Ukhw00XdskKO9Lj77r5+1xyTF5xQIIsEypyKCFecJamGFRYJTKiAewTL
+Qnz9mVFNC6g01kxpRhQs6B6NkVlQyIgqa5uomeuwLJeF/lUJXeW0RR9N0QSuL4DUUnLVgBOZZVLAxw3O
+6N8aOcl1Y1jajlZSxCzZmhh1eXM7JiJmvquU8eghvj5xWSYZFRrveE2ufoLBwHXAAKxlVHIKhKEdWke9
+DiF9y8rvWNmoLUlphkGOddqlPfXMkYSHySETe1NXFtWdOQummBSLmxEa+6OJj6Z9OwFBZ4NjgJjL1zMo
+tsETqdYfdo1/S0bIvE2yT6wqlqR6rvkErpOXO84IYMIExJhQ8F0/E2cWfdOmZrtpBZqfkvt22MQcaDH/
+t7sEf6pu/a7z3kxB42uZWmACYiYwB/YiGLtc34PFVbcHkoJiTXveWUG8odcpYTbHWnj9WTuvH7X5BFBL
+BwifdFzWfAEAAIMEAABQSwECFAAUAAgICAAAACEAn3Rc1nwBAACDBAAACAAAAAAAAAAAAAAAAAAAAAAA
+LmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAAsgEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/nodes/node/meter/MeterConfigStats.java-adb17149-7d95-3784-b1ed-48a49dc869f0--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetMeterStatisticsInput.java-abbd129a-df56-34f8-9b57-3a8140effd3a
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetMeterStatisticsInput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU1FPwjAQfl+y/9DsCQgUJi8wREPU
+GB7AKI/Gh647RnVrl+1GXIz/3a6bDqIGIXZLl17vvrvvvlvC+AsLgag0pCoBGbAiEuEGacFkSEOQdOvS
+PJX7lzEgpDRDhiJDwTOawtYdunpNbEvEiUrxJEQsEqjBBmN3RBeldR4cAEWloqyC5yqOlaT3SxbD36N8
+IQOhv9cM2Z3/DBxPpSHkFiSqtKhJjNwxXaoArpREeMUHWB9f1SwPYw3K/KikVD79Tse2SIcsVJBHQKQm
+6xlDuXYhe6atvUYo47XiG4gZSRhumrDHlibj7QZ7Jthrgi81J5EJJadnA3fYc139tkP4nqX/o1HIJMen
+MmHftpLcjwQnQrclXTMO5BbQqL36CpiX/tpdL906XVdWHfb72a2MjXS1Yadr5/813PSXIi9s661Spspd
+kzMQnKyFZBExI6n32eKGTI+aY8pTYAgt56BATtdplNEH03GnPZl8Flb/TySsecyDVttcvpfbB1BLBwgu
+2iBCeQEAAAwEAABQSwECFAAUAAgICAAAACEALtogQnkBAAAMBAAACAAAAAAAAAAAAAAAAAAAAAAALmNv
+bnRlbnRQSwUGAAAAAAEAAQA2AAAArwEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetMeterStatisticsInput.java-abbd129a-df56-34f8-9b57-3a8140effd3a--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAllFlowsStatisticsFromAllFlowTablesOutput.java-f08bcfc5-7ccc-3238-845f-e3b61275c94f
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAllFlowsStatisticsFromAllFlowTablesOutput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU01PAjEQvZPwHxpOQNjCyoUP0Wyi
+eBGJgZvxMJSyVLvtpp0FjfG/2/0Iu5oYssZu0m5nOu9NZ15jYK8QcqJNSHXM1RbepQj3SN9BhTTkih58
+mhj13bmT+kgtAgqLgllq+MEfDkb+eNpsiCjWBv8CiAaUBYZCqxzR9wdDui6twREMP0OBWkubkzEdRQ7q
+8QGiGlEbobbCrTeAsNy8cIb1Y4MkjLhC2MhzxPVLTOfOE6jt6uRbQHzv/hxT+vW73WaDdMlCbxPJiXKX
+n2SGdFQpvJTCKymyQyu25xGQGHBfRj21XXqTauwkjZ2UsdcuPWFdi2YXA3/oDUaeP+6EHD2QMuOxFSJv
+Z3R08nhZmWy/3mmdYJzgc5piv9mIk40UjAiF3OyAcXLHMZAyrZQt6zR3QIV1naEsMxCH4QZ/Q3c9m29+
+K3Evd/+UZGEuFVMYKjK4/K/u17nZVbPxkYsiz6coU4bLyE4okCR7HW4OFrdkVutJUWY4IG+3zomj1WuV
+qnCbvHetzrRQ7Gc6fQFQSwcIk+DgJ4wBAACJBAAAUEsBAhQAFAAICAgAAAAhAJPg4CeMAQAAiQQAAAgA
+AAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAMIBAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAllFlowsStatisticsFromAllFlowTablesOutput.java-f08bcfc5-7ccc-3238-845f-e3b61275c94f--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GroupDesc.java-ab4540bf-187e-3bdd-afae-466c8c28c694
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GroupDesc.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStUlFLwzAQfi/0P4Q+bcVl1r11DBEm
+Pk0RH8WHW3rLom1SknQ4xP/uNZ3LBEEFr+Xay9333X1HWhAvIJEZK7lpUVewr5Xcer4HLblEzXcF76z+
+mpTWdC13HrxyXgnHLe6KWUE2TxPVtMb67xm9MbUbuIVpGqP5/S00+HvUWulK0XcJHu7Wzyg8Yftnmudp
+wnK2MlVXI9PEWoaD3k4ZJ2H4SRw+VD2ILTbAWvDbCHsckfLyFFwGcBnBl6RcOWX04uK8mE2Kgt7x0KFC
+J6bx96mnnaZJ261rJZjSHu0GBLKbvmRJFVRAhq+e+rkhiDLT5G0QOiQOLGEQwTZKQ83CKslfra7Z4k/7
+58IieBxlP+rNzrIolIKoLxvP55/T/ddtOqR6en5cE5Poj8FoHJq+9+4DUEsHCOo73SMwAQAAzAIAAFBL
+AQIUABQACAgIAAAAIQDqO90jMAEAAMwCAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAA
+AQABADYAAABmAQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GroupDesc.java-ab4540bf-187e-3bdd-afae-466c8c28c694--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/aggregate/flow/statistics/AggregateFlowStatisticsBuilder.java-e0fd4149-f63e-3456-bd3f-025a08a68c16
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/aggregate/flow/statistics/AggregateFlowStatisticsBuilder.java
+
+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
+UEsFBgAAAAABAAEANgAAACoJAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/aggregate/flow/statistics/AggregateFlowStatisticsBuilder.java-e0fd4149-f63e-3456-bd3f-025a08a68c16--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/duration/Duration.java-be4cfcfe-05fc-31b1-8c00-7d3ab2cdd443
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/duration/Duration.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStUltrwjAUfi/0PwSfVDTe5oPt3BC3
+Rx3Dx7GHmB7bsFxKk4oy9t+XpnbtmDAFU0iTnMv3ne+clNAPEgNSWYxVCjIiR87ixOAjkTGOQeL9COeZ
+/G0UKgKOtSGGacOoxuaYgsYZ7EeT4Ww8xVGeWZuSoe8xkarMnAcwSnFdQlElhJL4dU0E/BPVpMXA7HBK
+MiI0PgiO5Smde3enmtrQUrvDS5VLA9lkfDm3LZMRs/9lwnj0srs+cJHHAqQhW17UVnyDbtf3UBetVJRz
+QNJWHbiHYjVT9muV+64U57WhCQiCUmKSOuytbRUJmsGBa1RQpwhcikerBtO2PfPxcDTpD2f98bRTtWzw
+5/BeIAx8L823nFHECvl2hAJ6OjlYu11wMBZZl5eTVPc3nqsK8aFXwjSEvTVUVX2N6XufZfNK7JMcLgVF
+OyYJR2587b5YPaP5VTOPaQbEQLt1YQ9bvVbdPHup6LY6YVgx/Bl1FIPZAFUyanfC0nbGY02k0rWX730V
+2zdQSwcI5ubzJ4ABAAAiBAAAUEsBAhQAFAAICAgAAAAhAObm8yeAAQAAIgQAAAgAAAAAAAAAAAAAAAAA
+AAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAALYBAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/duration/Duration.java-be4cfcfe-05fc-31b1-8c00-7d3ab2cdd443--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/flow/and/statistics/map/list/FlowAndStatisticsMapList.java-d1a3546b-d6c6-39df-9f70-84a3304ba3f2
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/flow/and/statistics/map/list/FlowAndStatisticsMapList.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS1VMtO4zAU3UfKP1x11VbEbWADLTCq
+EEgIOjw3o9Es3OQmtcaxo8QFIjT/znWc0iBBmSLqSH7k+Pqc+7BzHv3lKYIuUqZzVDGvpEjnhlVcpSxF
+xR5CtijUWzCR+pGVhhtRGhGVrMCHcG+4Hx44hKu4jWY8Z5LmY98TWa4L821sZ4RMVHz3ik15/gmL0VqW
+ji/SWaYVu/nJM9yOtvP4/9XMhIoFjSdzIeOrZHPD8xiVEYngM7kFd9Yl9t08XNLsAqvN/Zgs0ow8adyw
+36Df9z3ow1THC4mgKF+j+odt7SMDqzJYKaw33UVzzDjk3MxXVr+75PuobTuytqOV7Q/yXZRCq6PdYbgX
+DPeD8KBXn09RaHEEFIXARmHwZfCPlTXwvXwxkyICoQwWCY8QPoor7aeGT4bkl27RlM3hNq+WpT7ecXyt
+LH0b55dqbCnoPbyB2jfjcE2tHvves6s4Z9fko1YTQSIUl1C/FtRPpqdwtNETw6ICucFu57PK6+x0ViVH
+i3Wl0+mNx0u57sWBFI2bdXtjB7je3SLb+nCLhlSUcF2IjBcVkPOgE/hFmsEGA+6rHJe7Bx8HuAmc5aSh
+JvS9f7Z7AVBLBwgcf59bwQEAAFkGAABQSwECFAAUAAgICAAAACEAHH+fW8EBAABZBgAACAAAAAAAAAAA
+AAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAA9wEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/flow/and/statistics/map/list/FlowAndStatisticsMapList.java-d1a3546b-d6c6-39df-9f70-84a3304ba3f2--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutputBuilder.java-542f8eaf-a255-351f-8fb6-00dcf3f6d1ef
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutputBuilder.java
+
+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
+AAAASQoAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutputBuilder.java-542f8eaf-a255-351f-8fb6-00dcf3f6d1ef--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/FlowCapableNodeConnectorStatisticsData.java-5f7cdf25-b4a7-3642-9a68-eb0aaee9bed8
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/FlowCapableNodeConnectorStatisticsData.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSdUNFKxTAMfR/sH/YBl+C8PiiKIFd8
+1Ae/IOtirfYmpc2mQ/x3OyrqwMvQBlLaJOecnIDmGS01Ei1IIO5x8s4+KkzIFiwxjC0MkZfFIFEhKapL
+6kyCSGO7bY/bk/O6cvu5+jugivhUoDvHvcv3NSredU9kdGX2oBjHI7FKnIqMo9P2DFh6gtucdsKcsSX+
+F/3gqnDj5WWHATtPC6b7r+a/u3E12H1eJgMI5+k5wtB5ZxrHSvEBDTXrvLOnddXkQ6+aSVN5fFu9KR8/
+2S4WWJefHetcdfVWdJZ4n9MHUEsHCKNx/GTcAAAAVQIAAFBLAQIUABQACAgIAAAAIQCjcfxk3AAAAFUC
+AAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAAASAQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/FlowCapableNodeConnectorStatisticsData.java-5f7cdf25-b4a7-3642-9a68-eb0aaee9bed8--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/$YangModelBindingProvider.java-e5ae1069-fa02-3745-9e46-3f8fb2e8ff88
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/$YangModelBindingProvider.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSVULFqxTAM3AP5Bw9vSBZBWjpl65ah
+0LWj4yiuqCIHW0kJj/fvzyGhpdAOFVqEdKe7m637sB5NiB7CjDLYjcm/K2xWPHgUWBtYovxcjhw+QW3P
+CEmtUlJyCSKuzWPz0Dy1ZVEW89IzOTOSWDaObUrm8pZJX8KA/EwykPjXGFYaMBqaZsYJRdPvSjQEToem
+/oDCn1zX/bvJdSr4J+HC2MkYjEf9nqp6pzVnRdQcyZed86bLHnJi2knORBxWdXtAbmWR+w5QSwcIXhd6
+U8MAAABqAQAAUEsBAhQAFAAICAgAAAAhAF4XelPDAAAAagEAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250
+ZW50UEsFBgAAAAABAAEANgAAAPkAAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/$YangModelBindingProvider.java-e5ae1069-fa02-3745-9e46-3f8fb2e8ff88--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/node/connector/statistics/PacketsBuilder.java-afd385b5-148d-3e15-a5be-e8f28894e54d
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/node/connector/statistics/PacketsBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/node/connector/statistics/PacketsBuilder.java-afd385b5-148d-3e15-a5be-e8f28894e54d--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupFeaturesOutput.java-a1530c96-5ad7-31eb-ad2f-87ef0ceae58c
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupFeaturesOutput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU01vwjAMvSPxH6KeAEGg4zLB2IS0
+jRND+7hNO5jglmxtEqUuDE3770s/UGFDqpDmVqni2O/Zea4B8QEhMm1Drg2qFewiGa6J70CFPETFNz5P
+rTo+DK1ODU8ISCYkRcItbvyh72zcbMjYaEtnIgaR3nKyoBIQJLXaIw6G/KXyTrdgsYaCtI6SgkzoOHZQ
+jw8Qn5G1lGol3fcWCBbLdxR0fu40DWNUBMuojrjmjmlncH+9A/+SzzLvPQKlFpMnNNHO4WdPv9NpNliH
+zfUqjZAp1/Iod2R2CNzLgXuVeHnUs1hjDMwArau015aranSYPMqTR1XyjStNJk6aycXAH/Z8373tEPcs
+QVlp/4RLp2RSesvY+s2GSZeRFEwqQhuAQDZDOmp2kYe7aGf4Sa6mpNj8vZJucfB7cEp3pWvpOBDr6r/+
+A366/Otm46vQq6Auu84RBAukgojl4+rW6fyOTc6acS6sY8OWVyub1/Uqvdym0MJrj8tp+s6WH1BLBwib
+z6M1eQEAABwEAABQSwECFAAUAAgICAAAACEAm8+jNXkBAAAcBAAACAAAAAAAAAAAAAAAAAAAAAAALmNv
+bnRlbnRQSwUGAAAAAAEAAQA2AAAArwEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupFeaturesOutput.java-a1530c96-5ad7-31eb-ad2f-87ef0ceae58c--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/OpendaylightMeterStatisticsService.java-1ccf6658-c162-36a5-9081-99b1de3bb52f
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/OpendaylightMeterStatisticsService.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS9lFFLwzAQx98L/Q55nH3IKL65MRBh
+4sMYbJ8gS28xmiYlvRSH+N1NWtmctKsT2wQS2vtffndHLgXjr0wAMVZQU4DO2EFJ8Yz0wLSgAjStUuqs
+PjfmgGBpiQxliZKX1EKV3qZ+zOJI5oWx+G8n0kfAe6VWQfBg9F6K7VG1dlg4PDFfWMWoQ6koN5o7a0Ej
+XTp0FnoCQ2NU2YS4kzqTft8UfAu2kvwKX27y3OjguoHSKRymHHUtuqswRuWf9ODIcRKsUUtg4Y6MBxq1
+fAPCOkhhTpMkjkhCViZzCohmOdzVP8JYf0P8OOOr54J0GkeF2ynJidRes2ccfufpB7yhF5bNx6mV4+i9
+CS/MYGpeh/mxY+e9z81iQUS3ZtLXND4Xv97MGnx/EJfx7eA/Ilt6oaGdGSatl/kqRntOLQldziaOPsLy
+CVBLBwj/GYnRQwEAAMQGAABQSwECFAAUAAgICAAAACEA/xmJ0UMBAADEBgAACAAAAAAAAAAAAAAAAAAA
+AAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAAeQEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/OpendaylightMeterStatisticsService.java-1ccf6658-c162-36a5-9081-99b1de3bb52f--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/$YangModelBindingProvider.java-fa237b02-c04d-3ad0-aa53-f398f1b8a2f7
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/$YangModelBindingProvider.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSVULEKwkAM3Qv9hxsc7HJYXJRubh0E
+V8fzmp7BmCt3aUXEf/ekRRF0MGQJyXt573XGnowD5YPTvgNuzJXQHUVfDTvtgPVQ6j7w57Ilf9FRjGAU
+tFEHGMrlYlWuqzzLs64/EFrVIhtSlkyMarZPdFvfAG2QG2S3C37ABoLCc0dwBpb4XYN4T3FUcxih+ifX
+7fldpZoU/EnYE9TceuVA3tO8eNKqqQJICuNlZ7qpk4eUldScMmEL86IaIfc8S/0AUEsHCJM1WJe+AAAA
+ZAEAAFBLAQIUABQACAgIAAAAIQCTNViXvgAAAGQBAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBL
+BQYAAAAAAQABADYAAAD0AAAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/$YangModelBindingProvider.java-fa237b02-c04d-3ad0-aa53-f398f1b8a2f7--
+------=_contents/model-flow-statistics/.settings/org.eclipse.core.resources.prefs-2d4a00f1-4903-35b1-a672-b1a37e523fc5
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/.settings/org.eclipse.core.resources.prefs
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnRLTc7JLChO1SsoSk1LLUrNS04t1itL
+LSrOzM+zNeTlAgrkp2TmpevrFxcl6+cmZubpVybmpduGhrjpWiBJ2xQU5WelJpfYwWQAUEsHCKo0DkFJ
+AAAAWAAAAFBLAQIUABQACAgIAAAAIQCqNA5BSQAAAFgAAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVu
+dFBLBQYAAAAAAQABADYAAAB/AAAAAAA=
+------=_contents/model-flow-statistics/.settings/org.eclipse.core.resources.prefs-2d4a00f1-4903-35b1-a672-b1a37e523fc5--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetAllMeterStatisticsOutputBuilder.java-e5f83ba2-d0c4-371a-a369-ef47528866be
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetAllMeterStatisticsOutputBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetAllMeterStatisticsOutputBuilder.java-e5f83ba2-d0c4-371a-a369-ef47528866be--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/NodeConnectorStatisticsAndPortNumberMap.java-85c86a98-dcd7-3074-973c-9ee6699c7d4c
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/NodeConnectorStatisticsAndPortNumberMap.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStk01PwkAQhu8k/IcJJyB2scgJREPU
+m6CGo/EwbIey2O422y2RGP+7s61QNCZC4jZpsx/vO8/MbDOUrxgTGBsLk5GOcJuoeOXEFnUsYtJiE4rC
+6u+bmbFO5A6dyp2SubC0CS/CfjgYNRsq9bu/GzpjkryyliZNjRZPM0zpeNVC6Ujx9xYdPizWJF2tXeMG
+ReFUIu4Zi9f90+t2mw3ogl8Cs4QUMwhAm4hAGq3ZwNgcUEfgVqQs1EmVsqmJioRAM+SwXPDjEDDwoYMf
+qrlcUYqQoVvVquc2l3F4qB167bDWXnMZVa6MHvfPw4sg7AfhoONRgz3qQaSAoavoukgXZANOrXfS6RfP
+1ms2smKRKAlKO7JLlAQzdrnZmcz3HhMdPbLDrDSYYsZyHvTmOKW8mtR9aTbeqw5UG18xSiAJS6UxgbL3
+/J5M72B80oUR0hI6arf+KmnrrFXXkicn1afVGY12/P7+XP7TTyI8hdhTHJ5hikpXUQimEEd24wpickee
+bXfKxD786xNQSwcIR+CG/oYBAAACBAAAUEsBAhQAFAAICAgAAAAhAEfghv6GAQAAAgQAAAgAAAAAAAAA
+AAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAALwBAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/NodeConnectorStatisticsAndPortNumberMap.java-85c86a98-dcd7-3074-973c-9ee6699c7d4c--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/OpendaylightQueueStatisticsService.java-cc097251-ad7b-3cf8-a8a3-d5a9862f642a
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/OpendaylightQueueStatisticsService.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTFlN9uwiAUxu+b9B24dF5g3JJdTGOy
+G80uFjd9AqTHykahg0Mzs+zdB+KfaZbamU0haQt88PE7cFoy/spyINrkVJegMraUIl8gXTKV0xwUrbrU
+GbU/+ObAAbXIUFgU3FIDVfeme9297aWJKEptkLywilGHQlKuFXfGgEI6dOgM7EQ/2qLW0sYNzITKhH9P
+Sj4FUwn+i7lcF4VWYeoErJN4ZOYJsHQEeC/lcxDY6VYwNLoYiQrUkzd7UKW7kPXY4bm9fXdwtuen3jj/
+J/TK9wLBrvPdRDrUTrudJqRNHnXmJBDFCrhbdYQy/uZ3sOA6tYK0kyalm0nBiVAIZs44NJvpC7yjF9rY
+2GVsmnzE7YUahuI2Q2kTT0d22GSuDWFSElwAWcXEEobI+AIygno7FCLsxT4Oq6bSGWxW7MSP+KPpb5O/
+3/TmDAYkPyptNcwAH0T/vOrFPTWmX5OHZh7OmcQbNf8D2IP7Wku71dbg7t/DE3gj4IY4nOjJyMfTM+LW
+6VpN0m2HmSaf4fEFUEsHCC3gmlKKAQAARgcAAFBLAQIUABQACAgIAAAAIQAt4JpSigEAAEYHAAAIAAAA
+AAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAADAAQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/OpendaylightQueueStatisticsService.java-cc097251-ad7b-3cf8-a8a3-d5a9862f642a--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupStatisticsInputBuilder.java-4cd42ecb-4eb5-3b91-9e9e-a3f2bfee213f
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupStatisticsInputBuilder.java
+
+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
+UEsFBgAAAAABAAEANgAAAP4HAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupStatisticsInputBuilder.java-4cd42ecb-4eb5-3b91-9e9e-a3f2bfee213f--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/flow/capable/node/connector/statistics/FlowCapableNodeConnectorStatistics.java-ddd64da5-cf5d-3d54-953f-931aecf5bd2c
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/flow/capable/node/connector/statistics/FlowCapableNodeConnectorStatistics.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU9FqwjAUfRf8h9AnFRttdQ+rc0Nk
+e9MhPo49xPS2DUuT0qZuMvbvS9puzWCigikkpL2n59x7z80IfSMxIJnHWGYgQnLgLE4UPhAR4xgE3nu4
+zMXfj5nMFS4UUaxQjBY4h7038XxviiMu3zElGdlxwEKGgKkUAqiSuQWYdTssNT/5n1dJyYtaAZVpKgXe
+rEkK56N2TIRMn8uE8fA5uhy4KOMUhDJZnAAfrVGqk+d2kdQhg6ZU41v/Bq91wPKnOFu7NuYZDQbdDhqg
+lQxLDkjo/IPqhVk2kWu0uS1PFbSlCaQEZUQlLeqlp0UGNjYw2KDFPmh1rGBSzP2xN3E93/WmfdNSt2mp
+a1rq/rbUoh1dNezViB51O1m544wiJhTkEaGAnjR8WaOP1E8j9YIPpdNsLo0N7q5l8tMi7oc1s+Wjq7Gf
+N2IXiDxayM/ainVU04qKgaKICcJRNZZ6X6we0fyiWcY0B6Kg55yypDN0Wi/qy3n+cfqzZo6+zPYNUEsH
+CL5IzQx7AQAA5gQAAFBLAQIUABQACAgIAAAAIQC+SM0MewEAAOYEAAAIAAAAAAAAAAAAAAAAAAAAAAAu
+Y29udGVudFBLBQYAAAAAAQABADYAAACxAQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/flow/capable/node/connector/statistics/FlowCapableNodeConnectorStatistics.java-ddd64da5-cf5d-3d54-953f-931aecf5bd2c--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetAllQueuesStatisticsFromGivenPortInput.java-76648989-7f8a-3888-a980-373524af9bd8
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetAllQueuesStatisticsFromGivenPortInput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS1U99PwjAQfifhf2h4AsIKw4ToEA3x
+B+EBFHk0PnTdMapdO7eOSIz/u7cOHfACJNolXXq9++6++3ox428sBKKTkOoYVMDWUoRLQ9dMhTQERVcu
+zRK1e/meQQY0NcyI1Aie0gRW7pnbdXv9akVEsU7MiYhCrUAZnawLqM65e0GnOoAbrRRwvBgHB6CN1jIt
+knAdRVrR2ZRFcHyUL1Qg8H/LDHvwXzHrP5Ax8GGeYHF6VcMsjBCU+TKnlH/tZrNaIU0y0UEmgSgk61lD
+vrYhHSuXU8plveZ8CREjMTPLMuy5jmS87WDPBntl8DVyEqnQatDtuGeO23XcXiME4zApi0zpVipnkejI
+CQU2xMn5to/3FCrOzEteWrtaiTNfCk4ENjBZMA5kBGYo5cyizH9B7hFjlEM8IsI4B8B4XNh1pJQWh10p
+WoWxVH1j2Gr45V9NBz226qtq5bNQuShmQ99icrIQiklinzfuw8kdGZw0E5QnwAzUawfFrrVqpcp4sJrU
+Gv3+T2F7M0pQ3j1TvWGdv/LtG1BLBwjrHgrHkQEAAG4EAABQSwECFAAUAAgICAAAACEA6x4Kx5EBAABu
+BAAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAAxwEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetAllQueuesStatisticsFromGivenPortInput.java-76648989-7f8a-3888-a980-373524af9bd8--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetMeterStatisticsOutputBuilder.java-41071fe2-5400-3d90-9e47-3367e0ca2be4
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetMeterStatisticsOutputBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetMeterStatisticsOutputBuilder.java-41071fe2-5400-3d90-9e47-3367e0ca2be4--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/GetFlowTablesStatisticsOutputBuilder.java-15b4913c-00a8-374a-9b78-5464dd527cb2
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/GetFlowTablesStatisticsOutputBuilder.java
+
+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
+AQA2AAAAbAgAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/GetFlowTablesStatisticsOutputBuilder.java-15b4913c-00a8-374a-9b78-5464dd527cb2--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAllFlowsStatisticsFromAllFlowTablesInputBuilder.java-da8a26ee-b845-39e6-83c4-bb4a4b17410d
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAllFlowsStatisticsFromAllFlowTablesInputBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAllFlowsStatisticsFromAllFlowTablesInputBuilder.java-da8a26ee-b845-39e6-83c4-bb4a4b17410d--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutputBuilder.java-9c7ccdaf-2c68-397e-a564-9531bd6d0880
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutputBuilder.java
+
+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
+AABICgAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutputBuilder.java-9c7ccdaf-2c68-397e-a564-9531bd6d0880--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/NodeConnectorStatisticsUpdate.java-ce77eec8-1292-3641-970d-717561daf37f
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/NodeConnectorStatisticsUpdate.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS1U01P4zAQvVfqf7B6goq4dcthKbCo
+YvfYsit2T4jDxHFSL44dOZOy1Yr/zuSjJHuoSpBwJCfO+M08z3vOQD5BopjzCXeZshHsjE42yHdgE54o
+y7eCF97+H8ycR54joM5Ry5x7tRVzMRPnl8OBTstoz4TabpVF53d1qukXccHXLlIfzRcb98zRg81Bona2
+YSimc74qDOoMPP5qw8tn8MdqoXMmr6tKl6aU8+ca0g8zPNjC6ty3zlolqSH3bzuWNvpBmHWRhsqvIHs/
+3VDbSNP7GyDchX8ob3/s7Uab6C7uD1wWSUrSQmh6NHgPXjvUsZZQakTo8pmMx8MBG7OViwqjmCUJFtWP
+cnRzBmWloO1wteleblQKLAPctKiHE1Jn0cUuSuyixd6QOjonEtezqZgHYhaI81NLOgVyL1SnUlBkEaCa
+HNvwWDKYDAdZERotmbaofAxSsQMO+F2hCERD/UWim9eLRpyrVuCvZ3Wk0/2rT/ZnzW5f+OAta+LvNHln
+99tna4nh4F9tijrU9LEiLVmsLRhW3VGal6vv7LrXxebSKzrQyeiYOUZno9YVtDgm++j0svHySzm9AlBL
+BwjSNWyIuAEAAIIFAABQSwECFAAUAAgICAAAACEA0jVsiLgBAACCBQAACAAAAAAAAAAAAAAAAAAAAAAA
+LmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAA7gEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/NodeConnectorStatisticsUpdate.java-ce77eec8-1292-3641-970d-717561daf37f--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/nodes/node/MeterFeaturesBuilder.java-4861d919-df19-3106-a234-6fdd90fefe5f
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/nodes/node/MeterFeaturesBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/nodes/node/MeterFeaturesBuilder.java-4861d919-df19-3106-a234-6fdd90fefe5f--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/nodes/node/MeterFeatures.java-38597915-f3ca-3512-9517-705e0aa5e459
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/nodes/node/MeterFeatures.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS1U1FrgzAQfhf8D8GnttTYbC+tbTfK
+2N7ase1x7CHVU8M0kRjLZOy/L0ZBXQulG4tykuTu++7uO3MavNMYkJAxFjnwkFYpixOFK8pjHAPHB4JL
+yYeXGSiQuFBUsUKxoMASDuSa6IW5CKEwdmlbLMuFVL8CV1UOLe5sQeZ4W58+AFWlhOIZ8rQ6g6+ESIuG
+KRBZJjh+2tHsXFa9qD3jIdPfu4Sl4WN0eeCmjDPgiu7TP/biZKN3usWDpmiO+vEmE9tCE7QVYZkC4rpm
+3xzUqw/uGnC3AzdeL0ECGUU5VUkX9jrSmfn9YJ/xg65NyOpWp8QKJvj6akau3dncJYuxmQKvs94xgGH3
+O/YfOITod9ykGLUVvtUJebaVl/uUBYhxfRnRANCgD9pJL/hQmqzdtBKujnp2M20celKt/uFXwCdJj0fa
+tj4bERuHtk4DHqCIcZoiM8Tabrb3aH3R5ONAai4YOWelcKZOp4HeDFVwxst21L5q8w1QSwcINDLZn3QB
+AABCBAAAUEsBAhQAFAAICAgAAAAhADQy2Z90AQAAQgQAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50
+UEsFBgAAAAABAAEANgAAAKoBAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/nodes/node/MeterFeatures.java-38597915-f3ca-3512-9517-705e0aa5e459--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/AggregateFlowStatistics.java-d85ed7db-524f-3be3-83eb-87bcbe363b4f
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/AggregateFlowStatistics.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStUl1PwjAUfV+y/9DsCYgrTF5gCzEk
+6hsaw6Ph4VLuSnVrl+6CEuN/txvg8GNRE9ukze3tOffc0xYgHkEiM1ZyU6BewS5Tck18B1pyiZpvI76x
++mMyzcwTLwlIlaREyS1uo+FgFI0T31N5YSx9T0jGZOWeWpg8N5rf3UCOv0ctlV4pt18Cwe3yAQU5bDX7
+vZ7vsR6bmdUmQ6Yda1wfVOOUMay0h432+tJcrDEHVgCtG9R9x/Udn2LjChs32AvXtyqV0ZPzQTQMB6Mw
+GndBSosSCD9X6rdmFlXNvu8Vm2WmBFOa0KYgkE2PiGsHmJ9qdgOfyUk7BI0hvveyt2SfOHDWxQRLlYaM
+1aa7dTq7YpM/vRQXFp2cTvCTNcFZ0Hjigtbeg26SHLX+0yfk78W+3GkxlEmkllSnW8t7rZY3UEsHCEUq
+XcI8AQAALQMAAFBLAQIUABQACAgIAAAAIQBFKl3CPAEAAC0DAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29u
+dGVudFBLBQYAAAAAAQABADYAAAByAQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/AggregateFlowStatistics.java-d85ed7db-524f-3be3-83eb-87bcbe363b4f--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/NodeMeterFeaturesBuilder.java-b686a582-5408-3fee-9edf-c597db13620b
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/NodeMeterFeaturesBuilder.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS1VU2P0zAQvSPxH6a9bALIotobpYBY
+CakH2ANHhJCTTlsXxwm2E7RC+9+xnbRJ7GSbsktWSleZN2/efNkFTX/SHUIudyQvUGzoHWe7vSZ3VOzI
+DgWpFqSUom/MUKMkSlPNlGapIhKrxfXCPMvnz1hW5FI/GSMR+QaVe5PPFvUJqS4lKhPK/hVlwlkKKadK
+wReD6oE+loxvUMIfCwXzFJJVVCP0UPAjG2B28Jp9jDeKLbMF3sNUl8AACVV4IrKP3jNF+ppg5WCmgLrn
+HMXLRkAguh8kdOxGlGg+irAOJ+YJmYHyQ/QVVJSXU/J0uGWgzYKnKoLEShpMUeDvEL/OCh7ZAHEQoZkX
+N5opbJmgfGzYLAuY8eeYodADgHYMO+IPtKKE2+W4sbRvn2xxgvDv7BCsj/pwszYvuaUp9gvVKdb/00Jc
+DTtdvu+Vpql6Xe6Ju9p1HO7w6OQGG/ivWxhk8uG2QinZBoO+X7Ke51b0grBMaNhTtb8xtQiD1AW3GFPJ
+DE2+14tlH2KNJnLJtbH6xpOhdn9x/PASosgv5QpEyXkM7+E1vPHyIq3EOAjh6lATX55/kuccqQD8VVKu
+onb7bpMDpubeSg5BVdgW3OlgNQ/ZO7K07J1djTCfzJC0+Y+TbY3CCWxmdtzRYdo5cwJJ++WR9MNnXK73
+ZmlWEC6UNcdWgj80RuZY/wcEuhrZIP7+zR5wOpPZQHb3gAZnokUzb/ya6RjS8NiSDg9KBzRlitux/aol
+EzvQef1PuNI+9HTmNb8rdyWOoaJ5eIt9m/s7eVyqLZPKbr+X3NlZeKitFu54R5t+jDra9brNI95NHQgt
+7F0WzV9BkJ4jCT/5nv2kVoM0no83Wr7D8Oh4HFffr2LS9j8cKncymtdfUEsHCGyFMcKYAgAA7QsAAFBL
+AQIUABQACAgIAAAAIQBshTHCmAIAAO0LAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAA
+AQABADYAAADOAgAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/NodeMeterFeaturesBuilder.java-b686a582-5408-3fee-9edf-c597db13620b--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupFeaturesInputBuilder.java-e7216a87-bea9-3819-8862-0ed173566e55
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupFeaturesInputBuilder.java
+
+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
+ADYAAABPBgAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupFeaturesInputBuilder.java-e7216a87-bea9-3819-8862-0ed173566e55--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/GetNodeConnectorStatisticsOutput.java-57dfe865-df96-3eb9-89e0-8793a5dc8906
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/GetNodeConnectorStatisticsOutput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU99PwjAQfifhf2h4AsIKA3wQREPU
++ITE4Jvx4dYdo7q1S3cDifF/t/uhmyZISOySNr27775vd9cYxCsEyLQJuI5R+bAPZbAhvgcV8AAV37o8
+NeqnM9aGeEJAMiEpEm5w647coTueNhsyyrwnJlyHesfJgEpAkNSqzOgORvyxss53YPAIBWkdJgWZ0FFk
+Uz3cQ3QCypPKl/a8AYKl94KCTsfO0yBCReCFx4gPViTSPob1GtM+xrLSg/PhGb+3AddaKStQm9V3nOXL
+vn6322ywLltoPw2RKVuCSW7IVp3IybQ5FU8etBIbjIDFQJsK9dS2Iid17CTDTirslVUnE9uo2XDgjhx3
+6LjjToDkKKvVEV9ia2z9v706pTil50xCv9mIUy+UgklFaNYgkN0hHajCMgdanF34RlZyUlx+T1OvMB9I
+U3qrUSgNtf5e/NPL4cd+5rLZeC96W2goq5HnEmwtFYQsH3W7zxe3bHbS++DCIBC2W8d63Oq1qubaS9Gi
+VmdaDt5Htn0CUEsHCPtt9xGHAQAAVgQAAFBLAQIUABQACAgIAAAAIQD7bfcRhwEAAFYEAAAIAAAAAAAA
+AAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAAC9AQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/GetNodeConnectorStatisticsOutput.java-57dfe865-df96-3eb9-89e0-8793a5dc8906--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetFlowStatisticsFromFlowTableInputBuilder.java-b8207223-6e83-3461-891c-1578bc1af8b0
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetFlowStatisticsFromFlowTableInputBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetFlowStatisticsFromFlowTableInputBuilder.java-b8207223-6e83-3461-891c-1578bc1af8b0--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAllFlowStatisticsFromFlowTableInput.java-e3e3709a-2190-3c0d-9942-8e3b8affe335
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAllFlowStatisticsFromFlowTableInput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU11PwjAUfSfhPzQ8AWGFYWL4EA1R
+MT6AUXwzPpTublS7dtnuUGL877bbdGAkQGKXdOvtPWfn9vRGjL+yAIiOA6ojUB5bSxEska6ZCmgAiq5c
+msZqe9OX+o0myFAkKHhCY1i5J52e2x9WKyKMdIx/E6LWMsmpuQ5Drej9jIVwOGohlCfM+4ohu1u8AMc9
+2J0lCLUChTpel+LpTHtwqRXCOz6Af7yqcRqEhpQt5L6SdsrKwBTXERSn6na6p/TRRm89Q2qfdrNZrZAm
+mWovlUCUOcFBFrBjk82xPjmlT1nSnC8hZCRiuCxRT3WjZLCJHVjsoMReGDUiEVqNuh33xOn0HLffCAAd
+JuXv/zh+rMM8mNXTPjRPqCjFZ6uqXa1E6UIKToTxI/YZB3IDOJZyYtLnPxQTw2Aj+QlZuEGbYSw0tST5
+YtvXVh4sr1AR2HDv7J/agR4m+bxa+citzZUUlWeMnPhCMUmyRjHzeHpNRkd1F+UxMIR6bZ/FtVat9NYs
+MjdqjeHwW1dxDYmxs/isN7LNTzt9AVBLBwiRdhvJlAEAAEsEAABQSwECFAAUAAgICAAAACEAkXYbyZQB
+AABLBAAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAAygEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAllFlowStatisticsFromFlowTableInput.java-e3e3709a-2190-3c0d-9942-8e3b8affe335--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetAllMeterConfigStatisticsInput.java-ffae2ab5-2de8-3c9f-b677-dcb0cb73eec2
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetAllMeterConfigStatisticsInput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStUk1Pg0AQvZPwHzac2qZsi70otZqm
+GuOhNdqj8bAsA11ddgkMjY3xv7t8RGiiwSYOZMnO8mbfezMp428sBqKzmOoUVMgOUsQ7pAemYhqDonuP
+Fpk6PkwAIaM5MhQ5Cp7TDPbezDMxty2RpDrDnyui1jKva3OdJFrRxw1L4O+oQKhQmO8NQ/YQvALHHuyv
+GoTag0KdHWry03Pvgm50CCutEN7xCaLTWS2LODFFWSBLSeUzGY1si4zIWoeFBKKMWL9KlNEt6Vaeuq2n
+1V9bvoOEkZThroU9D4wYvwv2K7Dfgq+NJpELrRZnU2/mep55hzGgy6RsbuJaRSLuXDjpOxcqLfClpDGx
+rbQIpOBEGLOyiHEgd4BLKdcldlVBt9/I+xJocCaMs4Z2Xm+O7R7XybazTaJj6uV/jSntY3tlWx91B2sS
+jdyqFieRUEySanTNulzfksVJ8055Bgxh4PQ20hk7bQfNpuqBM5w34/VZLl9QSwcIACzv024BAADEAwAA
+UEsBAhQAFAAICAgAAAAhAAAs79NuAQAAxAMAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAA
+AAABAAEANgAAAKQBAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetAllMeterConfigStatisticsInput.java-ffae2ab5-2de8-3c9f-b677-dcb0cb73eec2--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/GetFlowTablesStatisticsInput.java-7b820c93-5679-39b1-b30f-c24ce17a1b2e
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/GetFlowTablesStatisticsInput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStUl1PwjAUfSfZf2j2BIQViiHRIRri
+V3wAo/hmfOi6u1Hd2mXrUGL877YdcSNRhMQu6dLbnnPPPfdmlL3SGJDMYywzECFdJzxeKrymIsYxCLwi
+uMzF9mWUyDesaJAALhRVvFCcFTiHFTkiQzIaOy2eZjJXP9MqKZOiSsBkmkqB7+c0hf1RARch1/9Lquhd
+8AJM/YH9tRAuViCUzNeV+MExOcFzGcKFFAre1QNEh6ualnGqSY07Gmy+frfrtFAXzWRYJoCELta3AbOa
+lJ4x1rNQrzbWPl2wJaQUZVQta+xTW1fkNxl8w+BbBr9mONfV8YJLMRkOyJFHhh4ZdWJo5isaCfs7rrjI
+SvVsFPSdVlYGCWeIa7PyiDJAN6CuNe7RwhbfqFsD0hi9tKtabVEdtq3uVcG6q5tAw9DTf51TvEvumdP6
+qNpXqdjUankYirigCbJzq/fp7ApNDhp2zHKgCtrufg10e27dOX2wXXA7482AfZrtC1BLBwhHeeU3cwEA
+AMsDAABQSwECFAAUAAgICAAAACEAR3nlN3MBAADLAwAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQ
+SwUGAAAAAAEAAQA2AAAAqQEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/GetFlowTablesStatisticsInput.java-7b820c93-5679-39b1-b30f-c24ce17a1b2e--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/NodeMeterStatistics.java-fdaecab9-2c40-3fd4-94a1-2eca90eb79bd
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/NodeMeterStatistics.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSdUE1rwzAMvQfyH3zsYIiFXTo2BoNd
+1x32CxxH9bwmcrCVrKH0v0+Oyz4CY3QSSEiW3ntyr81OW1Q+WPA9UqOn1tlXhkmTBYsEYwVDoJ+PHTIG
+iKzZRXYmQsCxuq7EbsvCdb0PfCbitvXv4GhEYh+mjHe1rm4yVYSnlP4AZ+/bmGlqR42T/KhZP9dvaPi/
+wn4/Fcg3GOd4mppFvnyOni/3YbCd/IAAeJLt5P1Qt84oRwK91QbVRvgWRGWhxHDPwnAqvg6/zI3v0Hfz
+/n1ZHDJH8jSzgFUWedFaXcyyjil8AFBLBwjfTmxO4AAAADsCAABQSwECFAAUAAgICAAAACEA305sTuAA
+AAA7AgAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAAFgEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/NodeMeterStatistics.java-fdaecab9-2c40-3fd4-94a1-2eca90eb79bd--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/flow/table/and/statistics/map/FlowTableAndStatisticsMapKey.java-a39b5359-18fb-31b9-8e78-3b38f56028c5
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/flow/table/and/statistics/map/FlowTableAndStatisticsMapKey.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS9Vctu2zAQvAfIP2xyiey2jB3HedRN
+XykKBG2RQ9peiqKgpZXNlCZVknJgFPn3kqJkPSwrQQ6VDiK0u8OZnaWU0PA3nSFINSMyQRHRFWezuSEr
+KmZkhoIshyRVoh6Mubwjhk45Em2oYdqwUBOFy+FoeDQcV+NURNWcBU0muztskUhl/uem5KONfnXBdyK6
+WYe+PEjHSMm1JzZlImL2eRWhMCxmqJ4qxbM0qwQLAYOjE5LRu4osqLuTdMpZCCGnWsNW9p9wtbsDlgTH
+hWWloST3amvRa/hri+yVKLakBiHrVQgxE5QDl2IGGhWj/DsqzaT4dvUBLuDF6Wh0fHZ0Pjg/G49PxmeD
+49Px5wl4JF9a4OVK4JepSMo29KK65ATN4l7B1l1mzjQpIpZUZQcXvvePw34/L+nDpUJLSQOFUCYriJVc
+wI1MVYhwPb3F0JAidV3yNqGKLkD7rDxZZslFzuHj9XQF8z06JfoU0q600diidzM0+TKoYSs0dhhbuuYX
+b6+XqBSLsAbKhIE51fNLGWEdzrvu4tb5BVqyo+GkDLuAQp1yYyPVwPqlL+sXL55BEJTKL0CknPfgDQzg
+5ZozKan0JhvKPNDjdE3t0UYqAP+klOvgli4p4e7Y+rlwjtfUshgCZ45j1oxVKBiVYoXYfR3AFpbK2gFi
+y6YDwXp76T4K1oq9jAgp3zwBsnM8pZmjsj51DnHPkZjUSW662CCW9cKhl6O+tyW1Q0dDyz2gjVvsYG89
+Lrm79b2e0qhNex+Yr3KgboyyPw4w0i/qh6iZ9j5lPLJdn+ZP2xW825YV7Hf692O/ekaKgY+Z0u70VaRs
+cW+bJS4pQ2k1q8Bvdctb1FKV6yU0cb/KYP851Mg33GirKGhfbBQ2MtdjUE3btLpRdfDzoEdKD6tD4G67
++AdQSwcIZQn6DqwCAABOCQAAUEsBAhQAFAAICAgAAAAhAGUJ+g6sAgAATgkAAAgAAAAAAAAAAAAAAAAA
+AAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAOICAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/flow/table/and/statistics/map/FlowTableAndStatisticsMapKey.java-a39b5359-18fb-31b9-8e78-3b38f56028c5--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GroupDescStatsUpdated.java-659f7669-329c-3539-abe7-460b19a21076
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GroupDescStatsUpdated.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU8Fu2zAMvQfIPwg5tUGjxMulS9sN
+wTrslBRb11OxAyPLjjZZEiQ6nTH030dbzpwCDQoHkw3JEkXy+T3SgfgFuWTW59w6aVKotMq3yCswOc+l
+4buEl968NObelo4HBFQBlQjcy10yT2hcDQeqcNZjz4jK7KRB66sYanaZvOdrm8pT42XaPnH0YAIIVNbs
+Ec7mfFVqVA48fu/Myyfwb+VCa3WIWYUtCor5dQ1FD6+NMqmi9RYQ7jY/pcD+vp+2Sqd32am0ROGwcnKv
+2Sy55F/q01sZxD0pGr5Jp6v+yJZlXpCEsNEnULK2qDIloNaCvOtnOh4PB2zMVjYttWSGqF40B/U4jDlp
+fmrSVWNz615sZQHMAW47t8czYmRx6LxonBed80eiRQWCcfNulswnSULvecyQEkNNmjApXQoo0+kxw486
+5XQ4cOVGK8GUQekzEJK9pPoh3qbLNORvJFwhblqdr7ta+XARLQc8X/+vruWvwtpnPNowrf2V8mktdQf/
+++wUHg7+RI2jqSWpASZYpgxo1rQWzcvVZ3bTqx+58JLQn43elHp0Meo0ps0xMUfnV21NPtfTX1BLBwgs
+aFpZtQEAADMFAABQSwECFAAUAAgICAAAACEALGhaWbUBAAAzBQAACAAAAAAAAAAAAAAAAAAAAAAALmNv
+bnRlbnRQSwUGAAAAAAEAAQA2AAAA6wEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GroupDescStatsUpdated.java-659f7669-329c-3539-abe7-460b19a21076--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/NodeMeterFeatures.java-afd37bde-9463-3eb8-9916-c1019d249f3d
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/NodeMeterFeatures.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStj9FKxTAMhu8He4deKkhweKMogiDn
+7ugzZF2s0S0dbTYc4rubnh3QXYliAylNk+//M6J/xUAupgBxJOlw6Tk8KywoAQIJzA1MSbafAyklyIrK
+WdlnSDQ3F42d67riYYxJ/40IEjvKhwz70rUj1ClR/qsUy0yiMS2rxvllc3XUeLD8A1Vj7PPKb1k6tvse
+FR/bF/L6+9m7KQxmxraOYtMlxqnt2TsWW/UJPbniarN4XTk79KbGPz6+PJythe/gm0K4rav3VaBEadkw
+XSDdFE5OD34+SvoEUEsHCPHRAfnWAAAAJQIAAFBLAQIUABQACAgIAAAAIQDx0QH51gAAACUCAAAIAAAA
+AAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAAAMAQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/NodeMeterFeatures.java-afd37bde-9463-3eb8-9916-c1019d249f3d--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetMeterFeaturesInput.java-c367621a-5d47-3d33-a65d-e0d853aa8b72
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetMeterFeaturesInput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStUk1PwkAQvTfpf9j0BAQWKhcF0RC/
+4gGMejQetttpWW13m+2USIz/3emHKSQYJHHabLPTeTPz3kwm5LuIgRkbc5OBDsUmUfEK+UbomMeg+drn
+hdW7P1NAsDxHgSpHJXNuYe2PfbKp66g0Mxb3Z0RjkrzOLU2aGs0flyKFv6MCpUNF32uB4iF4A4kHsL9y
+UHoNGo3d1M2PTv0zvjQhXBmN8IFPEB3f1byIU0oqgqSkVD7DXs91WI8tTFgkwDSRnVSO0rZTDipNB62m
+VdSzXEEqWCZw1cJeOkRmsg2eVOBJC74kTipXRs9ORv544Pv0dmP4qRKBwMJCPtzjUjor8LUsNnSdrAgS
+JZkiSWwkJLA7wEUZf9uE35fRFExGolFHeX3ZVbJfO9uhNY4tvc7/awP53hYvXOeznkhduSFWJZAsUlok
+rFpFOueLGzY7an+5tFQMOt7BwXh9r50IXSq1ve60WZev8vgGUEsHCLxd7IFmAQAAlAMAAFBLAQIUABQA
+CAgIAAAAIQC8XeyBZgEAAJQDAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYA
+AACcAQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetMeterFeaturesInput.java-c367621a-5d47-3d33-a65d-e0d853aa8b72--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/flow/and/statistics/map/list/FlowAndStatisticsMapListBuilder.java-d36792ad-30a8-3aea-990c-15def0503f12
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/flow/and/statistics/map/list/FlowAndStatisticsMapListBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/flow/and/statistics/map/list/FlowAndStatisticsMapListBuilder.java-d36792ad-30a8-3aea-990c-15def0503f12--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetAllQueuesStatisticsFromGivenPortInputBuilder.java-91272d6f-8cb6-3765-8cac-4cfb984fdcbc
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetAllQueuesStatisticsFromGivenPortInputBuilder.java
+
+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
+ZW50UEsFBgAAAAABAAEANgAAANUGAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetAllQueuesStatisticsFromGivenPortInputBuilder.java-91272d6f-8cb6-3765-8cac-4cfb984fdcbc--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetAllQueuesStatisticsFromAllPortsOutputBuilder.java-01148183-80ff-3103-9246-460f558c12a8
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetAllQueuesStatisticsFromAllPortsOutputBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetAllQueuesStatisticsFromAllPortsOutputBuilder.java-01148183-80ff-3103-9246-460f558c12a8--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/OpendaylightFlowTableStatisticsService.java-b63fcd6d-3303-3928-ab6b-892169cffafe
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/OpendaylightFlowTableStatisticsService.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS9Us1OwzAMvlfqO/gIPWQqiAtMOw5x
+QJM2XiBLvS6QJlHiFCbEu5M0sII0jcEBR3J+/Pnviy0XT7xFMK5lxqJu+E7Jdktsx3XLWtSsr1lw+rtx
+o8wzI75WyDxxkp6k8MxhX1/WF/XVTVnIzhpH8Mh7zgJJxYTRIjiHmtg8UHA4gg7mJmOUz1WspW5k3JdW
+rND1UvzCV5iuMzq5LtEHRT94/rVjdos0j5CHhPCrPWIRyIb/Tnqnc860JlVVFlDBvWmCQtC8w+vhIcni
+S7J9oDHOB9kJPikLG9ZKCpCa0G24wNO9o+ALRbDPl/Efy+I1l5lWMuVyk1QwRxJbGBsHswGuFNAWITED
+AzMerEMfxwqMHkzEnUYCbRr8DDXJhzx30/0sTI9+2mwG7WH72THeI0FRnw/0vyX1DlBLBwgLKaA9NwEA
+AGIDAABQSwECFAAUAAgICAAAACEACymgPTcBAABiAwAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQ
+SwUGAAAAAAEAAQA2AAAAbQEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/OpendaylightFlowTableStatisticsService.java-b63fcd6d-3303-3928-ab6b-892169cffafe--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetAllMeterConfigStatisticsInputBuilder.java-c4aaf063-0494-30a4-bb74-e405d85ade85
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetAllMeterConfigStatisticsInputBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetAllMeterConfigStatisticsInputBuilder.java-c4aaf063-0494-30a4-bb74-e405d85ade85--
+------=_contents/model-flow-statistics/src/main/yang/opendaylight-flow-statistics.yang-700c2c90-ee51-323e-ab41-0b44483beb0d
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang/opendaylight-flow-statistics.yang
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTlV9tq3DAQfS/0H8Q+1+wmvcYLgVAo
+FBoo+QOtPXZEbUlIcjZLyL93JN/ku1MSEqgIwZHmeuZoRslFXGRAhAQe01PG0lsTJJk4BtpQw7RhkSYP
+798RXJzmoCWNgGwKxUNfJbQqYauy2ZcqUkHC7ok9tYe4W+6zXAplyInyNIB7Qx4qQfzeEwV3TDPBg5ga
+9HW+O/sY7L4Gu4vN/rGj3gma8TvgRqhTYwx39qO2vgVn87YcAOYkQTfG2q1Rm2e74PzLrM0WnJ5lezBj
+eXcRnH+etWzoIYOeUW9vfbwuRy5iGAGzOVsPqVOJqCxDUZRrGhlUbINUPQ0GJkHfYHrZ2K0xXuwcOp+c
+45patVQnsprCdsWgI8Wki2TzkzPDaNZqicTFTTz6a1B3LIKa04+1p+32qkhzxGmggQFSYgQxt9BFwYF7
+WRbn0p6UlmhlZ7NF4EMrpJuvbYN86PS8v+1XJzW8PmFlK2Ax/mYJA0U2vQttAaR1OnYVGsHuCfWzTZUo
+JONpX873HwluKBZLzQmV0KFowlIMjWYa/Fi68TgeuETHRNqrE6aAblk0TKBKopOLVYmhrDQCNckOV1cW
+++FZVcfHsFBsHiPKYx/0nMogw+9Jb7/sYc0/VPYZhcp+FM7OWid2/YFTRYNuOs4Y0FEoOilX5z3Vx6m6
+DcOaKccSbFOAXVPp1A5gjgC8BY4ZTYbDaAWzVrPKawLk5vd3EtEs0/bKJ2Ci235DqDqTjEiKvQ1F3YTR
+fpqJEnlzUrZ0PcmUH86JRw9kDeo2/cbOXW0bCuPd/couitstfWRox4eHcVkMuONAqdtRYO849pkAO/Ow
+pHaJwkwZmWPs2P02KvTmRkCPVEHXaa8afYgHCLfoPgu4DkUJEfbZyEP4BQC2y13UcnjM3FRv9Ie18PS1
+fa3CjZbtOUs2LM2r1W2h6byJEnBhHwsRdYAOulMh3ZtrEn8r330yIc6H0wiQjsO5UHADMmMweBk4Ch+E
+QDk+jlEH9dHWvozSEkJee79GL9jaE6EITVMFqQWi/+CLRJaBM/P0B92qF1zjenBHRt9yk+KTL5ZJjfH3
+3SrxEsDll543cJcCH6Pu+AieLFZvUkwC22s+ATKgHd0Lrah17iHjKOQNEv0/TpIn1rrRW93O/r24KcN/
+erFb2AI+Q3mJswS6/kfQmS83iXXvbb754fPiVRsZQtPFW5hGV5Nt2pWoRPvDzIyanTBPhKKGIS8ywyRV
+JpiZOfjzF1BLBwgZnutMoQMAAJATAABQSwECFAAUAAgICAAAACEAGZ7rTKEDAACQEwAACAAAAAAAAAAA
+AAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAA1wMAAAAA
+------=_contents/model-flow-statistics/src/main/yang/opendaylight-flow-statistics.yang-700c2c90-ee51-323e-ab41-0b44483beb0d--
+------=_contents/model-flow-statistics/src/main/yang/opendaylight-group-statistics.yang-90bbc455-b6f4-3e73-90bd-56c509f8fe3b
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang/opendaylight-group-statistics.yang
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTVVkuPmzAQvlfqf7C4e0naQ7fk0qrq
+oZeq6qF3Lxh2VGNbtslutMp/rw2YmIfZTaJt1RFC2PPwfN8MA7UoGkaRkJQX5MCguje4UqKRWBtiQBvI
+NXp6+wZZ4aSmWpKcoqRRPAt9stYnO/kku85HKlrCI2rVTmu3OwXUUiiDDoRXmD4a9NRb2ucdUnQPGgTH
+BTH2tHeb7Xu8+YA3H5PdceQ+yhv4nnIj1GEIZnd2i7Fu8XY9VseBOUiqh2jB3mLU7QZvb6dRSyYecE4k
+uWMUG0W4JrmxjkNUo5Y8uCjoAqCSg7fu7rngxgbsFk6SzxzY76YmCv0Cfc8FnHRfawIsQ2TfKT4Bv4G7
++iYXtS+Xl27lQXp8W3slvhucFFTnCmSLJ/nGwQBhJy9RdpShoJU0VXvIqT9vhKU1Bl6hWAMOgIFTtWrl
+JE2tbQkVSkrCNJ1CbLQtbVDSbBovsO/TPJ5y7e6kqWpbIZSktlSZq5kenlJbqy7miDLb31nvhqGwdyjB
+gknagk9TCHMO8p3lePRv1YRCV5818qb6i2lb4Or1eXLZt1zEeHIGzzBUUmIaRWfNM2UqZndZk/loWFHJ
+DlHyXkbgubT5wyOkefWUuDRFP398QTlhTPfjQeaoogbbneg3wwlw2Zgpce2JHgJ2dNvULR/lnA0nojGx
+IGvv8IzgwcuoLJjGmDwQRedHL/SyR/0qiJ0wSvrBaSs4ieHEIV0ADcUkznG0/K9YDb8r/7KRThPmWsgr
+YJdGy19HGp1Il+L0Q+O7cCMoJ20tg+HR/1KG2lmbNdL9XRUhhBEHywPshT3rQdUNMyCJMjgG7/hMxkGX
+XJ/xSsudlXE026HS1+cabZqzMrXXH1BLBwiU+ciUhAIAAIYMAABQSwECFAAUAAgICAAAACEAlPnIlIQC
+AACGDAAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAAugIAAAAA
+------=_contents/model-flow-statistics/src/main/yang/opendaylight-group-statistics.yang-90bbc455-b6f4-3e73-90bd-56c509f8fe3b--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/group/statistics/GroupStatisticsBuilder.java-7555e69c-4a4f-369e-9825-37446a7abe1e
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/group/statistics/GroupStatisticsBuilder.java
+
+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
+AAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/group/statistics/GroupStatisticsBuilder.java-7555e69c-4a4f-369e-9825-37446a7abe1e--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAllFlowStatisticsFromFlowTableOutputBuilder.java-28cf4373-a77d-32d3-a6ed-b5a4b5047eb8
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAllFlowStatisticsFromFlowTableOutputBuilder.java
+
+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
+bnRlbnRQSwUGAAAAAAEAAQA2AAAAewgAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAllFlowStatisticsFromFlowTableOutputBuilder.java-28cf4373-a77d-32d3-a6ed-b5a4b5047eb8--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetQueueStatisticsFromGivenPortOutputBuilder.java-977462dc-9959-3f97-9409-1ee7d754c672
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetQueueStatisticsFromGivenPortOutputBuilder.java
+
+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
+ZW50UEsFBgAAAAABAAEANgAAAHkIAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetQueueStatisticsFromGivenPortOutputBuilder.java-977462dc-9959-3f97-9409-1ee7d754c672--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/queue/id/and/statistics/map/QueueIdAndStatisticsMapKey.java-ac024c2c-3fc4-397f-8455-cb1513a4058b
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/queue/id/and/statistics/map/QueueIdAndStatisticsMapKey.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTVVslu2zAQvQfIP0xyiZymTGQjW9N0
+cy9Bl6AI2ktRBLRE20xpUiEpB0aRfy8paqUsOzF6qXUQzZl5fPNmhlCCo994QkDICRIJ4TFeMDqZarTA
+fIImhKN5iFLJm8b7lKQEKY01VZpGCkkyDwdhPzzJTTRGmMd1jxlOLra36CwRUj/zNMrnhGshF+6Yo7Pw
+HH0VMRkKzklkDFfxptBjJh6QXiRE5cTdCef9Y/TN/l+LrIVgyp0xojym5n0VG7Z0TInclNVm8haM3/P4
+pjR8yWS3T5KOGI0gYlgp6HD9RBbbW2A4MzIzSSiocnndEfIG/pgQ80sknWNNICMVwZhyzIAJPgFFJMXs
+B5GKCv796iNcwsv+6aB/Ep72TVZHg7Pjs/PT8PMFOCQXWuDl58LtfVmQtpPXDnDLW/2Rs3QqdOcfrIM6
+aDHqFRLYn55ShQqLydSjXbl4sNa1Tdq6P7rX4f5+DrEPQ0lM1gowRCJZwFiKGdyIVEYErkd3JhwVrmXI
+uwRLPAPlvHJnkTkXPodPlajblOOvVMS5oGcIU0Ss1Gd5hWFCdL4MGqwk0Wbu/PKUWDUkvyEMore1HLmT
+rVu8u54TKWlMGodRrmGK1XRogpuwruGt3TT9jBhZBmFNO2uQRKVMG0vdUG66sP1i4wUEQVWVS+ApYz14
+C0fwqlQFVVR6T4Vslc+D9uydR2QiOuCnSTcyVzHBHMh9ipkK7vAcI2avWTcSttkbgtIxBLbjLEPfVqOg
+ZUpqxB6bACawynA5wNiwWYFg2mlo72RT7Z2MCKp2NoBcMZtCT4k0VVsxvz1L4KJJsN0kHqlMB4tdTflO
+h+uKHLw8HoEYu8EOdspuzCvbPGsTkbK0Ohu1Oz0/5N+m6U9GM13Pukna7Y5eM1LVDN1oab5tQAu3aF5N
+vtuHlLLYtNoofxuVyEOXV7C7omV/7tYvhWLCx1Qqe/3UEulo2a4CWacMZWnpCvyltXMFWxKVZ4twYr/l
+gt0DaJD3arEsoqB92Qr0PMver7ut6+//TAuP/npN/AHp0CYfAi9679deD1XdXR8P+5jFX1BLBwj0dGkc
+GgMAACoNAABQSwECFAAUAAgICAAAACEA9HRpHBoDAAAqDQAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRl
+bnRQSwUGAAAAAAEAAQA2AAAAUAMAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/queue/id/and/statistics/map/QueueIdAndStatisticsMapKey.java-ac024c2c-3fc4-397f-8455-cb1513a4058b--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/$YangModuleInfoImpl.java-9fb12aaf-feae-31a2-b96c-d6fa9b1b75d9
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/$YangModuleInfoImpl.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTNVt9P2zAQfkfif7CqSQQBbjsexvil
+sYlpfaCdKC/TtAc3uaYejh3ZTqFC/O+7OEkbh5Rfk9iiSHHi3Hfn++4+O2XhNYuBKB1TlYKM2ELweGbp
+gsmYxiDpvE8zLf3JWKsspcYyy43loaEa5v39Pl7kaHODJ6nSth3SKiVMAT7hMuL4/IEvFyrKBAzkVK3s
+f7M5o5nlgo7Btn3+xszMmwpVQmOlYgEUh4mS+BACQksHSZJZNhHwEIorOpBpZsdWA0taJkfntyGkliuJ
+k2k2ETwkUy6ZIKFgxpB3/gIGSSoIYghIQFpD/Flyt7mxuUHwSjWfMwvEZbFCbPw8GI6vzoZfzskJkXDT
+5inYPmoCFki4HEwukSwBtO7Uidhz9O2t6OscPYFgUhY6GKyEwzrUoYM6fCYUVgk3mMcc6X2vv7/X7+P9
+hIlRmQ7hO7Oz3Kx7cX51tjcYfu3mNdR9dFmuzCr0Vh9gj/2UnpKCfYiKb2aV3YL4kq0GTzHYgcQpGUKw
+nVNMykuDxZQteSxjuW9S1kpsHactUgO2rIuyEY5PXTVUNjhPWRQFL2vtqVA31GomDQvzmq9au7dPW6Kk
+3sr/3juXc2wapReF295B/+NbuHWL/ke+Cy21ixQqGe31D97CsZuEWwsy78nla7n6D70Xrr7ROFiaddFF
+JU4Xo2mAodaNasqLreUeJ23dQJ3U5s4vS0E4M4VZUFcIL54pCSpIbJNMCK+j8svOtLpxHTTAbSJmYozd
+DUu5DzqVM7LVITu+Fu2QzhbhhiTcGBSqTt31/Wpo9aLptQgKV6QMeA17T0JmwxkJalsOAS/qbpcsYxLA
+rnfJJLO4DtCQByOVneWqeQMIJUmkHsR0X1fDT6M5aM0j8CSuVF7M9RClv1XP8j3h6BWAl+UG0Apa7Q6v
+AR5Wm9TacN3s86HrhYn4RTWOXeLLutsuyseQOlt3/2Fpj9oKuq2en1HOZUJNdVZ6LlEt21cuJL5ktHL3
+cD9+WXFYVQwa+6n79jnjIgJNzKTcSL3PAfaS4+VLTlCw7YZMKslDJorW8ER4Qlma62vQ+dlZM1GdxjDb
++XDNX7v+mav82b2vtagfrRy1xesj//vnqkY5rLUr6DClSYOcNVa/vHRUJTShK2pWrOL9B1BLBwjtQMWB
+VgMAAJMMAABQSwECFAAUAAgICAAAACEA7UDFgVYDAACTDAAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRl
+bnRQSwUGAAAAAAEAAQA2AAAAjAMAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/$YangModuleInfoImpl.java-9fb12aaf-feae-31a2-b96c-d6fa9b1b75d9--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/flow/table/statistics/FlowTableStatistics.java-47b21064-5e69-38d5-8574-370804770485
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/flow/table/statistics/FlowTableStatistics.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU11LwzAUfS/0P4Q+bWPNlo492Dll
+iPo0Zcw38SFLb9tgmpQ2nQ7xv5t+QKsUWWEJJCT33nMuJycpZe80AqSyCKsUZEBPgkexxicqIxyBxEeC
+i0z+DoZCfWBNDwJwrqnmueYsxxkcyYJ4ZNkfX9kWT1KV6YFkiQpAdHn0KYWGbX7lLfEjSMg4eyn59ufS
+aaVEXhMzlSRK4t0TTeD8qgOXATf7XcxF8BwOL9wUUQKyUskUl3M2mdgWmqCtCgoBSJp+/OqiHF1ItxTY
+rUrdVpgqdc9iSChKqY7b2teRUdXvIvglgl8h+C3CrRGV51zJtTcnC5d4LlmOe7lmA27fyj5mtpUWB8EZ
+4lJDFlIG6MFk/3k1k2oGfGrTanNoBL6+rEV7uG+mNWHnYS5M2h//p5V+a9vWV22YOqnRtUJkKOSSClSZ
+2ayb7T1aD/oBmGVANYyc8yzjTJ3WK+bQ6wBnvGos/l0uP1BLBwj823ibZAEAAHUEAABQSwECFAAUAAgI
+CAAAACEA/Nt4m2QBAAB1BAAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAA
+mgEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/flow/table/statistics/FlowTableStatistics.java-47b21064-5e69-38d5-8574-370804770485--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAggregateFlowStatisticsFromFlowTableForGivenMatchInput.java-3c7e304c-59cb-3178-aa3a-a19952d83027
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAggregateFlowStatisticsFromFlowTableForGivenMatchInput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStk99PwjAQx99J+B+aPSGhhWliBEVD
+VIwPYPzxZnwo5VaqW7t0N5QY/3fbbTrwRUW7pFtvvU/ve3dNuXjiEoixkpkU9JyvYiUXyFZcSyZBs2XI
+cqs3f0axeWYZclQZKpExC8twr3cQ9g+bDZWkxuI2QFylULHC3u4+GzvjN0A0Js5KtDBJYjS7nvIEfu41
+U3qu3PuMI7+aPYLAbSUovQSNxq7qbLCpmcOp0QgveAPR76Ma5TJxUD6LvST/dNvtZoO0ycTM8xiIdmIH
+hcGPdST1KaV1jYpNt2IBCScpx0Xtdd9yWgbrvgPvO6h9T5wilSmjh7u9cI/2DmjY35GAlEtpQXKEr6fR
+yJqkNBbR08hYKpXLEE04ikX3b95Kpzk+eAXdZiPNZ7ESRLk024gLIBeAow+076HbT/DYcb3lzlPHxl54
+5sQjLz3RAd1wxXKpyMqF390pPzeLWRnrvqkMayU7+qdLxbYWdNxsvJZ9UwZXpao4RJBIaR6T4sK4eTQ5
+J8Nf3TImLLiIWsF3/RN0grpx3KIoX7BzWPX0m5/eAVBLBwj+1Ae2nQEAAIkEAABQSwECFAAUAAgICAAA
+ACEA/tQHtp0BAACJBAAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAA0wEA
+AAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAggregateFlowStatisticsFromFlowTableForGivenMatchInput.java-3c7e304c-59cb-3178-aa3a-a19952d83027--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/node/connector/statistics/and/port/number/map/NodeConnectorStatisticsAndPortNumberMapBuilder.java-69dc4a28-64ed-3b3c-bf2d-7b81ae8641f8
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/node/connector/statistics/and/port/number/map/NodeConnectorStatisticsAndPortNumberMapBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/node/connector/statistics/and/port/number/map/NodeConnectorStatisticsAndPortNumberMapBuilder.java-69dc4a28-64ed-3b3c-bf2d-7b81ae8641f8--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/MeterFeaturesUpdatedBuilder.java-b735ff03-4364-343e-aca9-8da08b839342
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/MeterFeaturesUpdatedBuilder.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTtHGtv3Dbye4D8B2aBQ7Wpo3ht52HH
+dvM4F2dc3ABx2wMuFwTcXe4uE620lSg7vkP++5GUtOJTorSSH23UIo6l4bw5M+SQWcHJFzhHIIrnfrRC
+4RReBXi+IP4VDOf+HIX+xchP41D+uEQExX5CIMEJwZPEj9HFaHdEnxf37+HlKopJQ4yzILr0SQzDBE4I
+jsIC4/au/2v59nTaFj8OL1BIovgqQ7z9fLTv/xJNkYhxEi39eRTNA+TTvy4pE5MoCNCE+O8palQCfoYX
+0E8JDvw3GQBlLTF9PoOrGoZJFAVJxvoYh1NMf/4dEvhu/JmiNaH8B0wW9WhFPWBEZv4KxnCZ+F+XgR/m
+9Ph7/jdytUKZDbe393f2qFRpSA28u9OltkOqba7yN1EYUuGi2EXzp8tlSuA4QG+ppyn6WEKy8F/j+Sll
+do5ik7bkUa4WeJXOl5R/yOxKR7P/Hj98eP8eeAjOomkaIBDCJTrgL9gj4nzE58ajcm5wqPPJAi0hWFGO
+y2EfPKq4A3HwAR98UA7+ieoPJ5SNo53t0e6j0Yj+P8wozBAkaYySR+lqCgmaPja//sjIPb5/b5WOAzwB
+kwAmCThjoD/nkL9lgK9THExRDP7HxGXsrWJ8QT9k2gyYfl5TVSEYgk/LKEbv0SrAiLm9CCxNVvCJKHNX
+BOVSTgAz0SGfYIelLY+PlbGf4nwKihjWfko5gl+5UA1pFMOM6PmoUvo3THWHPwH0lVCLJa1CZjnTdrf3
+R899Tvw1DKecmeKX83TF/BWpGrsuht7AFRzjAJOrNVvrV9TkNvZKzs4XbLox7TJxVB9xMAofZjSKiQiN
+wlELy/NhRiJZZgCfsNECUhCjqEIlqMlDaLCusJkYag67SsK+aX4fH29dKzUABWLgCIToEuTJ6/DYG5Z6
+ygJTRUjyhiwoMdhvIPvpPLKzIuQsDQimSZQIAe7VJYwRgPF8zR97yAInvhghqewUxsfJWfmOyy+PkMJd
+PmaOiBRQ18O+3ZQeHMVvL0xPIlVEuwK/zZJ5iiilOMvfGIyoh3BhmPbNhsAYbBVERhgTwjyYSuzzN2Zg
+HhQlYP7mmjzPVqZbbIMFrZyapJdCcwkrRXBRNGexTN/AGCaoNhYwoMbBgA+yTiCjsxZDmnrretzG7iph
+auGvggQODitAyx6ruEsB5+QvBbDZYdiDZ8BjUACHNDmGExTNjI5zulwFkm+wxwZIKw/25xEw+lmGihF9
+IaPjMlSmXY5XAhFl+abMg2zRw56H54iAGUYBNcwsjpZgjulEBfM4Sld0xcTmVcpQ+uB3GFA1F78DnKwV
+A6hmopD/mNHVXXTJBvKIfFBQAYdpcFz+EuDjzqP84WOKdQMStgi1Kd42tUePNGtIPRbstH77km8yMNuX
+jhHxjYwShCzi6DIBp3R1P4fBq9xNTr5O0Io7LJ1OmWuJHhTmbnPBfYubN8PIFrZCwL6I6OfMS3+mTuqV
+Oyla/hjnS1mccIeljNC5MoOBNKfY3GbSCFO7c3/UYoIWyL3uS50hU4c1OSjhXU0QvfJTnXQUzmyJp3cO
+65OZZMkiofVsST1JSlwUibJnLvTky6eSOM9InCI97XQy42zh2TLNcBt3sdIotHBq8wW1vOicsr1OuU4j
+tMlltjgo1c5N9dWKEa5Le4F+SxTpqD91IdGhBs2Kq1ykNNTdgxLWIB4tJHh1a6slPHkAAAP0dUUnBk0R
+WT1xAD50Hgm3OopXTfG08fQOaaioP4L/hAPwo2aBcUrAJUwOAP3IajIZoGotkpd4ejNCmamin8SI2sTY
+rjDtYsitC92PTZhN/Q0T7rJTIRVdRmblToYJ2zU3Jix1mZF5WwvjJsWQ2hk1JZxVqKoGiEk4tU8hlWgW
+u4vNEnececFlwSn2Rkw481ZHXrWYkOBaGyoNEb0OMaFVuyYahZdMzTSkJv+CcUjXkok3SMPJAk2+oOlg
+KHFxeHIjDRVwwmQVKXqqO5/IfZBfqX9K2uAlggIAjo5AmAb6dpFDzhuI3ACOLUYzFCO2ATOBYRgRMEbg
+l9/evn0wMMRbwULeyVDinaV2jdcWe6cgoW4rhGw9pNN1flq/kcqhXmhsM9B2e9WMMTnmyylBZ4tZj78F
+DywmK5uO4NMkonVgDHFICu6ZSn9nf9GqJGV/gncwDTsU7JnRpYSntThBDA6MPXRvqDFZiBL7lEVCGUw8
+gVkzPB8jM6cUcwbPMvwq1nkckZGag+efk5id3aDaWELiDU7DbLeIy3wA/kYrs6L8Y7/5g63MBFtGJQ1V
+e3wzzhRzje3smLlLtjgI4WluaIKyBpLkigbSOArxf2kxbNxjzqeEz8+LWB2mEdHikY70+Dkhk+DjfFoe
+KUPGRVvY4Gzsyb/7cDrN5gWVIkpodi+x+/8+ef9uiztU+dIbjJ7v7T19tre3/Wz32fb+kyejp6Mng6Hm
+DMVjFn9Nn/80cmmfEnoYrjgH0yK+rWvPsiLtNKwJKuYY3s08NdL1FOrkozzfo5wa5WT9NApwwmZ017FN
+tZoW1mSA/iOaI73iuUXBzDD19nb29/afPtvZf/K2IoqpIncdwIyH7NrELn0Res0rYWthauqT9FKfVqxd
+b2Q5XakRW3+mH80Uq2t1lXwt+a2/pCYchfye1AxJTdBP06RW9OV6SGqS1UxJTQC4lqTmQq94bndS23lS
+l80kWXvIZvrp5HbxKtu5+5PFK+FU9fd4ZYhXgn6axquig99DvJKsZopXAsC1xCsXesVz1+OVJGsP8Uq/
+6NAiXp1OvbxXYKv5cG+1ndxOMPUcbDypJy66Z4/6RGUH4Gbuemhdh2u9/CFR160idRVWqd5V2AK2I6pG
+e9XaCuRzydCHYoHedsjWY2T0Dod8w2iGQxhU3Kvj53nZsVvEBDLDlJfuBEFUR+rZZKwDWHBJuWabgzM4
+UbKBoLhe2ckShNyeEhSUWyBTvdP9RH2Yw01FfZD9xqEOe2uuD94caw0vElbZ1nyl0G2E2APXR2iX/Sz6
+crv2Jw7+fvWv+uqfpCtbDK7KvdqFm3WKaXbpphzW/OKNQNLx8o0wYoMLOAqWji7hSNI4XcSRRjhdxilH
+VF3IKaGaX8opnuQSk8kiu6AjVx0JXaNYlqcTdptn+0D/sOZIcW/hH4Hw0XJFrqif25cSMYJfLN845ZGF
+MnuyaETR+ychia/+msEFFS4gGRQxhZwj4g19TIdB7hJ+SPVhNYWLPf+SKk5wOA8QiULmyHyq/RNdecMt
+ILdxcxU28/MpmsE0IKDB/JLTh2b6mhWyVDm+fHeB4hhPUUW17XCwlD32w6UKAy7Um5w9FYnbqtaG5B2O
+p0oi66VvQ4K37wSrJF9VJX1LJW17yFWTu65Abyi/8zlYxcHUKr8TsoajsgpZdanQkKz9NK1IB2/qT40O
+3IqUTYdu7Uw4HMCtZvbunstlT6Ozuezp83yuYiXBqI3O6eZoXIzHGkgLmnbfUJ/RPSorRRkMXcEtWU22
+O1LYZR+pWVi2PwLqx/WHbPjD4sWPwPPkxVuh8J/ANm8xld/8kj1VVZXolUWeQkD62pZEuRZU2c8/tEZs
+WDKqJDSQjYhZVpYmokbQDVSYL0B1FfIPGyDO16k6Yv6hLWKsqwW3Fl9Z9Sp4pa8tSchltkxACihV6HkI
+ypA2DzFF1xn9kcJAPLmT39qPxp+NUZmtEhjHpu8CW4YusaElTJFURvUcmakVbsBGgy/PMDRiPuAM+uWb
+DdFbuwsRWWT/UoD9XwuhjKjRmTdaTYHW0pXlVOSNNdtxBAfZDPJ9Ayhg/5DKzHsgRfncO3T6mypUP8Lu
+qgR5UH9qkHORrAjpWyeq0JNWjSsU8D36QZEuFSfIX3cjdkVKrVGAPrJHVehpXVGKBtCdemqKAAc1mTH0
+rC5zQWJQmxGwq0mllDG1kyqD73VSZQWUNqn4667EVoqsWrEz+F7Fzso7TWz+uhOxsfOkwH06P1adHHfj
+zJaitFpSeVB/Qss1sSy/9K0LVZiL50pFSEN6U4PcFRGVIG2ab6gCc4XdfpOOn6gEJMr+om83qKDrDvD6
+RB/bdrFBeQPjqZsP2g5LsSCZ4Tgh+jnTmgq6yqYMmGO1WrygaTV5ZmPL6PURxRXbOvMGW0ATjiPRX6kj
+RZGOjEiUEVJJroLXl9x/Eq1JQrnpTa7gXTTnVHHfIaUV8jj6WVH1O6mqWW1+l5SmSeaoPn194KzI5tX7
+XVOoUcIGijWvIBwndX3Ff5fUmcvjPKmzVYejqupXCXdLVVweZ1VlKxUXVdWsL+6QkrDjNMRu0819OXKH
+dCQJ5aYueUnkoDm7KqrUYFeBg/gKF+oIcUWjC61ASwsjfg8ksTY0lKE/fPxh6JeLE33Fw/sd9I//A1BL
+Bwg4c6UdvAwAAE9rAABQSwECFAAUAAgICAAAACEAOHOlHbwMAABPawAACAAAAAAAAAAAAAAAAAAAAAAA
+LmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAA8gwAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/MeterFeaturesUpdatedBuilder.java-b735ff03-4364-343e-aca9-8da08b839342--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetAllMeterConfigStatisticsOutput.java-a32889da-4c96-34d1-ab2e-4a6efd8acd4b
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetAllMeterConfigStatisticsOutput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU99PwjAQfifZ/9DwBAQKkxcdolnU
++IRE8c34cJRjVLt22W4gMf7vdj/MJjFZltgtbXrX777rfdcIxDsEyEwccBOh3sBRyWBH/Ag64AFqvnd5
+GuvfzhAJY54QkExIioTHuHenrh0zpyPDyMTUMuJWmQOnGHQCgqTRPxEnU/5cWf0DxNhAQcaopCATJgxt
+qMcHCFug1lJvpF1vgWC5fkNB7bF+GoSoCdaqibihxnSMsCzv5MI954vMemP0VgYrW/7kCSN1tBTZNx4M
+nA4bsIXZpAqZtrf2ckM26rFHeexRpV9+aiV2GAKLgHYV7KVnE/PqYC8HexX42mYnE6vO/GziTkeua/9+
+gDQCpUomkSdcIxw3+U1KUUqvWR5jpxOlayUFk9oe3oJAdo/kK3VSjAK6zJEWaAd+kE08KTZ/lm5Y+E57
+rDRXLVAaarpe/teT4Y2XuXI6n4XERRZlOfJggm2lBsXyJrezv7hj81Yvg4sYgbDXbVS6O+xWEttNIVK3
+Pysb8CubvgFQSwcI+XVgnIYBAABSBAAAUEsBAhQAFAAICAgAAAAhAPl1YJyGAQAAUgQAAAgAAAAAAAAA
+AAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAALwBAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetAllMeterConfigStatisticsOutput.java-a32889da-4c96-34d1-ab2e-4a6efd8acd4b--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput.java-0972dae8-ecea-3649-a09f-44a2d65152a7
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU1FLIzEQfi/0P4Q+aTFp13Jg66kU
+7upTFdE38WGazqbRTbJkZ+uVw/9ustveVqGU6mUhSybzfd/kyyQH+QIKmfNKuBztHFaZVgsSK7BKKLRi
+mYjS24+baeZeRUFAuiAtC+FxmQz6Z8nwvN3SJneevkJIHmwBkrSzNWOS9AfioYmOX8HjHglyLitqMemM
+CVR3N2AOQM20nevw/wUEt7NnlHQ4dlwqg5Zglu0T3umIcXPMtj2mVY4bp4enP8RYKY8KCCfBu/t/eUEv
+fr1ut91iXTZ18zJDZoMFoyoQx7YQj9bzRqdKupcLNMByoEWDejwKRY62saOIHTXYq1CdLsJFXZz2kwHv
+n/FkeKyQOGxq/azGU+9MHazc4qnzXOklWm6A5KL3PbQrKS/pKR6h127l5SzTkmlL6FOQyK6Rdrg4CcQx
+8hBpJ85fR9Jp5LytKANjGPiHghlFvfjcpyd1eIfAerdpsk160zk//9ObFF8/5mW79bfup7q6tYOVimSp
+tpCx6nmFeTz9zS4OepNCegwlHXX29VXnpNM0VFjU19o5Pl83+1uc3gFQSwcIM7s2iacBAADKBAAAUEsB
+AhQAFAAICAgAAAAhADO7NomnAQAAygQAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAAB
+AAEANgAAAN0BAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutput.java-0972dae8-ecea-3649-a09f-44a2d65152a7--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetAllMeterConfigStatisticsOutputBuilder.java-148cb42f-87b7-31e2-bc76-d10067c6be08
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetAllMeterConfigStatisticsOutputBuilder.java
+
+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
+SwUGAAAAAAEAAQA2AAAAdQgAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetAllMeterConfigStatisticsOutputBuilder.java-148cb42f-87b7-31e2-bc76-d10067c6be08--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetAllMeterStatisticsOutput.java-4accc790-b257-356a-9244-b23f7c8e1a06
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetAllMeterStatisticsOutput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU01PwkAQvTfhP2x6AgILlYsW0TTR
+eEKjeDMehmUoq9vdpp2CxPjf3X5oET8IxGmzzc7smzedNxuDeIYQmUlCbmLUM1grGS6Ir0GHPETNlx7P
+Ev01GCFhwlMCkilJkfIEl97AszZsODKKTUIHZaR1jFWy/ol3zMe5d/JJc4exWh/KMFdmxSkBnYIgafRH
+zf0Bv6+9wQoS3EFBxqi0JBMmimyq22uI9kBNpZ5J+70AgpvpEwraHxtkYYSaYKpy4vzptdsNh7XZ2Mwy
+hUzbkvzCkdtmym7R7G4tX3FqIhYYAYuBFjXsoWn76G+C/QLs1+Bz20eZ2taNjvreoOt59m2FSF1Q6htT
+79eAySjO6DFn7jWcOJsqKZjU9tQcBLIrpECprXm4KTAWYg1fyBaZlpttQTul+6dxqkK1FJVjo7+n/3U5
++B9/cdZwXksdS/6qA0UaweZSg2LFmNk1GF+y0V6zyUWCQNh0d8rpdtxaR7spdXFbw2rK3vLlHVBLBwht
+PzoheQEAADYEAABQSwECFAAUAAgICAAAACEAbT86IXkBAAA2BAAACAAAAAAAAAAAAAAAAAAAAAAALmNv
+bnRlbnRQSwUGAAAAAAEAAQA2AAAArwEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetAllMeterStatisticsOutput.java-4accc790-b257-356a-9244-b23f7c8e1a06--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/NodeGroupStatistics.java-79ca29cb-ccd3-3e5b-9412-81d62b922730
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/NodeGroupStatistics.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStT0sKwjAQ3Rd6hx5AgsGNoAiC4E4X
+niBNxxitSUgmxSLe3cTU/0JEZyBD5jHvYxjfMQGFtoJoA6pibS3FBknLlCACFGko8VY9g8Jqb4hDhtKh
+5I5YaOiAhhrlmdwbbfFvjGQeodUN+aCAWtcuaZVSVTLMGUO2LLfA8Td32Bq4GuvTYdq65O97V1Mv9qBi
+LK3CdWzjy1ryQioEu2YcioWu4CV+nhWh4IBBofvc8/XS4pF6fLmfdMgb2TEppz7F5wxQSwcIDIRP0MAA
+AAASAgAAUEsBAhQAFAAICAgAAAAhAAyET9DAAAAAEgIAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50
+UEsFBgAAAAABAAEANgAAAPYAAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/NodeGroupStatistics.java-79ca29cb-ccd3-3e5b-9412-81d62b922730--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/AggregateFlowStatisticsUpdateBuilder.java-24694f2a-0921-31bc-a688-adc7d90b7890
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/AggregateFlowStatisticsUpdateBuilder.java
+
+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
+AAAAAQABADYAAAD1CwAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/AggregateFlowStatisticsUpdateBuilder.java-24694f2a-0921-31bc-a688-adc7d90b7890--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetMeterStatisticsInputBuilder.java-703bb006-8498-33fb-b6a5-3c42ff1fd31c
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetMeterStatisticsInputBuilder.java
+
+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
+ZW50UEsFBgAAAAABAAEANgAAAAEIAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetMeterStatisticsInputBuilder.java-703bb006-8498-33fb-b6a5-3c42ff1fd31c--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/OpendaylightPortStatisticsService.java-8067652a-37fa-34cb-9741-9da9a39481f4
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/OpendaylightPortStatisticsService.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS1VFFLwzAQfi/0P+Rx9iGj6pOTgQiK
+DzrZfkGW3rpoeinppTjE/26yuNUJ2zpwF0ib3F2++74cqYV8FyUwY0tuasBCrLQql8RXAkteAvI2587i
+rrM2lnhDglRDSjbcQptf5Zf59ShNVBW8/3UgfwR6MQXcG0SQZOxsGzRxVDvqEN9EK7gjpbk0KJ21gMQf
+HDkLR8oiY3QTC5wrLJT/Tms5A9sqeUKuNFVlMKROoXGaziLGndY7ejT7BTn/FTzhuQAP0NyAhjHMsjRh
+GXs2hdPAUFRws94INvmF9urBuiN+rjZEDtOkdnOtJFNIYBdCQq9Eb/BBPq6Ji65h0uQzFhdGcMUig2XM
+U2MdZ7YwlgmtGXquTG7JsoU1FaMlrB2b5GH8iS19u22z2z5dMR6z8mDYoIfoXiI/X4xiHb3IlaoF/EPv
+ZHYHH4DIbE/I4EjvdozS5CtM31BLBwigyADxVQEAABAFAABQSwECFAAUAAgICAAAACEAoMgA8VUBAAAQ
+BQAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAAiwEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/OpendaylightPortStatisticsService.java-8067652a-37fa-34cb-9741-9da9a39481f4--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/nodes/node/meter/MeterStatistics.java-cab07155-0a93-3897-95b2-ed3d27471c49
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/nodes/node/meter/MeterStatistics.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS1U89PgzAUvpPwPzSctmWU1V02tmkW
+43EzxqPx0MEDGktLoEyJ8X+3FCITZ+aWWMhr2ve+971fzWjwQmNAMo+xzECEtOIsThSuqIhxDALvCS5z
+8V2ZgoIcF4oqVigWFDiHPZkSvbCQIRRGNlYL22JpJnN1nEJJyYuGLJBpKgV+2NIU/o7aMREyvd8mjIf3
+0fnAdRmnIBTd8VOsl5RjqwuxqdWPX1rNUn/eaGRbaIQ2Miw5IKGz9s1FvQ7du8a927k3Vo9BAilFGVVJ
+B3sa6Nj8Q7DPxF5nJ/PqRgfFCibF6mpCpu5k5pL50HTL66T300HE5esJLybAI1Bz73eB98CE6H/Yz+65
+zsazrazccRYgJrQ6ogGgXhm1mV7wpjRhe2hnYHmk6NfjxuSg28t/m3n8C/klhKrKoOWazMms79q23ptx
+ahjaopkoAxQxQTkyD0rL9eYOrc56hTjIgSoYOCc764ydrqX60G+qM1y0Y/9Ri09QSwcIrNDPTXEBAAB2
+BAAAUEsBAhQAFAAICAgAAAAhAKzQz01xAQAAdgQAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsF
+BgAAAAABAAEANgAAAKcBAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/nodes/node/meter/MeterStatistics.java-cab07155-0a93-3897-95b2-ed3d27471c49--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/flow/capable/node/connector/queue/statistics/FlowCapableNodeConnectorQueueStatisticsBuilder.java-2dc04a2b-8db5-32e9-91e1-7dbf714323bc
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/flow/capable/node/connector/queue/statistics/FlowCapableNodeConnectorQueueStatisticsBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/flow/capable/node/connector/queue/statistics/FlowCapableNodeConnectorQueueStatisticsBuilder.java-2dc04a2b-8db5-32e9-91e1-7dbf714323bc--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetFlowStatisticsFromFlowTableInput.java-74725836-aea6-3022-87ba-616db3334513
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetFlowStatisticsFromFlowTableInput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU11PgzAUfSfhPzQ8bcvoYCZmY06z
+qDM+bEbnm/GhlAurQkugTInxv9sCkS0+7COWpNDbnsM999ymhL6TCJDIIixS4AEpYxatJS4Jj3AEHG9c
+XGR8dzOMxQfOJZEsl4zmOIONe+aM3PHENFiSikyeQijLFBou1xme47kK7iGUQsR5TU1FkgiOH5ckgcNR
+PuMBU+8bIsmD/wZUniqB8Q1wKbKyrQZeigCuBZfwKZ8gPD6rWRElipT4sZakn0GvZxqohxYiKGJAXIn1
+qoAe25S2LqndelQdWtE1JASlRK5b1EtHafG2sZ7Gei32SiliORN8OnTcM9sZ2e64G8Gff9hhJpI6WOU8
+OOQM42khX3U2A9NICz9mFDFVsiwkFNAdSN0Gq1/8XMF15FmD7zVWQdVQJVYC8nqhD/Trz10LmmDrdhPY
+KvTFP10FfEDql6bxVftap9HIr+goChknMaoaWs2zxS2aHnULMM2ASOhY+/y1+lZrrFpUlljdSdNz33r6
+AVBLBwi1oO2efwEAACkEAABQSwECFAAUAAgICAAAACEAtaDtnn8BAAApBAAACAAAAAAAAAAAAAAAAAAA
+AAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAAtQEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetFlowStatisticsFromFlowTableInput.java-74725836-aea6-3022-87ba-616db3334513--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/OpendaylightMeterStatisticsListener.java-e6969c27-68da-3df8-a841-df891b274ab5
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/OpendaylightMeterStatisticsListener.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS1UcFqwzAMvQfyDz5mObiE3dbjYKe1
+O5R+gBsrnlgiGdsJK2X/PnthW9ekkMMqgY305PceslX1mzIg2BnJFkirY4vmNcijIiMNkBwq2Tv6C3YQ
+wEkfVEAfsPbSwVDdVzHWeYadZRf+jVFuEvTI1KDZRdzvrVYB9K2UnkCF3sFCmcDc+lHwgKQx3lsO2GAd
++ZmeowYQuFuZ3f0gv3ZTrsoyz0QpNqz7FgSpDh6+GilezhQuWL79ptlVntn+0GItkOJQo2pY+DQGvMdC
++7GY20ienUarKdPQwKgF05XfLq70BZ1x361HqinhxacWc82FVJOVF/PtCV2efaTjE1BLBwjXvM/R+wAA
+AHIDAABQSwECFAAUAAgICAAAACEA17zP0fsAAAByAwAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQ
+SwUGAAAAAAEAAQA2AAAAMQEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/OpendaylightMeterStatisticsListener.java-e6969c27-68da-3df8-a841-df891b274ab5--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetAllGroupStatisticsInput.java-47653453-1406-34c1-a2e0-cc76aefd755a
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetAllGroupStatisticsInput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStUlFPwjAQfifZf2j2BIQVJi86REPU
+EB/AKI/Gh647SrVrl+5GJMb/brcRB1GCJF6bLr3uu7vvu8sYf2MCiLGCmgx0wjZKihXSDdOCCtB0HdLC
+6v1HYU2R0RwZyhwlz6mFdTgMnY28lkwzY/H3iGiMyuvY3KSp0fRxzlL4OyqWOpHue8uQPcSvwPEI9iAH
+qdeg0dhNXfzgPLygc5PAjdEI7/gEy9OrmhQidUFZrEpK5ep3u16LdMnMJIUCoh3ZqHKUthsyqDQNGk2r
+vxZ8BSkjGcNVA3tuOzLRLjiqwFEDvnacZC6NHp8NwmEQhm53BGDAlPqRqX/wQeqswJcycd9rZUWsJCfS
+yWOXjAOZAk6UmpagxTfmvoQ4hDOnoisxry/70vZqZ9PFrWNHwMv/Gkl6uM4rr/VR96lOv6VYReFkKTVT
+pBpQd05md2R80lRTboEhtP2j7fJ7ftMnd6l09zuj7RB9lscXUEsHCAbMyz5mAQAAqgMAAFBLAQIUABQA
+CAgIAAAAIQAGzMs+ZgEAAKoDAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYA
+AACcAQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetAllGroupStatisticsInput.java-47653453-1406-34c1-a2e0-cc76aefd755a--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAllFlowStatisticsFromFlowTableInputBuilder.java-55586e79-66d4-3065-ac4b-d40b2c1eab02
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAllFlowStatisticsFromFlowTableInputBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAllFlowStatisticsFromFlowTableInputBuilder.java-55586e79-66d4-3065-ac4b-d40b2c1eab02--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAllFlowsStatisticsFromAllFlowTablesOutputBuilder.java-ca67534e-46e5-3b21-a63c-f92aa88c5435
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAllFlowsStatisticsFromAllFlowTablesOutputBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAllFlowsStatisticsFromAllFlowTablesOutputBuilder.java-ca67534e-46e5-3b21-a63c-f92aa88c5435--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/group/statistics/GroupStatistics.java-fb4eabda-b1a1-3f89-8cde-ec20711f70eb
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/group/statistics/GroupStatistics.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStk11LwzAUhu8L/Q+hV9tYs8XdSOeU
+IeLVFNmleJGlZ2kwTUqaDof4300/pLVT5mSnJSU5efOcHN5mlL1SDkgbjnUGKqZ7KXhi8Z4qjjkovCO4
+MOp7khtdZDi31IrcCpZjAzsyIy4OUnPfE2mmjf0ZYbWWeQ1jOk21wk8PNIW/qzZCxcJ9bxMh48ft6cJl
+wVNQlm5kSS2fyWjke2iEVjouJCDl6omqhTK6R4bVZcP2stWuNUsgpSijNmllzwPXxKgrjipx1IpvXBNF
+LrRaXEzJLCTEvcM+YXJ04aVkTnwvKzZSMCSUBbOlDNB9uXHdrdUFvFlXUjNpenh1NjP0kNfjmtNp+flY
+B6lf4P8B2n0GX6wpuewf7XvvtXNqQtP5qhSGtkJRiSpXu3G5ukOLk34FzAxQC4PgqIGCcdA6x036zgiG
+88bhH+XwCVBLBwin4fIbSQEAAPsDAABQSwECFAAUAAgICAAAACEAp+HyG0kBAAD7AwAACAAAAAAAAAAA
+AAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAAfwEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/group/statistics/GroupStatistics.java-fb4eabda-b1a1-3f89-8cde-ec20711f70eb--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/$YangModuleInfoImpl.java-736e218c-5641-3e0a-aecc-bb778f259a62
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/$YangModuleInfoImpl.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTNVt9v2zYQfg+Q/4EwBlRBatpykHbN
+j2JZkWF+iDPEfSmGPdDSWeZKkYJIOTWC/O87UlQsKnKTdEA2QYAone674913dyxY8pVlQFSZUVWATNlG
+8Gxl6IbJjGYg6TqmVSlD4VKoW2rYQgDVhhmuDU80LWEdH8WT+Jic7u/xvFCl6cc1SgldW1hwmXJ8fsGX
+K5VWAqZyqbb6f7M1o5Xhgs7B9H3+nelVIEpUTjOlMvQNl7mS+BACEkOneV45px9DcUWnsqjM3JTA8h7h
+9eW3BArDlURhUS0ET8iSSyZIIpjW5KdwA9O8EAQxBOQgjSahlNzt7+3vEbyKkq+ZAeKi2CB2fp7O5p8v
+Zp8uyTmRcNtnKTo47QLWSLgdDC6RLAfUHrQTMbQ5HLpwDLc5HJw+AaMLljgs5MRJG+/E4p04vJNn4iFf
+uMaIWrjJOD4axpNhfPyEilZVmcAfzKys2ujq8vPFcDr7bWTZNHp6g451jYleQ2DOwgh/JDUZIK2/6W2w
+ax745HXSloGZShTJBKIDm3HirxIMBu8hrd6X+24Ge/PcxunzVIPxNPF1cfbRkaPRQTllaRq9rNxzlYJo
+V7rZFODrffxhckx7fKXB/v+9D67lcLnGclLlxtv+Of7warZNyaRmiW0BvtPF46PXsP4fbdoJ4ZsBaWv0
+4dU78X78Kk7UM6ZFt3g8efcyw53ixfJozwEcDsXmehmhe22l1jDA8naP876KpK77W+M3vjNd6Fotareq
+wJ8liRpILNVKiKCq7WVWpbp1VTzFyZUxMcfSg4cJFA0aY+TNgByGTfGQDN4QrknOtcaOOWibvt8uTbnp
+Wq2dwh0pDUHTuCcJM8mKRK0pSCDwejQiDz4JYF/fkkVlcB9QgnVGKrOy7fsWEEqSVD3y6b7dkX+5XkNZ
+8hSCNutHAMZ6hoOot6faCXX6A4A3fhL1gjZj6keAZ83I3Omukz4fuk1MxK/ZOHeB97w7qOmjSTtbd/9D
+al/3EbqPz8+gsw+obo5vz01Uzwi1jSRsGb25e3wmeBk5jKoXnZnuvv1acZFCSfTCD/Pgc4S15PLyySYo
+OnBLJpXkCRN1aQSNd0FZYXtqNPhzsEPQHBAx2na546+34QnQ/+zed2q0z3gutfXrd/4PD3gdOuzUq9Oh
+vUonOTu0/grC0VBoQbep2WYV738AUEsHCKBLc4ZzAwAAKw0AAFBLAQIUABQACAgIAAAAIQCgS3OGcwMA
+ACsNAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAACpAwAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/$YangModuleInfoImpl.java-736e218c-5641-3e0a-aecc-bb778f259a62--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetAllMeterStatisticsInput.java-d3686548-2596-3874-bd47-ef0a8bc0c3af
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetAllMeterStatisticsInput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStUlFPwjAQfl+y/9DsCQgrVF50iIao
+MT6gUR6ND113jGrXLt2NSIz/3W4jDqIESbw2XXrdd3ffd5dz8cZTIMam1OSgE75WMl0iXXOd0hQ0XTFa
+Wr37mAGCpQVylAVKUVALKzZizsa+J7PcWPw9Ihqjiia2MFlmNH285xn8HRVLnUj3vebIH+JXEHgAu5eD
+1CvQaOy6KX54ys7ovUngymiEd3yCxfFVTcs0c0F5rCpK1Rr0er5HemRmklIB0Y5sVDsq2w4Z1pqGrab1
+X3OxhIyTnOOyhT13HJloGxzV4KgFXzpOspBGT06GbBQy5nY3BQy5Uj8yDfY+SJ2X+FIlHvheXsZKCiKd
+PHbBBZBbwKlSswo0/8bcVRCHcOZUdCUWzWVX2n7jbLu4cWwJeP5fI0n313nhex9Nn5r0G4p1FEEWUnNF
+6gF153R2QyZHTTUVFjhCJzjYrqAftH1yl1r3oDveDNFndXwBUEsHCJ3yKRNmAQAAqgMAAFBLAQIUABQA
+CAgIAAAAIQCd8ikTZgEAAKoDAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYA
+AACcAQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetAllMeterStatisticsInput.java-d3686548-2596-3874-bd47-ef0a8bc0c3af--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/node/connector/statistics/Bytes.java-089772b8-4ea1-322c-8033-e7ffb10aa39d
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/node/connector/statistics/Bytes.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS9U8tuwjAQvEfKP1icADXmpR4aWipA
+PfQAVR+3qgfjLMZtbEfOgoqq/nsdB5pUAvVxqCM5cnbWM55xMsZfmABirKAmA52wbSrFCumWaUEFaLrp
+0bXVX4vKJJDSHBnKHCXPKW4zyKmFTW/QPeufUu0AlButgaOxNeQwDKTKjMXDjGhMmpfc3ChlNL2dMwU/
+71pInUj3nq5kmtwsf984XgsFGtkirbE+sw2jiuGKTqS41ggC7Ddb/927uQNM99bd150rnk67HQakTWYm
+WadAtHMn9h+KUSeKKorIU3jUPV+BYiRzZ6naHptOZVxvjr3KuNoi9ltcOpUyl0Zf9Lu9QdQ9i/qnrSLr
+6DPrGm3neGWxRcifCgGdMMjWi1RyIp2vdsk4kElRdUU34BWdqt1iF+r5EYdGJyWsFuH5f91r6jWPwuCt
+jKlUsjuZh3GylJqlxF9oN49nV+TiV38B5RYYQrPxw7QaJ40qJrfwpjdaw+FeXnWZiQC8Aw5yA0mzNSzL
+h0APlulcScQdLgzei+kDUEsHCCfOWiuNAQAARwQAAFBLAQIUABQACAgIAAAAIQAnzlorjQEAAEcEAAAI
+AAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAADDAQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/node/connector/statistics/Bytes.java-089772b8-4ea1-322c-8033-e7ffb10aa39d--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetMeterFeaturesOutput.java-fe0a31a8-fb3b-38ba-94d8-c97dce4766d0
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetMeterFeaturesOutput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU0tvwjAMviPxHyJOgCDQcdnK2IS0
+x4lNe9ymHUxwS7Y2iVIXhqb996UP1LIhIaa5Vao4tr+v/hwD4h1CZNqGXBtUC9hEMlwS34AKeYiKrzye
+WrV7GCOh5QkByYSkSLjFlTfynI2bDRkbbenIikGk15wsqAQESa22FYcj/lx5p2uw+FeIgjRtDJZ8h2fe
+KZ9l3hsESi0mj2iizYH6pHWUFEhCx7Gj+nAH8SFWtay5VAvpvldAcD9/Q0HH507TMEZFMI8y4OwZdLvN
+BuuymV6kETLlKPm5I7N6yX7eh34lXh71JJYYAzNAyyrtpe2a6NeT/TzZr5IvXSdl4qSZnAy9Ud/z3NsJ
+cYsSlI0d7HHplExKrxnaoNkw6TySgknlYgIQyG6RdrS5z8NdtDP8IMcpKTY/56NXuH8LWx5UfS8dtWae
+/9c94PvpXzQbn4VeBXT513kFwQKpIGL5OLl1Ortmk6NmkAvr0LDdOihbq9eq9HKbQotWZ1xO01e2fANQ
+SwcIY9PMlX0BAAAcBAAAUEsBAhQAFAAICAgAAAAhAGPTzJV9AQAAHAQAAAgAAAAAAAAAAAAAAAAAAAAA
+AC5jb250ZW50UEsFBgAAAAABAAEANgAAALMBAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetMeterFeaturesOutput.java-fe0a31a8-fb3b-38ba-94d8-c97dce4766d0--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/FlowCapableNodeConnectorStatistics.java-343fecbc-0427-3136-9965-935d4dd14957
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/FlowCapableNodeConnectorStatistics.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStklFrwjAQx98L/Q6hTyprXNSniozh
+tjcdw8fhwzU9a7Y0KWl0k7HvvqTVtYOBDpZCSnr3u//dPy2Bv0KORJuc6hJVBgcp8q2lB1A5zVHRPaM7
+o34GS20srSxYUVnBK2pwz8ZsxCbTMBCFj/5e0Gotq6Y010WhFX1aQoGXU6lQmXDvO7DwmL4gt471z3Aw
+CAMyIAud7SQS5aom9Qe/uhVjrxO3vddJK77FAkgJdttSzz03d9JlE88mLXvj5haV0Go2umbjmI1iNulv
+pH6LOZSQSoyVzjDmWinXqTYd2eFlaWvfzTAMyl0qBSdCWTQb4EgeHD5v6KWD5yd21R3MLXy3rv/joXUt
+DD4a35rAsXyty8lGKJCkvhm33y7uyexP10m5QbDYi875F11FrXHucJknUX86PTX+T78t9cr0qEy9Mv1W
+7gLnXSc52vNZvX49waffvgBQSwcId00eGFMBAACCAwAAUEsBAhQAFAAICAgAAAAhAHdNHhhTAQAAggMA
+AAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAIkBAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/FlowCapableNodeConnectorStatistics.java-343fecbc-0427-3136-9965-935d4dd14957--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/$YangModuleInfoImpl.java-2306d0d5-5d7f-3ac0-abfa-3349cecfdd94
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/$YangModuleInfoImpl.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTNVV1P2zAUfUfiP1jVJFJBXT7GAy2g
+McS0PtBOlJdp2oOb3KYejh3FTqFC/e+7cRISh5QynhZVqmPnHl+fc+51zPwHFgJRSUhVDDJgK8HDhaEr
+JkMagqTLI5om0l2MVACCasMM14b7mppVDJomsDw6OTw7PiXD3R0exSox7cBGKaHzLWZcBhz/f+LLrQpS
+ASM5V1X8H7ZkNDVc0CmYtunvTC+cJV9FNFQqFEBxGCmJf0KAb+goilLDZgJeQ3FFRzJOzdQkwKKWxcnN
+kw+x4UriYpzOBPfJnEsmiC+Y1uSTe4BRFAuCGAIikEYTd5U87+7s7hB84oQvmQFiuSwRGx+PxtP7q/H1
+DbkgEh7bdvK6wyZgjoTHQXKJZBFgdKcuRK+Sr2fl6wy3IOiY+RYG/TCoQw2sHwYV4GA7IHqFa2Qzwzs+
+PDrpHZ71jk+3hGiVJj78YGaRhfVvb+6veqPxt37mpP6bh7NmK9Fb9wBz7hJ7SXIPQJDP6YrjXP5Cs4Za
+IZiRxCXpg9fNhCbFk4BB4l7ULHJZN4VrlbeO05apBlO4oyiH80vriTIG1ykLAm9rmXMwcxqzhEWaPkWC
+yqJM7bwdVaV+iKX+mbbkSx0O6nk0GMWc6zWJhRqvJnMPs60H1QoTObd/F200UVuJ2eZ3hVOudB7m1a3j
+5DMnXgmJ/KVCOFRnj1kk6tFSO8IuEjIxRdnhpRt4nXIzstch+65J90lnj3BNIq41OrhT33pdDU2yau6a
+J4UnUhocJdfEZ8ZfEK/WkQg4Wff75CUnAezhgMxSg+eABLJkpDKLrJweAaEkCdSrnNb1MvkyWUKS8AAc
+7xcliVyPsTO0Gj1rGcMPAN4VnaEVtGwbHwEelz1sY7p29f3QdWMifu7GqSW+8F03t48mdbWe/0NrT9oM
+3ebnd9i5IFSXV+l7hWrpa1kjcVtGq3avG/W/mcOofNBotHbua8pFAAnRs6LDOtMe1pLV5ToTyOvaIZNK
+cp+JvDScPjyjLM76r9f51dmwUF7WyHY23PDVgXslFx/b940R9TvXSpu/vvG9e+E27LAxLpdDFyENcTZE
+/XboKC00o5U0lar4+wtQSwcIzLBFaDADAAC4CgAAUEsBAhQAFAAICAgAAAAhAMywRWgwAwAAuAoAAAgA
+AAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAGYDAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/$YangModuleInfoImpl.java-2306d0d5-5d7f-3ac0-abfa-3349cecfdd94--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetQueueStatisticsFromGivenPortInputBuilder.java-b410e353-4151-39b1-8ff0-800f371d081d
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetQueueStatisticsFromGivenPortInputBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetQueueStatisticsFromGivenPortInputBuilder.java-b410e353-4151-39b1-8ff0-800f371d081d--
+------=_contents/model-flow-statistics/pom.xml-7e2aef30-fcf7-348e-a4d5-62fff20dd869
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/pom.xml
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTVVtFu2jAUfa/Uf0Bor4mB9aGLTCpU
+NnUSjGp0094mL3GDV8eObJOAqv77bowDhsC6Sd20vTnHx/eee+61AV+tct4pqdJMimG3H/a6HSoSmTKR
+Dbuf7t4Fl92r+PwMF0p+p4npAF3oYXdhTBEhlJOSipAUJFnQUKoM3c6m6CLs1WEsM1pptmVXVRVWry1v
+0Ov10ZfpZA4HcxIwoQ0RCYVTmkXaghOZEGNVPZusc4qx0ukGDCwvhO8uVNPp4FymlH/e1B3bTYz2MMsq
+iKLC2DV8ZUoui/dpDJFDWVCRkjVn2cKEiRRGSc6pCm0MjBqqO0mUYfckMYBYQrAJjJG34aiuF3E/7Afz
+D6Pb+c3sDqPSV4U8We3Q91xWAdhpmDYs0a0cUFTyQDJocPxtKVJO63gNcn5mKSmty4NBYFQ3wrbY2iGe
+I68e3XyEDnk6tOC0UqpKltAjVnhm7OI75GnfktqUlr4/oJgJmCUj1fpvy22N3JqIzEjJ9fGJ2xfvnwz4
+IDDrgrYH44gqD2gmwTEVLaRmYIU3IVvMK4AdZFeUU6Kh3cyTKkhOT9Ds1pa4VDx2d13Q1VLve1Lf+Poq
+QouQrw/tsVxohFEdrSm8pf2XqtGCFHohzXPl7HgvX08T++cFYdTqGC74Ei79xyOdPNj5D/t5ooLfqOwf
+7u3RIlqwf2OxTvLmOKQV8DbVjxGgUcZMpPUCZMKqJTIavLnoXyLvFw5YGHkxtq9XSTmcVtcvEP5YMJfH
+kCy+eTsaY1SvHNh4ret/GeyBtb0uGa3QDNCxQ79eb3NG03EwH012HmO0sQss3bzjsP4BUEsHCK5WJn5l
+AgAAKgkAAFBLAQIUABQACAgIAAAAIQCuViZ+ZQIAACoJAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVu
+dFBLBQYAAAAAAQABADYAAACbAgAAAAA=
+------=_contents/model-flow-statistics/pom.xml-7e2aef30-fcf7-348e-a4d5-62fff20dd869--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/OpendaylightFlowTableStatisticsListener.java-d34335ba-2546-38be-a0e4-4afc61eeedee
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/OpendaylightFlowTableStatisticsListener.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStUE1PwzAMvVfqf/Bx9JCqIC5w58SH
+NOAHpIlbrGV2laaFCfHfSRoNhrQJIWFLcZznPD+9QZuN7hHE90oGZKt3jvqXoHaae9Ujq7lRk+efYOfk
+VQXdOlRj0IHGQGZUHufmojlvLq/LgraD+PC/tOom4k8JfvxCnwerA/6yMIi4Ma9uiS3Fei+BOjKRRvg2
+UiGjjywp66oqC6jgTuzkEFhv8Wp5SPFwwH1Ezp4qzddlMUytIwPEAX2nDf7hewx8i40dc3NMcFm8Z8kp
+01CWnqKCNRqkGSGZCoup8G0qTItv++E6X2YhC8InbV6dRIAP5J0tRn6k4xNQSwcI3aVps/YAAABfAgAA
+UEsBAhQAFAAICAgAAAAhAN2labP2AAAAXwIAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAA
+AAABAAEANgAAACwBAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/OpendaylightFlowTableStatisticsListener.java-d34335ba-2546-38be-a0e4-4afc61eeedee--
+------=_contents/model-flow-statistics/src/main/yang/opendaylight-queue-statistics.yang-42498db6-b53c-3943-98a0-b6a4dcca8fe7
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang/opendaylight-queue-statistics.yang
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTVVk1v1DAQvSPxH6zc3e0W8dHshQoh
+xAUhDtyniZMd1bGD7bRdVf3vjO1N1ptky5YWAdZqldieN3nzXsZpdNlJwXQrVAkbifXa8R+d6AS3Dhxa
+h4Vldy9fMBoKGmFbKATLOqPyNCYPMfkuJlvFmNaICm9ZWParNB0XsGm1cayS+oYX0MKlFNwZUBYKh1qx
+u22kM6v7vYgNqJqLWzfsoOsVM+IaLcXxEhw939np8hU/fctPz7NR+B5TVNdCOW02AxjNrGax3vHlBCs8
+vNKlmAEa1o6HmxHBbVphB8xkbh71nJ+9fhB1J9AI2i8chRyxC60cCRVv/MguFMqrrgHDvqNdK427tY8N
+oMwZXMeF96hO8LI5KXSTDXbok27zLc/48k3WG8+PUtjCYBu8kX1W6BDkLkpXsTgscW1DxZe9D7c1if+L
+xUVXNyTYNIg4A3OaubXY92aQmWgrUZDOEQe2KNmC9M/9DjtcDRe7oMXgifi67PEjF+dbPI4l/WOFwrDs
+gYeYvKheMegZ+9FZkvgxCHPVqo3uWlT1o4BSasEsqIjN7yJE0WhvhTWVBKQVKc2B6s7FeS0oIRaHGCYs
+73dUe3t8+/qBFSCl9VaohCvWE6eMahPTYMlBlakiDbQpEUnTx+7140psWNbvZ6OKYTkughRQDfBjLD98
+bdI2kvebR0D3M7iT7AcTTK3/ywzPJmYqpGkLVgvHSckYatNyV0Y3Ycm3SXuw13wSLm0QlTaMgkKDiJgM
+HPXCtSi9WfqliOlThFtfjVQsVG3nxvULrNPaOWoKnPrzlKYfunOHQB5w2Nxr40yeHL0cbsCIp5e2RjoT
+Q3EfW9ttXf1tAGHxIKuet5R+/Flj/2tiTc6LJ+gUhemV8j7/r6UaMjxz9/y7FujPsy/af04UENT06gWV
+EkW71n/s9QEq3T4xTdyb8tiTcPz5cRy3nlfTSYctGMcPMSRa9PsJUEsHCJEV3JLRAgAAuAwAAFBLAQIU
+ABQACAgIAAAAIQCRFdyS0QIAALgMAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQAB
+ADYAAAAHAwAAAAA=
+------=_contents/model-flow-statistics/src/main/yang/opendaylight-queue-statistics.yang-42498db6-b53c-3943-98a0-b6a4dcca8fe7--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/GetFlowTablesStatisticsInputBuilder.java-09ef30fd-c0fc-3f2b-b22a-0cb39385487f
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/GetFlowTablesStatisticsInputBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/GetFlowTablesStatisticsInputBuilder.java-09ef30fd-c0fc-3f2b-b22a-0cb39385487f--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GroupStatisticsUpdatedBuilder.java-37884121-5679-380f-96f1-8d8b19b29102
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GroupStatisticsUpdatedBuilder.java
+
+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
+AAEAAQA2AAAAEwoAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GroupStatisticsUpdatedBuilder.java-37884121-5679-380f-96f1-8d8b19b29102--
+------=_contents/model-flow-statistics/src/main/yang/opendaylight-flow-table-statistics.yang-eb3651ef-e9aa-335f-846f-8dd24545c715
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang/opendaylight-flow-table-statistics.yang
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStVU1v2zAMvQ/YfxB8V/MxdFudy4ph
+A3YZhh52Z23ZISpLgiSnDYr+91FWbCuunfYwITAck48m3yPpRpetFEwboUo4Sqz3nldSP3IP91Jw58Gj
+81g49vzxA6OjoBHOQCFY1lqVp8A8APMOmI/AbBeBxooKn1jw6VyCB5miERujre+MvADTvdtbUA4Kj1qx
+5xPa293LGeIIqubiyQ8edL9jVhzQEY6X4CnR7Xrzia+/8PVNNoGf1Y3qIJTX9jgEoye72Vhf+eZVrC55
+pUsxE2iwvT/cWWpRDX80wo1cjM9mo27WfPv5YtRRpEnoYLgQeX3Dt9dD5F7DQitPcsU/4WS3CuVD24Bl
+f9HtlcbR9qMBlDmDQzR8Q3WF981VoZtsaIr+1X09W765zvo+DKcUrrBoug7Jfin0CHJE6aqjPfLEkk5u
+SAfZt+VQRLiuVrdt3ZB2C0jiAJjXzO9FNEYYnEDZipTPg8xuuFsN0sfJOCuAmjU/gTmWdMUKhWXZ7AQG
+BaBPO5zWkWSzrnO11Va3BlU9j0iz6oRERYm86RpJI0CFNaUN0ok0wyHLsaHyWlBkLJZyTvJ+GZPv5bn7
+850VIKULKlTCF/t5pZZLBlWmnDZg0nokPX6/dzgP4siy6IzltHYpoGK9cYoMJ1CSDnLeO08Cvfw3TlM+
+rSlYLdKF7xZ0Ppu0nx3viSNNGmnSTcWohgsb34WxIEwcGKuEZ2EUUp5QmdZPuekK7EeIh4akUeG0nF5X
+FI5u/VKQi2LOtaq3efLl4fAIVrzB42r1W4fRLaAjiFrTikLgQbzeIK0JezQFqxQ6P/gRtKjH3ell8zsr
+glPGJxukp/nCZrnIXM9a00qPBqznS/wRafT7B1BLBwhobg1wigIAAHMIAABQSwECFAAUAAgICAAAACEA
+aG4NcIoCAABzCAAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAAwAIAAAAA
+
+------=_contents/model-flow-statistics/src/main/yang/opendaylight-flow-table-statistics.yang-eb3651ef-e9aa-335f-846f-8dd24545c715--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetAllQueuesStatisticsFromAllPortsInput.java-1e732614-cd32-30f9-bc38-b1aa74b6d020
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetAllQueuesStatisticsFromAllPortsInput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU11PwjAUfV/Cf2j2BIQVhgnRIRri
+V3wARR6ND113N6pdO9eOSIz/3a4jbiQaILFLuvS25/See24zQt9IAkjmCZYZiIhsOEtWGm+ISHACAq99
+XORid/O9gAKw0kQzpRlVOIe1f+IP/dG45bA0k7n+nVFLyVXFTWWaSoEXc5LC4aiQiYiZ/zXR5CF8Bar3
+YP/UwMQahJb5pkp+cOqf4bmM4EoKDR/6CeLjs5oWSWpISchLSeXX73ZbDuqimYwKDkgYsYENlKNJ6dma
+enVN7aklXUFKUEb0qoY9t42YoAkOLDiowZdGE1NMislw4J94/tDzR50EtEc4r25Sjau8OJep3SrVqv7B
+B5nICv1SJtZvOVkRckYRM+XLY0IB3YGecr6wJMsfjltDYcKPJcF9iTdwM0zJjR5VLXZ96FXB2vJtoFHt
+8//qX3xg0hct57NyuMplK95SUhQzQTiyrW3m6ewGTY56D5jmQDS03b1Guz23dtgsrCNuZ7xtv69y+gZQ
+SwcI6LGjI30BAADkAwAAUEsBAhQAFAAICAgAAAAhAOixoyN9AQAA5AMAAAgAAAAAAAAAAAAAAAAAAAAA
+AC5jb250ZW50UEsFBgAAAAABAAEANgAAALMBAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetAllQueuesStatisticsFromAllPortsInput.java-1e732614-cd32-30f9-bc38-b1aa74b6d020--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetQueueStatisticsFromGivenPortOutput.java-96a3957e-f7b8-3ee9-92f1-be19d01d2f88
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetQueueStatisticsFromGivenPortOutput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU99PwjAQfifhf2h4AsIKg4QHEA2J
+SnxAJPhmfDi6Y1S3dnY3kBj/d7sfcagxgLFLuvSu3313910jEM/gI9PG5zpC5cEukP6a+A6Uz31UfOPy
+xKivzpcEE+QxAcmYpIi5wY3bc7tuf1ityDDShk6MuAr0lpMBFYMgqVUR0e30+H1pHW/B4AEK0jqIczKh
+w9CGmt9CeAJqKZUn7f8SCGbLJxR0Onac+CEqgmVwiPgPPebz1HXjjZW3+HRPIbJM6dduNqsV1mRT7SUB
+MmWLH2SGdO1TOBmFU1JktxZijSGwCGhdwh7qNr/BPniQgQcl+MLmJ2Mr0qjbcXuO23XcfsPHnyzOyujQ
+8eUGlZP2pX3UJZ1QlNBjmlG7WomSZSAFk4rQrEAgmyBlXSkbcm0DTFL8nYXPMrQF24WvZMuI88MvrWzl
+3u+jV5jLySgMe3Kf/ZvKR5V0Xq285bLnmRSNyQIKtpIKApbNv93H0ys2OunRcGEQCOu1g+rXWrVSdnvI
+5ao1hsVQvqfbB1BLBwhRx7qTiAEAAG0EAABQSwECFAAUAAgICAAAACEAUce6k4gBAABtBAAACAAAAAAA
+AAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAAvgEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetQueueStatisticsFromGivenPortOutput.java-96a3957e-f7b8-3ee9-92f1-be19d01d2f88--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/MeterConfigStatsUpdatedBuilder.java-638cca68-0e14-365d-8893-6902f82c04e4
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/MeterConfigStatsUpdatedBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/MeterConfigStatsUpdatedBuilder.java-638cca68-0e14-365d-8893-6902f82c04e4--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/group/desc/GroupDesc.java-6806f092-8ece-3ab3-99be-a670e88d60b1
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/group/desc/GroupDesc.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStUlFPwyAQfm/S/0D6tC0bG+7FdE6z
+qPFpGuOj8YHRGyW2QIAuLsb/LqWdnXHJXLIroXDcdx/cd5qyd8oBKcOx0iAzui0Ezx3eUskxB4k3BFdG
+/j7kRlUaW0edsE4wiw1syJR4a48ysGwWR6LUyrjDyZ1ShW1omCpLJfHzIy3h/6iVkJnw/9tcFNnT+nTg
+ouIlSEdXxTHWI4VwWw27GkzIJX6ovT5l/Y0HgzhCA7RUWVUAkv6JaXDUtp9rFHKNuqKGqBeWQ0mRpi7v
+YK89f5F0H5wGcNqBb/xthBVKzi8mZDoixI9+w1BrMz64fKsZxnGkq1UhGBLSgVlTBig86M5H+ABv8OE8
+tW02bfmvztZBP2TXw4ZhT6fzsXR9+pcwOOLos1Gw8bU1CbkYWgtJCxQa1s+L5T2an9TlmBmgDnrJUSGT
+YdIp6DedWkl/1vbYVz19A1BLBwgS8n/fUgEAAMoDAABQSwECFAAUAAgICAAAACEAEvJ/31IBAADKAwAA
+CAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAAiAEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/group/desc/GroupDesc.java-6806f092-8ece-3ab3-99be-a670e88d60b1--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/NodeGroupStatisticsBuilder.java-113865a0-8d37-3c2e-8d40-ecd7b9de464b
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/NodeGroupStatisticsBuilder.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS1VltP2zAUfp+0/3DaF9IyhSHeymVs
+7CJexgPSXhia3MRJzdw4s50wNPHfd5ykSWo7pQgapIbY5/qd7/g4J9FvklIQMg1FTrOYPHCWLnT4QLI0
+TGkWlodhIbP1zVSKIg+VJpopzSIVSloeHh3ic/z2DVvmQupXs+hufTML1+33Ey61EFzVzucsixm+PxNN
+ruZ3NNKoa/7yYs5ZBBEnSsF3EVPLxaeC8ZhK+GeEAZ9cspJoCpYc/Eqd2FqV2sew9WBi7BvRR6jf2yq+
+GtR2OkSmbVDm0QumQjtHODVy6E5b6sHkuMlneww8WzAnim4VhhHcKo6D6bSxNr2mGhJGeawgkWIJKStp
+BpVtpIrJrFjSTIfwg3AWt9/AFLAMQcwibJ4ERFa9EsG5uDeK+iGnarbyAicFP+s+ODvbVc1ODtB45+mg
+57ddPc+JJEuTS5eoqPqhE9ELKe4VXHJOU8I/Nml/+RvRXDORAUsaqPqIZA0MZYVVBUFtcXqwRoBS4HaN
++lcEPega0qHcHNuXEvSnqgJgIFjohHBFjzshDCYw2awqYgqyI3zXgttExmBnbTkxGG3ieQtLHzMtiz5k
+j+vojTpZT4ZIBcjo/SAbgnUFgDH9m2M1adw0xgxudoXGLfzMxrDvRDAvNNwTNQPcNKxaF5i4UNinlH0M
++QDvQyWpxjR8I8BnfcOUUa4jOxZssGK7M7GSPHaiNOLbRwZzE5o3XUMLj8blMueBceLOgGZ0VrWN8BTI
+CB+evMYO4Hjn1BDOK9JN5V4Sd6QkITcMuzCmT16NfZ4Azgw1Llcx0vgSf2RCIho4rdSAtstowgrLdXr3
+4GnQr2F/xvWlrzxU7w2cdmb4Js4+NcedrM6vSioli6nDg+c28dON/AznDKfigqjFBeLiuqlLYGQQ1yXF
+vI8O7QMcNyVVBde4a2+2G7X6dLWwj6PHBfUUsoLzCXyA9zBzcgu7MO0h0qBRG38+Bqv5Tf8UOLSDri+b
+eY/3DgcZM5AMN0zUvv1eWNZUawKzjaGRDoFhY/a1YsAacqg6VLCkoyrAsFt5ofmhE1DoBTYRXioGBCYm
+DJs8GOowDzxhVkgZR25PjjaoPZGhJ8tHoCiH/oKRQ8SGJ/44XgqvnzQ9oW0Y3VH4Wsvqqi/qf9wWt0Xb
+07B5n1bjc0gqGPum3c3Y7tBViyVMKu3e9LZgxabyGoXK8mDxV34Hq1+Xe0C7wSIkuZl5wfgdOAlWRtwl
+W9NO69RryNJyKGar+ClkWdm73ZuEHQ8GLpf48x9QSwcINTTbq7cDAABwEQAAUEsBAhQAFAAICAgAAAAh
+ADU026u3AwAAcBEAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAO0DAAAA
+AA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/NodeGroupStatisticsBuilder.java-113865a0-8d37-3c2e-8d40-ecd7b9de464b--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/GetFlowTablesStatisticsOutput.java-3e8d8277-bf4f-3655-8dc9-eef759a2733c
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/GetFlowTablesStatisticsOutput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStUstuwjAQvCPxDxYnQMQQEJdQWiH1
+caJVBbeqh8UswW1iR/EGiqr+e52HSFoJKG0dyZF3PbPjnY1AvIKPTMc+1xGqJewC6a+J70D53EfFNy5P
+YvU1uQr0lhMsAuSGgKQhKQyPceMO3L47HNVrMox0TL+ijUEZECS1Khjd3oDPy+hkCzH+rcRB5fzW5udp
+eqKWs/2FKUQnCpLWgclLCx2GVvvjPYSnZFZQC6mW0v6vgeBh8YKCzsdOEj9Elb3OgtOv227Xa6zNpnqZ
+BMiUleRlgXRVKZ20MU4GdcrGZFdnYo0hsAhoXWKfmra1XpXBSxm8jMErGa5sa6Wxro37PXfguH3HHbZ8
+rNYzlYLdIymdUJTQcyqhW69FySKQgklFGK9AILtD2ptnSuseMpQF2YVvZPWa/PB9ojp5+OAAFPnSnyJQ
+afrF/87i0Rdd1mvvuce5jKIfGZFgK6kgYNkI2n0yvWHjs+aWixiBsNn4mcuNTqO01x5yqxqtUTGGH+n2
+CVBLBwhHZU2zfwEAAGsEAABQSwECFAAUAAgICAAAACEAR2VNs38BAABrBAAACAAAAAAAAAAAAAAAAAAA
+AAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAAtQEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/GetFlowTablesStatisticsOutput.java-3e8d8277-bf4f-3655-8dc9-eef759a2733c--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetAllMeterStatisticsInputBuilder.java-63183a47-813c-3450-97e8-62bce644fc3b
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetAllMeterStatisticsInputBuilder.java
+
+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
+AAEAAQA2AAAAUwYAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetAllMeterStatisticsInputBuilder.java-63183a47-813c-3450-97e8-62bce644fc3b--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/$YangModelBindingProvider.java-41330d12-0cc9-3eaa-8b73-a8a30a3fe436
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/$YangModelBindingProvider.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSVULEKwjAQ3Qv9hwwOdgkUx25uHQRX
+xzS9xsP0EpJLoYj/bkqLIujg45bj7t6997zSN2VAuGCk80C9mi2aK8tZkZEGSE61TIE+hya45GVkxRgZ
+dZQBpvpQZzRlURY+dRa1GJCUFdqqGMXukvlOrgd7ROqRzDm4CXsIAkdvYQTi+F0EO2fjKqdbT+VPrvvy
+XWRsCv4kTBZaGpwwwO9uXy20YkMAzmm87Gw7bfaQw+KWciakYV8168mjLHI9AVBLBwg3rkPRvAAAAGUB
+AABQSwECFAAUAAgICAAAACEAN65D0bwAAABlAQAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUG
+AAAAAAEAAQA2AAAA8gAAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/$YangModelBindingProvider.java-41330d12-0cc9-3eaa-8b73-a8a30a3fe436--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/FlowCapableNodeConnectorQueueStatisticsDataBuilder.java-333998c7-0db8-3e5c-a428-5da2b2e682a9
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/FlowCapableNodeConnectorQueueStatisticsDataBuilder.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTFV99v2zYQfi+w/+Hil8ruwMwr0If8
+WresBfKyogjQl7YoaOkks6NJlaScBEX+9x4l2ZIluZWs1XMAKxaPx+++++50Snn4L08QtEmYTlFF/EGK
+ZOnYA1cJS1Cx9ZxlRu0ufskwQ2Ydd8I6EVpmcD1/Pv99/uL8lydilWrjuj06raUtfC+EigRd/+aOv1l8
+xtD9YO8BaFgs9R0LecoXEpnSEbJQK0VnadPe9pqMrwvbf8j0emP51hvebu0Ipv9Ls4UUIYSSWws9t/pY
+/8qEjNDAV+8E6JMaseYO+/qAT/EgnPkRBdbhKIOpx+ldPEJxHevwP0ttX7q4SbZB+I9bCsv6cgiXfj/B
+cz2PC6bnJV/juR+wBRbc4qgwvYNRcZ7OZuXps1t0EAuUkYXY6BUkYo0KEqOzlCreM5qtUDkG77gU0fY3
+CAtCUbJVSA0pBq3yS6wlYfIb3UOK9mxzClxk8qr6IcXVsbV1cUqHVghOa3i2d1+m3PCVj7EiQOftrjJx
+S6PvLNxIiQmXf5Z0vLoPMXVCKxBxSWGdKVXSs845zKkpPM5Od4S31rRcZOM1JSOo+m2rNBbUnZHTeTZP
+DAEhYcRcWjyvjAhM4KPZZMon6si874A+ROzB0dvQ1HN9SH1taa/nxJmsnpLH3eycVLYdTJHUQOHdXrUF
+uxsAJnifEkSMyoI8g/fHZu8jfFATeNZCtsgc3HF7BrTo1bxrMG1TdGBXhiGJq1Nu0BEdQx7ZI1DWpwvb
+H3BfDqjRZOOeMbmH8xY73s34yGHhQ++k38t9gKebVSoDD6r9LC9HtVzLIXVVxeXwCdD7B5p0JfrCG7S1
+mhprJH3ma86kr8BrD+Xi2NXpgV35ErnZxITRDX2ZmIcYtFpQmZT/AyXLc7XbFmp0ltkt0voTx/H6YUN1
+eUAvaM2Gh9TuofNhi+WXb9ZojIiwpeOf3YwPb8gDghA0nS25XV6T1/bxhbS8DeV/hcTr83nzQU+LBm0m
+Ha02F7cLxfbZ5sYzGmn6J/MSVCblFP6A3+CsNxesCqs5nJSsFmCGc7aZO/FLRsNmUPWzck6lebnFpB90
+vIZ9NF3rNViNaakE1nRGTipm9jtrjsN7vJFG82ZMEjjJAbLqzkj3Q5802i2pCdDQO3Dj1MNuipNCG66z
+jnBzxj2w/j3o5DvufsBgB4uPgGRHOIKT3gVQ6nMY7rHp7hZxzahPhVUldetM/iqti3/aLappun2KlNfL
+fJzaZxVMhkwz7yfNTrJpBbEw1rXfdEao8Xvy8Y7yE/eKa4Nnr7oKOe3ZXXLHeOpnmmDyK7QCz520bzV3
+9g33svOAhrfeEm666pZow/vTj0+nrNLZnpcx+voGUEsHCGOOYSD0AwAAhBYAAFBLAQIUABQACAgIAAAA
+IQBjjmEg9AMAAIQWAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAAAqBAAA
+AAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/FlowCapableNodeConnectorQueueStatisticsDataBuilder.java-333998c7-0db8-3e5c-a428-5da2b2e682a9--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetAllQueuesStatisticsFromAllPortsInputBuilder.java-43b21f78-76eb-3431-bf56-cba2257f3657
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetAllQueuesStatisticsFromAllPortsInputBuilder.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTtWW1v2zYQ/l6g/+HiL5XTRIlboNgc
+J22XZVuwdt2WrfvQBQUt0zZbmlJFyok35L/vjpIt6s21GvcFQxnAdkze8e655448OWLBWzbhEMYTP4y4
+GrGFFJOp8RdMTfwJV/685yexKk6+S3jCfW2YEdqIQPsxn/ce9h70Hh3dvSNmURiblhqFmnNlwniRqjr8
+pvet/0s44r/zca7yDZszPzFC+qehlDwwIlS6bvo5i95jiAlDqVOThkKNBL5/zwx7MXyDautU/sT09IPU
+Pk0mM3SNkbEoTX8Hu7t378AuPA9HieSg2Iz37Rc0XJ37Fuj9HGi76iKY8hmDiJlpLvbKQ0z7rnDfCvdz
+4ccIrdBoxvGDw97D/d6D/d6j7oSbfSZlupN2ttofx+HMTpG7+mDjhUJFibkkww7u3omSoRQBBJJpDT9y
+81TK36yCi5X8DyiOX/9Kwuck+10i5IjH8C9hRb5FsZgzwyEjBLxW+OGoPIvRGdh4SYL/lHYcPAZ+bRAS
+DW4YBttiu7+hRycne5/bAGDO/nAMil9BxunBidfN0UwD1i5UXpeCReI3kL7fRtl2KsdpqAwGn/jC4snK
+QBpmKrRvSYRA4CTqNiRiYbBe3A6NDZfDkGnebBjNViyjIcbg0SQIhZxQAQ/Hm1p4PotkYUcaLWThtaDX
+Y9jUx3RDsvaouKl1dS0n7VaFJS4IN6VIpTWVxu4FNzAWXGLWU2mCiUCGwCQOkwgLMgU8IZU+vGRSjFb/
+g9ArRAEhDZV9G+NRE16RoFlEXPeXu8AgkSf5P1KcbJu3gwNUmu9w4Oy3+vZJxGI2Ix9yB0N7iOVLzDQO
+rzSc45E5YfJp5u7ZdcAjCzzyKYXIRUJl7s8tRtb1VCNVdSc15iFOp2hT8L38FK2k3RAPR85wP22BR0Mw
+5mMmC9wgcpM3Dre3jWslAQpp5229/nQJiNpMtg67aJg44VWSL3HZydfW+IBBthnUFGevKADQ4dcRxomP
+Mqr34dW2Xb+Ev1UH7ld2HmL1u2K6DzhJPCkuWJfnGe2WV4EVqi4eMTdo6+qa4KhJX59cJFEUc63/YrHC
+jNFeJ1F4qQre8lGnW9hncPal3CDgjJx1jfDKt52z4in/ByZtARebW6UFcIx1N5HVU2EDQnVca8Bqi/mY
+x5wqaMCUCvGMw2vbn8+e7XRqgurEyjvrFmyndKnYup3jGXTGmSWHsMQla85hO31UsZjW1JHrw2xio9Ha
+0H4xF9kKwz73zbZgUDWKBVLh+gqp9qDpilEb6A8JMgwpyrU1ivKrxVXKI2OqaZB1QBbHAE9jxWS7lsve
+7ei+xQmJjcXyFs0BpUzdT88IrB3nS1/46Bxf4jELSoeEE4RPbaFvY1Oshw6MWTTTMNb3vO66r33vNvpe
+F9E2Cdmyzldavspx09j2LYe+EiaYpi1gsbxp8Q+KVNTTCKhfPOxXJ2oLJZrhPGHz+SwyCwSs1hwaw5iz
+tw1zdudew840Up6jev9MmXjxlcvNXF7xoxB2TrBh0+t1fYGljuGNHD8qRK0xYJtE/WsgGg3Q2DRIbkJF
+SWGz9We+8Lp7YD+/pAsj5uFRBnS7nBnxMUukgRa5WqxpFYLUkeCm4fB58mLO41iMeOVYX9tx0ajpuko7
+Odts0IGtN+d/1ZjRaNWcpUz4eA1aKXBOeFs1ai3oJZSBKXL4tJZb6RlBa/CMnlEZfNgrP0fBSWQUpc4x
+lCdXE6n47vKL++B52cG7RPoxHEI/ZbGfG1QGZ53CYnYW9RagW6fegp0qbQ/m8kkbf5cwqR06Zk/mwuGb
+Wv5RcSGL6+Yds0pPqTLDyspQyVr+ZsrKDwAbtCHNbC4hN3asgX7+zS3Vt+mRQjPFW1zb599obpmt6FKJ
+eDU+WBhpx+x2uLNm7Xt8rvH7BrikXxHG3k5K94wuzo63hbZc1Db0tiDy0ZwuXqJc3wun5y0hqM+Z+lOx
+MaHzDL4wsf0tIkw/VEtleemq88je0+tC0yqvs2nr/6pyYCyrzljE2lQfZjclwLr40iqrrjH6y80aw5/G
+u0E6A8VnEd0KvM4eVLyySqpflSWtL8e10qWlaWKV19UkTrPj65xudngDZ0tWlCXcvKj6WlpdSC/7EFU3
+HnQl0XuX97p+TvGGnwPw5T9QSwcIkgE/5T8GAAC/IgAAUEsBAhQAFAAICAgAAAAhAJIBP+U/BgAAvyIA
+AAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAHUGAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetAllQueuesStatisticsFromAllPortsInputBuilder.java-43b21f78-76eb-3431-bf56-cba2257f3657--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/QueueStatisticsUpdateBuilder.java-71ffc703-1d8f-3372-9416-8c37081236fa
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/QueueStatisticsUpdateBuilder.java
+
+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
+BQYAAAAAAQABADYAAAAYCgAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/QueueStatisticsUpdateBuilder.java-71ffc703-1d8f-3372-9416-8c37081236fa--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/MeterStatisticsUpdated.java-002d8f34-c39f-3de2-8641-87c1f89032db
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/MeterStatisticsUpdated.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU01v2zAMvQfIfxByaoNGiZdLm7Yr
+gm3HpFjbnYYdGJl2tMqSINPpjGH/vfRH6ixYUCSYbMiWHh9J8JEe1DOkKFxIpfNoYyiNTtckS7CpTNHK
+TSSLYP8GMyQMMicgnZNWuQy4iaYRr+t+T2feBTrJI5UeW2eTq+hSLqrbx7cwD+hNeWoEbTdoyYWy9X8Z
+Xcmli/FUf4lxL5IC2BwUaWe3NZhM5aIwpD0Eeurg+QuE92KRcyZvoiqXZezz6xKyI1grbWPN389AcL/6
+iYqO535aaxPfJ8cT50WacYVhZU7IeOlIJ1pBVSpmV894OOz3xFAsXFwYFJYrMasvqrXrc1Q3z6hrx9rq
+Ua0xA+GB1h3t+xnrONslz2ryrCPfsY465zRuP0yi6SiK+D3fjzAqfAyE8fgQ8KMKOe73fLEyWglt2SwB
+hWKvpb815mzNC38RJ5Y3h1aHm07LjxcNslPom/81t/uj1ua1DXmwo7f4Pwa1haoZe/vtRO73fjcyN1Bb
+pzo1JRJtwYi6+XmfL76I26MmRqqAnP7Z4F21BxeDTmY+HNJzcH7dtuWfansFUEsHCOgsPXWrAQAANwUA
+AFBLAQIUABQACAgIAAAAIQDoLD11qwEAADcFAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYA
+AAAAAQABADYAAADhAQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/MeterStatisticsUpdated.java-002d8f34-c39f-3de2-8641-87c1f89032db--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/NodeConnectorStatistics.java-f503d9ff-737d-381d-8d26-38a32bccd8e5
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/NodeConnectorStatistics.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTFU01v2zAMvRvwfxBySoJa+Sh6qINi
+WJMO2KHt1u427KAorKPOlgyaNhYM+++jZTdOi3XxBgyTAVkSH997puhc6a8qAeEwkS4Hu1G71CRbkjtl
+E5mAldVMlmifBzO3gVQWpMgUZHQhaZdDIRGq2en0fH62CAOT5Q7p17zkXFo0CtplmbPy443K4EjWX7uR
+qxI55mx/W2tjN4bfK0Xqdv0Imv6ZOcsALoO1LOLwEPmB7wao6JQfVaVkpmgrL03y3hIkgP/B1+WOoHZV
+P5PxOAzEWFy7TZmCsHyNsT+ox6Fg1BFEXsqj7vUWMiVy/qYu7fOQ3caHybF3G3cUsad4w25NwRd7MZ/O
+TqPpeTQ/G9W+o73vA9nJq5EvtfQkDPJynRotDFcWH5QGccMZy6eE+z2e4TzgG7HDdtM1ykl70PZcGHxv
+KtUctxJeW4sHY1UqfPPz/Pb6Slz80R8jNYIiGA56FmxwMugqxZtXKzIYLRZPlts2FAlQuxyOFk2omX0/
+1GG/eBncd2qNuAMNpoIVuvz3wE+obJEZOo5sKa8QHfbj7AFtSd8hF9nD+6BvK8C70vbGL1Efxy5dmvoe
+X7rSkoeGwY96+glQSwcIPwfI98UBAAC7BQAAUEsBAhQAFAAICAgAAAAhAD8HyPfFAQAAuwUAAAgAAAAA
+AAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAPsBAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/NodeConnectorStatistics.java-f503d9ff-737d-381d-8d26-38a32bccd8e5--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/OpendaylightFlowStatisticsService.java-a3646733-a948-3c7c-b081-bba7515c3269
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/OpendaylightFlowStatisticsService.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTNlc1u2zAMx+8G/A46ZjkoC3bZ1qJA
+Ly52KAq0ewFFoRWtsmTow10x7N0nWY5Tp4AjZ/U6GXBikhKpn6m/a0IfCQOkNMOqBrklz4KzncXPRDLM
+QOJmjZ2WQ2cp1BM2llhuLKcGa2jWnz5+Xn+5yDNe1Urbt1oQ34AtvPOh9xVaVcHynWwE3DlbO3vI+oM0
+BDvLBaZKUqc1SIsLZ52GE6VZpYSJRW643HL/e1/TB9ANpxPmUlVVSoap92CcsLMAuWZMAyMWRsgUSl8L
+ER7NMaT3q+SbnKuQkfzzJe229e/zplG/4Q3IW2Lp7j8qZc5mHH0d8yc2w8ydtU0+6xk8nX3//sO1Wi7z
+DC3Rrdo6AUiSCr62hjDuXmQdsuyUMESu8qx2G8Ep4tKCLgmFpIl+wE/r40x8OOhrnv2KxYUruGKRYSxR
+Ab5tENk3GjpwQKXSiAiB7A5QYGRQrcF4zfeVtUZTA+WlrzR4kQ0wUL+wKmPME/cJ9tZV/BO/GZe9jl+e
+K7tXV4hNnro4U1r9tv39w0Xcw1+hRFU4rWCQVa2NhRMcjaj0NbTGfuHojXxnwnosIZPAHiZPQHukn2lw
+XyD1IAZEE3qzY9evmQ4xQfs6YqORi7TP2luyGNhbDGZ6D6Uq8IDBWPhigrKeQ+N1B8zZHom9caIx0rsi
+z36H2x9QSwcIDBTqA/sBAABeDAAAUEsBAhQAFAAICAgAAAAhAAwU6gP7AQAAXgwAAAgAAAAAAAAAAAAA
+AAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAADECAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/OpendaylightFlowStatisticsService.java-a3646733-a948-3c7c-b081-bba7515c3269--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/FlowStatistics.java-af32bace-0488-3ff0-9b8d-e000c2893fa1
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/FlowStatistics.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStUlFPgzAQfifhPzQ8DSLdcC8bZDEm
+6ts0Zo/Gh1u5QRVaAsd0Mf53C8zA0ERNbJM2d9fv6/ddW4B4hgSZLhOuC1QxHDKZpMQPoBKeoOL7gNel
+Oi3uMv3CKwKSFUlR8RL3wXy2CJaRbcm80CV9T0haZ1VHLXSea8XvbyHH36O2UsXS7FdAcLd9QkEG28yp
+59kW89hax3WGTBnWsE00Y8joN9r9Xnt7aCNSzIEVQGmPepgY3+EQGzbYsMdeGN+yklqtzmfB3J8t/GDp
+jvino/ix4Z/aVlFvMymYVITlDgSyG3NuM5RlBr6Suf0Y9J5t661z3RWOVO0dgu2kgoy1fTXr5fqarf70
+GFyUCIQT5yf3zpnT2zbByKjjRtGnwn/6XV8qpz1jCdJpZuK2Et6b5QNQSwcIR3vtYS8BAADqAgAAUEsB
+AhQAFAAICAgAAAAhAEd77WEvAQAA6gIAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAAB
+AAEANgAAAGUBAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/FlowStatistics.java-af32bace-0488-3ff0-9b8d-e000c2893fa1--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/NodeGroupFeaturesBuilder.java-5609b479-e9c2-3b54-b2f3-53368a0088f9
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/NodeGroupFeaturesBuilder.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS1Vktv1DAQviPxH6Z7IbuglKq3vniU
+h3qhh0pcACFv4mRdvHawnS0V6n9n7Hg3iZ20W2BTadPY8/zmG48rkv0gJQWpylRWVOTklrNyYdJbIsq0
+pCJdHaS1Ev3NUsm6SrUhhmnDMp0qujo4PMDn+OkTtqykMsMWjZRcN7bnTOQM3++IIZfza5qZB3T/Ihq/
+VVBiakV1+tF+fvBf6M7+VfWcswwyTrSGTzKnPaG3NeM5VfDbigI+lWIrYij0pOB7OWDZiTfWx+wmU2vZ
+Ct5B895O7b8B1E+DqHITkH3Mgum0nxucWil0ZXqqyfTY57Ft5tEGzImmW7i3Ylv435/NvKXZFTVQMMpz
+DYWSSyjZigpwdpGBNp96SYVJ4TPhLN98A9PABMImMmyQAqRwr0JyLm+sormtqD5ae4GTmp+1H5yd7aZK
+J/touvWz3/G6WX1dEUWWNpM2TemarBUxCyVvNFxwTkvC3/ik3//KaGWYFMAKD1QXD+FBWDmkHACNxdl+
+r+wridsN5h8Q8qTt8ohkczwTKEF/2sGPgWCRC8I1PW6FMJjEZrOuhy3HTtDthTZOwmRHLTi16IyzewNH
+Fyuj6i5Ud33U9lrZgdyQAiDozSgLkr4CwIT+qrCKNPftcARfdoPEN/gqJvA88j+vDdwQfQS4abnUF5jG
+QIQnUv/QiaHugqQoLor4eB+yOzo7dOiiHwG2Ur3NuefkjqPYrPC2EcHchjSYoiVBJH+xrHhiHcSnux+D
+ro4ZdrogfGyGWiuAk51TS60BgXa6doK/JiuScsukc2v25L+xLHJ/ZklwsY6P5hf4owqS0SRqGA/W7mJJ
+HYZ9Eneg8ag3cG95BekqDld4lLnRRB5n5/1TOcrk9eWKKsVyGtX9Me35UIs+wi3D+bYgenGOWMROGsCt
+DCK5pJjv4UF4JOMmeq65wd1wc7PRqM/WC89xkIRQnoKoOZ/CK3gJR0FeaRtiOBI8Do3hx+e/nsL0Z42j
+N2m7z09tvD1EqNjxYtlgYx7a74QVzCgfWGgMjbT5jxsLLwcj1pA77ujAcu65ANN25R/ND59x0iywafBy
+MLg9tSGEpMEwx+o/EKDDyDoJ+2/vHqUHMhvI7g4oyqG3ZC+gn2fHUAz/CukwUTpC27C4pe2VUe6KLpt/
+4pYORTdnnn+fupE4JpVM4in2ZRL25LqpCqa0iW9qD3LhvrJacWd3tOhrr6NVb8o8ou1xSEllZ1kyeQFR
+es5IvBRq9pM6HTQT6ATUChWGqRPYePbt2TRt6z9yMcSfP1BLBwj9h+i5vAMAAAQRAABQSwECFAAUAAgI
+CAAAACEA/YfoubwDAAAEEQAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAA
+8gMAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/NodeGroupFeaturesBuilder.java-5609b479-e9c2-3b54-b2f3-53368a0088f9--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/node/connector/statistics/Packets.java-98737440-a6b5-3cd0-8404-551110131b94
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/node/connector/statistics/Packets.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS9U8lOwzAQvUfKP1g9tRVxN/XQtAVB
+xYFDy1JuiIPrTF1DbEfOpKJC/DvOAgkSiOWAIzly5s3M83uThPFHJoAYK6hJQEfsEEuxQ3pgWlABmu4H
+NLP6Y1CZCGKaIkOZouQpxUMCKbWwH4z6k+GYageg3GgNHI1tIKe+J1ViLH7eEY2J07I3N0oZTa9XTMHP
+szZSR9K9FzsZR5fb3yeeZkKBRraJG10f2J5RxXBHz6S40AgC7Del/67dygEWb9Ktm8rlT6/b9T3SJUsT
+ZTEQ7dQJiw/5ajYK6hZB0aJArfkOFCOJu0uddtd2LMNmcliwDOsSYVHixLGUqTR6PuwPRkF/EgzHndzr
+4N3rRtve15HEjR1gep9T6Plekm1iyYl0ytot40CuyrgLuwVP6JhVh8rY2RcqHR+VsIaNs/+abVqxPva9
+59Kskkt1uwLIyVZqFpNirN1+ujwn81/9C5RbYAjt1g89ax21arPcoZK+1ZlO3wjWQ00E4A1wkHuI2p1p
+Gf4MdGuZTpVErHC+95Jvr1BLBwhdQyHNjgEAAE8EAABQSwECFAAUAAgICAAAACEAXUMhzY4BAABPBAAA
+CAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAAxAEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/node/connector/statistics/Packets.java-98737440-a6b5-3cd0-8404-551110131b94--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/$YangModuleInfoImpl.java-a29d82cb-4446-35c0-ad93-5d71bd449904
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/$YangModuleInfoImpl.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTNVt9v0zAQfp+0/8GqkMgEdduNX9sA
+MdAQfaBDlBeEeHCTa2pw7Mh2ulVo/ztnJ1niLIUBYhBVquPLfXe+73x3OYu/shSI0ilVOciEbQRPV5Zu
+mExpCpKuJ7TQMhQuhTqnxjLLjeWxoRrWk4Pxk8khOd7d4VmutO1HtEoJU2IvuEw4/n/El7cqKQRM5VI1
++l/YmtHCckHnYPu23zCzCkSxymiqVCqA4jJTEv+EgNjSaZYVli0EXIfiik5lXti51cCyHuHZ6UUMueVK
+ojAvFoLHZMklEyQWzBhyJzzANMsFQQwBGUhrSCgl33Z3dncIPrnma2aB+CjWiJ2Pp7P5h5PZq1PyjEg4
+77MU7R13AUskPA4Gl0iWAWoP2kQMHXvDhr3B8U8ATM5ij4J5cNRGOnJIRzdEwhzhBqPogPbHk4Ph+Mlw
+cvgTFaMKHcM7ZldObfT29MPJcDp7PXIZNPrRoXyO1eC9JsA+DeP5nJTUQ1LumSa0JesVVR2SUrBTiSIZ
+Q7Tn+CXVo8FiwK5IrHy57PLVy2obp89TA7ZKiuoWPH3uU6HWQTllSRL92rXOVAKifa/tJof6dh/uP6Q9
+vtLg/H/ugy8tXK7x8ii9aSrLrdm2mknDYnfhS+uTyfjgL1nnYJc0Z5plhl5kgsqqNvp9LhGmYWCMDDy4
+jSj80+A3CTcZ7z+6DbteCBcWpKtOV6/V4R+Pb+Xwvjn92ek7xQvLQ7vrYSvMN2fLCN1rK7VaH5Y3//es
+ryJR3+uc8fdVTT4xpVrULtKBP0sS1ZBYqgohgqrmHrvS6txXsSn26ZSJOZYeuOq30aA2Ru4OyL2wHdwj
+g7uEG5JxY7BXDNqmL5ul1Zuu1dIpPJEyEBTNSxIzG69I1Or5BAKvRyNy5ZMA9vU+WRQWzwEanDNS2ZVr
+XOeAUJIk6ppPl+2O9OJsDVrzBII2UzU/jPUMm29vT3Fd+fg3AN9XPbgXtG7QvwM8q8eEre566c2h24mJ
++GU2zn3gq7zbK9PHkDZb3/7D1D7rS+i+fL5BOlcBNfWwelOiekYIV0jCktHL3fWZ6NeSw6py0Zlp/N7L
+gosENDGLapgJtiO8S56XV46gaM8vmVSSx0yUVyMovAvKcldTo8GnwRZBPQ5jtN1yy1f3w6m3+ti/b9Vo
+T7ee2vL1B9+Ho20nHbbqlXSYSqVDzhatz0E46hRa0IaahlX8fQdQSwcI5zQ5ZoQDAAATDgAAUEsBAhQA
+FAAICAgAAAAhAOc0OWaEAwAAEw4AAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEA
+NgAAALoDAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/$YangModuleInfoImpl.java-a29d82cb-4446-35c0-ad93-5d71bd449904--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/OpendaylightFlowStatisticsListener.java-898c233f-b3e9-3b44-8617-2cc3ab523f85
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/OpendaylightFlowStatisticsListener.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStks1OwzAMx++V+g4+jgqlVFyAnbhw
+4uOAeIA0cTOLLKmStKNCvDvJqo1Oq8YOs6V8Of77FystF59cIVinmG3RSD5oUqvABm4UU2hYX7HOmcNg
+o+2G+cAD+UDCM4d9dXtzV90v84zWrXXhUoLsKUb8+z7y0Uoe8J8ywVrtx4I1GUlxfrWBGhJRxprnKIUG
+3eVhH5VyqCJgop6BTl4WRZ5BAS9WdhrB8DU+bA+SvU3qHGrsoNPVMs/artYkgExA13CB52VGw6+4kX7c
+zHUlz75H0OTp0gicrID9AyE1Af6aAI11wCHwWuM1eDQB6gH8hoJY7bLLcdFbkmDNyV4tTkbBTLivlqPs
+Mez260wZz8Ga/W+L2dMjjDz7ScMvUEsHCPYqpCwbAQAAVAMAAFBLAQIUABQACAgIAAAAIQD2KqQsGwEA
+AFQDAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAABRAQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/OpendaylightFlowStatisticsListener.java-898c233f-b3e9-3b44-8617-2cc3ab523f85--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/FlowId.java-6e6aebc1-c332-3d36-89f6-0af889b2d1bd
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/FlowId.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStUk1rGzEQvRv8H4acbINlKw7N2iY0
+kFAwtLRgkkspZbw7XivVSoukdeOG/vfqY13brSE9VDrsMvPmzXszqjH/hiWBNiXTNakCd1KUG8d2qEpW
+kmJbzhqjTpNrqb8z69AJ60RumaEtn4wzPp13O6KqtXGvEwpya1ajwcqy50oyZRMkxoUix9yupsQ9Hk8v
+r9iDEQf+J9wiE5otyQiU4geuJP2RXRF60jutrDNN7rT5ZLwi4wRZjwx3NBh0OzCA4AdEEf8/6KKRBAor
+msVAOMdOhgE9PLiPoGW+oQqhRrc5VH3ueaOz49pZqJ0dat96d8IKrW4ux3wyHGdDPu1HflGM2u+XwDfq
+dupmJUUOuURr4Z3PLQqgZ+fJLfjReJQ3L6ki5SwcjwVefM6f2ogtOoLYPoe1UChBalWCjehHMkHKw+Ie
+buDNhGfXPLvKOM8yfs2nV5P3cwhDC1S3Z6fau9iibOii3/ZLgpPUXlyJDBteOiN8068R3N+rC8c2nqnX
+JuYp/jN90qrCGcCdIe/DAkKu6x2sja5gqRuTE3xcPVHu2B76u+Q2vjSwCdWCdQTvMaNzqts5p7ozWtvE
+v2hV5N+Ynxoq3zpqTlv7P0I91zmVryg9YWrfRWu5JHdPa2ykW7Sie+3iihR+/Gt9hpx/8NFoq+oEemh9
+en3gF1BLBwiezED4+gEAAIcEAABQSwECFAAUAAgICAAAACEAnsxA+PoBAACHBAAACAAAAAAAAAAAAAAA
+AAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAAMAIAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/FlowId.java-6e6aebc1-c332-3d36-89f6-0af889b2d1bd--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/group/features/GroupFeaturesBuilder.java-3e19c0cb-afb2-30ae-af25-1ebc2f6f373b
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/group/features/GroupFeaturesBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/group/features/GroupFeaturesBuilder.java-3e19c0cb-afb2-30ae-af25-1ebc2f6f373b--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/aggregate/flow/statistics/AggregateFlowStatistics.java-126c639a-48bf-3237-8258-e0ca7b3f9092
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/aggregate/flow/statistics/AggregateFlowStatistics.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU11LwzAUfS/0P4Q+bWPN1omwdU4Z
+om9TZI/iQ5bepsE0KW06HeJ/N/2YrcMyJ0shIU3OPefenJsQ+koYIJUyrBKQAdkJziKNd0QyzEDirYfz
+VP48DIV6w5kmmmea0wynsPUuxlNvhgljKTCi4fDO3LZ4nKhU/06llRJZRUpVHCuJnx5IDH9HbbgMuFlv
+Iy6Cx/B04DJnMUhNNqJgLb7RYGBbaIBWKsgFIGn0+OWPYrRDukWubpNreWlNI4gJSoiOGtRzz9TSb2P9
+Aus32BtTS55xJReTsXfhjqeuN+t/V/WQafSPk5dCzci2knwjOEVcakhDQgEt94h7A1i3szED3rURXW/q
+Il+dyzUdzNfDiq71NGej7DTqMTGnCYhVAKIdXe8S2OuYTS672GzrozJhRVq/VRmHopBLIlDZIGZeru7Q
+4qSuwjQFw9hzjpnRGTqNC82m01NOf143zWcxfQFQSwcIgrFBmF8BAABWBAAAUEsBAhQAFAAICAgAAAAh
+AIKxQZhfAQAAVgQAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAJUBAAAA
+AA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/aggregate/flow/statistics/AggregateFlowStatistics.java-126c639a-48bf-3237-8258-e0ca7b3f9092--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GroupDescStatsUpdatedBuilder.java-77017dfb-ff31-32f6-8106-aff43616e630
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GroupDescStatsUpdatedBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GroupDescStatsUpdatedBuilder.java-77017dfb-ff31-32f6-8106-aff43616e630--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetAllQueuesStatisticsFromGivenPortOutputBuilder.java-1bece34c-382d-34e6-862a-411382d47933
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetAllQueuesStatisticsFromGivenPortOutputBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetAllQueuesStatisticsFromGivenPortOutputBuilder.java-1bece34c-382d-34e6-862a-411382d47933--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/GetAllNodeConnectorsStatisticsOutput.java-37a6b881-58b1-3c30-9929-0278540899e5
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/GetAllNodeConnectorsStatisticsOutput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU8lOwzAQvVfqP1g9QdW4pO2pbIoA
+cWoBlRviMHGmqcGxI3vSghD/jrNACpe2Eo7kyON5b5Y3zkG8QorM2JSbHHUC70qmK+LvoFOeoubrkBdW
+/77MjSXuCEg6ksJxi+twHI7CyWm3I7Py9kDCpTIbTha0A0HS6IYxPBnzx9YabcDijhBkjHJ1MGGyzFM9
+zCHbhTq8Uj43CV4ZrVGQsYsfj0gn9x4zL7IY7Qzy/dONpU6k/18DwV384nkPx0ZFmqEmiFVZcfkN+/1u
+h/XZzCSFQqZ9L6aVoVzblEEZKGhLrZwWYoUZsBxo1aKejnybptvYaYmdtthL3ybpvGLno5NwHISjIJwc
+p0gBKBVo37hAfHfObYUc7uFiCsoLei6TGXY7eRErKZjUhHYJAtktUqTUL21cK85dBfZYv/CNfAGuPvwd
+skFt3lPjxrsVrjFsqXH2X2O3T4EX3c5HrX6dR9Olik+wpdSgWPUq/B7Nbtj5QU+JC4tAeNTbNQW9Qa+V
+3x9q6XrHp81ofpbbF1BLBwhl5jv2iwEAAIEEAABQSwECFAAUAAgICAAAACEAZeY79osBAACBBAAACAAA
+AAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAAwQEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/GetAllNodeConnectorsStatisticsOutput.java-37a6b881-58b1-3c30-9929-0278540899e5--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetAllGroupStatisticsInputBuilder.java-3b540705-4d07-3c4c-a733-af5b65c20053
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetAllGroupStatisticsInputBuilder.java
+
+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
+AAEANgAAAFEGAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetAllGroupStatisticsInputBuilder.java-3b540705-4d07-3c4c-a733-af5b65c20053--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetMeterStatisticsOutput.java-204a0e28-0d38-353a-94ea-3e4366431752
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetMeterStatisticsOutput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU01PwkAQvTfpf9j0BAQWKhctoiHR
+eEKjeDMepstQVtvdpp2CjfG/u/3QImIIxGmzzc7Omzf7ZhqDeIUAmU4CrmNUc8hDGSyJ56ACHqDiK5dn
+ifp5GCFhwlMCkilJkfIEV+7QNTayLRnFOqGjMlIeY51scOae8mnhnX3TPGAc5scyLEK95pSASkGQ1Oqr
+5sGQPzbeyRoS3ENBWodpRSZ0FJlU97cQHYDypZpL870Cgjv/BQUdjp1kQYSKwA8L4uLpdzq2xTpsqudZ
+iEyZkrzSUdhmyl4pdq9pXxk1E0uMgMVAywb21DI6eptgrwR7DfjS6ChTI934ZOAOe65r3naAv1n6O506
+ozij54Kxb1tx5odSMKlM1AIEshukrSG4KwEm3hi+kaksrTbbXexW7l0zVB81+teODVHP/+uP4H9d4cK2
+3qvOVeT13cscgi2kgpCVg2XWyfSajQ+aRi4SBMKWs7eBTtdpOmc2VUec9qieq49i+QRQSwcIN4Xc13QB
+AAAoBAAAUEsBAhQAFAAICAgAAAAhADeF3Nd0AQAAKAQAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50
+UEsFBgAAAAABAAEANgAAAKoBAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetMeterStatisticsOutput.java-204a0e28-0d38-353a-94ea-3e4366431752--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAllFlowsStatisticsFromAllFlowTablesInput.java-bc6f9458-6f2b-3dad-bd7d-563283d3fc03
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAllFlowsStatisticsFromAllFlowTablesInput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU9FOwjAUfV+yf2h4AsIKkxcYoiEq
+xgcwim/Gh667G9WuXbYOJcZ/t90WNhINLrFLuvS25/Tcc28TQt9IBEimEZYJiIDsOYu2Cu+JiHAEAu9c
+nKfieDPk8h1niiiWKUYznMLOHY8m7nRmWyxOZKp+JlRS8qykpjKOpcAPaxLD31E+EwHT/2uiyL3/ClSd
+wP6aAhM7EEqm+1o8XssArqRQ8KEeIWyvapFHsSYlPjcpmW/Y79sW6qOVDHIOSOhkvSJgRpPSMZY6taXF
+oQ3dQkxQQtS2Rj13dS5eE+sZrFdjL3VGLGNSzM9G7tgZTRx32otAOYTz4p6scZETpjI+7DiF+GzY7jQT
+Sa5ejMKhbSW5zxlFTNuYhoQCugW14HxpmDYHoqXmqaJPBcmd4dAUemj7dXJZuTiuyaAM1uWvAg3nz/+p
+lXEL3Re29VkWvJRTeVDQUhQyQTgqOl3Pi9UNmrd6HpimQBR0O6cK3xl06orrRVGXTm9WNeOXmb4BUEsH
+CJMop5B7AQAA8QMAAFBLAQIUABQACAgIAAAAIQCTKKeQewEAAPEDAAAIAAAAAAAAAAAAAAAAAAAAAAAu
+Y29udGVudFBLBQYAAAAAAQABADYAAACxAQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAllFlowsStatisticsFromAllFlowTablesInput.java-bc6f9458-6f2b-3dad-bd7d-563283d3fc03--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupDescriptionInputBuilder.java-6b5dbcea-f010-30eb-a7c3-48fd9b3273e2
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupDescriptionInputBuilder.java
+
+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
+AAEANgAAAFEGAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupDescriptionInputBuilder.java-6b5dbcea-f010-30eb-a7c3-48fd9b3273e2--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetAllQueuesStatisticsFromGivenPortOutput.java-fba29582-3065-35a1-9a30-38d9ff379957
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetAllQueuesStatisticsFromGivenPortOutput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU0tLAzEQvhf6H0JPWtzUbaGHapUF
+tXioD/QmHqbZ6TaaTdZktrWI/93sA7cKUitmIUtm8n3fvJKBeIYEmbEJNxnqGNZKJgvia9AJT1DzZchz
+q786X3LMkTsCko6kcNziMhyE/XB41G7JNDOWdmScK7PiZEE7ECSNrhnDwwG/b6zRCixukSBjlKvEhElT
+T3V7BekOqJnUsfT/MyC4nj2hoN2xUZ6kqAlmapvwH2rMbwvXZRzp+O7TPYXMKxVfr9ttt1iXTU2cK2Ta
+Jz8qDcXalAhKiaCRKG/diQWmwDKgRQN72PPxjTbBoxI8asCnPj7pfJPG/cNwEIT9IBzuJ0gBKFUpuQ2p
+YG5NGiRyiTooitP7/U2TU5bTYxFbr93K8pmSgklNaOcgkE2QIqXKErmmPBeeZFJw3HiK65LBE/iFr+ST
+ctXhh8IeVN7vg1ibmzmpDRvNP/63nv86rZN2660ahCqaukAlqWBzqUGx8kX4PZqes/FOz4gLi0C419k6
+D52DTjMI/lC1rbN/VI/pe7F9AFBLBwjxayHAkQEAAH8EAABQSwECFAAUAAgICAAAACEA8WshwJEBAAB/
+BAAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAAxwEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetAllQueuesStatisticsFromGivenPortOutput.java-fba29582-3065-35a1-9a30-38d9ff379957--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/NodeGroupDescStatsBuilder.java-950e64dd-3b21-353b-ab1b-797e263ddbe0
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/NodeGroupDescStatsBuilder.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS1Vs9P2zAUvk/a//DohbRMYYhboYwN
+tonLOCDtwtDkJm5q5saZ7RTQxP++5ySNnThpiyit1KR5v7/vPb9kJPpDEgpCJqHIaBqTJ86SuQ6fSJqE
+CU3D5VGYy7QpTKTIs1BpopnSLFKhpMuj4yP8nLx/xxaZkHpnHitRTFUUfje3l3i3IYwWgqsy4JSlMcPr
+JdHkenpPI4225pvlU84iiDhRCn6ImNbObzAL9SVnPKYS/hldwE8m2ZJoCrUa/E6cdGq10m2vw2BoXBrN
+ZyivW9rtDE9bAJFJnY356DlToa0KJkYDQ+jaJBieVMlvXa8vgSlRdENgo7Ih8uFoVHkY3VANM0Z5rGAm
+xQIStqQpFP6Qe1NFvqCpDuEn4Syu/wNTwFIEKY1wAmYg0uIyE5yLB2OonzKqxqsocJrzM/uHs7Pdc3J6
+iG5tjEMnYv30PCOSLEwVtkRRtLZV0XMpHhRccU4Twj9XBX99jGimmUiBzSqQXCzSCoBlgVJRfOlxdNgg
+eylQXOL9DeEO7Gx5LTXFSaQE46kCekwEyZ0RruiJVcJkAlPNigtDxc6RbaTV3XTBGwzZ0CDS3cl1+S42
+WuYuNM9NlPasbkc9SDmk9KGX9aBpADCgjxmyRuOq9cdwu3sE7uBXOoADL/Y01/BA1BhQaPqmqTD0QWif
+OfYga8LrAiOpxqSbR3WXr/4FoFzfNiTOSL7pECt0TrxkjOLWacDU5NFZlKHaN7haZDwwIfyjutpgBV0R
+DnBKeO/+M24AdyynpoW6NOxqdAq4J0sSctMyF8bx6c7ayY9/Zmi/WmVI4yv8kTMS0cAbjQqwN0wmLHBs
+9qwDToV8CfmGNwjXoIfe/m71Vmt3Z/avVy/38+sllZLF1ON6m/lbN4MvCMVwQc2Jml9g4X6AElajg7gt
+KNZ3fNQ+Y1Eoqcq5RmlbWAtK89HqwQFuBBe2CaQ550P4BB9h7NQT2tTaZ3tVe+nw5XWv1if9m+PODOx0
+VesW176HhtkThnGTb5fcSau1bKrE2s7Qia2931l7q/d4w14pjgakca9IMLRPXum+5xQTeo6Tgeu9Wz40
+SbTbBRPtYr4jvQIhE8GdsL01Bhtq6qjrGSjqYaRgz2m6qifasV8LYndrOErb9K1t1BstizdpUd74w9tW
+rU+y6jop9lyfVjDoWEy3g/YYruZoxqTS/lvWWvLXcWlUC5+9TK8i9lJdcttjXYEQksxspmDwAbzSCif+
+o7alLWjS6aKl7/RTW7m7X1r2+3f7w9CS3vMyhz//AVBLBwhIjEwAuQMAAIEQAABQSwECFAAUAAgICAAA
+ACEASIxMALkDAACBEAAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAA7wMA
+AAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/NodeGroupDescStatsBuilder.java-950e64dd-3b21-353b-ab1b-797e263ddbe0--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput.java-dfe959e0-d0ec-36a4-ae76-a23440fbe0fe
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU8FO4zAUvFfqP1g9QUXchmolWpZF
+kdjuCdAKbojDq/vietexI/sFqBD/jp20pCBVVYFEcuRnz8zLeFyC+A8SmXWS2xLNHJZayQXxJRjJJRr+
+kPLKmfeLubaP3BOQ8qSE5w4f0tHwJB2fdjuqKK2jzxCSA+NBkLKmYUzT4YjfttXsERzukCBrtW/EhC2K
+QPX3Coo9UDNl5ip8L4DgevYPBe2PzSpZoCGY6V3CWx0p7Bz1pse0LHHt9Pj4B8+kdCiBcBq8u3nbF/Ti
+O+j3ux3WZ5d2XmlkJlgwqQvx2RRKovVJq1NvuhELLICVQIsWdXcQmpxsYicRO2mx56E75cNBnR0P01Ey
+PEnS8aFESmDd60e1JHe2aIq1W0luXQJa1yU/+ArWVlRWdB/bH3Q7ZTXTSjBlCF0OAtkfpC0OTgNtrNxG
+0ql1mdZx6q9rwsAXHnyiYINvJh8TetSUt9CvVtt4rbe3mfn5TbeRf/Ynf3U7z02Omt5W7tUaguXKgGb1
+tQpjdvmbne11F7lwGBo66O3KU++o1wYpTJoj7R2erkL+EodXUEsHCIfZnCeiAQAAwgQAAFBLAQIUABQA
+CAgIAAAAIQCH2ZwnogEAAMIEAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYA
+AADYAQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutput.java-dfe959e0-d0ec-36a4-ae76-a23440fbe0fe--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/flow/statistics/FlowStatistics.java-f1f24480-7d32-3177-88b9-b246d7af06b9
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/flow/statistics/FlowStatistics.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStUl1rgzAUfS/4H4JPbWlTbdlo7bpR
+xranbow+jj2k8aphMRGN3crYf1+igtYN+kEjRO+9nnMu596E0A8SApJpiGUCwic7zsJI4R0RIQ5B4K2L
+81TsFwMuP3GmiGKZYjTDKWzdiTN1Z+3K3OqwOJGpOkdA7RKouF1nfI0fdfJcwlj6wJstN8id2fgKP4GA
+lNH1sa0rKXlWalIZx1Lg12cSw/GoDRM+0+/7iHH/JTgduMzDGIQiG25UzTPq960O6qOV9HMOSOh+vCJh
+TpNyaPwd1m4UP61pBDFBCVFRjXrraiu9JtYzWK/G3mkPWcakWIwddzJ0pkN31mvxjw7E70ZvZHWSfMMZ
+RUwoSANCAZmRr5tt6gNfSndTBZV7N5fa333B20Gp0rD6Ykrtyv/KJlt9/tlQq/Ndzr2sV+YVlBQFTBCO
+ip3U93L1gBYnLTKmKRAFXfvQ/O2BXQ9eB63R2r15tZ0/5voFUEsHCLLiwLdmAQAAcAQAAFBLAQIUABQA
+CAgIAAAAIQCy4sC3ZgEAAHAEAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYA
+AACcAQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/flow/statistics/FlowStatistics.java-f1f24480-7d32-3177-88b9-b246d7af06b9--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupStatisticsOutputBuilder.java-f4c9b409-0e94-3fa8-b296-8d0abfdacf4c
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupStatisticsOutputBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupStatisticsOutputBuilder.java-f4c9b409-0e94-3fa8-b296-8d0abfdacf4c--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/$YangModuleInfoImpl.java-b0b4a3fd-419d-3cc6-bdb0-67bb09e096b6
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/$YangModuleInfoImpl.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTNVttu2zAMfS/QfxCCAXWxRqlb7NIr
+1hUdloelw9KXYdiDYjOOVlnyLDldMPTfR8tyY7lObwO6GQFim+YRxUMeKmPRJUuAqDyhKgMZs4XgyczQ
+BZMJTUDSeUiLXPrGnwUUQLVhhmvDI01zmIe74U74mhysr/E0U7nphjRKCV2BT7iMOf5/xYdPKi4EDOVU
+Lf1/sDmjheGCjsF0vf7I9MwzRSqliVKJAIq3qZL4JwREhg7TtDBsIuA2FFd0KLPCjE0OLO0wnp/9iiAz
+XEk0ZsVE8IhMuWSCRIJpTV74GximmSCIISAFaTTxreT3+tr6GsEry/mcGSA2izVi6+PhaHxxMjo9I0dE
+wlXXSsHmQRuwQsLtYHKJZCmgd69JRN/S11/S1zu4B0FnLLIwWAn7Tah9C7X/QCisEq4xjyXSzna42w93
++uHre1y0KvIIPjMzK90Gn84uTvrD0YdBWUODO7dly6xG71wDzKGf0mNSsQ9x9U4vs1sR79hq8ZSAGUo0
+yQiCzZJi4q4cDKbshkcXy3Wbsk5imzhdkWowri5cIxwe22qofdBOWRwHj2vtVMUgmq1tFhm4Bt/e23lF
+O2Kl3v7/PoapUFeUyzn2j8oXbu234d6zrV3tuVK559+5yZnULCoVxwlruL37HKv/o5RbI/wyIEtxuHl0
+QbzZfmQQrQ7GHmmqP46EbHE+DTDUplNjBGCP27+jrrakVvPLxb84ZTrRlVvQlCovnikJakjs10IIr7XL
+y8xydWVbeYjzKmFijP0HN3Mn6NWLkY0eeemL4kvS2yBck5RrjYrZay59vbw1+aK9ahUU7khp8JTjmkTM
+RDMSNGYfAS/qwYDcxCSAXW6RSWFwH5BDGYxUZlbK9xUglCSxuhXTdVOW353PIc95DJ7WuhGAuR7hDOoU
+1nI4HTwB8IubRJ2g9Zh6CvConpYrw7XWh0M3CxPxq2oc28S7utusykeTJlu//8PSPu8q6K56fkA5u4Tq
++tD2UKI65mgpJL5kdHJ3+2DwuOIwqrppDXb77n3BRQw50RM30b3XAfaS5eW0JCjYtLdMKskjJqrW8ER4
+QllW6mvQ+9ZbYaiPhZjt8nbFV1v+4c99bJ9XejTPeJba6vGO7/0DXqscVvpVdGjn0iJnhdd3Lx11CU3o
+kpolq/j7A1BLBwjzxCIhZQMAABwNAABQSwECFAAUAAgICAAAACEA88QiIWUDAAAcDQAACAAAAAAAAAAA
+AAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAAmwMAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/$YangModuleInfoImpl.java-b0b4a3fd-419d-3cc6-bdb0-67bb09e096b6--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/NodeConnectorStatisticsUpdateBuilder.java-7a5629f1-53d6-31ea-9777-313b664c70e0
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/NodeConnectorStatisticsUpdateBuilder.java
+
+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
+AAEAAQA2AAAAEwoAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/NodeConnectorStatisticsUpdateBuilder.java-7a5629f1-53d6-31ea-9777-313b664c70e0--
+------=_contents/model-flow-statistics/.settings/org.eclipse.m2e.core.prefs-f69e9037-9866-319e-a5bb-50db4a28e81f
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/.settings/org.eclipse.m2e.core.prefs
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnRNyzEKwCAQBMBe8CuCD/AP6VLLscIl
+4sme8f0hXfqZKks3DlrTDi8xQLpOR5pEAzEEnjboaqPkGAi3vnEab59VvnlBlpfFBzH85AtQSwcIVoDB
+00sAAABaAAAAUEsBAhQAFAAICAgAAAAhAFaAwdNLAAAAWgAAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250
+ZW50UEsFBgAAAAABAAEANgAAAIEAAAAAAA==
+------=_contents/model-flow-statistics/.settings/org.eclipse.m2e.core.prefs-f69e9037-9866-319e-a5bb-50db4a28e81f--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/GetNodeConnectorStatisticsOutputBuilder.java-96d442b8-6c3f-32d9-9448-5712ec85881c
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/GetNodeConnectorStatisticsOutputBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/GetNodeConnectorStatisticsOutputBuilder.java-96d442b8-6c3f-32d9-9448-5712ec85881c--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/NodeGroupDescStats.java-8c6085bc-74f9-3c7a-86d4-a70b3ca3ae5d
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/NodeGroupDescStats.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStT80KAiEQvi/sO/gAIS1dgiIIFrrV
+oSdw3cmsTUXHpSV69zS3rU4RNQOK8znfj2H8yAQQbQXVBlTNukaKPdKOKUEFKNoW1Fv1DgqrvaEOGUqH
+kjtqoS0mRahZnsmT0Rb/xkhXESrB8Q/cqHXjkkolVS3DXTJkm+oAHH/zhZ2Bh6VxMU1Tl5x972rpxQlU
+jKpV2I5tfNVITqRCsDvGgax1DUPwbfjr8oyEgjMGgf7xjDdKg1fm+X190SMDV55dkmTqazxuUEsHCATm
+duXEAAAABQIAAFBLAQIUABQACAgIAAAAIQAE5nblxAAAAAUCAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29u
+dGVudFBLBQYAAAAAAQABADYAAAD6AAAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/NodeGroupDescStats.java-8c6085bc-74f9-3c7a-86d4-a70b3ca3ae5d--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/NodeMeterConfigStats.java-358d4d31-21be-3d05-a062-6d32b6bc1bee
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/NodeMeterConfigStats.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSdkNFKxTAMhu8He4ddKkhweKMoguit
+euETdF1We9yS0WbTIb676XpAHYgcE0hom/z/R0djX4zDioMDHpFas/TePQsshhw4JJhrmAL9fBxQMEAU
+Iz6KtxECzvVZrXFZFn4YOciBil3Pr+BpRhIOS9Y7Pa8vslWE+9T+K/47LhC3GNe6n1qNbpk67550If7h
+Kcx9zO6Np9ZrvzNiHpsdWjl892Zyg36BgjLpdspxanpvK0/K1RmL1YPCbinLotLAN1GL/eEL4yRffNe+
+WgWuy+I9m6RMM1vdyqFs746OV7KPVD4BUEsHCEa5krHiAAAAPwIAAFBLAQIUABQACAgIAAAAIQBGuZKx
+4gAAAD8CAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAAAYAQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/NodeMeterConfigStats.java-358d4d31-21be-3d05-a062-6d32b6bc1bee--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetQueueStatisticsFromGivenPortInput.java-f29c3338-b2bc-3aa8-bf22-ea282db8fdd4
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetQueueStatisticsFromGivenPortInput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS1U0tPwzAMvlfqf4h22iaa0SEQbDyE
+eIkD7yPikKVuF2iT0qaDCfHfcZJCxzhsQ9BKaeP4s/35i3PGn1gCRBUJVTnIiE1TkYw1nTKZ0AQknYS0
+KuT3w+cKKqClZlqUWvCSFjAJN8J+uDX0PZHlqtArRhRyAlKrYupCrW+HO/RSRXCkpASOB+fRgtBaqbR0
+SbjKMiXpzSXLYHnUSMhI4PeYaXY1esSs/0BGw6u+hfi3keNUvVA9zaGsNXAJdvqb9MbsV+nSJ9/DKsmw
+XDZKTbPM2+t2fY90yYWKqhSIxDYOrME8syEDW0TQXATrdcfHkDGSMz1uYPdtJDOYBQ8seNCAD5CMKIWS
+e/31cCMI+0G41UngZ5YgLlQWJAK7HBiqvaWchMwr/WAK6vleXo1SwYlAQYqYcSBnoG0H774CnCL+zMCv
+EX1uwIjFBxVEEqXbfJd1zRmbG1QbZlq8+1eTRpepeN/33pymrpCato3HSSwkS4kdE1wPL07I3kqzRXkB
+TEO7tVDa1lqr0RQ3VotWZzj8LGxu1gkqOmdqd4bO1a31dTeO9a918L13s3wAUEsHCFhQnFWrAQAA1wQA
+AFBLAQIUABQACAgIAAAAIQBYUJxVqwEAANcEAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYA
+AAAAAQABADYAAADhAQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetQueueStatisticsFromGivenPortInput.java-f29c3338-b2bc-3aa8-bf22-ea282db8fdd4--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/flow/statistics/FlowStatisticsBuilder.java-57226b39-7aa7-3760-b896-f0d137876fd9
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/flow/statistics/FlowStatisticsBuilder.java
+
+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
+AAAwEwAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/flow/statistics/FlowStatisticsBuilder.java-57226b39-7aa7-3760-b896-f0d137876fd9--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/flow/table/and/statistics/map/FlowTableAndStatisticsMapBuilder.java-41c6eb90-3909-3b9f-ba02-3e88e65d1cea
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/flow/table/and/statistics/map/FlowTableAndStatisticsMapBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/flow/table/and/statistics/map/FlowTableAndStatisticsMapBuilder.java-41c6eb90-3909-3b9f-ba02-3e88e65d1cea--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/AggregateFlowStatistics.java-dd656392-c3f0-3630-8d2d-bd8511dca597
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/AggregateFlowStatistics.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS9k1tPwjAUx9+X7Ds0PAFxBTYwYYQY
+vL3hJTwaH0o5lOrWLtsBIcbvblfAzgQUX+ySbu25/frvWcb4KxNAdC6ozkDN2CaRYoF0w5SgAhRddegy
+V9+NqZ5BQgtkKAuUvKC4yaCgOaw6Ubsf9ga+J9NM53g4L2qdFNsKXKepVvTxjqXwS1SVRgLOacZylhZ0
+nSZU7dLZffvliNqGqEuv9FIh5FF4OttUqpk072uG7H76Ahz/g/C8a6qUT6vZ9D3SJCMhchAMgcwT/Uac
+6tY61rNlAkQZ/WK7UY4qWeACAlvSek34AlJGMoYLF/ZUN+RxNTi2Nx27FLFNcWGoZSG1GobtThS0+0HY
+a7A9Z1ByVsq2jlqey9It38uW00RyIsvzzxkHd+ZbEzCpntgMWKMh3C3c5fje+1a4rWGX0xbjZC4VS4ht
+MzOPxjdk+KfepDwHg1OvnahQ7azmpDGLoxLUGoPBHvmrA4gAfDB/JqDdqjcGW4cDbpcbhB+corB0KlV0
+Tr73UU6fUEsHCJVdG8GEAQAA+wMAAFBLAQIUABQACAgIAAAAIQCVXRvBhAEAAPsDAAAIAAAAAAAAAAAA
+AAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAAC6AQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/AggregateFlowStatistics.java-dd656392-c3f0-3630-8d2d-bd8511dca597--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/FlowTableStatisticsUpdate.java-98a48e3e-309e-3963-b822-347103d2bb5f
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/FlowTableStatisticsUpdate.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS1VF1v0zAUfa/U/2D1aasWt241iWUb
+qOLjrZ1g2xPi4da5SQ2JHTk3HRXiv2MnWV0Q3QiIRHLiHN9zv85NCfILZMiMzbgpUSewy1W2Ib4DnfEM
+Nd8KXlv9M5jm5oETrHPkFQGpipSsuMWtmIuZOL8cDlRRGks9aZXeoiZjdy3V9IW44CuT4N/ytWFa0BVI
+UkZ3EYrpnC/rnFQJlu4CvHgA+4++jpaEv3P4nYcXOrndH1hC+YxDMiavWtfSFIVL4v0KiufCPLBaK50o
+93wDBDfrzyipv+3rjcqTm7S/4aLOCtdSn3d/45UhlSoJvjfO2t+T8Xg4YGP2ASWqLTJfddbQs1B1VpcJ
+EDYHlyapHahdyeLmg78OnUeeImoookDRHL2VGyyAlUCbYPvxxLU+PmSIPUPcMMSB4ZVrvapc5NezqZhH
+YhaJ89Pf+oracCdPgZ+8/8lwUNbrXEmmNKFNQSLbyypo6v4xe3fhV3KBVu2m6+JVUMLLsxY5aNPVf5L9
+r/E9uj46Fx1+dFA73P8f9q9BL8PBt1YxLdTVrQlRslRpyFkzR25dLN+y617Dx6VFl8LJ6M+kMDobBQ24
+zVONHp1edlL/7pcfUEsHCJUpYH/GAQAAnwUAAFBLAQIUABQACAgIAAAAIQCVKWB/xgEAAJ8FAAAIAAAA
+AAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAAD8AQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/FlowTableStatisticsUpdate.java-98a48e3e-309e-3963-b822-347103d2bb5f--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/FlowTableStatisticsData.java-f7f2b139-841e-3a61-a6a2-5093cada60d5
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/FlowTableStatisticsData.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSlUO1KxDAQ/F/oO/QBZDGKcIciCHJ/
+74e+wDa3F1dzm5Jsq0Xu3S+9iB9QFTELWTbDzkymQ/uEjpoQHYSOZIOjZ/egMKI4cCQwGOijfAW3PjyD
+YusJkqJyUrYJIg3m3JyZi8u64l0Xos7Tagg+FYGWZcO536Liun0kq7/s/myJZSDREMfi5XRhlsVmgvup
+/Yv8+//CKuNHgbt39O8Z3PRul91ngiB5e6qubz3bhkUpbtFSMyM0RVdXTT70olklleEj0ZPy8Jn+6shx
+/YbMkNbVa3FQaj9dB1BLBwhawNoy1wAAACsCAABQSwECFAAUAAgICAAAACEAWsDaMtcAAAArAgAACAAA
+AAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAADQEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/FlowTableStatisticsData.java-f7f2b139-841e-3a61-a6a2-5093cada60d5--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetFlowStatisticsFromFlowTableOutput.java-02cbba7c-739a-3e27-a7fc-cede9d94851f
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetFlowStatisticsFromFlowTableOutput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU99PwjAQfifhf2j2BIQVJi/8EM0S
+xReRGHgzPtxKGdWtXbobaIz/u+22ONQYmLFLuvWu3313990SYM8QcqJ0SFXC5RpeIxFukb6CDGnIJd15
+NNPyq3MTqT1NEVCkKFhKNd95g/7QG02aDREnSuNfAqIGmQJDoWQR0fP6A7qqrP4eND9CgUpFaUHGVByb
+UPd3ENdABUKuhXlfAcIieOIM62P9LIy5RAiiY8T1W0xnxuPL9fLTN4fk1nwZJvv0Op1mg3TIXK2ziBNp
+ih/nBrsOKVxL4VYU+aUl2/IYSAK4rVAPLZPe+BA7tthxhb006YnUSDQ963sDtz90vVE75D843I1WcWHM
+u9M75Y7KMMnw0abTazaSLIgEI0Ii1xtgnNxwtC2p+jEzeGtZWfQiBxusWfwFTQlpcfitjd3C/X3sSnM1
+FaXhQOrz/1L4lIoumo23QvAij7IteTxGNkJCRPLJN7s/vybTWr8LZZoD8pZzTHin61SKm0OhldOelNP4
+brcPUEsHCNQn93+BAQAAZQQAAFBLAQIUABQACAgIAAAAIQDUJ/d/gQEAAGUEAAAIAAAAAAAAAAAAAAAA
+AAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAAC3AQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetFlowStatisticsFromFlowTableOutput.java-02cbba7c-739a-3e27-a7fc-cede9d94851f--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/Duration.java-93f27cdc-c61e-3e25-a0cc-ec61fe255355
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/Duration.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStUsFqwzAMvQfyDyantixu2tJDU8oY
+dMdujB3HDoqjpt4SO9hKWRn79zlOQzrYoYPJIEuW9KRnuwbxDgUybQqua1Q5nEpZHIifQBW8QMWPM94Y
+9TNY6RxLbglIWpLCcjrVaLnB42yRrObLdRjIqtaGfsclrUvbdRC6qrTiTw9Q4fVVmVS5dPsWCB6zNxTk
+ats1nUzCgE3YTudNiUw51NQftHKJGA/Dx354n/UsDlgBq4EOQ9nLyPFPL4tTzz8dIFIPcev4Syu12syT
+2SJOVvF8Oc4b47K0mvbGaws8DYO6yUopmFSEZg8C2fac4OJO8INcQ9s5A88w+OyYdoEziJ9EsL1UUDJ/
+l07f7e7Z5k8PwIVBIBxFVxKObqKBqXN6itF4ve4n/N+PxfsWvL8tViD19mjs23616htQSwcIUbVrhTgB
+AADZAgAAUEsBAhQAFAAICAgAAAAhAFG1a4U4AQAA2QIAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50
+UEsFBgAAAAABAAEANgAAAG4BAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/Duration.java-93f27cdc-c61e-3e25-a0cc-ec61fe255355--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/node/connector/statistics/and/port/number/map/NodeConnectorStatisticsAndPortNumberMap.java-b6179510-f844-3afe-9da2-fbd4241564ee
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/node/connector/statistics/and/port/number/map/NodeConnectorStatisticsAndPortNumberMap.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTFVF1r2zAUfTf4P4g8JaFW4rSDNWk7
+QtlD2ZL1Yy9j7EGRrx0xSzKyEmbK/vuurKRxy7I6pWUyyFg+V+fo3qNbMP6TZUC0yaguQCWsykW2tLRi
+KqMZKLqO6cqoxz8LbSwtLbOitIKX1MA6Po5H8QlVOgHKtVLArTZNDFOJj1MruQBDJSsmYSCkW/s/9HSO
+6Mst+O4BO1XJNSLnNXDGik9QvVSpUGtQuHnlNQ7fx6ePWa+SZ7a2WuelJ+FaSq3ozZxJaB+1ECoR+L5c
+ijz5kh4eeJXgEUQq2CJ/Ae10lUmMbxG8N4kSE5Y3a2mrAjZVH56O3u2rI/K5Z9DvhwHpk5lOVjkQhdkb
+1wtuNIkipy3a8dSgO74EyUjB7HIX9b2LIsfN2LGLHe9iP6A6UQqtzkfD+DiKR1F80nPujB7c2WCK0J2e
+3bszQncO3hD9w51kEAbFapELToSyYFLGgbS8ERiOA35ZTEDpPzb2Onutm9xSycWRp2/Y7NUkvEkz2Qre
+A9/8bd65s/Zt6iIM7r3p/Tab+tbKOUmFYjmp2wfO09lHcn5Qz6HcALPQ7Txn/s5RZ+d6/DjIm53eZLLV
+/6RVkgzsk6Vub+KhfvZ33Y0+uQWLQktybYRkpiKYH6JT8g2PRT4jP/mKbWSLHvyzKn9JtdOCr5o/DH67
+6Q9QSwcIKRlHyPgBAABMBwAAUEsBAhQAFAAICAgAAAAhACkZR8j4AQAATAcAAAgAAAAAAAAAAAAAAAAA
+AAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAC4CAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/node/connector/statistics/and/port/number/map/NodeConnectorStatisticsAndPortNumberMap.java-b6179510-f844-3afe-9da2-fbd4241564ee--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/nodes/node/meter/MeterStatisticsBuilder.java-6b881490-9855-323c-b8c1-f7ef31552712
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/nodes/node/meter/MeterStatisticsBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/nodes/node/meter/MeterStatisticsBuilder.java-6b881490-9855-323c-b8c1-f7ef31552712--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetAllGroupStatisticsOutputBuilder.java-e16fcf15-9d98-3e5b-8aae-7021dac411b5
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetAllGroupStatisticsOutputBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetAllGroupStatisticsOutputBuilder.java-e16fcf15-9d98-3e5b-8aae-7021dac411b5--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/NodeGroupFeatures.java-12f64918-dbc3-3aba-94c1-fa1593d4f0ca
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/NodeGroupFeatures.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSdj1FKBDEMht8X9g5zAAkOvigrgiD6
+pmfIdGKNzialTQcH2btvSxfWFUTWBFKSn37JH9B9oKdOowcNJCMuE/s3gwXFgyeBuYcc5VT0UXOAZGic
+jF2CSHN/1ZfYrFe8DRrtTCLLTGIal4a6vO5vQHSkBM+l/kE11Sk1/sAycnkf0PBleCdn/73od4/wVKVH
+QsuR0vm33We/LWYLWKX8rhnyMLHrWIziKzrqquuTNetVV4I+rfAPzdHjRRt8B99Wwt1B+EH6aktb7mrZ
+A1BLBwhinl+EywAAAAcCAABQSwECFAAUAAgICAAAACEAYp5fhMsAAAAHAgAACAAAAAAAAAAAAAAAAAAA
+AAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAAAQEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/NodeGroupFeatures.java-12f64918-dbc3-3aba-94c1-fa1593d4f0ca--
+------=_contents/model-flow-statistics/src/main/yang/opendaylight-statistics-types.yang-552cf751-25c8-3c9c-81a4-32593df59207
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang/opendaylight-statistics-types.yang
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTVlsGO2yAQhs+u1HdAuVOl2W2lOqee
+qj4Gi8cOWgzuMM42qvLuxTjE2HWy2fUethyiyMx8zD8MA7UtWg3MNmAKcdCq2hF3JEg5UtJxOjTg2J+P
+H5gfRtTgGiGBrVo0eeqT17YAnQ+eefBcbXvPBqFUv1k33SP9935G1Y1FYgqo5AdhqrjiyaP7tGUIe+WU
+NbwQ5BffrD+v+fob39yvtsce0/9Gu2ByF0y+rGL03SjASVQNBZufRpESevCyJSu1fWIOcK8kxOBHS1Ro
+20aZihUtisBJ8NIaEsoAzs52Q4MoPd8bFtOpbnTig+Zc2tYQ4N1mO7Y6zvCMMPaNmMez5Ilc4/eX+yUM
+SLKYlEhcMhvE+xJ5BHKz2hEkqD1cjrRVhr7e36CaUBhXK6IFsOPc3j0cCP6z4NPoeIG2+Sf+eeIUEcNa
+wohhAKLFpXEsgcRASvR9qyctA9k9IMfWvAVLolyCkVbrviWGQ/1iSOt8iccmdbXPVeDPhJJzJ37UTX/0
+doNj6bUNTqvtREHfJK6En7asqYwJqzuxryRl00xk19NA4kHDy5Oxs7pIMElifEVo0bUBssw9KZI7FtaI
+CcuCQiEplLK/nuZPw2yDj1qyJOOOa2sfoeBtc449u5ymeUQtfJxD67oFMJ9WUVUIldcfpD2b1+/R/HRR
+v/vyGnGCxNs4ozv6agZjYf5qob29MBM7/+o51V14iQkiEfY2AN2ncR0m9xY/35PZTQV0CZO8Fl4NcqEV
+DpfFs6Bscu4T8DnN/s9fUEsHCE/T+YpBAgAAHgsAAFBLAQIUABQACAgIAAAAIQBP0/mKQQIAAB4LAAAI
+AAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAAB3AgAAAAA=
+------=_contents/model-flow-statistics/src/main/yang/opendaylight-statistics-types.yang-552cf751-25c8-3c9c-81a4-32593df59207--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetMeterFeaturesOutputBuilder.java-0f549cda-feee-3174-a5a7-7d0789a95626
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetMeterFeaturesOutputBuilder.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTtW3lv28gV/z9AvsNYQLGU12EsH8la
+sZ2r3tZoUgPr7RZoGhgjaiQxoUiVHPpoke/eN8NrToqURR+7YQLbIt+8e37zZvi0wN5XPCUoiqdutCDh
+GN8E/nRG3RscTt0pCd3LgZvGofxwTiiJ3YRi6ifU9xI3JpeD3QFcr54+8eeLKKYtOU6C6MqlMQ4T7FE/
+CguO27vur9Xd03HF34vm7jSKpgFx4c85DPGiICAedX8BQaQi/IIvsZtSP3DfZwTAKDE9/ogXS9SnURQk
+mSEjPxz78PvPmOKz0Rdga2L5V5zMlrMVveITOnEXOMbzxL2eB26Yy+P3+V/0ZkEyj29vH+zsgVVpCOHY
+3Wnim9P5PKV4FJAPEDlF4zmmM/edPz0FdlMSm+yRRzX10dt0Oichy5YohNHs3/PNzadP0Cb6GI3TgKAQ
+z8mQ32CXyPMZz7VnVa5xqnNvRuYYLUDjatgnBxw4FAcP+eBhNfg1uM1PQI2jne3B7rPBAP73p6SQMiGY
+pjFJnhtuRSldpPQzk/b86ZNFOgp8D3kBThL0F0I/MuKfc9ozTvou9YMxidH/mL1Mv0XsX2JKkJTQ6IIq
++S2Scs09xNx+yNP6sIrP8bEy9iLOE1/kUGYHupjja65mSxnFMCN7PornR8Ai/p754/A1ItcUopCsBCtV
+fu9uHwx+crnwdzgcc2WKD+fpguUgUT12Vwq9xws88gOf3pRqlbd8ktjUqzQ7n7EpxLzLzEnaB4UPMwbF
+JASwL1oh8nxYKUQeDsBW42lx0h+ua3lxzVPt+HjrjuUhLIhDRygkVygH+8Njp1/5KsOJWoRw+gwjGPU3
+lP1uMbaLZfbtFY4JwvG0VIxddOYnrow4YDhQgTQqYRq3n9sjmtOZUTWztGBvMaaAtsqOj/md0gSBWIMe
+YZj2zMbACBIKIyONiWEOApL6/I6ZmE9miZjfEcPVIkjmp2iEE9IgbxiZPXGMISqGtI1ROe7WQZI4rRAl
+wYIGYRKo5Tixy58ghxEgPwTgCj0STSzxOp0vAikg7LKToguf/TxClgBn7JjoVzJLrn8tLHLOEolo0Tcl
+CbMSkV2b54SiiU8CcOIkjuZo6l+SEE3jKF1AfcnyOWUsXfQbDvxx+Rn5SekeBP6JQv5rArVwdMUGcswY
+FlLQYRocVx8C/3jtOHT4HLjeQkQL/FZEPRdsK+++4RsN5q/KmRHfzFQkdBZHVwk6hf3DFAdvc9eeXHtk
+wYMMiZiFQ/R6mLv6kseDuyTjyGpnAWEuI3icRfZnCKxT7aY0xB7BvoJgkJfwIIMikF8THEh5yGYFs0aY
+FGuPoTaXNKBy1r+A9Zk7rOC3BAA71aceVBsCa+caLgdrI2B3HEl9ETAuBB1roS8ufCqJ84zGKdGhei0z
+rgWkWWaeWlq0dVcbDQq32cuWlr7bqGgN5gH08jXUhr6OPAChHrleAHrCpMoQeIg+rT13trqL8Gf077CH
+ftSsGkFheYWTIYKHbGWQCeqqiHyhkc9c9ACKro8JmBmaD2akHU3OuzpikfDZxFI5gjFxu+MTFQuEG5W3
+nb3cpxnSOcwStLcaVXdyYzJOPWCR0NwSd/GUpznPHJstPMVDHYnnG2YFTNXknzgOoapLnF4aejPifSXj
+Xl+Se3hyT0c26ITZKMp01Hw5kc9ZfoUEkFzBFx+FAB3BtiMN9C1PAzTtidogzi0mExITtoHwcBhGsL8l
+6O//+PBho2dAHSE8zklf0p0tGpquK228UaKilwxuUHOnupv4XbRh8U117ocuvAiW8hj7UMkfZcyY7r+x
+P7SFTinK+SGioSxn1wRKGUc7ZUQxGhqPsZ2+pmRhSuyCihQUTBxBWTM9HyMrp6zHhhAaPopLNWdklNYg
+xc5pzF6JgDfmmDq90zDbInGbh+hPsLgWKzj75Pa2shBsGZ3UV+PxzZiS5jKJ832lJS4jliElT8oV3kU4
+WhqaqKwzNrkBzIqj0P8v1DOW44h8Urj8TYw1ZVqJLS7pXZmbCzKZPson5pEyZFSc7xrSjV35cxePx9nM
+ACuiBFaqirv7r5NfzrZ4SlU3nd7gp729Fy/39rZf7r7cPtjfH7wY7Pf6WjoUl9n8Uj7/bdTSPil0xKt5
+GWVa75ZiXFlJVfXVWqFNcDLncDZxVLTrCO7kN2rfkU5FOtk/rUBOOIVZN76pUdOgTSa4C1RrKLG4HhCg
+GSbf3s7B3sGLlzsH+x9qkEw1ed0gZnzbvRp+6duqO97b6XBZc0jYeLqs4AXzfuxetoi1PrEdT3blm2LP
+qO797mSd625xEzoTvi9uhsVN8E/bxa04mO5gcZOiZlrcBII7WtyaSCyuh7247ewvW9UkWztY1fR2oVUx
+KzuT+p1hltDo9B2zDJgl+KctZhWvsTrALClqJswSCO4Is5pILK7HjlmSrR1gltx9KNC1wCwwvfaM+b46
+FrWT7TtuYZTk6wWxdHYN9NrZ9RayNfIY53WDiKE8cQwvOxiu2duRHCZKP0uXu1wnfoiD2oZt3v3EWpQI
+M8tGVfVzCwapSdV58KaEq8s1JWM2c+MJ9hQQFBzYsUIZLsovRAQn5ZHIQtCg/V0fZG9j12kfTE/6/anW
+sjtdV3RZn3qzEcX7SX3M997x5b3jor9qwK9++dPacUuEX6EltxrbtC1XGHGL1lyFy5racyVrGrXoSiMa
+tekWV3LlU2+WtezKa2sCZadlx+Gx/t7tof6g1EPJJOELbi6ZL+gNpJS9NowJ/mp5xiUPLJLZlc15YO+e
+hDS++ePOZVJkgBRUwpxyTqjTd30YhSlLCzcEn1jD0SSmf1g3J7BxDQiNQpbQfLb9jdw4fdixSm/rcje2
+y/cxmeA0oKjFPJMRWwv/kq2PVBu9ObskceyPiVZTtmlZY1dd25qiQRPxDbraRKmGqqylwIfX+CbZV1fk
+PVBLV+2N0+xeVju2tL9x+5ySYGoBuhaxhg47RazYZWcX26Djrl69x9yIx65WzXjs6rIhT4mTENFWjXk5
+mybhYwfXM1gT3kdjwzY8q5cYDVT0c1Y07A4UddlDiApbio6Q+rB8kA3fLG78iBxHLeQLl79G21pznVup
+qLqrVkRV7yvciwcrMzZsC1QRGsmthFl2DyahRtJbuDDfZOgu5A9uwTjfi+iM+YMVGctFj8xbmkF17Pmc
+y5i2n1PF6x3ynxQH4mvy/Dti0eiLEYZYzcY0Nj0X1DK8jjG8ewEmtTCWMzO9czJwA7ThkAoQscEVdKs7
+t2Rfc6oZ0Vn2zbS673SCMiokaa2TtZ7g3mKS1LMF2/u/BjYa7PyGSMC++DpxNhRwy/PEpMNtnSv1WzX1
+QknfnQNK/JVtL26vx+wajF7iAH1kh67Q1wnFKRrB+tyzZFVp4CYzh47dZV7hDG4zEq5rUinr4tJJldF3
+OqmyFVmbVPz2usxWVu2lZmf0nZqd1Qua2fz2Osw21xS1lktDOjNePr4T7ZdOdm7pAnPhsfo+lnd0IBpl
+f+jbDpW0fCtQ9hOw7ZeNyulZXoF+0vZaRaU28eOE6p0uS8uKurgycs7XGvVCqjXsWZwto8smiQXbSDu9
+LaSZx5not9SRslFHRjbKGKVKUQfUViG/E6cV9jTzV1nZNHJVu/rjMTlNs6yh+/QaqLEj21coj82hRgtb
+ONZcJTWc1MurmsfkztyexpM6q6waump5JfS4XMXtaeyqrBpr4Cq7A+qMtxvewGhFC3WEWEzp9irUUk3G
+uxIT6xGTMvSHzz/03aou0ostfgIFP/4PUEsHCP1tE9T2CgAAAVcAAFBLAQIUABQACAgIAAAAIQD9bRPU
+9goAAAFXAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAAAsCwAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetMeterFeaturesOutputBuilder.java-0f549cda-feee-3174-a5a7-7d0789a95626--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/GetAllNodeConnectorsStatisticsOutputBuilder.java-6b53e46d-b6f2-3ce8-aa6a-42d2d7a8f973
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/GetAllNodeConnectorsStatisticsOutputBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/GetAllNodeConnectorsStatisticsOutputBuilder.java-6b53e46d-b6f2-3ce8-aa6a-42d2d7a8f973--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/OpendaylightPortStatisticsListener.java-254162fc-4af8-3849-b4db-2d314a44a36f
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/OpendaylightPortStatisticsListener.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStUMtqAzEMvC/sP/iY7MFhm5zaY6/N
+A0I/wLEVV3QjGVu7JJT+e+wsbVMoaQ+VwEae8cygYOyr8aA4es0ByJlTh/5F9MmQ1x5ID63uI30HA0fR
+SYxgErRJRxjaeXvXLh7qCg8F/S9BvWIHj0wEVjhuPxnPwRmBX+yEuUuj8Q7JYb5XLLhHm2WYnrIUEMSs
+UnrWNHWlGrVk13egyBzg/vJQan2lvcmGX0k+VAp1Vleh33VoFZJA3BsLf/uZC455cGkcfopZV29j0NKF
+NDA6xXRzQ5ObqKIrn+llD+/lOANQSwcIwnrDn94AAAAWAgAAUEsBAhQAFAAICAgAAAAhAMJ6w5/eAAAA
+FgIAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAABQBAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/OpendaylightPortStatisticsListener.java-254162fc-4af8-3849-b4db-2d314a44a36f--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/AggregateFlowStatisticsDataBuilder.java-066b9bf5-fca5-373e-a9d2-6a18d2b2b735
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/AggregateFlowStatisticsDataBuilder.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS9V01P20AQvVfqfxhyqRMqA+LS8lVa
+2kqcOCD1QlG1sdfO0o3X3V2Hoor/3hnbiR3b68SiaZAw8c7H2zdvdoeUBT9ZzEHp2FcpT0L2JEU8s/4T
+S2I/5om/OPIznawvRlI9+sYyK4wVgfE1XxwdH747en/6+pWYp0rb7oBWKWmK0FORhAKfn5llN9MHHtgN
+vsPB+CyONY+Z5S2bj8uVr7hwu3qPEOgnzaZSBBBIZgw4TAn3p0zIkGv4Q06An1SLBVq6fOAH682bhyhy
+b87qjSkvuTxD8Rwa4F/R7Not0/EKI33sTBjfRQGckz1mt45w3vi03O5wqnpMYMoMHwSTHAbhPJhMyuiT
+W24hElyGBiKt5hCLBU8g1ipLsRmIgWzOE+vDNyZFuPoOwoBIkPwkwFaNQCX5I1ISU5OjfUq5OVlmgbNM
+XlRfpLjYcanPDjBHlfCgln719jJlms1pS9V+Vd74lYmdafVo4FpKTCI/lrv/8jvgqRUqARGVjNWJSUo2
+FjllORNFxMnBmk4WCpcL8r8i91518rSUOsVzijPMZ/I6IBCse8Sk4aeVEYLxaDfLwlBddkvzGsZtpOrt
+usfHxNw2zbAirc6o1Vmd0Od1bvcq246No1Ag4Y9OrXjrDgAj/jvFWvOw7J4TuNsxOffwPRnBfgvINLPw
+yMwJ4CJJb91g3GZkyxMP+upQZ1Bzi7vru40GZK1fhMYNwIUZuzYbdv7mHqet3ZDbcOQwJeid9JC6ejyv
+56n0KGn7XiqngFwrAR45CZObhwmKBzgASU467jWtBo7aJh/YgvmSBHxFqc52LG7CcUGKu15C5uE1/tIR
+C7jXatiS0/8Ays+ZXm+iGlllbYqivGBOqwfbpJItOqc1hWzTCdtOIi0WLm8WXGsR8paKXnq0bH+8DAAl
+8KKfMTO7UmGHtIpSkg3WY86Rl+Oj5q2Di5qbTFpcbS6uFgr3yfLFPl6fbvLPIcmkHMMHOIQT5179Cnbz
+JixZKpIN52Q5ovBfGc4lXtX95UiDo1WLKbpVSVOEvmu9BqtxNZfAmsEwSMWEO1hzcnJEQ43lRxeWeC8H
+6FdvXhh+07mr7AybEAemDYZjgtUUF0LfrJMO+DmDlNjd43s97hsY6GDhGTjaYV5vzynYUk/9uF5ajm6R
+1Yy26YBK8rdW5/8EqeKP9hHRNF2duuXzPL/sXVbeqO8uvhs1O3vZmpHQxrbH3AHq6Ss/OeYZnOJY5neq
+o5CDw7vkxmcpXcne6C20NpoHab9qerq2d94ZsOHtlGDTtVtijWhv7t+M/UonjlEbf/0FUEsHCGGKhQTN
+AwAAGBMAAFBLAQIUABQACAgIAAAAIQBhioUEzQMAABgTAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVu
+dFBLBQYAAAAAAQABADYAAAADBAAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/AggregateFlowStatisticsDataBuilder.java-066b9bf5-fca5-373e-a9d2-6a18d2b2b735--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupFeaturesOutputBuilder.java-e640fae5-1c22-3f25-9e10-6a1a37143fc3
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupFeaturesOutputBuilder.java
+
+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
+ZW50UEsFBgAAAAABAAEANgAAAOEJAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupFeaturesOutputBuilder.java-e640fae5-1c22-3f25-9e10-6a1a37143fc3--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/FlowStatisticsDataBuilder.java-62018ca7-1778-3063-9ad9-f90089f34e89
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/FlowStatisticsDataBuilder.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS1VkuP0zAQviPxH2Z7IS0oy4oL7Is3
+0p72sBIXQMhNnNTgxsF2uqzQ/ndmkrRJbKftCtqVmk3n/c03Hpcs+clyDkrnsSp5kbI7KfKFje9Ykcc5
+L+LVSVzpYijMpLqNjWVWGCsSE2u+Onnx/OXJq7PHj8SyVNqGHVqlpGlcz0WRCnx+YJZdz3/wxO6wfXgy
+nuQTvt9sXjEe/ZXVXIoEEsmMgaEG5fauEjLlGv6QLuCn1GLFLHdU4XsWcl4bNAFGXUdTck6a99A897T7
+XzA5lTCdbzKij10IEzvlwQWpYSw7NI6mZ20pe1fvS2DODN8nBdLbJ4fj2az1NbvhFjLBZWog02oJuVjx
+AnKtqhLZSEVVS17YGD4zKdLNOwgDokD0igRnJQNV1I9MSQxNhvau5OZ0HQXOK3nZvUhxeZhenR+j6y7O
+cS/q5tc3JdNsSZV0Zap64DoVu9Dq1sCVlDxn8m1b9MffCS+tUAWIrAWqj0fRgrCqkaoBaDzOjgetXykU
+N5h/QsijbuI9qs3xfOAM45kafkwEu5wxafhZp4TJRFTNuh/UjoOgO0htCw2jA03ilODZwu8NIH20rK76
+YN0PcTvqdAPVIQmg4LejPIiGBgAT/rvEPvK0HYhT+HIYKL7B12ICT73488rCLTOngEJi01Bh6gOx/VyC
+ANh9mDS3WELgrN/tur9LjBfFSQNHqtrrBKwVz7wESXvvrGBOaQULJTL4BlfLUkYUwj/s291YdzTBoS+Y
+HN2s5AZw40tOJAtpdEu3V8APtmKxJFK9J8fnhyEchb8kOlytE+TpFX7pjCU88manxetwucQ1ikM+96Bp
+cW8A3/tm0jcdafM4ib0lvYWmOxa1V8+b6xXXWqTc6/7D5nXnzD4gssCtt2Bm8V6lAQI0yJMOArrkWPOL
+E/eYRqHmppIWpa5wI2jMZ+sfnuJ28fC8gKKScgqv4TmcupXFXZLuomihaFw/HIH1dua/KlzJUTeI7TbH
+W4WHCy0dIgUlHZL30nI2V5uY6wyddACMO3MvDSPekD/1KYINPaoTjLtf/tH9yIGn7AKHBy8NYfmUknCJ
+g4mOciCQYw0ThfEm8WiL1Y7qAhXeA0c9DBcduRxsKRLM4l+BDdOlp7QPlzvy3lhdX+BV848/2q7q5gBs
+nxf1mhzTiiaBvfZl4o7merYyoY31r3G7CbGttaRfOx5t/DrsaOebVo9Yt0jErKT1Fk2egVdf7cT/ybV0
+qroI+nGMXHq5FmH6OE6efHsyjTsOjFwc8esvUEsHCLR8Fhe1AwAAMREAAFBLAQIUABQACAgIAAAAIQC0
+fBYXtQMAADERAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAADrAwAAAAA=
+
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/FlowStatisticsDataBuilder.java-62018ca7-1778-3063-9ad9-f90089f34e89--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAggregateFlowStatisticsFromFlowTableForGivenMatchInputBuilder.java-b3a927c1-38e3-3c54-a5e6-8207d0276f52
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAggregateFlowStatisticsFromFlowTableForGivenMatchInputBuilder.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTtHWtv3Dbye4H+B8bAoevUVuw8G8dO
+m+SS1LikKepcD7heYci73LUarbQnaZ26h/z341N8S5SWsncNq0Adk8N5kZzhjKjxIh5/imcQ5MUsyhcw
+m8SXaTI7r6LLOJtFM5hFF/vRssjUzmmaf47KKq6SskrGZVTAi/0He9/tP3329VfJfJEXVR+E1eUCMlz7
+e/cfR29Q4/t88iaNZ6VAPM7n0SzPZymM0D/neYZ+pCkcV9EviALsy0GSXcCsyotLIUz0Uz6Bv8CpQPlH
+fBFHyypJo1eUZpJnpa37fbwIqgrS+D6uxuc2aj/G5blC0a2j4/l8WcVnKXyHpk7DNY+r8+hlMjvOKjiD
+RYsAVZ6nJRXlLMkmCfr597iKP5z9geiEF/44K6ti6da4Kk+g1fcqzz8lbUvKoogXy9kcraYYc4tG4//u
+3b379VfgLkALeplCkMVzeEAa8CPj3MXc7IrNRYBOxudwHoMFmiEx6rcRkuRAHnuAxx6Isd8jcZISMXF0
+f2//we7ed7v7T7dnsNqNZ7MCzuIK6tR2p0U+p41kmexO82J3lqC9sTvHy+/eaqOTbLGsfscS3Pv6q8Xy
+LE3GYJzGZQnewuoFR4tVf1IjfYNw4paPGOObvHiL8ZG9cIyxvVwm6QQW4H9Yy1gtiyK5QEgAAQGnc7Zr
+5C55MYHTRF1aMiBZXyme2pOqQDMLTsc5mtckg8VPaAY1aLFkMBz++T4uP2lARFtjgNfrIbFYh2LLPX8u
+DzwtmEGzc/Qux/ycLadTWBxPOlLhw6w0BCg4zZfVz2jpd0TPRnlJgGDfFvly0Z0EGWalIbsOcDplHqR5
+ZvGytUyqAHyJNjqMM7pg4jT98XM76FlcFAmxpS2AaAkmY13NAq6eD9SVF0l12VFbfFjLjNRkkkkKPyZz
+iLTckZI00pfYeVxM+hGTRjrXgboje+3GFkFOzrFzOCUmr/NOZKOsJNgBBJxm6B/PTAO3OBRMvMJm9PB7
+AP+skEMogeyDDgMd76LeVvr585214wjEEkPgCGTwM2BHqcPno22hb+qnVvVQo23sozDCL4D+DIs+0JkH
+xMWs5hQ/1XlSRtSNIiWhXoSzIuSJjlQw2ZcKaNnfWgYpPlWMeiU3W4dxTymP4W2WAdzpCfCXrMUCzFyY
+gP1AG+ygxBUpsKTFAkyckYAkLsoKRr2RDElbHFonDolBJ+Uxb7GpgfqkGvYl/d0CSZ1SDXhCfrXAce8i
+mP2ZtdiYFQ5CWiGi0TJEMvNiyI+i0bk49IVhAWT2V0B+pA016Jc13axvIdoayRgTe1GhmTlbVrB07N7b
+CRp2glzZA2zCkEPGPtw+MdixC8nwEFmssCL1RgDO4hI2+ATc3cEpcPCOXoEP6+QWxCA/v8DhvRwDB/by
+DBJwm2vgoB6+QYB6OQcC7usdGLCHe2CQPv6BM+xtf+rV0sEA8TGeFkhdJI0miIPqNsjY0RxQ2dL4SaZg
+hDsBmZdsDPNp/619PF+kysbEz0rYUACH/38E+psLyhSW8ZnKGFFQ46GbEFdAZNV90Qwjzanh5+4JrMA0
+gSkKfHAOCpCkE5jhjYaDe2RflxhlBH6N02RS/w6Ssp4HgCYiz8iPaZ4i8fBA4nQPOBVwuEyfi1/S5PlQ
+fvzwHkK+AqV2h7QqBWcAoSG+J6msbv1hERfxHE+DmKOcZI4FSHVe5J9LcJymaAmmL9iMvf5zDBdk7aCN
+RGdZnsyMzeAFmWbCHsWIE474J3OmFznqpgsGr+aRSF0bjvqMpWiSkqwdxAhattM4VZY33tVYGmlTD7U0
+jP1u2NjRYMfLbawcp/l2mfAr4MflHVwe4gpYcjkfwVLtgK6AG4tvE4wI/3YFnNhcJ9lC8v5CB0NoWv4g
+O63dNDp2GPPsXVXkQY+rxjgsXKVenAbdoQ5++g+yZAgdrgYzjpAsixpLhCfujErkfatGJuGZcMc4uvVg
+cc4QLFgjJkFfiprCU7fGX4K2iMHCk7ZFcwplHtENQtqMDQVtHh+GJ2xGmjLVOtocgrAlblV3O49dAxN3
+RcHSAq8j4eCkbTG1IFzH1cHpWiJ0/HRwMXcErMUvoBM7iehch/aROgCALfjnAh264YSFXgfgt6EOIDvB
+zwldMTqn53fwn2wLfGsoB/ENPsflAUCdOC5RAZpCYxbm0DsQwqXKM1bACnGoXpCwpVKVyxKGg7RhtFyo
+sCE2XsGbjs+G3XYDw4ZeeveruTM7Vu2+RjPH5OqC4qdsSLXLGTaU0l0L2ffYsKlXMfz4Ex7FgVG+euHS
+Yn2TQngKGzb5moXvfAv7b8eoXMloRvqyjtMlw+5anvL1DV+0tdG2TrVy0cMXJbfHNozKjZBmhNIKEoG5
+Dad2e8QbqxJeW3Vq3Bfxxq3EyTbc5vUQ3+3etNX9Fiq52SEHrTaE6sUPG0Z+kaOO8Wxo2CUPA8cPJ8vF
+ooBl+a+4yNC+KUdby2x8Dsef4GRrW6Fz+Hpt73+A11h6mauRfnnltXol4yPylIqiSIirAYCjI5AtUzML
+7nEY2ZK5AQRbAZHBhjgbPI6zLK/AGQQ//fPduztbFm8rTd7o9bbCOz7bGrwO9WYPlNzBU39/EafLpvd1
+pP+ZIQMGGvCVKuZSOTsoBwsXz1q8f32sqycTw5e5+NdzBdcpQH0CkmylyTfeZaQV3HFsLfl+KJIPTRCS
+sOLC4aX/K/6HEWZomXRyG86SS8fPNC/AyLguBwpwYN6QHW0bHHI5iojpvxxJnNrhyRiVMy0U4s8XtUn7
+VY6SCCIrNQ/zRFdWhFSBNu5o6zijLzWIzAfgbyig4cET/i3a2qH63zE1tK3PxBerLbPklbyXK1uoXW83
+j4ylZ4A4LXx5ibxgkWfJXyh87P+6km2RiNxDd64kf7b4o3xqETEqNqWcsT16pA054/cGLUsQP6w/iicT
+ulWQCHkJJyOBPfr3618+7JBlJhpHW/vfPXz4+MnDh3tPHjzZe/ro0f7j/Udb28Yq4Y9F9po4+Wll0b1L
+TPfpuvU+lC2swzYtYgpqDaVpIBg+TCmmgcyieqX/1ijqRlHVTyeTKKW6QxtEfdYMc6gCrIkx9GSKP2tk
+Ci2b8uH9pw+fPn5y/+mjdw02UBc5tAW0fpEzlP3jeSbJdoU/CA5j5pRPi26tnG7lFPV0MnLinVpoG6dN
+mWHilP41sXB+PPFnjQzcqmc9TfDQZs72ZeCAVo4mv2/QKU/97PHW/lnsn6SfrgaQv9ofwAIqs2YzgRLA
++thAH6b4s0ZGsPcpTxd5APNnfrU8lP2j7+qUN3iuNCW/WnJ96cn6TaB3alW6mHK9GW36rtF8v9eU0+a3
+Wq6Pc/46059vcSHm+rhmb0z9ma4v01wfz/U7WfP95yYfRdSaArdHEf0oouqn01FEuswf+iiiz5pxFFEB
+1uQo4skUf9b7KPL40aMHjacQXdrQpxBrNZDBPKR0d+RmGUCj1MmtDdRtoKGiTmZQ/YwotCW0TJ9hDA2Y
+NbGH/nzxZ8NNokXg0FbRVbloKMMoX3y7WYbRKMt0axh1w2ioqJNhVD9mDG0YLdNnGEYDZk0Moz9f/Nlw
+w2gROLRhdFVZG/am2o24pXZr/ppuqPW+nTbYzbSWW2lrZeq8WOLPGlm5MLfRhr2JdiV2jn9UoH9vsMlH
+P6Wc5a3d0+2eop5Ohk/UaAht+bQpM0yf0r8mts+PJ/6skfGzbMf7jxoPeJqooe2drf7sUAaPfPvEv4Vy
+vbBhZTau6XUNmsHGb5TWt8Cu8e3U2lXcVTg0Z175fgrBG99P7QBXZTDr4gizMADbZ5Yv9rCPWKlK2ggz
+bH4VplaOniZZnK5aJZ+UdsPF1SDW3wqIRJ19Sbn6JlmDpYY/WuXiwgk2ucU0HmvuTZrLa2eZerxniq2W
+FM3WBF0Mlj9tYAK1/pEDc4jfnzswx0mRuvkhfRMZ698wMAe4/yBBO3LtG3c78/a/FeCjIO0T9aYhzr8f
+4DVI/cDca4jyBXnTCNdfF/AaY3767TXM/KrbZ135zIytGr85wF5bX4a7ra9/NfX1ZZ2v5k5XPv0ZhY7x
+41vsWMB2LXgsRnYveiyP9S98LEb5Fj8WI/wKICvwXkWQxYj2QsgyrF8xZHV2vAoiS0ryKYoswD0KIwtg
+3+LIkgCdCiSLcd2KJOsLq7lQsoD2K5Ys4NsKJvOn/JzgHUiKJ6uxQpn85Uo1jXGl5b0Ds6Omrxkp6Q+7
+RXC+qC6RtXKH/QWMPzn6COV9B2X88KPcInqdVcXlratZxdXUK0hZGBAr9gSidR0lKACIqxzt2ChDenVO
+qc+6uJ2qFTgq0bE5hVWe4Y1Fdvw/IDJ0O0B+Jbf9jE1Ft303gdN4mVagw35XDyXGEmpJrykx2g8fLiDy
+ChNoxMdNZdjwYyvFplHyIeNfqU0m6ogMO9LuWMxNZsAVY3bkwK/em0rYEqr2lru5JJxM1xLvdqTqUTVO
+JmjGzCtLaS8spxHVA+8eM9pSe04mqIfuAVawvTydStSI/3vTba1gJxO2JRECULYWuZPpmnmIAFRtdfBk
+okYmozfN1lJ5MllLOiQEYWc1PZm2Pa0Sgryz4J5M3p6eCWCS28xxkA3cWLZPpmlmiToSbazsJ1OSqvu5
+yXhU+mtm52YXAMRPpyKA+BmyEKA2k9J8dyoIyND4TDC+1HGOzquvrIuNxpQYBpkukhN5sK+xizvREsPH
+5COgd9YddPhd3vAtGI14Boyr+nuwhy98kNZIsKSrpxGlmijTMMudfQlo+TSNgtLbn4RIuxn4eVdf5CI7
+p6HmHX0R10k8DS9rXwEty/WZeElHX8QsJahhJa39UfLMoYGVdqyyqlmC0bKkSU/v9cATkfpyoO190fKE
+pYaVNvdFKhKbGlre0Vu/cv5T17Do64teSZNq6KW+1eyFw1b0RVonXTWsrL0vWpqb1XDixp4I1eSLilfx
+lk3oiX+lSLv7T37NEf53GaeldAJhf/0rP/vDeuTAuSPMsa1fYstyL9FyCREhaTyyMGS2u5cWbPhojY9P
+6DhwhzAYiZYV0a923ySvzumfz1jxTwkikfRDDL4DqJ1HLIISXWMm+Os71+1ZD81YtPMFwBT/Icfp6A47
+BrFVJdNcdQro537Wc1KzxMqY4QRXTmmq/HJXEDU4TnPNelAHDacI9TCpakLpC6QK89TZpod6xJBKqE+8
+ugZ4RxDxzXNxs/A1/HCi1ydyVXDeHERs49TeLDUHH05oHi6oMrPWUCJrEUWrzBR+UKFpLGNITZqDiK3F
+O80yU+DhBKZhliotaQskqh6HtUnL4IcUmEWAusy0OZhP16LEdodOBwzrzWmAarpy0h7GeutRbIvxZuAD
+2m4WPmumm7YGEVmPsJslZtDDCcwie1Ve2hhEXDP2bxa4hh9O5DrroArNm8PsaVtmomVXS0MG3NdSWkTb
+2aIniAqs2ZNmFchDhlOBnLpRVSD1BDybdzuXD34mt57Hg4hr5J6a5eXgwwnMk16qxKw1iMhqXqxZXgI7
+nLAkG6dKiptCiGnP1jVKqwwZTGj1kp8su3J3a0UV2FN6q94qqXL6D/PlnQ5aX0qvP0rFLzFdUKOt/t90
+/Wa81ORp0mlSlJX5vbVlS7Qn2DAYwedcEJyac0XQJeAYXX+Eu8DvskdbO8AQiyAxm/SRVJgj63ANliX5
+dMDWJN4NUZQsk5++lKSgj9r883cbpDdFKD/FqTlEP815Zfw2Sm1cIl+d1VlHH4V5ZQk3SF1cHj9l1ZlK
+H1X5pBY3SFNMHD9F8fSmp57a05GbpSgij7emaErUR1XtWcwN0hMRxk9JNJPqpyGPzOdGKYnK46snln31
+PWy1J0s3SFe1QP7HLJqw9XJ8HhnWDdIVE8fT7bEsr4+ePPKyG6QmKo2fllhu2EdJXrncDVITl8dPUXU+
+2ctKeSZ/N0hbkkielkpKQPvozDdbvEE6k0Ty05mcsfaPBG+Kuqg0XSJALyX5JKY3SEtMHD818eS4j55a
+E9obpCQsi5+GSFLdQz1uwZuEdgvsIazGhT5CzombsmrQSmqd1OArnXdwtaHf/P7NdiTS29IYxiC5oov+
+939QSwcIj1loB6wRAAB1sAAAUEsBAhQAFAAICAgAAAAhAI9ZaAesEQAAdbAAAAgAAAAAAAAAAAAAAAAA
+AAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAOIRAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAggregateFlowStatisticsFromFlowTableForGivenMatchInputBuilder.java-b3a927c1-38e3-3c54-a5e6-8207d0276f52--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAggregateFlowStatisticsFromFlowTableForAllFlowsInput.java-dcf318e3-45b5-39f1-8323-22565a04d967
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAggregateFlowStatisticsFromFlowTableForAllFlowsInput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU1FP2zAQfq/U/2D1qa2I24A0QTs2
+VRtFPMC0sbdpD65zcQ2OHTmXQjXtv+/shKVMQx0wR0ris7/P3919LoW8FQqY84q7EmwmtkarNfKtsIor
+sHyT8trbx4u5cXe8QoG6Qi0r7mGTHk2P05N5v6eL0nn8OyE6Z6qGWrqicJZ/vhIF/DtqpW2m6ftRoPi0
+ugGJe7BPpqDtBiw6v+3E8yuXwQdnEe7xC+TPV7WoVUGkYmX2pfSkrAjmuC2hrWo6PXzDv4boRUak4ZmM
+x/0eG7NLl9UGmKUKzmIgjF22JPQp6foUN13LNRSClQLXHerbkJTMdrGzgJ112PekRlfa2dPDaXqUTI+T
+9GSkABOhlAclEP48Lcm9K5pgzCrJnU+EMTFUTV6D1bas8XtQP+n3ynpltGSa+uZzIYGdAy4eiJe0//o3
+7ZJYQyTWc+n8wpgwrS4CH9HRoN5TEapm8tgQB02w814b2Gn72/90j/gLc3jX7/1oTNJIa2sTj5As11YY
+Fq8cvReXZ+z0WfeUSw+kZzjYZ5bBwaBzCU1ivwaj+fxBV2toRiZof4ejuPgzvH4BUEsHCAf8EjWuAQAA
+lQQAAFBLAQIUABQACAgIAAAAIQAH/BI1rgEAAJUEAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBL
+BQYAAAAAAQABADYAAADkAQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAggregateFlowStatisticsFromFlowTableForAllFlowsInput.java-dcf318e3-45b5-39f1-8323-22565a04d967--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/GenericTableStatistics.java-2295f843-39a7-3243-aa56-967129a3d763
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/GenericTableStatistics.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS9U8tu2zAQvAvQPxA+2UZFPxMgMoIi
+6OtS94G0pyIHmlpLbCiSIFdOjKL/3hWtRA7QIO6lFECJ3OHs7HDlhLwVJTDrS24dmELstSor5HthSl6C
+4bsZb7x5GqxtAZoHFKgCKhk47h0E7mE3W0wv5merNFG1sx7/zovW6nDIIG1dW8O/fhI1vHDqWI0C3HIn
+vKgDv681Nx1d3I9fvaIpKVryN7YxCH4xP13bRplC0futQPF58xMk/g+F50vK0j6T8ThN2Jh9AANeSVZ6
+2zjSwyqrW12s7AL9PTAPWiAUDC0LdwplxVBsNESetS0aDcyQ03ncaMdxDVlPlEVxEXUtK6gFcwKr/tiP
+IdWYHx/OY0/kPUUeKV5TfSooay7n09kim15k87NRJzyL2o6yTp4L3LSJJ2nimo2mglXr01ZIePDmW4u/
+foQTmgbcI8nrFv0dpsmvg7+HQEcZc0m2VUZoFruR5qv1O3b5Ty3MpQe6gOHgRHsGrwa9L7R4zoDBaLV6
+UPzYydQAeCVR7eC9tndhOFodAE9g58sW9oV+c8Dw0dpbKL67E6BrQd0DRUSmye92+gNQSwcI1hWYprAB
+AAAsBAAAUEsBAhQAFAAICAgAAAAhANYVmKawAQAALAQAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50
+UEsFBgAAAAABAAEANgAAAOYBAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/GenericTableStatistics.java-2295f843-39a7-3243-aa56-967129a3d763--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/MeterFeaturesUpdated.java-b7d73458-c065-3b70-a452-d76972c054b6
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/MeterFeaturesUpdated.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU01v2zAMvQfIfxByaoNGiZtLm7Yr
+gm69JcW+TsMOjEw7amVJkOl0xtD/Xvojc4plKBJMNmRL5CMJvkcP6glSFC6k0nm0MZRGp2uSJdhUpmjl
+JpJFsG+NGRIGmROQzkmrXAbcRNOI11W/pzPvAh0VkUqPbbDJZXQhF9XtPQIVAfMv6E15bHxtN2jJhbKN
+fhFdyqWL8dh4iXHPkgLYHBRpZ7cdmEzlojCkPQT61pnnzxDey0XOmbzJqlyWcczPS8gOQK20jTV/PwLB
+w+oRFR2OvVtrEz8khwPnRZpxh2Fljqh46UgnWkHVKkZXz3g47PfEUCxcXBgUljsxqy+qtRtzVEtn1Imx
+9vqq1piB8EDrDvbjhHmc7YJnNXjWgW+ZR51zGTfnk2g6iiJ+T5sMSavDUeFjIIzH+69/VunG/Z4vVkYr
+oS07JaBQvBHz98aZfXnhL+KS8ubQMnDdsfjhrLHstPj6f82r3FfVNuE/lby1/zWeraGarD+/HbX93u+G
+3MbUdqguS4lEWzCiljzv88UncXPQnEgVuBI8GbzL8eBs0JHLh/08Dk6vWim+VNsrUEsHCGS8Nk2uAQAA
+KQUAAFBLAQIUABQACAgIAAAAIQBkvDZNrgEAACkFAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBL
+BQYAAAAAAQABADYAAADkAQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/MeterFeaturesUpdated.java-b7d73458-c065-3b70-a452-d76972c054b6--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/FlowTableAndStatisticsMap.java-1099abc8-87d7-381d-a1db-cd44a6616fa4
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/FlowTableAndStatisticsMap.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStUtFKwzAUfS/0H0KftmEzu7GXzikD
+9ckpMt/Eh9v0rstMk9Km0yH+u0mqtoIbE0wgIbk559x7bgpgz5AhUWVGVYEyhZ3g2VrTHciMZijpNqJ1
+KX8GV0K9UA2JQFpp0LzSnFW0xG00jkbRZOp7PC9UqX+n1UqJqhFgKs+VpPe3kOPxqITLlJv9EjTcJRtk
+usVuYAu01lzQG5OWubdzOBj4HhmQhUprgUQatdhd2NFVCm1loassbCtzT5dsjTmQAvS6xT72jDdxlyG2
+DLFjiFuGC+MNr7iSs9FpNA6jURhN+h0tkGlHL8yhGB6MPtkMhr5X1IngjHCpsVwBQ3JtUA8WNJfp8huy
+gMIAzMBXbVKtmkNrn++9NUY1gU9WJ8nIiksQxLXIrPPFFZn9qa+UlQgae8FxVgUnQeuRORz0IehPp19Z
+236f/es/7saNdveN0aZ7vT4nGeq90V7fpfxulw9QSwcITvoQL18BAAB/AwAAUEsBAhQAFAAICAgAAAAh
+AE76EC9fAQAAfwMAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAJUBAAAA
+AA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/FlowTableAndStatisticsMap.java-1099abc8-87d7-381d-a1db-cd44a6616fa4--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/FlowCapableNodeConnectorQueueStatisticsData.java-622e1428-03ea-3d69-a2e3-4769ff6abc72
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/FlowCapableNodeConnectorQueueStatisticsData.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSdkN1KAzEQhe8X9h32AWRwWxREEaTS
+S0V8gtnsNEbTSUwm1UV8d5NG/AHBthlISIZzvpPxqJ5QU+eCBueJR5ys0Q8CE7IGTQybHlLg383nRIkg
+CoqJYlSEQJt+3s/60/O2MWvvgvztKM7ZWL0Hw6PJ5zUK3g6PpOQf7QFpYGndywI9DpZu3EgLx5xBLtwV
+yf2X4lDyKtuDTJ4iFHUFH5/NTmqmCFvO/jO5SnpNXOI5zupSPg3WqM6wUFihom7Hr5Xxtk2XF71KJsd6
++Z76UX34ibzYelx+dnYEtc1bTVrrvWwfUEsHCOAr4hniAAAAXgIAAFBLAQIUABQACAgIAAAAIQDgK+IZ
+4gAAAF4CAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAAAYAQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/FlowCapableNodeConnectorQueueStatisticsData.java-622e1428-03ea-3d69-a2e3-4769ff6abc72--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/GenericQueueStatistics.java-19bd3ada-291b-354e-809c-818d4e3832d1
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/GenericQueueStatistics.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSdU01v1DAQvUfKf7D2tLtqvB/9kJpV
+hYBWnApU5VZxmHVms4bYDvakdIX470yctFkkClscyYnHb968eXZqUF+hROF8KV2NtoBdpcstyR3YUpZo
+5f1CNt7+vmlcgZUMBKQDaRUk7WoM0uP94nh+vjxdpYk2tfP0Z15yrgpdBeWMcVbevAeD/8j6bzXysvG8
+5+zhstbaFprfl0DwYf0FFb1AnEbayBo8mCAfTCVtTxrj8WsQOGeBJ/KtayyhPzvhKu0zm07TREzFO7To
+tRJDb8JtRPiuSW1FFANEoLZYiG8NNswZ065d0VQoLHuax0A79iVnA2EWtUTULRMZEDXQdki7G3NL+X5y
+Hv3OB4o8UrzidnRgly+W88VxNj/PlqeTsmsgi+r2qs6e2/jcFp6lSd2sK25ct7ZsQOGjFTct/vYJzmge
++EAsr18MR3bUB/rTT5MfnbtduK8QSyux0RYqEa8hz6+vr8TFi+6uVB6BcDw60K3R0WiwiRfP+TGarFaP
+ip9uiSiRPnmwwWgiLN7sCMN4supQf8d+5P8d6RB0aM/yynvnO3Sa/GynX1BLBwj+KTmLqQEAADEEAABQ
+SwECFAAUAAgICAAAACEA/ik5i6kBAAAxBAAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAA
+AAEAAQA2AAAA3wEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/GenericQueueStatistics.java-19bd3ada-291b-354e-809c-818d4e3832d1--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/OpendaylightQueueStatisticsListener.java-eb395836-0551-3216-8ca0-79c71e1458c7
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/OpendaylightQueueStatisticsListener.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSdkNtKAzEQhu8X9h1yWfciZS14oa/g
+gSI+QJpM4+B2JiaTxVL67k26KFUWFGcgYQ755p8EY9+MB8XRaw5AzuwH9K+i94a89kB67HWO9L34niGD
+TmIEk6BNOsLYr/rr/uaubXAXOMo8UZiHNLE3SA7L/ciCW7QFxXRfcEAQf6H8Q5de19LzV+UlOCNQ5lRf
+dl3bqE49sMsDKDI7uD0nqj1dDPgB+ZRbe5dtE/JmQKuQBOLWWPjj02LwUQKXpmDuQ9rmMEmtXptGRqeY
+ZrdazGYVXXCvzpsf63ECUEsHCGmigBzZAAAAAgIAAFBLAQIUABQACAgIAAAAIQBpooAc2QAAAAICAAAI
+AAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAAAPAQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/OpendaylightQueueStatisticsListener.java-eb395836-0551-3216-8ca0-79c71e1458c7--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/OpendaylightGroupStatisticsListener.java-4485f3f4-254a-362a-bfb2-255cf47efa56
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/OpendaylightGroupStatisticsListener.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS1ks1qwzAMx+8Bv4OPWQ4uYbf1OrbL
+Pg6lD+DaqieWSsZ2QsvYu89e2OiaHHJYJbCR/vJPAtlr864dSA5OsQey+tShe0vqpMkpB6SGVvWB/oou
+cO9VTDphTGiiCjC0t222tajw4DmkfyOqxyI9gE59gLj1View12pzD9FssnrtPptfZVmjxNzFseUOyWK+
+XzjhHk3mMD1lFhCETCm+ahpRyUY+s+07kKQPcPedKPZ6xr6Y5QdTalei8v2uQyOREoS9NrDwaTY45sDG
+MZgbVFQf46jFS9HAaCXT7BLq2aykM+7NesRMYRcfp55LLkRNllbPpyc4UX2W4wtQSwcIvNAgVPkAAABs
+AwAAUEsBAhQAFAAICAgAAAAhALzQIFT5AAAAbAMAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsF
+BgAAAAABAAEANgAAAC8BAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/OpendaylightGroupStatisticsListener.java-4485f3f4-254a-362a-bfb2-255cf47efa56--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/duration/DurationBuilder.java-230f79d9-9fea-3ee7-9e2c-5e9bf42717a3
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/duration/DurationBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/duration/DurationBuilder.java-230f79d9-9fea-3ee7-9e2c-5e9bf42717a3--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/MeterConfigStatsUpdated.java-c884f327-13e7-3505-a74f-b965bac1708b
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/MeterConfigStatsUpdated.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU99v0zAQfq/U/8Hq01atbkNftm4D
+VYPHdoLB08TD1XFSg2Nb9qUjQvzvu8Qp6YBqSsUlcmLfr8/33TkQ3yGXzPqcWydNCpVW+RZ5BSbnuTR8
+l/DSm5fKQqL0PCCgCqhE4F7uknlCcj0cqMJZjz0jKrOTBq2vYqjZZXLF1zaVp8bLtH3i6MEEEKis2SOc
+zfmq1KgcePzcqZdP4F/LhdbqELMKWxQU8+Maih5eG2VSRd/3gHC/+SYF9ve92yqd3mf9HZdlXlCFYaNP
+QLy2qDIloC7VqYzEnsHKybZdZlfJJV/Vp3fWZCp/oHYKn6TTFaWon+l4PBywMVvZtNSSGSr2ojmo5TD2
+pIk96fqxsXoQW1kAc4Dbzu3xjIAtDp0XjfOic35H6FSgm96+mSXzSZLQex4ziAZokyhMSpcCynR6XPW1
+TjsdDly50UowZcgwAyHZn7f+Eu3JnET+QEIX4qbl+6brmbcXUXNA6M3/mt6/6GiB7XP+k6297thYtfp6
+mn//du00HPyMbEdVW6oGnGCZMqBZM2a0Llcf2G2v2eTCS8J/NnqV9NHFqGObNsdJHZ1ft/35q16eAVBL
+BwgqQN9DuAEAAEEFAABQSwECFAAUAAgICAAAACEAKkDfQ7gBAABBBQAACAAAAAAAAAAAAAAAAAAAAAAA
+LmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAA7gEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/MeterConfigStatsUpdated.java-c884f327-13e7-3505-a74f-b965bac1708b--
+------=_contents/model-flow-statistics/.settings/org.eclipse.jdt.core.prefs-c7a3088f-7ff0-3997-934d-c56300706c18
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/.settings/org.eclipse.jdt.core.prefs
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSNjjEOwjAUQ3ckrvKlTky9A+IGaeJG
+HyX/R06A65OBzmWxPNh+RizaOqQROwiL6PIGu7qty/XizIJf5JmGRCem1KYFnCYhw2QEZox7CWN31nWR
+23mztqJh4v5JN/pWUGWub5oS7HGcXT+BppbPFrq/eLC+UEsHCOiKarVzAAAA8wAAAFBLAQIUABQACAgI
+AAAAIQDoimq1cwAAAPMAAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAACp
+AAAAAAA=
+------=_contents/model-flow-statistics/.settings/org.eclipse.jdt.core.prefs-c7a3088f-7ff0-3997-934d-c56300706c18--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GroupFeatures.java-ba9d7011-7d09-3645-a37d-ff02cfb00444
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GroupFeatures.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStUk1Lw0AQvQfyH5ac2mK3xt5Sigh+
+nKqIR/Ew3U63q8lu2EyKRfzvTjYpaUBQwUnYMDvz3ry3mxLUG2gUzmvpSrQbOORG70gewGqp0cp9Kmtv
+h0XtXV3KioBMRUZV0uM+naccizgyRek8fc9IzuVVy61cUTgrH++hwN+j1sZuDH+vgeBh/YqKGNs8s8kk
+jsRErNymzlFYZs3CRhOnjNMgftqLD11PaocFiBJo18OeR+w8OwVnAZz14Et2birj7PLiPJ1P05TfcTth
+i0C1x2o2TF8a+lkclfU6N0oYS+i3oFDcNW23XRc3ceA78ewu6S3H0Udrui10TEGUEltjIRfhWHm9Wt2I
+5Z/uQirPGnCU/Og9OUt605wMfSbjxeKo8L/+rq50HCEHRyY00mBjNA4CPpvlC1BLBwi+D6SpNAEAAOgC
+AABQSwECFAAUAAgICAAAACEAvg+kqTQBAADoAgAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUG
+AAAAAAEAAQA2AAAAagEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GroupFeatures.java-ba9d7011-7d09-3645-a37d-ff02cfb00444--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/queue/id/and/statistics/map/QueueIdAndStatisticsMap.java-d11fbfb1-3a63-30cd-a3fa-1e1af1c601a9
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/queue/id/and/statistics/map/QueueIdAndStatisticsMap.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS9VF1v0zAUfY+U/2D1qa0Wd+nExNpt
+qJoQqqCDMV4Q4sG1b1KLxA6OU4gQ/52bOCVZ1dKtmnAk5+Pek3N8fXwzxr+xGIg2MdUZKMHKRMYrS0um
+YhqDouuQFkY9DH4voACaW2ZlbiXPqYF1eBaOw/MmJAVlSnQzUpZNfU+mmTb2v7DRuyo2FzMl7v8GFix7
+C+WxQqRag7LalE7B6cvwgt5qATdaKeAYmIsDv7ZaJ7kj4TpNtaJ3tyyFYwVFif5BbZlB3lTC6boYv9is
+/vF6llIJifeblUzE++jpwLnA4shIsmVyaEE70LMiThH/CPDeaqS4FUnXBa4ybU3egAIjeV2a1hNIV12j
+4dD3yJAstCgSIAq3ZVJ/qEaXJ6hLHbQ8ddY9X0HKSMbsqoV96aPISRc8qcGTFvwK5clcanU1Pg3PgnAc
+hOcDxyBFgLbuEAVo69GRsa+VqJHvZcUykZxIZcFEjAPZc0wwHQf8tKg9dy+NMy6f7fTuob4+cXwdSzwf
+5xEdY6Nnt32aYNf9l/tbz7Xv/XJ+c7BmO2ohnERSsYTULQHn2eI1uXpSH6HcALPQ7x20Xe+k1/oNX/7h
+nN5gOt3IbRZGYrDNY38wdSE3b7XDKnHr0xbAHbtqDMlHsCg8Jx+MTJkpCdaL6Ih8xmWSdyiIfMIDvcke
+PVC0o9QVN95qPt/7XU1/AFBLBwhZQFWOBgIAAO4GAABQSwECFAAUAAgICAAAACEAWUBVjgYCAADuBgAA
+CAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAAPAIAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/queue/id/and/statistics/map/QueueIdAndStatisticsMap.java-d11fbfb1-3a63-30cd-a3fa-1e1af1c601a9--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/group/desc/GroupDescBuilder.java-f37c8d95-e89a-35b4-b2fe-5606904200ea
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/group/desc/GroupDescBuilder.java
+
+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
+zgkAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/group/desc/GroupDescBuilder.java-f37c8d95-e89a-35b4-b2fe-5606904200ea--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/FlowsStatisticsUpdate.java-0f082f43-d9e0-35c5-b870-6b324b213196
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/FlowsStatisticsUpdate.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU91v2jAQf0fif7B4AtQYMl4otJto
+tz0Vqq3b07SHi+Mk7hw7sh0oqvq/75zQmn2gCjZHcmzf1+/ud1cB+wE5J9rkVFdcpbCVIi8c3YLKac4V
+Xce0NupXYSb1hloHTlgnmKWGr+PJeBqfz7sdUVbauFMcOgPKAnNCq9ZjHI8n9Et4XWzA8FNDCLXmymmz
+DWjpSqev+XNaS9t6ZrosEdqnFZRHWCVCpQL/78HBbXLPmTve9roQMr3Njjdc1HmJWUMiT0C80k5kgoEv
+/T8R+7dOoR9RslDp3YtsCdUNnjCS/0bDYbdDhsSrWRI8EIv5kGRL7EY4VjQ6S53WkhOFvMyaB7/2YUQe
+RhScNEp3rOAlkApcEay+9TGF2b7tzNvOgu07TEFYLMnlm3E8icbTKD4feB27FyCqqxQcHx14/+7jjbqd
+qk6kYEQox00GjLfZhpJ8bbRRGRd/cAjKtpddQ1yEpnp71kr2GL/4n1T9geo54CEed+Lfx3f37Cfv5Rja
+rNt5bOlvRbv6NKAYyYQCSZrxw32x/EAuj5pZygxH4P3eaxT3znqBW7wcYLE3mM+fkd7DGqj0Ea8wOAdF
+hF1qwz/zSgpu+4NG88lvPwFQSwcIDhicv8sBAABzBQAAUEsBAhQAFAAICAgAAAAhAA4YnL/LAQAAcwUA
+AAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAAECAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/FlowsStatisticsUpdate.java-0f082f43-d9e0-35c5-b870-6b324b213196--
+------=_contents/model-flow-statistics/.project-5da287dc-354b-3800-836f-fbb524de9e60
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/.project
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStkU1uwyAQhdeN1DtY3tu0XnWBbamt
+ssymyQEITC0ifizAbo8fwLiRY1nKort5b+bxDYDbXymyEYzlWtX5a/mSZ6CoZlx1dX467ou3vG2ed7g3
++gLUfYKlhvfOT3v3CSsioZGagSi+hf4prCOOW8epxSj2whDVUoJyDUZzFdx0oo0CLdR54IJ99UCDSvLD
+R4li0UlcbboSqOC9hfLCXEm18QUZSQyAua3gE8R0Q2DbpNHSwGhFeYgrK5i4koygqvf/ICdnfgAPdYOB
+ND2J7btP/bBAnNvK3O19WKXmOmD/vmf5/VdQSwcIVibOOeQAAAA9AgAAUEsBAhQAFAAICAgAAAAhAFYm
+zjnkAAAAPQIAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAABoBAAAAAA==
+
+------=_contents/model-flow-statistics/.project-5da287dc-354b-3800-836f-fbb524de9e60--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/$YangModelBindingProvider.java-f107aa21-80ea-3ff0-acc3-80eab456ce42
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/$YangModelBindingProvider.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSVULGKwzAM3QP5Bw8d0kVcrnQ4unXL
+ULi1o+OoPlFHNrYSCKX/fg4JLYXecEKLkN7Tey9oc9UWlY8WfEDu9OTI/ghMmi1YZBhrGCK/LnvfoYMk
+WigJmQQyBUwQcax3H1+f+0NZlEUYWkdGXYi1U8bplNTmnFlPM/hI3BHb7+hH6jAq6oPDHlnSeynivUuL
+qHaBwp9ct/m7yrUq+Cfh4LDhi1cW5TlV25lWrRVRciYPO+tNkz3kyKThnAwbrLaHBXIvi9y/UEsHCMEe
+NzLEAAAAawEAAFBLAQIUABQACAgIAAAAIQDBHjcyxAAAAGsBAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29u
+dGVudFBLBQYAAAAAAQABADYAAAD6AAAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/$YangModelBindingProvider.java-f107aa21-80ea-3ff0-acc3-80eab456ce42--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/FlowCapableNodeConnectorStatisticsDataBuilder.java-64753ba1-a3c0-3b00-8592-fd098e156266
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/FlowCapableNodeConnectorStatisticsDataBuilder.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS9V02P2zYQvRfof5j1JbITcOukp/1q
+2m0D7KU5LNBLGhS0RMlMaVIlKW8Wxf73zEiyJUtylrITewFrLc4M37x5HI1yHv/LMwHGZszkQif8Ucls
+6dkj1xnLhGbrOSus3l3MjfXMee6l8zJ2zIr1/M389fznyx9/kCtaHQ7ojVGuCr2QOpF4/Z17/n7xScT+
+Gd/xYFiqzAOLec4XSjBtEsFiozVuZWzb4R2a3VZWf6LR7cbmfmuC0OgvLxZKxhAr7hw870Wp/VZIlQgL
+/5M/4Ce3cs29CHCHf9JQYGXgCtwoWNGUgJH3E1TXI2J9q6oFMMNttkVOH7+UjgXQBdfkipj885tE08ua
+mqMYDrOGBXfi0JTI99Cczmezes/ZvfCQSqESB6k1K8jkWmjIrClyPKhEXLES2jP4iyuZbH+DdCA1VlLH
+2EZSMLq8pEYhHHL0j7lwF5td4KpQN80PJW9Op5urc9yu2fu8hWR7923OLV9Rdk3qpuxPjYlfWvPg4E4p
+kXH1a03EH59jkXtpNMi0Jq/Nka6JWZfslaRUEWfnO/JaG1yu6vAOyxA1DbIn+wW2U8FxP1eWBIGgGlKu
+nLhsjBBMRNlsakQlOhnjO3BHyjo6YUeZErUjz9CW4Db73hZt8p9263DW2A4wg6ICLR726iradQCYiM85
+ohNJfegu4MPpKPsIf+sJvOxhWhQeHri7AFwkxe4aTPvkjO+vEFioNsVWeEw/8Jl6GKz2894FIQxIFdtF
+cfCToXS+7JFAEY7KEhaU5iDBJOCwIHerXEUEpf+grWekUpkxNkPN1aipi0IDDpNK0AEK9WqGtBYhn/ia
+M0WH6JYAXJ3ugBGkG5L63SYRkdzhl015LKJe/6j5Py0+VlZl90y3KKzrWBXwm0+87S1GSG7cQe4NZiOP
+4AHDWY/Ht+/XwlqZiJ46v0+vPKhfjkAtcSJacre8xYD9nSu1kA0WdyWQwzfz7iMXF61whfK42l3cLlTu
+s82NlzhRBNXsGnSh1BR+gZ/gIoQB1iTTHQ5qGisI45naTHjivwLHuqhpRvVEiJNpjz8aNEiglMjQegtW
+Z1qpgXWDYZCGlP3BuoPnnmiox7KTYuHPSoCsuXNk+BEPB+OXeLhxyAz3mRLYrhAxoVGaGsivpJjgBHWU
+s69EeoatAcaeQKAdQojOQnReyzAY7bEFHZZpyyjkDDWH5t7b8oXUVP/0W0/XdPsQqK/X5XizzyqaBM4Z
+HybdNrE556m0zvdfIw4T3dekQjHKzfYKaQNlr5Iq6ezxrhljPKdxI5q8gl7OZZD+ra5nQKbXg7E7gULk
+2o0yLMdO4BcfX0xZo6k9Lzj49QVQSwcIkl584eoDAABsFQAAUEsBAhQAFAAICAgAAAAhAJJefOHqAwAA
+bBUAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAACAEAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/FlowCapableNodeConnectorStatisticsDataBuilder.java-64753ba1-a3c0-3b00-8592-fd098e156266--
+------=_contents/model-flow-statistics/.classpath-09c1ac1a-1744-3e3a-8acf-9730feae819d
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/.classpath
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTllE1PwkAQhs+Y+B+avXdXuOihlTSk
+RomgoZUrWbpjWWy3ze60gX/vFjRQgwkHE0WOM/vOxzPZGa+/yjOnBm1koXzSpVfEAZUUQqrUJy/xnXtD
++reXF16ScWNKjgtrdHYWKNRr500q4ROjE+IUFZYV+gS5TgFdKYBtxGCI0wRsZCznUrElrzlp0nU8jqjl
+vEIwG3vP4Sieg0+KEm2DPCNOzbPKOlBXQNg36pzXoGhZ5AK0rEEcivJYu6jH2lA/x7nmKj0XTjcF5SaF
+epXnhWxs/2fAu0JQogH+T7A2EboHiBv/yR4pu4OfLIVOKSSZLA3QpUCa8UolC3vg6XASzgZP4zh4GIcT
+9lUnFYK2OFTAvEppJT8iQdMIuRJci+koXpfAhnZIUeh26fWxo/oV+LwHdBRMw3FvNngMoug5iO93/H+j
+9SM3cvvCjERgeSEgM6f4SbecbaYWbVNgL5213gFQSwcI9oEzZl8BAACxCAAAUEsBAhQAFAAICAgAAAAh
+APaBM2ZfAQAAsQgAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAJUBAAAA
+AA==
+------=_contents/model-flow-statistics/.classpath-09c1ac1a-1744-3e3a-8acf-9730feae819d--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/AggregateFlowStatisticsData.java-3d1ced85-5d44-3b7a-82fb-bb3320ebaa13
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/AggregateFlowStatisticsData.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSlUMFKBDEMvQ/MP8wHSHDwoijCguzV
+w+4PZLrZGO2mQ5sZHcR/t2PRVRgVsYGGNMl7r69H94BMTYgMoSfd4eSF7wwmVAYmhbGFIerX5t6HR0iG
+JsnEJYg0tmen5+3FZV3JoQ/RlgEtBJ8KdCe6k5xv0PC2uydnv+z+LEZ0JLUQp6MWMOw8JdjO6V/gSz+F
+FXMkRqN1Htl8TPzdgdXAh6w9AwTN23P0Q+fFNaJGcY+Omm/IZvPqqsmHniwzpVIcPT0pD58prt78uH7v
+LAPX1XNRUuJlvl4BUEsHCAh+4xfWAAAAKwIAAFBLAQIUABQACAgIAAAAIQAIfuMX1gAAACsCAAAIAAAA
+AAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAAAMAQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/AggregateFlowStatisticsData.java-3d1ced85-5d44-3b7a-82fb-bb3320ebaa13--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/$YangModuleInfoImpl.java-a47fbd8f-f88a-3fee-9977-8daa29993633
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/$YangModuleInfoImpl.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTNVt1P2zAQf0fif7CqSQQBbjseBhTQ
+GGJaHygT5WWa9uAm19TDsSPbKVSI/30XJ6FxSPmaxBZFipPL/e58v/twysJrFgNROqYqBRmxheDxzNIF
+kzGNQdJ5n2Za+sIELGhqLLPcWB4aqmHe3+3jRQbrazxJlbbtkFYpYQrwCZcRx+cPfDlXUSZgKKdqqf+b
+zRnNLBd0DLbt8zdmZp4oVAmNlYoFUFwmSuJDCAgtHSZJZtlEwGMoruhQppkdWw0saRFenN2GkFquJArT
+bCJ4SKZcMkFCwYwhH/wNDJNUEMQQkIC0hvhScre+tr5G8Eo1nzMLxEWxQmz8PByNr05Gp2fkiEi4abMU
+bA6agAUSbgeDSyRLALU7dSJ2HH07S/o6g2cQTMpCB4OZcFCHOnBQBy+EwizhBuOYI33s9Xd3+n28n1Ex
+KtMhfGd2lqt1z8+uTnaGo6/dPIe6T27LpVmF3moD7KEf0mNSsA9R8c0so1sQX7LV4CkGO5QokiEEmznF
+pLw0WAzZA4+lL/dNylqJreO0eWrAlnlRFsLhscuGSgfllEVR8JbStosUyqru7ff3aIuD1Nv03xueCnVD
+uZxj0Si9KG3v9fffzbbVTBoW5oVe9bPe7ntY/0ebdkK4tSDzmnx4LZ341HulE43CwdSsN13sxOniYhqg
+q3WlWufF0nKPo7ZqoK7V5sYvy4ZwYgq1oN4hPH+mJKggsUwyIbyKyi870+rGVdAQx0TMxBirGx7afdCp
+jJGNDtnye9EW6WwQbkjCjcFG1ambvl8urV40rRZO4Y6UAa9g70nIbDgjQW3kEPC87nbJg08C2PU2mWQW
+9wEacmeksrO8a94AQkkSqUc+3de74eeLOWjNI/BaXNl5MdYjbP2t/SyfCYM3AF6WA6AVtJoObwEeVUNq
+pbtO+nLoemIifpGNYxf4Mu82i/QxpM7W3X+Y2hdtCd2Wzy9I5zKgpjorvZSolvGVNxK/ZbRy93gevy45
+rCoWjXnqvn3JuIhAEzMpB6n3OcBacryc5gQFm27JpJI8ZKIoDa8JTyhL8/4adH52Vgiq0xhGO1+u+Gvb
+P3OVP7v3lRr1o5Wjtnh94n//XNVIh5V6BR2mVGmQs0LrlxeOKoUmdEnNklW8/wBQSwcI2X77lFEDAACT
+DAAAUEsBAhQAFAAICAgAAAAhANl++5RRAwAAkwwAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsF
+BgAAAAABAAEANgAAAIcDAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/$YangModuleInfoImpl.java-a47fbd8f-f88a-3fee-9977-8daa29993633--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/flow/and/statistics/map/list/FlowAndStatisticsMapListKey.java-1c101290-a2ac-3daa-8bc5-23cc41a6d9c7
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/flow/and/statistics/map/list/FlowAndStatisticsMapListKey.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStVV1v0zAUfZ+0/3C3l6UFee2qiZUy
+GAwhVQztYYIXhJCb3KQerh1sp1OF+t+x66T5aJrBtOQhVu69x+fcc52kNPxFEwSpEiJTFBFdcZbMDVlR
+kZAEBVkOSaZEPRhz+UC0oYZpw0JNFC6Ho8HFcOwjVETV6IKmhNv15PCALVKpzLPt9slGptEjuEZKrv0O
+MyYiZp/TCIVhMUP1/Jy6OrAh/F5Ed9vQF5re+Na4O81mnIUQcqo17Mv9jKvDA7CsOS6sDA2lmjf7at7C
+H1tjr1SxJTUIG3IhxExQDlyKBDQqRvk3VJpJ8XX6ES7h/OLsfDwejc/PBkO7Hg+Gr24m4IF8ZQHnjYCf
+cWFIvpvX06EkqFf2Cp7uMnOmSR6wbEpwF1z7x2m/nxf04Vqh5aKBQijTFcRKLuBOZipEuJ3dY2hIkbot
+uUqpogvQPitPlpvkIuf0v6TsieU7dMnzGaRVZUs/bU2Cxq+CGq5CY8d1t11+cXW7RKVYhDVEJgzMqZ5f
+ywjraN5nF7deL9ASHQ0nZdgFFOqMGxupBrYvfVm/ePECgmAr+hJExnkP3sEAXheMSUmkN9mR5WH+TdXM
+nnykAvB3RrkO7umSEu5OtR8HZ3RNK4shcK44Ys1YhYJRGVaIresAtrAU1g4QWzYdCNbXa/cFsEYcbYiQ
+8s0TILvGUpo5KmtS1+z2HIVJneKOgw1Wm0Y47O2AH+3J7NDQ0LEGtHELHRwVk5IbW9vpKS3aNfaRySpH
+6c4o+0cBI/2ifniaaR8yxiPb8Fn+tD3Bh31ZwXGXc9+Pq4ejmPSYKe0OXUVJu3H77HA5G5BWowr4Vqe8
+PS1VuVpCU/cHDY5fQo17w4u2ipz15U5dI7EYgWrWrs2NopMfJz1S+lcdAHfbxV9QSwcIFtGtVp0CAAAl
+CQAAUEsBAhQAFAAICAgAAAAhABbRrVadAgAAJQkAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsF
+BgAAAAABAAEANgAAANMCAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/flow/and/statistics/map/list/FlowAndStatisticsMapListKey.java-1c101290-a2ac-3daa-8bc5-23cc41a6d9c7--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/GetNodeConnectorStatisticsInputBuilder.java-38e064c4-8cb4-3c3b-8fb7-707dc8138d02
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/GetNodeConnectorStatisticsInputBuilder.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTtWV9v2zYQfy/Q78D4pXKaKHHbh82x
+03ZZtgVrV2DZuoeuKGiJttnKlCZRTr0h3313lGRRpCTLidMARRXAdkTe/98d76SIep/ojJEwnrlhxIRP
+VwGfzaW7omLmzphwlwM3jUV1MQpj6SaSSp5I7iVuzJaDp4Mng2cnDx/wBa5uyZCLJRMyjFcZq+PvBt+7
+v4U++51Nd83yLBSCebBw4ZesP9IldVPJA/csDAJY5qFI6pZf02iDQjIMgyRTbcKFz+H7Ryrpm8lHYFvH
+8heazG/E9mU6W4CJFJUFavw72t9/+IDsk9ehnwaMCLpgQ3UDL53nIUo6LEOoNl16c7agJKJyXlK9c8C1
+Q512iLTDkvY5OJgnoMT4yfHg6eHgyeHgWX/G5KEAdx96hb81aUftq1xEqXyPGhw9fBClk4B7xAtokpCf
+mazE8HJNdIE0P6Q88FlM/kNfoPJRzJdUMmIEnnwQFhLM7QC9bNuJyQyCNVLhCzAaZ6jY6DlhnyW4KCF6
+VEY7Sit3g92npwf3JJdQTSwZE8GuSA7o0anTL32XRbFb/Jw+RhDJrkn2fRMmOysXEkKLaKDxbK0YXnLO
+E1dBBAyHReCtFFNmK+1vZv2GbWRCE9agiI7xsdpYKKWtrPWzjNAJKrv4lDi4SLgAnAiPhdNN1lwsoqCi
+JV4daMgHjp9jsskPmQDU6qQqRJnUikslorJFN/baiF5WVPHav2SSTDkLIM+ncbggMw6oIbM4TCOoyAiC
+FFm65C0NuL/+n/Bk7TkCrguF+prCWRNeIaFcRSwZFlLIKA1Oy38CfrprLI+OgGkp4UiTt777IqIxXaAN
+pYGhOsXKLXIeh1cJuYAzc0aDl7m55589FinHA24yF+meELn5S+UjZXrGEcu9li7LEJYzb/8EznbKY9RK
+xQmcjoyCvEQ5HhSBmE9pUMEGghit0TC8a79agK+kl7PzmtRHR9RmrDJY94aMU2aDvPDLXrm3xgYIssqg
+pjg7VQJCeuxzBHFifg71IXm3a9Pfk79Fjzy2JE+gQl7RZEhgEXFS3dCW5znszF6hroDqLoqZBPWbWorr
+mgOsaC/WcWtiV8fjxWUaRTFLkr9oLCAnE6eXCmjcvE/M7/Urckbn99yVkHO0UZftmI3TebWF+AOqQcUd
+KmmNDWQMBT0N7OOlA1J7ujZEcYvZlMUMS7NHhQjhgIUO8M9Xr/Z6NWjRQuSc9yu6Yx5aut6uFyCJDT4T
+n1BG0279gNp5YtmB21vQup2mTgHuNrXuWhfq+62gu+9u3YL8PbXvFT3sWFXADfstcB+Qph6qNpzbhJJM
+MJa1pRHzu0Nv6KBwO/3yIU75y4P2QtCg23CpmlNsHBlavHF7OYRqRptA/GKBhtJ0UajO/Av4iKfUM44e
+zcdfSDFXeb5aZTWn5bHKgtRxhq8ntKd5fd+3iX77iV73X5ds7Fi6reG27UDrMuBaJ0/jkFtcyRWX3jwb
+eKs1MOH/AomlHl4eTsfHQ3thLd/wq/ag0WWLSK7AwbXq4DWJGf3UsKYkDxok45VlAbB3z4WMV9+QXiB9
+jYZKkBk6CQZ9p+9yKJMUSOGnAB81hqdLjL+5PZebwNASMBkKBLzKxF/ZyukfEPX7LfaFkGMnuVu3ywef
+TWkaSLJFHlbrmwWHupBfN5xXL94sWRxzn1nn/rYzJV7tc6WhR1clGsdOU+JGMR3G0HZ1vobpFK+tJlS8
+7nJKNeKlRXWraTVn0yWMXEgyh/w5q4VUdvbgHugVFlhwnw7Mp1SwCEDCtB0Tc3G9kJHvFzceE8exG4LC
+6c/JMRlameOWapou2yimlvcNGVYLUJVvJUJt7FVMM6bbx6x4XMr+SWmQaKjPH6+Gk4+1MMf6iRrXrWtq
+GY8ac8VMZsCkNU1yZuZT3AZugGaVsgDBPaWgW965Jfsuc2Eo59C8dn1pAeqZSQAmNOO5Rn3lQRRq98V7
+LWQbLK+x/pqwAF/8TJ09K6Fy/NTrcVu3r12yjR/u2Pgai3dhZn1FaLW2QnJnRlcbY932So90SxfUl40t
+u5uyiF3KWL1TC7Mf9qFkbl3Pnvl31hQ27XJ6m578vLOO5KLgTnmcSPtlTIda0BZiJFCcGwFQyG1EQBby
+BurcLy6NsPNyegfEMlAxsW+ZlKZZ41pGBpVVWEySxsLxFTmtu6e6uKfZ8Dajmw3uYKyhhUmh1xPbVmN3
+pSypNwlJY49kkD56/6jvlqWh4XUgfPwPUEsHCPjTvUCCBgAAGicAAFBLAQIUABQACAgIAAAAIQD4071A
+ggYAABonAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAAC4BgAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/GetNodeConnectorStatisticsInputBuilder.java-38e064c4-8cb4-3c3b-8fb7-707dc8138d02--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/FlowAndStatisticsMapList.java-391a854e-8c9f-3d74-b2c8-f4366eba8c4d
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/FlowAndStatisticsMapList.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStUtFOgzAUfSfhH2542hbphnvZmNMs
+UZ+cxuzR+HBXCuuElkCZLsZ/9xZUMNGpiSUptOeee05PyZE/YCJAFwnTuVAR7lOZbAzbo0pYIhTbBawq
+1GcwTvUjKw0aWRrJS1aIXTAeTYLpzHVkluvCfN3QaJ2WTWuus0wrdnuNmfg9ay1VJOl9jgZv1lvBTcvd
+4g5ZZWTKrsgW7dtnOBi4DgzAboGOwToHVBG07iHDvK5Z6qhKBShyFNYbdnTd+Jbtt8y6aMU3IkPI0Wxa
+1l2PMgu73NByw5Z7RpnJUmo1Px4FY3808YNpv+5P7joaPrnzU/oeHgLvrfLQdfJqnUoOUhlRxMgFXBJp
+oaLVB2WJuc2C6mmIJ0MOy2bRZuo6z016DfDWtJblEEuFKdT3RvNieQHzP10244VAI3reTwl5R14bDS0O
+nd/rz2bvdu3xTv7pf24QEu2iJMqsKPsu3FNIhPkO7PVrpy92egVQSwcIg2+7t2gBAAB+AwAAUEsBAhQA
+FAAICAgAAAAhAINvu7doAQAAfgMAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEA
+NgAAAJ4BAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/FlowAndStatisticsMapList.java-391a854e-8c9f-3d74-b2c8-f4366eba8c4d--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetMeterFeaturesInputBuilder.java-20020e8c-de9c-3e5b-a6d6-4d06acd5b3ad
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetMeterFeaturesInputBuilder.java
+
+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
+AQA2AAAAUAYAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/GetMeterFeaturesInputBuilder.java-20020e8c-de9c-3e5b-a6d6-4d06acd5b3ad--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/GetAllNodeConnectorsStatisticsInput.java-06f6d859-f57b-3c0a-bd73-086cc267645a
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/GetAllNodeConnectorsStatisticsInput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStUtFKwzAUfS/0H0KftrFmy7YH3Zwy
+VMQHJ7pH8SFN77pompQ0HQ7x303aYjtQtoEJJOQm5+acc29G2TtNACmdYJWBjOlO8GRj8I7KBCcg8Zbg
+Qsv9y0xpg3NDDc8NZznWsCVjMiKTme/x1N3+ntAoJfIqNVNpqiR+WtIUjkdFXMbc7jfU0MfoDZg5gP1T
+ApdbkEbpXUV+eEbO8VLFcK2kgQ/zDOvTWS2KJLVJaSScJDcHvZ7voR56UHEhAEkrdloG3GinDN1HYWNp
++WjFNpBSlFGzaVAvHatl2sZOHXbaYK+sIp5zJeejIRmHZBSSSTcBE1IhQmk1hkxJab1TOm99OTjiCZdZ
+YV4dl4HvZUUkOEPcGqbXlAG6A7MQonaxRq9+wPcOa6F2WIMt/bw67Lver4JNgetAy9uLf2pWfATfS9/7
+rEpZ0ag1l+kYWnNJBSp72K6Lh1s0P6nxMdNADXSCQyUN+kFTS3so6xB0Z3WbfbnlG1BLBwi/Y+P0cwEA
+AMsDAABQSwECFAAUAAgICAAAACEAv2Pj9HMBAADLAwAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQ
+SwUGAAAAAAEAAQA2AAAAqQEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/GetAllNodeConnectorsStatisticsInput.java-06f6d859-f57b-3c0a-bd73-086cc267645a--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupDescriptionOutput.java-aeda5300-36fe-3d7d-a191-eec9a201f029
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupDescriptionOutput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU01PAjEQvZPwHxpOQKCwcjGLaEgw
+nNAo3oyHoQxLdbdt2lmQGP+73Q9cNBhC4uymm073zZuZNzUg3iBCpm3EtUG1hF0sozXxHaiIR6j4JuCp
+VT8PI6tTwx0BSUdSOG5xEwwCb8N6TSZGWzoz4irWW04WlANBUqt9xP6AP1Xe8RYsnqAgrWNXkAmdJD7U
+wx0kZ6AWUi2l/06A4H7xioLOx47TKEFFsIhPEZ/oMe0M7tvbDy75NPNO0Im5b757RBPvPEH29Nrteo21
+2Uwv0xiZ8jWHuSOzw8jdPHK3Ui//ay7WmAAzQOsK9tz0aYWH4DAHhxX4xucmnddmdNEPBt0g8G8rwj3L
+0qdqpcnE6x336pRMSi8ZZ69eM+kiloJJRWhXIJBNkb5rLiH3OcIDvOE7+eRcsfk9KZ3CfaRn5Uklcek4
+0O3qv64E/7OE63rtoxCvYC+Lz4MItpIKYpYPr1/Hs1s2OmviubAIhM3GSQ0bnUYlnt8UkjRaw3K0PrPl
+C1BLBwi7L8sXfwEAACoEAABQSwECFAAUAAgICAAAACEAuy/LF38BAAAqBAAACAAAAAAAAAAAAAAAAAAA
+AAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAAtQEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupDescriptionOutput.java-aeda5300-36fe-3d7d-a191-eec9a201f029--
+------=_contents/model-flow-statistics/src/main/yang/opendaylight-meter-statistics.yang-86867d5c-b1db-3d24-a874-225ef3ad0640
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang/opendaylight-meter-statistics.yang
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTVVsGO0zAQvSPxD1bu3rRwYDe9gBAH
+Lghx4O5NnOwIx7bsSXerVf8dO4lTN02ylC6VGEVRa8+M35t5nrZWRSM4UZrLgu0EVA9Ia47cUIsMwSLk
+ljy/fUOcSVZzq1nOSdIYmcUxWRuTHWKSTRejDS/hibTbftctdxtQa2WQ7JisKH9C8tx7us8bYvgWLChJ
+C4butHer9Xu6+kBXd8lmfxR+hBvklktUZjckcyubyVy3dH2SqxTqkUpV8IlEw96fp5soKe40t0POaG06
+6x1d306CzJlm94JTNExalqMLHLKiCRHdO1cSnUv3xVvySYL41dTMkJ9gH6SCw96XmoHICNt2Gx9B3sB9
+fZOrOhkaF6D2KNdr9yRBIt4KbnMDukWVfJWAwMQhSpUdcRLpy3KzhZwHzezDUaypatcIkqSuI5kvvx0+
+pUNLOu0dQXAiyvpgCoV7QwnuyKTt7lje4dihWiCd79wlCJamzreEiiQlE5bHSbw11nU66nA2zhf5769I
+uwPd4lgkHvu9CvVJvgeZLnE+l2PJGTaGL/ILPq/T1pCNGq7FbqG1aUp+fP9MciaE7a+TzknFkbqV2cHr
+DaRucIy2hRPK5HuGrjwORHkKwZtqcC7JklRPWA1RaLJoBlH2yAw/PXqi3YH1P2HsTXDWDxqnklEOb57p
+BGkoRnn2/0khD/KJbu41VTTPPx4ll1ZgQURTN/rql2Z2EPwtzzA2vik/6HLW/qpG46P/Zxbvnqiu0f5f
+RRFTOKrBZrR+loQDqboRCJoZpHP09i8gPtLJ5ZgXZXcW6lnEQ7cvRzsrnLOQuuc3UEsHCPrsL4xiAgAA
+0QsAAFBLAQIUABQACAgIAAAAIQD67C+MYgIAANELAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBL
+BQYAAAAAAQABADYAAACYAgAAAAA=
+------=_contents/model-flow-statistics/src/main/yang/opendaylight-meter-statistics.yang-86867d5c-b1db-3d24-a874-225ef3ad0640--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupStatisticsOutput.java-ef55ca4b-241a-314a-b296-06aa2391a252
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupStatisticsOutput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU99PwjAQfifZ/9DwBAQKkxcDoiHR
+8IRG8c34cCvHqG5t091AYvzf7TZwiBgy423p0mvvx/d9NwPiFUJk2oZcG1Rz2EQyXBLfgAp5iIqvfJ5a
+9f0wtDo1PCEgmZAUCbe48vu+s6FXk7HRlipmXER6zcmCSkCQ1GqXsdfnj6V3vAaLJ0qQ1lFSFBM6jl2q
++1uIK0QFUs2l+14DwV3wgoL+CqqgiTYGdwz1/HM+ybyzL+4e0ESb6t2N0zBGRRBEGbTs6bZaXo212FTP
+0wiZcqAHuSOz/ZSdvK9OKV9+ayaWGAMzQMsy7KnhQA32gwd58KAMvnLIZOLEGZ31/H7H993bDPFnle5R
+p07JpPScVex6NZMGkRRMKkK7AIFsgnTA110e4O47wzdynSXF5nBO2oX7GN3bo1LhrWOP1Iv/+iP4bxAu
+vdp7oVxRfIs9zyHYQiqIWD66bh1Pb9io0rxzYREIG/WTAtbb9VI5tykUqTeH27n6yJZPUEsHCGeBY251
+AQAAKAQAAFBLAQIUABQACAgIAAAAIQBngWNudQEAACgEAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVu
+dFBLBQYAAAAAAQABADYAAACrAQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupStatisticsOutput.java-ef55ca4b-241a-314a-b296-06aa2391a252--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/QueueStatisticsUpdate.java-a05f753f-5497-3760-9a74-29eedde23fbc
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/QueueStatisticsUpdate.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU99PwjAQfifhf2h4AuIKhcQoioao
+Dz6AMeqT8eHoulHt2tndQGL83+1+6NBkMSN2ybb26913d99dDPwFQkGMDamJhfZhq2S4QroFHdJQaLpm
+NLX6J/iailTQBAFlgpIn1Io1G7MROzxpt2QUG4sNPUq9FhqN3RauhkfsmC6ML/b1FyizoWhBJ8BRGl1G
+yIZjOk8Vyhgs3lfwbAP2Ly40RiUFKzdR5HzeLiBqYLWU2pfuewkIN8tnwbG57cVKKv8maG44S8PIVRiW
+ao+IFwZlIDlkpdpXkfqeobcZdO3PtH/3Dc8hdkzZM+j32y3SJ3Pjp0oQ7Wo+yQ+ytUvh5RReRZHfuuMr
+EQGJAVeV2WPXxTfZNZ7kxpPK+NzFJxOX8HQ0ZGOPjTx22PvN4KWxDygGNedPGeGg3YrTpZKcSI3CBsAF
+yTOukn3Ib7vLbok3dFElxaaU+7RqmbODAtnR8/R/hfgd1hdjjUolWjtVJZ4N8/dv1U3t1nuhcgGVhcqD
+4ySQGhTJp8y9Z/MrMm00mpRb4RLodv4Uu3PQqVR2mxo9O72Tsik/stcnUEsHCA27URuoAQAAPQUAAFBL
+AQIUABQACAgIAAAAIQANu1EbqAEAAD0FAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAA
+AQABADYAAADeAQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/QueueStatisticsUpdate.java-a05f753f-5497-3760-9a74-29eedde23fbc--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/nodes/node/meter/MeterConfigStatsBuilder.java-7c702a13-0252-3095-9a0d-0c0fcf47f01e
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/nodes/node/meter/MeterConfigStatsBuilder.java
+
+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
+AAAAAQABADYAAAAVCgAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/nodes/node/meter/MeterConfigStatsBuilder.java-7c702a13-0252-3095-9a0d-0c0fcf47f01e--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/group/features/GroupFeatures.java-7a5892e6-6087-3d74-a271-52e883833351
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/group/features/GroupFeatures.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU99LwzAQfi/0fwh92saWre5FOqcM
+UZ+mqI/iQ5Ze02CahDQdFvF/N/0xuuJwDnYtKZfc9bvvvosm9IMwQMowrDTImJSCs9TikkiGGUi8DXFh
+ZP+QGVVonFtieW45zbGBbTgPnbVHCRBbGMgXvsczrYw9DGCVEnkDRVWWKYmfH0kG/8/acBlz971NuYif
+kiOJR/jYUsOOyiy8xA/V7n3L5AW0KE8vbFWwDKQlG1Gxqp7paOR7aITWKi4EIOn4RvVGZfu/nNRVTbou
+11GvNIWMIE1s2qW9DRylaD85qpOjLvnG8eI5V3J5MQvnkzB077BB2Ik1/dN9r9CmvqeLjeAUcWnBJIQC
+6rXJBTmDT+tKaZ1Wm6uzjVgP8HrcoOw1+nxI/WE+DPx7Snzvq5G6CWgbVgNQlHBJBKrH3K2r9R1annQ3
+MDUOCwbBUcWDcdBJ7Zy+nMFw0Q7kd7X8AFBLBwjuyPm5WwEAAAgEAABQSwECFAAUAAgICAAAACEA7sj5
+uVsBAAAIBAAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAAkQEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/group/features/GroupFeatures.java-7a5892e6-6087-3d74-a271-52e883833351--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetAllQueuesStatisticsFromAllPortsOutput.java-14c27e63-1ad0-3828-8188-561d210123ca
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetAllQueuesStatisticsFromAllPortsOutput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU1tLwzAUfh/sP4Q96bCZ3cCHeaPg
+BR/mFH0TH87Ssy6aJjU5VYf4303TYqcgc2IKKTkn3/edWwoQj5AhMzbjpkCdwlLJbEF8CTrjGWr+HPPS
+6q/OpxJL5I6ApCMpHLf4HI/iYby33+3IvDCWNmScK/PCyYJ2IEga3TDGuyN+21qTF7C4RoKMUa4WEybP
+PdX1JeQboGZSp9L/T4BgOntAQZtjkzLLURPM1DrhP9SYX1euizTR6c2newKFV6q+Qb/f7bA+m5i0VMi0
+T34cDNValYiCRNRKhFs3YoE5sAJo0cLutnx841XwOIDHLfjYxyedb9LhcDceRfEwive2M6QIlKqV3IpU
+NLcmD66qNG7w64umpKKk+yqyQbdTlDMlBZOa0M5BIDtHSpQKBXJtcc48hzdfVQzTQODxfuEr+Yxcffih
+qju19/sUNuZ2SBrDSucP/q3hv83qqNt5q4egDqYpT+AUbC41KBZeg9+TySk73OgJcWERCLd6a2eht9Nr
+h8Af6qb1tvebEX2vtg9QSwcI6d13fIwBAAB7BAAAUEsBAhQAFAAICAgAAAAhAOndd3yMAQAAewQAAAgA
+AAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAMIBAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/GetAllQueuesStatisticsFromAllPortsOutput.java-14c27e63-1ad0-3828-8188-561d210123ca--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/FlowAndStatisticsMap.java-3b8088cb-e2c9-32e2-9b1f-b53f78b7cd26
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/FlowAndStatisticsMap.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSdUl1rwjAUfRf6H0KfVGxslQ2tyBD2
+8eTG8HHs4Ta91mxtEtqok7H/vqQta7chbiaQNjf33HNzThSwV0iQyDyhUqGI4ZDyZKPpAURCExR0F9Bt
+Lr4frlO5p4UGzQvNWUFz3AVjfxJMZ06HZ0rm+pyC+qCwrhX4o0t6a4LnFsxkjGm7xVZxfzq6oHcoMOds
+9ZVxgklLmRYVJ5NZJgV9vIcM/46KuIi5+V6DhofoBZk2WDuH/b7TIX2yBKVMAolQ7xEFsZoQEDHhuiDN
+TapcGW9TJMJ0EJYBO9rsnkV7P1ArtsEMiAK9aVBPXSNe2MaGFhs22CujGi+4FPORH4w9f+IF015Z33TX
+4vAyUMMj8WfLN3Q6ahulnBEuNOZrYEisyQsRNz4YGUyuGfimTU9FtWlUG1QBi6t/f1npdN4raavzmrNs
+iJE1F5CS0jyzLpY3ZP4vxynLETR23VOyuQO30ctsjijj9mb1Q/iwyydQSwcIUuohF2sBAACRAwAAUEsB
+AhQAFAAICAgAAAAhAFLqIRdrAQAAkQMAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAAB
+AAEANgAAAKEBAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/FlowAndStatisticsMap.java-3b8088cb-e2c9-32e2-9b1f-b53f78b7cd26--
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf
+Content-Type: q7/binary
+Entry-Name: .q7.content
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTtXV1T4zYUfe9M/0Mm01cSQmmHZUJ3
++FiYTJddOrRT+tTx2kow68iuLCfw7ys5yQbLsi3L9yq0wFOwr87Rla6+jmV5/P5xHvUWhKVhTE/6o8F+
+v0eoHwchnZ30Mz7dO+q//+X778Yxmw2IH4VJSgbMTzgf+PxxsIzZ1zTxfHL85+bXeUw5eeS9x3l4/A33
+QOIKJpoei+sn/XvOk+PhcLlcDuL5bCDAh3fXk41JA9e35BsbmTy3Gwq74Te7fo96c2H9l0dnk4sPy20O
+50lEHtcZ7ffC4KT/9/mno7vD08XRB3IbeKl/kRxO+d1S3JzRmJHg7Ok8Ih678TgnTDg0jwMS7U2jeLmX
+co+HKQ/9tC8Kqtcb+xKY8vwf8W/C4gfi83Sdm5qUufk0jMjGduBHXiryzO9FrTwSP+Pel0hc5ywj/WFF
+mjWfeYokng9EwTckiKNA1OaGJCWcixB5lnEF9Hkd+qIEB4ykccZ8kooMkmlay1aD9RDwFV4nlPkBMUUZ
+D9euV5VFyvxiKRTuzr2QPr9dMngS0Vk0UPOdEBp4T1E4u+dq3Azy1PWFYACYJwWFnbE4S0AR50S0PFDE
+JGYcFPCfjGSwxbjF2uNPCTFELIdsRdztzQjdS72oHH8FU9FyVIuyzbNsl42Nol5rKHKotytZLkZVhiXT
+jFWCWrhWmVC2rfoE5c5EMyQYJmVkMfpx/2j0rjmlEnI/yBHyWo5LZyGVI/8NixehgB48eAvPIICNGbKI
+TOg0nogBGAz7dDZjZOZxcimK+3bb+JDxLzzuueA4y8IIsioqqP5IAnHNDQu0S5LjlAZbmmsvQQX/KH6B
+EkwCUDiEVoAY/PgxLxlStFjXokO7cEV4RZu6ZPFcXvldwl/G7DSK8hxNaJLBRakl/+6L4XPGd1sOqwzs
+riCuwgWh1x7373cVEUoOXkJR7Cwq1CxgFMYq8CryAB8EzXTOnUSoXgM+PDfTIu/6ak6N0M8bcu7GXbSq
+bSZFcNhlQ91BK3XaRJ23z8/PhIEiuVwgEOqE6pawReh3nM0WhARvM5KZCAlWokdF0jbixxYCVwowZwGI
+rpxKK95BWLeyta1UNZZo4DQYFO09MU9bSh0J9jbJHegGLamAIrIF46/kCYKtXRuwSYHXygACGUnPaYAG
+iRac/sjU0tiuWEO5m6319nb1qhPrRwejn0x7VWy5Hlew1wRePi+DVG2rOKAaTxN6V03UjAGmlTYQdRdI
+TTng3VkvBFbrti1d59VUCxpnTnVfQ7XhgXdLXdUoIQKximrHCLCYglwQGQ5MFalbzL01qW3m3xqYlnPw
+FQL+UNGWDXQqbUoKNJu2mU+7mIMDhRzuqG/GARYeL2cds6vZuaGVsktIbjdzvNVmJP5e2VablVh+JQsb
+cGZlSIHzuEFhQnm6oOVAcCfnuSCpz8KEhzEFrxktgQNH4GtFz4DlyiXxeMYQHtWV0bFdQKqKIjyWE4id
+lqMeC727ctNXbVofPKLM+lpbgNtTp0VHKZRNO8BBRSkXBRylWBA2NCq4KEVTgocunE9iJlkMTkRotMyD
+B30JGS3rCIGpwcbcuKBQoe5cULjgty4YrQO1KQMR5VbP50DGsmpU50/lyvrlug3Zlw5E+65H3n0pdXzK
+C9iZNGG/mue8VkpS/prhm5LkRkm6loV9HtNpOMPVk6qJcFQlLR+KtlTDhOiag9pyV08uashB3eQ8aEpT
+GR3bBfjK0MBjOYHYQBy1DvSm4aRdKN0j+DK/Ah/FDSwVRweO4gCe2qKHx1j1qxWOCo7mAIriUkBGyzqS
+4qJgYyouChWq4qJwwSsuVJSd4ZJXk9JqrQwWwfXIUO9zWKwv67IH1PcYwMNtaqnpqnHR/0fv5LwEbUSq
+De60kfzEI9u99fvvDl7n3nqUd+AKDBcZ8+SeCdB9x2IADP3f5AFaKHleE2Bi471sIOcnol+mxOcxWNep
+Pv9YV6rViAwTERWgu9f2281UCkn9TbVZ7+IG2BR79sS7T5T0qID7ogvgN57/lUDMcPS4b/t1dzuTkEcv
+un7IcjA6fGUPWeQM4NxLJATCENKSCvzIsGY6nGcGBULIN8zacrl1D+XZSD0ZgoMV0QJed3U87tyCr7Na
+IgzNT0N2SoMbMX58yuZfCIM86rGCD/i4wFoWTN1RFpoj2bFIBa86Wp9H4q8GDcvZfJuFAMRSAGgx4HRa
+YE0KuZT4D58f0uGUHvPw7Bqa8Gf1dHtZ2WQ9UQtA88Gk/ZvKXd91dj/idWcHfhfaLhNg70bb9Ba2qV5H
+v/QC9IX8SwzuBYaf3wSGvNkC6vg2fE6kBg0nzoI8JyofTip7QxTNoZHPvZso2kMzoTtH81OhJbOrCi0S
+7sBRZ1WqMCK4qvQEuPXZSObYQfh6bGbDFEkUdlSVROECkUmeUeXwkwDtyyhK9oFlMi06SM2/KUmmM+Ra
+BFstyv0csis37Dm6b+vGalvrGFVShranTreSoYB2anTTkLC7/HZMeEdOVxC+nTj9opWZZpsmi/r7dXer
+71Xdqfhwpuaq5quwypXxcPPh3/zCeLj9LPB42PZryiLRv1BLBwjdMazffAcAAKp5AABQSwECFAAUAAgI
+CAAAACEA3TGs33wHAACqeQAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAA
+sgcAAAAA
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/NodeMeterStatisticsBuilder.java-b8ce4765-3f09-3775-a7b1-2872adc50741
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/NodeMeterStatisticsBuilder.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS1VU2P0zAQvSPxH6a9bALIotobpYDY
+Uw+whz0itHLSaevifGA7QSvU/47tpE1qO91UXbJSuopn3rx5fmOXNP1FNwiF2JCixHxFnzjbbBV5ovmG
+bDAn9YxUIj9dzFChIFJRxaRiqSQC69ntTD/z169YVhZCvRgiyYsVSvtuo76Z98MxVJc0f2WVcJZCyqmU
+8F1HO2FfK8ZXKOCvCQb9lILVVCE4cfCYBfFtSlNjGD2KDb4J3cP4pMASJFTiEcw8asskcbnBwgZqWZUD
+EMXzlohH3y0VSu5XFqj0foV0OeKP6hOkX8jlUlNejevbRs49liZ8PDNIDLVguzn+CWUss5JHpkjsVWn9
+ZE2cwprllA/b0eCAHhWOGeYqGNJZtdfEjtaUcDNKdwb644uNWYDAJ2ON5YEjrpb6JdY0xVPBeqL9TzbE
+atnb8f2JPK36jewXzHQ/eWi/z3jam9NrZtXr6st9jUKwFXo+uHSInx/kC4qzXMGWyu2d1sUv02yBidG6
+Zqj7vp3NT0PMokBZcaVX3cXjQpP+5vDhLUSRL+oC8orzGD7De/jg9UY6mrFXxqrRgF+uQVIUHGkO+Lui
+XEbdXN4nO0z1/ZfsPGXYGuzZYViH1nu0lDg53VpiLpgG6RQYBltrhiPQtIfsoaK3dGIJku7LlfBDJ2Ch
+tnqIFhAaMRMQGxqueTTVYR8EaFqlTCF/Jidn0p7pMNDlHlDH6XrRxDNi65Mwj2vlDZumFzTG0Z2FH5Rg
++QZU0fzjj7gbejwN29+FvT6HoqJp6Lb7MXUn9DBiayakOQ+c9ka44tz2mgSLPLj5h7qDu99s90B2qwWh
+pbnzouk78Bq0IP4nN9NtaxEEcrI8i7kpYQs5KDc/b2LS+cA3lz0t9esfUEsHCEx4BOuYAgAASQwAAFBL
+AQIUABQACAgIAAAAIQBMeATrmAIAAEkMAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAA
+AQABADYAAADOAgAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/NodeMeterStatisticsBuilder.java-b8ce4765-3f09-3775-a7b1-2872adc50741--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/FlowStatisticsData.java-362d1b34-5799-3c54-ad00-493cf4238d52
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/FlowStatisticsData.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSlj9FqwzAMRd8D+Yd8QBELfenYGBTK
+XvfQL1Bc1dPqysFW0obRf68zj3WBQelqgYUt+9x7WzQ7tFT5YMG3JBscHNt3hQHFgiWBvoYuyHS4df4A
+UVE5KpsIgfp6/rCoH5/KgvetD/ofIEtPoj4MFx4oNo5ibvCaXl1RUO9dzFoNy4ZTX6HiW/NBRu9y91fc
+L0frn8Ht3pad3afMCeAl/R6r7RrHpmJRCls0VE01xjRlUaVFR00CMR8uIWf54jf5eUS8fA+muLL4zLK5
+TuN2BlBLBwgdG57IzgAAABQCAABQSwECFAAUAAgICAAAACEAHRueyM4AAAAUAgAACAAAAAAAAAAAAAAA
+AAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAABAEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/FlowStatisticsData.java-362d1b34-5799-3c54-ad00-493cf4238d52--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GroupStatisticsUpdated.java-f42101ec-fb0b-3602-8532-aacd10918384
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GroupStatisticsUpdated.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU99PwjAQfifhf2j2pAQKkxfEXyFq
+fAKj6JPx4ei6Ue3apruhi/F/t/uBQyIxI3ZLu/Z6d9++784Ae4WIE20jqg1XAWRSREukGaiIRlzRlU9T
+q34aI6tTQxMEFAkKllDLV/7Qd+Ok3RKx0RYbRhRqxRVqm5WhBiP/mM50wPeNF0r9RtGCSoCh0GqNcDCk
+01SiMGDxoTZP3sD+lQu1lkmZlek4djHvZhA38FoIFQi3XgHC7eKFM2zue7kUMrgN96WlFA4zw9eaDfwR
+vclP599q3nMjs+bQJmkUOw1hIffgZKZRhIJBLobzzp9+p9NukQ6Z6iCVnCjH9bg4yMdmzF7xV726HItb
+c7bkMRADuKzdng4cJeNN53HhPK6dLxwvInEwzo4G/rDn++493M7QS00AyIP+LsNznrLfbpl0IQUjQiG3
+ITBOtrh+LK+7227wd3TAknJTKX1aV8t5t7RsEH36X327XQMVrnXKnT1T2X+roMqUd/H3Zy1yu/VRylya
+Kp4KaIyEQoEkRXu5eTK9JmeNepIyyx38A+9Ptb2uV8vsNrv09A5PqrL8zKcvUEsHCGVkm36rAQAANwUA
+AFBLAQIUABQACAgIAAAAIQBlZJt+qwEAADcFAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYA
+AAAAAQABADYAAADhAQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GroupStatisticsUpdated.java-f42101ec-fb0b-3602-8532-aacd10918384--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/OpendaylightGroupStatisticsService.java-6a41d946-69fa-3ade-b389-70e0e9ac7038
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/OpendaylightGroupStatisticsService.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTFlFFLwzAQgN8L/Q95rHvIGL65MRBk
+wwcZbL8gS88YTZOQXIpD/O821m3dzKYTihdIaO+u3116d5bxFyaAGCeosaBLtlFSPCHdMC2oAE3rEQ1O
+HyqFM8FSjwylR8k9dVCPrkeNjPNMVtY4JM+sZjSgVJQbzYNzoJHOAgYHe6MkFo1Rvg1gLXUpm3Np+Qpc
+LfkFvtxUldHRdQk+KPzB8w/J0jngrVLzaLDa6e+1DT3B/o20CNgv6g48d9KiNLrvrDqo3tOaAYsF3/uf
+2nL6TOh7pe9ocQ0HgzwjA/JgyqCAaFbBzeeLKIsO5ugjX30dTYd5ZsNaSU6kRnCPjMPvPBuBV2wMffuw
+Hxd59taGF1dUtRNospsKkzOZTadEpLTF6b5vIm/2q3ELO41MV2ILPNYVp5rkIthhiXRIW0WRLNqLGOkL
+TNze+avLs/e4fQBQSwcIAeh6d00BAACcBgAAUEsBAhQAFAAICAgAAAAhAAHoendNAQAAnAYAAAgAAAAA
+AAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAIMBAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/OpendaylightGroupStatisticsService.java-6a41d946-69fa-3ade-b389-70e0e9ac7038--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetAllGroupStatisticsOutput.java-d2d3d2de-b870-3316-98af-1beda1051b4d
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetAllGroupStatisticsOutput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU0tPAjEQvpPwHxpOQKCwcjHgIyQa
+TkgUb8bDUIal2m2b7ixIjP/d7gMX8UEwdjfddGa/eXzf1IJ4hhCZcSE3FvUcNkqGS+Ib0CEPUfNVwBOn
+PztDZxLLYwKSMUkRc4eroBf4NahWZGSNoyMjLpRZc3KgYxAkjd5G7Pb4fWkdrsHhgRRkjIrzZMJEkQ91
+ewPREaiZ1HPpv1dAMJk9oaC/NpXTRBuLW4a6wSkfpdbpB3d3aNXm+OqGSRihJpiptLX06TSb1QprsrGZ
+JwqZ9k33M0O6dkO2s7rapXzZX1OxxAiYBVqWsIe6b6q/C+5n4H4JvvSdydiLc37SDXrtIPBvI0Rqg1Jf
+MnV+dJiEbEKPaeZOtWKTmZKCSU3oFiCQjZCGSu1RN8kwHuIXvpAvMs4P+yPTys3fMV+4SrELww6/Z/91
+OfgvXVxUK6+5jnn+goEsjGALqUGxbJD9Phxfs/Ojpp8Lh0BYrx2Us9aqlTr6Q65LrTEopuwt3d4BUEsH
+CO7icxV7AQAANgQAAFBLAQIUABQACAgIAAAAIQDu4nMVewEAADYEAAAIAAAAAAAAAAAAAAAAAAAAAAAu
+Y29udGVudFBLBQYAAAAAAQABADYAAACxAQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetAllGroupStatisticsOutput.java-d2d3d2de-b870-3316-98af-1beda1051b4d--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/GetAllNodeConnectorsStatisticsInputBuilder.java-0b15d987-2a93-3101-86ae-a8956c9f8512
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/GetAllNodeConnectorsStatisticsInputBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/GetAllNodeConnectorsStatisticsInputBuilder.java-0b15d987-2a93-3101-86ae-a8956c9f8512--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/$YangModelBindingProvider.java-94b15aef-85a1-3e6f-a22f-cd9004d264af
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/$YangModelBindingProvider.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSVULEKwjAQ3Qv9hwwOdgkUx25uHQRX
+xzS5xsP0EpJroYj/bkqLIujg45bj7t6994LSN2VB+GilD0BGzQ7tleWsyEoLJKdajpE+hwMwRJlYMSZG
+nWSEqT7UGU1ZlEUYO4da9EjKCe1USmJ3yXwnb8AdkQySPUc/oYEocAgOBiBO30Ww9y6tcrr1VP7kui/f
+Rcam4E/C0UFLvRcW+N3tq4VWbIjAOY2XnW2nzR5yWNxSzoQ07KtmPXmURa4nUEsHCE8Vhze7AAAAZQEA
+AFBLAQIUABQACAgIAAAAIQBPFYc3uwAAAGUBAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYA
+AAAAAQABADYAAADxAAAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/meter/statistics/rev131111/$YangModelBindingProvider.java-94b15aef-85a1-3e6f-a22f-cd9004d264af--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/flow/table/statistics/FlowTableStatisticsBuilder.java-328e8c0e-91a2-3650-886a-9b2de0507926
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/flow/table/statistics/FlowTableStatisticsBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/flow/table/statistics/FlowTableStatisticsBuilder.java-328e8c0e-91a2-3650-886a-9b2de0507926--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/$YangModelBindingProvider.java-717a8df3-e904-3e72-8eda-eda08020bfe1
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/$YangModelBindingProvider.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSVULEKwjAQ3Qv9hwwO7RKounVz6yC4
+OqbpNR7GS0iuhSL+uyktiqCDxy3H3Xv33vNKX5UB4YKRzgN1arJoLiwnRUYaIDlWcgj0ufQusIysGCOj
+jjLAWO2qbbWv8yzP/NBa1KJHUlZoq2IUm3OiO7oO7AGpQzKn4EbsIAi8eQs3II7fNbBzNi5q2gUqf3Ld
+5+8i1argT8LBQkO9Ewb4PRXlTCvWCsApjJed9aZJHlJW3FDKhDQUZb1AHnmW+glQSwcIBTIvsL0AAABk
+AQAAUEsBAhQAFAAICAgAAAAhAAUyL7C9AAAAZAEAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsF
+BgAAAAABAAEANgAAAPMAAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/$YangModelBindingProvider.java-717a8df3-e904-3e72-8eda-eda08020bfe1--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/GetNodeConnectorStatisticsInput.java-1e42d79c-db98-3273-8fe9-6622cef2d02f
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/GetNodeConnectorStatisticsInput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS1U1FPwjAQfl+y/9DsCQgrFHjQIRqi
+xvAgRnk0PnTdUapbu2wdkRj/u+0GbvAgkmiXdOldv7v77rumlL1RDkhlHKsUZEQ3seArjTdUcsxB4jXB
+RSb3nanKNM411SLXguU4gzUZkgEZjV1HJNZ7YkAh1yC1yjZVqP4ZOcdzFcG1khKYccyiI6G1UnFeJWEq
+SZTEj3OawO9RoZCRMP8bqulD+Gqy/gMZDe/6CZanVzUteGKC0jC2lOzX63RcB3XQvYqKGJA0ZIPSYFcz
+pG8T+bVa5aUFW0FCUUr1qkY9twyXoIkNLDaosVeGkciFkpNBnwx9MvDJqM1B+9Lw89lOrUa23s9eIdNC
+v9gKeq6TFmEsGBKmTdmSMkB3oPemYPENnFmcgZllWmoKzqvDfp+7lbGWdGtodPPijyYfH6n10nU+KuGq
+ErZcy1AMLYWkMSon1uzT+1s0OWnMMcuAamh5xwT0ul6tnDmU/ffa4/GuroNXh/gBrVnUapeXP+32BVBL
+Bwj+xWkBfAEAAD8EAABQSwECFAAUAAgICAAAACEA/sVpAXwBAAA/BAAACAAAAAAAAAAAAAAAAAAAAAAA
+LmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAAsgEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/GetNodeConnectorStatisticsInput.java-1e42d79c-db98-3273-8fe9-6622cef2d02f--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupStatisticsInput.java-ce9e6e32-1071-3181-aa65-18acd8d3056d
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupStatisticsInput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU9FOwjAUfV+yf2j2BAQKlRccoiFq
+CA9olEfjQ9ddSnVrl60jEuO/23XDQYRMErulS297Ts+95y6h7J1yQCrlWCUgQ7qNBF9rvKWSYw4SbwjO
+U3m4yVOVJzjTVItMC5bhFDZkSMwYu46IE5Xq44xaqSgruZmKYyXx0wON4e+oQMhQmO8d1fQxeAOmG7An
+cxByA1KrdFuKH4zIJX5QIdwqqeFDP8PqfFXTnMeGlAZRU0oNpdXbBHZVHZARnhXReWhIi6ff6bgO6qCF
+CvMIkDQV9G2gGPtsPcvWq42yp5ZsDTFFCdXrGvbSMlL8fbBvwX4NvjF6RCaUnFwMyLBHiHnbHH7f0j8a
+FDLJ9WtxYd91kjyIBEPC1DpdUQZoBtomufwBzIvz5rgZxg+jKysXhyZ1y2DdD1Vgz4qr/2pufELktet8
+ls6Ud1fJWQqGVkLSCNk+N/N0cY8mZ/0cmKVANbS8RoO8rlc7Yxa24l57PN4Jq9oI8SqPedhq282vYvoG
+UEsHCJzNAId+AQAADAQAAFBLAQIUABQACAgIAAAAIQCczQCHfgEAAAwEAAAIAAAAAAAAAAAAAAAAAAAA
+AAAuY29udGVudFBLBQYAAAAAAQABADYAAAC0AQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupStatisticsInput.java-ce9e6e32-1071-3181-aa65-18acd8d3056d--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/FlowTableStatistics.java-620d14a2-a169-30c0-8004-91e0d32242af
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/FlowTableStatistics.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStUt9LwzAQfi/0fwh92obNzMZeOoYI
+6tsUmW/iwzW7ddE0Ke1tOsT/3STb6IQKE7zAhfv13d2XVCDfoEBm64LbCs0SdloVa+I7MAUv0PCt4Jva
+/AyutH3nBLlG3hCQakjJhte4FWMxEpNpHKmysjV1w5K1utk3kLYsreGP91Di+VW5Mkvl7hsgeMhfUZKr
+9Wc4GMQRG7C5XW40MuNQs+DwcoqY+g3SsEHabhBSF3KNJbAKaN3WPvccB9kpQuYRsoCQtQhXjgPVKGtm
+o0sxTsUoFZN+Z69hp/fFdxzGUbXJtZJMGcJ6BRLZnct+8smL02md4Ae5oQ5GS0gcfe4p2QcOeKGRZCtl
+QLNAutPX81s2+9NLcVkjEPaS80hJLpKWDWd0bp70p9PjtP/6GX+JdxDKCqQOd68fBvvy6htQSwcIQn7T
+4TsBAAAvAwAAUEsBAhQAFAAICAgAAAAhAEJ+0+E7AQAALwMAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250
+ZW50UEsFBgAAAAABAAEANgAAAHEBAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/FlowTableStatistics.java-620d14a2-a169-30c0-8004-91e0d32242af--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/AggregateFlowStatisticsUpdate.java-4d76a652-676a-33da-8fd6-209246dc05ff
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/AggregateFlowStatisticsUpdate.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStVE2P2jAQvSPxHyxOu4gYsqjSwu62
+Qv24wara9lT1MHEcx61jR84EGlX977UTwLQqQkFNpCT2+L15nnlOCew7CE6MFdSUXKfQKClypA1oQQXX
+dBvT2uo/g5kyO1ohoKxQsopavo3ns/t48TAcyKI0FnsSSr3lGo1tAhXdmJRfy9cKRAu6AobS6I42jmdz
+uq4VyhIsfgrh1Q7spVxojKq6rMwUheP8uIGiByqROpXu/Q4QnpNvnGF/7NtcqvQ56w9c1aJwFYZEXaF4
+Y1BmkoEv1bUdKVw31alnsCn5wTmLu1d0JYTlApB/cL17Oa5z+fw9HY+HAzImx1XEt5gEPpIZS4C0O5yQ
+yu2VJA2pdhJZ3iLXJq0VJ9r1bNlO+OtUYuQZo8DYLnphOS+AlIB5QH25cdtbnmKXHrsM2DduX7Jy5Xq6
+m8XzaHYfxYtbOGj/O1NUl6mbnl5a8NUrmA4HZZ0oyYjUyG0GjJMztfvcohzIXfwHOrlVN9jb6DFY8fWk
+i5z45PE//RPOdbZTd0h89lgehP2bZB/1/4rjZzDrcPCzs08X2tetFclIJjUo0h5i91yt35OnXiefMsud
+npvRJTOMJqPgAje41ObR7cPe9b/84zdQSwcI+MoPFtEBAACjBQAAUEsBAhQAFAAICAgAAAAhAPjKDxbR
+AQAAowUAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAAcCAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/AggregateFlowStatisticsUpdate.java-4d76a652-676a-33da-8fd6-209246dc05ff--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/GenericStatistics.java-588f7e08-0372-3f75-b499-427b31009a02
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/GenericStatistics.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSdU11rwjAUfS/0PwSfVGz8HtgiY5tj
+T+4DH8ceYrzWbG1S0ltRxv770rSuHQrTpZA2J/fec+5JmjD+wUIgSodUJSBXbB+JcIN0z2RIQ5B026eZ
+lr83Y7WCiKbIUKQoeEpxn0BKNWz7w95kMA5cR8SJ0ni6LioVpQUDV3GsJH15ZDH8kfVvNXSWabOn5Pmy
+lkKuhHnPGLKn5TtwvECcAFzThGkWp3QXR1SWRS1uvyqBPSNwRO9UJhH01ciw5E+33XYd0iYPIEELTkKt
+ssToIWulSdWojZmrVRYBkcZA3wL5qOvzqgTPEtuoBd9AzEjCcFOlvTaNfr+e7Ftz/aqEb0tcG+0iNZZO
+B73+0OtNvMG4FRZqa3zdY+gtJ+u6TpItI9OZyPteMw6HXhf17syAHRo15aI6jk4JlCfrOp+FcwVcFres
+nKyFZBGxV8zMN/N7Mr3oXlKugSE0G2ea0+g0KlfM4tiERisIDlp/zp6EgM/mdwS0ULMVFAEnwm73CFWQ
+63zl0zdQSwcIs1JmNIMBAADLAwAAUEsBAhQAFAAICAgAAAAhALNSZjSDAQAAywMAAAgAAAAAAAAAAAAA
+AAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAALkBAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/model/statistics/types/rev130925/GenericStatistics.java-588f7e08-0372-3f75-b499-427b31009a02--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupFeaturesInput.java-3d700436-5405-3360-81b6-13bdedbab3f9
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupFeaturesInput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStUk1PwkAQvTfpf9j0BAQWKhctoiF+
+EA9g1KPxsN1Ol9V2t9luicT435l+mEKCQRKnzTY7nTcz781kjH8wAUQbQXUGKmKbRIqVpRumBBWg6Nqn
+hVH7P4XRRUZzy6zMreQ5NbD2xz7axHVkmmljD2e0Wid5nZvrNNWKPi1ZCn9HhVJFEr+3zLLH8B24PYL9
+lYNUa1BWm03d/Ojcv6BLHcGNVhY+7TPEp3c1K0SKSVmYlJTKZ9jruQ7pkYWOigSIQrJB5ShtN+Wg0nTQ
+alpFvfAVpIxkzK5a2GsHyQS74KACBy34GjnJXGo1PRv544Hv49sV8FMlBmYLA/nwgEuqrLBvZbGh62RF
+mEhOJEpiYsaBzMHOy/j7JvyhjMZgNBQNO8rry76S/drZDq1x7Oh1+V8bSA+2eOU6X/VE6soNsSoBJ7FU
+LCHVKuI5W9yR6Un7S7nBYtDxjg7G63vtRPBSqe11J826fJfHFlBLBwgJmitDZwEAAJQDAABQSwECFAAU
+AAgICAAAACEACZorQ2cBAACUAwAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2
+AAAAnQEAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GetGroupFeaturesInput.java-3d700436-5405-3360-81b6-13bdedbab3f9--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/flow/capable/node/connector/statistics/FlowCapableNodeConnectorStatisticsBuilder.java-8c6a1f36-cff8-3386-9e8e-4b83a27b7012
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/flow/capable/node/connector/statistics/FlowCapableNodeConnectorStatisticsBuilder.java
+
+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
+AQABADYAAADSDQAAAAA=
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/port/statistics/rev131214/flow/capable/node/connector/statistics/FlowCapableNodeConnectorStatisticsBuilder.java-8c6a1f36-cff8-3386-9e8e-4b83a27b7012--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GroupStatistics.java-f0e01ad0-183e-398b-aae1-994c5d9f64bb
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GroupStatistics.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStUlFLwzAQfi/0P4Q+rcVm1r11DBEU
+n6bIHsWHW3ZLo21S0utwiP/dNJ10q4IKXktK7vJ9932X1iBeQCIzVnJTo97AvlSyIL4HLblEzXcZb60+
+LUpr2po3BKQaUqLhFnfZLHMxDwNV1cbS94xkTNn03MJUldH84Q4q/D1qrfRGue81ENyvn1GQw3bPNEnC
+gCVsaTZtiUw71twnujhmTL34dBDvT61EgRWwGqgYYI8T5zw/BucenA/gS+dcNcroxcV5NkuzzL3xuMN0
+nHjqWkzDoG7XpRJMaUK7BYHstju4OpbmAl/JKThsBuNh8NZb7wsHLt9EsK3SUDI/XLdeLW/Y4k83woVF
+IJxEP04gOosG624z9hrF8/mnxv/6y76WRoNjEmmUmsRexnu3fABQSwcIicFuuiwBAAD2AgAAUEsBAhQA
+FAAICAgAAAAhAInBbrosAQAA9gIAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEA
+NgAAAGIBAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GroupStatistics.java-f0e01ad0-183e-398b-aae1-994c5d9f64bb--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/FlowTableStatisticsDataBuilder.java-c340d246-63ad-33ea-a1de-0fd2b1bc32c1
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/FlowTableStatisticsDataBuilder.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS9V0tz0zAQvjPDf9jmghMYl8Bw6Ys3
+Mz1xKMMFGEaxZUegWEaS03aY/nd2bSd2bClxCiGdqRtrH99++lar5iz6yVIOSqehynkWs1sp0rkNb1mW
+hinPwuU0LHS2uZhIdR1aNpM8NJZZYayITKj5cvp8+mz64vThA7HIlbbusFYpaaoEM5HFAp/vmGUfZz94
+ZHf43heSZ/0Dvv1EL6/W7xAA/eTFTIoIIsmMAYcZIX5TCBlzDb/JAfCTa7Fklrvs4XvizVW6Vvm2ZwrG
+lIvM76B67uP8bwl11ch0ukZIHzsXJnQVDudki7mtI0wwPq2L3I8czzLMmOGDYZHxYFzHk0kddXLFLSSC
+y9hAotUCUrHkGaRaFTkKnKotFjyzIXxmUsTr7yAMiAwJziJswgRUVj4SJTE/OdrbnJuTVRY4K+RF80WK
+i4Nv6tkxZmlSHrcArN++yplmCyqqqViV7dyY2LlW1wYupeQpk6/r+t/fRDy3QmUgkpqzNjVZzceyJK3k
+ooo4Od5QxlLhckX/B2Q/aM6TniZnePpwhvlMuRMIBHc9YdLw08YIwQRUzWpraGcOTfQGyl0yDQ7fzWNi
+blcrrAlrs2l10SbzbpPXo8bWUTKKBDJ+7dVJsOkAMOI3Oe4zj+veOYEvB6fmG3zNRvC4B2VWWLhm5gRw
+kYS3aTDuczLghAPfDrS509xiXb4ZMzBTe6QZd1IXPuzNYvj5Wlqf9pCTy35IYUZQnTSQfjxel4tcBpSs
+P2Pq2V1qIMLDJGNy+/inWICXFclJoV6z5nrQKuoHW7JQkizfUoqzg0uWkFyQli5XgHl8ib90wiIe9Bqx
+ZvK/wApLljebo0VYvS/VhtzjZtUOsk0VOzqid4vYpfQhN4leta8+LrnWIuY9xdz3aBh2POwBROBonjMz
+f6tih3CqbSIb5HzBkYfn0+6swEXNTSEtrnYX1wuV+2T14jGOPDfR55AVUo7hJTyFE2eNYQO3O7dqZqok
++3OxukzwXwXeIIKmq+vLB16CegzRDCTdEHLXegtWZ5DWwLrBMEjDgj9Y947jiYaaKo8k3NqjEmDYvPnL
+8NvOUWXn2GR4sdliNCY4XTEh5O26cEAuWaOE7t492uK6o2JH1XfA0Q5zBkdOcdba8eP5W9rdYmoZDVF6
+I+0rq8t/TFT1R/8I6JquT9D6eV4OaJ9VMPLN0S+jbveu2i8R2tj+xXOgUrZtNzmV0b1iWOX2qqHafo93
+zUnIchqkwegJ9Iosg/RfdT1dpZ07g3U8nZLrurkl1Yn06NujcdjownPdxV9/AFBLBwjjWNo4yAMAAHYS
+AABQSwECFAAUAAgICAAAACEA41jaOMgDAAB2EgAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUG
+AAAAAAEAAQA2AAAA/gMAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/FlowTableStatisticsDataBuilder.java-c340d246-63ad-33ea-a1de-0fd2b1bc32c1--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/FlowCapableNodeConnectorQueueStatistics.java-4c076b84-6a79-3188-a1db-a1364c9eea2a
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/FlowCapableNodeConnectorQueueStatistics.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStUtFqwjAUfS/0H0KfVJa4KPhQkTHc
+9qZDfBw+3KbXmi1NujZ1k7F/X9rq6nAwhaWQkuaec885txmIF0iQmDxhJkMdw07JZGPZDnTCEtRsy1mZ
+65+XryWWyAoLVhZWioLluOVDPuCjse/JNDO5/Z3RGqOKhluYNDWaLeaQ4vmoSOpYuvcdWHiMnlFYh62e
+fq/ne6RHZiYuFRLtWMP6Q7WOGWktnrbi66ql2GAKJAO7aWFPHec8PAaHNThswTfOuSyk0ZPBNR9SPqB8
+1F0r80YFZBAppNrESIXR2mk1+Un3/iXFq0pa3/eyMlJSEKkt5msQSB4cybThmDuK6YFhUREsj626he/W
+Odof2iB976OJsrnY96ibC7KWGhSph+X229k9mVw0YSZyBIud4M9Eg6ugjdIdLskn6I7HB/3/9UezSgDb
+C2CVAPYt4BR25iBIgvbM0k63tvRZbV9QSwcIYKEOilkBAACuAwAAUEsBAhQAFAAICAgAAAAhAGChDopZ
+AQAArgMAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAI8BAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/queue/statistics/rev131216/FlowCapableNodeConnectorQueueStatistics.java-4c076b84-6a79-3188-a1db-a1364c9eea2a--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GroupFeaturesUpdatedBuilder.java-1b27e12a-9d22-3858-a486-69639dec3c8f
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GroupFeaturesUpdatedBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/statistics/rev131111/GroupFeaturesUpdatedBuilder.java-1b27e12a-9d22-3858-a486-69639dec3c8f--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/FlowsStatisticsUpdateBuilder.java-c4acb2a4-ad0e-349a-80b8-c97073bf9a02
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/FlowsStatisticsUpdateBuilder.java
+
+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
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/FlowsStatisticsUpdateBuilder.java-c4acb2a4-ad0e-349a-80b8-c97073bf9a02--
+------=_contents/model-flow-statistics/src/main/yang/opendaylight-port-statistics.yang-7accda23-6efc-3ae4-a479-e64c1aab740a
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang/opendaylight-port-statistics.yang
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS1VU1r20AQvRf6HxbdN4rdljbypaGU
+Uiil9ND7RFrJQ/aL3VUSE/LfOyvZ0kq2k9iQwcjy7s7TvPdGY2WqVgpmrNAVbCQ268CtcYH7AAF9wNKz
+x/fvGIUGJbyFUrCsdbpIU4qYUowp2apPsU7U+MDibtyk1X4dVVxitTT3vAQLN1Lw4EB7KAMazR63icGt
+niYZG9ANFw9hOEH3K+bEHXrK4xUEqm55ufjALz/zy6tslj6hifpO6GDcZgCjldVBrC988TzWSJ2HjRV+
+gIwb/dJh5Cu+/NQh99il0YE06H/EyK41yttWgWP/0K+1wXHvuwKUBYO7fuMr6gu8URelUdmg9O6h2+ct
+lnzxMds5GqMSvnRoO9mznxoDghyzTN2Zx5JuUKYScmfwUHieX7eNIj33zhNbYMGwsBZTwzUBcSKsRUku
+9DCwBcly8qKIJ/xwN9yMSRMm1ArFNp9jRVesUTiWPfPQ1LdY545WjNaTja/LHcWIX/21caa1qJtXQqRE
+uiZATbWfntt7QadqbIg6SC9SUgOxsS+Ll2gl1CYM85z9/fONlSCl3zabLVkjAqeVWbX+SLmT7vshJo1T
+G8cIiUUkNiKx2hnVdVPcSMmhtm2Yi9GxTTsnUJ9wejn32cUwbTgGcrx1QFf90NStuhGOK7CHNA+uSIYc
+h3tw4qDGUzVf5ftLQjZIw24m5RsoGUMKqOdiYTVHixH7j+2/1XR6Bvl0qlcntve5FuX5bxPHTAmd8FHo
+mcSJDa2Ng382HU5qqqOG/6KcOKvjGb73whBSdBnTalK3Zcw+u5AYt2LDsj0T54PnbRvjXO/nnurU0eOq
+9G6mxU/ej/kfybnDY9eVqpUBLdCxY/1JBOjzH1BLBwiJ598qigIAANAJAABQSwECFAAUAAgICAAAACEA
+ieffKooCAADQCQAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAAwAIAAAAA
+
+------=_contents/model-flow-statistics/src/main/yang/opendaylight-port-statistics.yang-7accda23-6efc-3ae4-a479-e64c1aab740a--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/FlowTableStatisticsUpdateBuilder.java-cef8e61f-3458-3c23-8374-e9abf8cdaa71
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/FlowTableStatisticsUpdateBuilder.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTtWutu2zgW/l+g78AYWIycSZS4aaYz
+bpLeNoMNtp0CTWcW2G4R0DJts5UljUQ5zS767ntISRavsuTYaTuoCjSJSJ7Lx3PjoRIcfMRTguJ06scJ
+icb4JqTTGfNvcDT1pyTyFwM/TyN1cBLG1z7Do5D4GcOMZowGmZ+SxeBo8GBw/Pj+PTpP4pShIJ770zie
+wkT4dR5H8CMMScD8N0Cf1BM/4AX2c0ZD/0UxgcZRZht+hRPb63/gbGYOzTGb+c/p9CJiZErSNnJdzOe5
+0OwlaFUvWAefFEcZFpqU0AwOj/y39duL8br0abQgEYvTm4Lw4c+DX/zf4jFZn+KKHZXHcTSW58xx4v8K
+o2/54LNofLkcUvbDKg6L4zArBBvRaEzh598xw69HH2ArNglOBOAIhF7EUQS049RmRC223CLxs3w6B4aY
+byms5v8Odnfv30O76A0JCF0QxNFDAj1UI4fyZIwZERNfxeMcBiM8J0Pxgj8y831OYl+Q2K9JiKmXwYzM
+MUrA1uu17zzAZShTGHIKQ0FhWFN4AhjRDCQ/fXA4ONofPNgfHPetvPYLcQ+aBt9z/gf37yX5KKQBCkKc
+ZWhpHLVl/C5mP89pOCYp+h+HjAudpHQB7xHfhxOnTZ2hq0mDvcmExNaGfLOew74RHKGreZySNyQJKcm0
+yYpnoiumOao8VSgeFHKKQHZSB5mzM23tVVqGOplC4a3oiuqkBU3FUoFepFmuugT0Pqk1fcFBP3mCyCcG
+m58h2TxPNhsUnDt7drb3hfgiLLFFpygi16jMDSdnXr/GrrDQVbbp9bl18gWfUfGz2/It6a2bPcLpdCkp
+f9iMZr7bTQAYWAFyMCdJgZVQ/K70tqbLV3nIaIJTJnnns2ucEofKknuXStLsVf1uqVW9QvHVGhglGnwl
+YLTE4GvTyFWtOMSnksySoPUEJRrWc5WgKevXTTfnBDTCGenoZXxJOzdzmbCg0NWGK7b2Ldegria3wrqa
+bAebP3SCPD4L0QiCWBSQeOIG/WKehAqk/GmcDSmT/3+K3BtVEOUyPFYJC5UaE4QgrkyRVfusmVRR5vFn
+95IwNKEkhIQ7SeM5mkLZF6FpGucJ1IjcRHNO0kd/4BBQr/5GNFvihACoOBI/JnAYia/5QnaTkGxYcUEn
+eXhW/xHSsztKMCcHwOsWjF0h4LZ018kcW+S5gtWBtHvLt09BRjznFlGbSywOQPUUNkvj6wxdwBF1isNn
+pfGcfwpIIswYfK4wONmuotKYFsLihCEVFHmFLkXERQzDhe3+Cqbr1ScwI0CPyiqaZsKMQRDwoAkOFU/j
+AYBrI/n/HVmpEUlWB2jvrkq0PseyfSoQQMooszQnZijaCN4u53TAKZJGV9ycPCpYtOxTs9Mz0MY5u1PZ
+XW7COpHMsUFqAbGehXcURGDprlK+EiBb4qdXUxtE0A5cY6XWEbudeq5FPUgjouJxZRJPXYBQj3xKwDHI
+uCxNhujdHQXMvQ1Fsa501rH/DfLQSb9H/4l66EdjX0Y5Q9c4GyIY5HlandBUtZZpf1WTrTlVyaaVEgYa
+ru7K2Y6aZodOiyI2RmYPz0Za7eeZPmajbGv62WiX7bsyb9ko0abltiafmYlsZPVOoMHh6WWeJCnJsn/h
+NIJaMvN6eRTMSPCRjHt9RYqT8y/cJETnXGuZt6f3Mc/Vjt5bqGIVXES60CagUzjW5aF5sGwR/3qyNEhQ
+S8mEpIQf0AIcRTFDI4J++/3ly52excukvfLO+4rsPMwbsq7bpkBZk3uu8m04EuRdWxlizWNDS77wFq0k
+rofs72Y8cMmqVjnbk06NGmpQMWXj9ijeoh2HEdY3BegqiKHKSTGFA1upAjeSP/gvRg2gnb3EtYPl9MWf
+CRTKnnEvgVI0tF5NeH1DyEqV1AcRGQiYeZKw9vlijSqcVqpYfMXyp1zFCEJWbi18+ZKl/H4O0Jhj5vUu
+ouIkLHQeor9le6gqbvhffm+v2II9K0h9fT8+W33fXkG2ts7SLte4X/IMM7TNcobG7AaSRBpH9L9Q6rlb
+a6Vf+OJmz2k1nThXj3Lx7peMbNqPSt881ZaMqisbi8Xxpxz38XhcOAdoEWdk7NXU/X+fv3m9J6yqfun1
+Bj8/fPjTo4cPDx8dPTr85fh48NPguNc3LKJ67Oov+YufVindfmFml4Y7xnUjHYS3sq5xxVzayZg7C6DW
+P7YiySWY3iTYkoxgOo3Vype+dTVqpS90DavIYW6XUhUluVkV7SFXC966ke02EZWOZymrucM3Xid4nKFZ
+q6mfA0xohMNVHz2IOwx+y0C4fg0T688iJOV0g7uzDeUnnUpoMuaRMZ3gQMs6EqJ3JFiRiNQyXAKt3J9i
+Y279VYlJstX3JeayFl+amIuML0YcGrb7dkRe/P37ke7fj8j4NUeOlUnFuFau09rmrpZrmp2ul+tl3a+Y
+67VN18z1rO5XzdWTXVMWzIprZzW5ZFDPOo43Ab+jPhyaA0uJNFOQPkz1yTxhNzaMq2eUEvzRMSY4Dxyc
++VN4M5D3zyOW3nx3zso5SWUWyiYTDtIlYV7fp5CXsDATPwKMnNvTZo+/w17yzeAUHRIWR9zghUv+k9x4
+fTg+S92K/uMS1m7+MCYTnIcMdfBDNSQb5rDiYKUUCE9fL0ia0jExCq3Ndcf507ZDrsnaRtBODXRZFnuh
+0pF7lx67zNxV8nRk727Dy8zoLTh079TLnG3dercQLTr3zcL+FRr6/OnU1OfPNhv72n5J29upwV+SabON
+vB08gwD3AqzHtK2iOOBzoP6c84x4NNCvi2EQDInH1VOkDy4HiuW71Ysfkec1FZwV/E/QIe8jO2f6teg6
+jI2slbpUYyaNrUteq181BsrouiyoSZeuTUyrhjW6yuiaLNS0qjJQzLqJvHCEgmh3Q6+uNMifOQ7lu5/y
+87N49MEaG3hVwCW2jUtiWW4fLFcNQKQxtpTEbPcsFmoQAkScA7/dEQL69Ztbkm9uKcVsJnriqz6LBZH0
+aME79i0c39HsF4ybjqqui7AWCFhQ+IxIyD8unng7DTGotKhVst12SwR01sDVDJa8ZHvwyFFTBUQa2QgE
+juDaDIK6aHswqLFdBUIZ2wgUtLX+dJtKU11Tuhn1HGmpWVN10faUVrOiqr8ytgko7OmzEQhlydZgUHsj
+MgjKMfmWENhz7NqH1+KuHrG4+MUse/Wpy+7p8jaYl/+uWV7Pfc/yzij3q7pkQtOMmZ8xdEqfTdvMlwoe
+TiOoJHBaQbHtjtXLG++En++83h4yVBVEzFf6SreCp1aS2vqGDKwvXpVh/yJ4Siq1Q1BO2W0wa59dvyHU
+FKXa4aZm+DbIrcjL3xBctCVGtB0w7dP4N4SRolQ7uNRSogVybiiaYHBD0EJ9TQp9hVwJmEprs5WCQnxZ
+kzlbAdrSH97/0PfrpG5WCqJTAP/9H1BLBwgt5zspBAoAAIhGAABQSwECFAAUAAgICAAAACEALec7KQQK
+AACIRgAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAAOgoAAAAA
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/table/statistics/rev131215/FlowTableStatisticsUpdateBuilder.java-cef8e61f-3458-3c23-8374-e9abf8cdaa71--
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAllFlowStatisticsFromFlowTableOutput.java-0eaf73c5-5928-3848-8fe0-c89d63f83193
+Content-Type: q7/binary
+Entry-Name: contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAllFlowStatisticsFromFlowTableOutput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU1FPwjAQfifhPzQ8AWGFyQsM0SxR
+fBGJgTfjw1G6Ue3apbuBxvjfbTfikMQAxi5p17t+913vu6bAXiHmRJuY6pSrFbxLEa+RvoOKacwV3fg0
+N+qnM5J6SzMEFBkKllHDN36/N/CHo3pNJKk2+JeAaEBlwFBoVUb0/V6fLipruAXDj1Cg1jIryZhOEhvq
+8QGSM1BLoVbCrjeAMFu+cIbnY8M8TrhCWMpjxOeXmE6sJ1Sr+bdvCum9/bNM7uu22/UaaZOpXuWSE2Uv
+HxQGN/YpPEfhVRTFoTlb8wRICriuUE9Nm16wjw0cNqiw1zY9kVmJxhc9v+/1Bp4/bMUcPZDykMeLjE5K
+Y1Gh7qnndI5pjs8urW69luZLKRgRCrmJgHFyxzGU0lWnKs3EhnCWhQswK/AWbgd/Q3ubrNz8VtFO6T7s
+wJ25apCdYU/1y/8S+8RLXdVrH6X8ZSq74hQhGYmEAkmKd2DncHpLxmc9HsoMB+TNxrE2aHQalf52UyrW
+aI12vfnppi9QSwcIjV5sIIYBAABzBAAAUEsBAhQAFAAICAgAAAAhAI1ebCCGAQAAcwQAAAgAAAAAAAAA
+AAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAALwBAAAAAA==
+------=_contents/model-flow-statistics/src/main/yang-gen-sal/org/opendaylight/yang/gen/v1/urn/opendaylight/flow/statistics/rev130819/GetAllFlowStatisticsFromFlowTableOutput.java-0eaf73c5-5928-3848-8fe0-c89d63f83193--
diff --git a/tests/com.cisco.yangide.editor.test/Contexts/YangIDEworkspaceSimpleContext.ctx b/tests/com.cisco.yangide.editor.test/Contexts/YangIDEworkspaceSimpleContext.ctx
new file mode 100644 (file)
index 0000000..832cfd5
--- /dev/null
@@ -0,0 +1,653 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Context-Type: org.eclipse.rcptt.ctx.workspace
+Element-Name: YangIDEworkspaceSimpleContext
+Element-Type: context
+Element-Version: 2.0
+Id: _r3H2sBPZEeSaxLxF-fnitg
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/25/14 3:57 PM
+
+------=_contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/SystemBuilder.class-c77b54b4-8d88-3b55-a28e-0265d8d41b08
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/SystemBuilder.class
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTtV91zE1UU/920JSFNm7ZCrYiYSov5
+ALYFbIGEYilFqqEIKcUqWm+Sa7K42Y27mw5994/wwUdnfIUZmA4yo7454x/leO5N3Gw2YXQ66UwfnEx2
+7z33nN/5uOecvffPv375FcBF8DBCDPcsu6JZdWGW+a6hV6qutsvNilYRprYzr1Vdt67xUk1o4gmv1Q2h
+laya5uw6rqhpttiZW5xbmLuiFRThRkM3ysIOY5Bh7DHf4Zohoe4WH4uSyzCyXbZqXDcLgtulKrHkFU/D
+1Q0trztuluFoQa+Y3G3YgmEmsJzLtyELrq2bleySFNmuWo67zmskMtHNwnBk27AquslwP98PV1uEvMQk
+9BhvVGrCdLmrW6Qj7jP6Dq9nGTvXSfF7sWJwx8llepvlWpbhNA0s6maZfNGWfapyfXGmuW8Ux6Xs4bCC
+tiunm7q7xDCQTG0yDK5YZRHFAI7FMIbxMCYZxtsRvc2dKkU1iuM4dhQMb8UwglG5D7op1hu1orA3eNFQ
+uWGVuLHJbV3OW8RBt6o7DIU+utEqAvIkXhHuzY6Mn0imunP+TBexZ6ZL796LYQhHGIYJ+baX9cf+AfAL
+SPYzMRxFlCFC7PlmDWwQb9+rQOpKxzCMWNPp5Y6SWEsGUz77Ghv+JdkoVj/lVq9ePRSZ2uVUbmOV6Cl6
+hqHRVrWX1wxDVLixbFca0pzVJyVRlyZFMM+Q8RuZ2Niti4QtvhG2MEsiUeKmabmJokisP8jnp6M4j4uy
+DC4xHE9273lqcxgLuBzGIjXbjq4TwxVcpZKizZEJlw8252yqmxRGjuHSfmJNrd3fFaVTVLRdWcAw2VmT
+xNeqy8ne0SW3Ci4vfUsetRjjTrDGRDJYYv3J+GB17wb19Kzag9E9tMONBnk/7Pj7QKVXShyI/ojjNZSf
+k/3vJwdjdJyXy51Z+mN3Z9pfYzoQg9l33T3m/7OCZ8VBxFy2z/UY7uJT6pX1BvXKyz165X/qngwL+/3I
+/XBYt53h+8NgCPW/otwwhvU+nWZa0GE8ZHjU97Saac7WiD2KTWzJL/jnDM/70zk7M7j/kD7rs/JAHuGl
+knCcmTmG8kF4kAreoBAtWA27JG7p6hjfwX1e8tIlbM00ha1qRThSwDMZ03Q2HaDr7iBC8uxMszDNQojQ
+nw7HakwHV/Wmm4O3HicqkzcOek4Q5QahMHqPpffwRvoVjm/t4c0XmHqmuE/Qc1TpGSdNcfpN4G2axZoy
+OIl36M1wCu8Sd1NDQuFqRJU8Q+nnmH7qgR1RxEkfyJAHchozLaP8wrNB4RM9hd9HsodwKih8qqdwBmc9
+888pEIecDtH7ZOYPjLzC+a2JuT1c+I0gpzIv8UEIvyP7VIW/HaLTNJuh8RmlY7Ip39IhR9ewRLque/ol
+5UMaLdOYNkHu0Q2seIbcVIbco5EECqczLzCdfqp4pc6oImfIi7M+fWFPXxiryue2PkmJqODcwketYF33
+w8+m2+Fqws8T/IXXwkcV2G2s9QJLdYEtEtjl14LFFNjH+MQLQF6BGuSvjO6oiv3Zl7gzgIddcciR/DWF
+nWhye9ijrbjL0YgK53XPArl231srEI1uknjQcucS7adci77C5laa7eGzYDYt+7Ip2tQ4FsEXeNRCmPWl
+4lRQOK6EQ+r/pXp+hW0FxKibMnyNE38DUEsHCBmtxQzeBAAA0xIAAFBLAQIUABQACAgIAAAAIQAZrcUM
+3gQAANMSAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAAAUBQAAAAA=
+------=_contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/SystemBuilder.class-c77b54b4-8d88-3b55-a28e-0265d8d41b08--
+------=_contents/org.test.yang.example/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/SystemBuilder.java-36f21bab-5c99-3b37-88e2-8ffc7f7f6cd9
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/SystemBuilder.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTlWFtv2zYUfh+w/3DiJ7kLhBQDNmx2
+0madgQZI24d02MMwBLRES0xpUaMoN8GQ/z5eJIukaMlJ7GHAZMA2yMPv3L5zeOwSJV9QhoHxLGYlLlL0
+QEmWi/gBFVmc4SLevI5zIcoYJWsc43u0LimOE7aOq4dK4HXM8ebsx7Mfzn6affsNWZeMC7hDGxTXgtD4
+mlSiWz+AknbhmmWkCGn8gMoRhYIxWhnVS1KkRH5e1tkaFwIJwoKg71GVG2DzKuslJQkkFFUV3GiLfqkJ
+TTGHv9U+yKfkZIMEBhWC+Y3gUs8F3KZsjUhxgxFP8pkraGTgNmeV+IjW2NvWHsMtbRy3t6Rp83fKlvkb
+wPdC+luB7dL8EIE3bl5cnB4PGpCFDOdQ4K/QhH5+EU1n29Ca8DuBj6Yq9Gr3EUySLEknBxkWv1pZ6A6q
+h2NR8yKYp0fz4ZpgciYh3zdZC8N5OQ1BmfxKJP0lDGMn38F4e1OXJcdV9TvihbSoiiZ1keQ4+YLTydTR
+M18cnyOwUI7Y8JHh58LN8eeHEjuOkhVEvgCcSybUlDqC6hE5Z181Sa4oxRmilzyr1dHFfYJLrXVi2wAa
+jeMV5rhIMCSoKJiAJYaPv11fn0ymsw7/sRf8aDF1bJehET1bp11ydlMVKo+BDj03iNZdUDozRE6q2OGl
+rBAtPOvZqmSHWOtbsyVvw+dhG1oyH06/obypgGHdugIOpBilaYCi/0IL7dXA8Xqqo8qpIB1Ph9Bl3Sf0
+qQswFvFAtGGpwh3sZ6p0jdCVdCRSUP0Cau64SlmQwIoUiDoXrzoKRAVCmdmudvewZZBJ8CGjK3vAVasa
+p1fyja9Q4l0ClseH0x3rGLgdy3K4iZoJ1+gI0j+yYxgJYPfHElvo/zaa2L5b1HYbz9J8Bi60QItvhOPe
+2DILHbZ6s3WwG06Ch9qmap1ohpCQuN8zLimN2pO7moVDzrefNphzkuJege4/p1k1tYvQ1hW+j+6xUc7W
+GKiKJ2obmvZsTX5dhdXsMf0Nm/OfHgrV86TBUD3HHA69RFj5etKQ2MDskx9SCMhlu3nH0gAtTSdWMrL1
+6Nr//rVnrtqUDKmpkLv+5nbDHH/VLnwHUeS1ozbib+AMfnZLL+4M9IM1qKBrWR54u/Fc4Kateah69ZmQ
+7iXgAjtpH4LXRDGgTyfCkjGKUQH4rxrRKtJ/UVBVk5+WdzgRwJZ3wdpRnVtZHNq3zBLcmaobw3wwCTJY
+ew3YSlq4B5osEd0HJK9PtIFxt/JCeGtCZCKXN+85RN3aVCnz60QatIPyAUt0MBSwd2ufDJwZ8SDgxSNg
+KSeVRSduwTUkCFjw0sDpMPQLczgEW/njub9tCa7r7fJB3PbaxrDPRvh4Dptu5Xqr1w7haridDTrsHDma
+204vdZx3BswXhiDc8543NgpmvvQvZ7Pujf7NLwhnrzdtb4fqUk1g0aT5ZfuHU+nnvcnEO+b2hREVp92t
+Ow68rbpxUE3ZcUTD7FE4mwSjoA6X9N9GVf9W9nX82UNtyNIKdvnuU0df5fLtH1BLBwgvrdJkfAQAAFwZ
+AABQSwECFAAUAAgICAAAACEAL63SZHwEAABcGQAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUG
+AAAAAAEAAQA2AAAAsgQAAAAA
+------=_contents/org.test.yang.example/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/SystemBuilder.java-36f21bab-5c99-3b37-88e2-8ffc7f7f6cd9--
+------=_contents/org.test.yang.example/target/classes/META-INF/maven/org.test.yang/org.test.yang.example/pom.properties-1973e0a4-0d43-314a-b7e9-eb1f5d0a8948
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/target/classes/META-INF/maven/org.test.yang/org.test.yang.example/pom.properties
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnR1jk1Lw0AQhu+B/IeBnrskoREM5CBo
+taKp0OJpLutmumxNdpfZSbH/3qgHqeD1eT94FvfkibVQD29neNYn8rDxQnZmLng4BIY7M7iYKM8Wa3bw
+OA1Q1VDWTX3VrK6h277uoSrKVZ6diNM8agtVqHK5625edg/bfZ5ZDlPc9G1gq4SSqLP2Ns/GilTkcCQj
+nR7pMlb0occ40EXtKZhvrfYWG8QZ2oTIJoog6kmWXw/0Y6tS/65cT4j/3GoWd9BG/nr9Nj4BUEsHCNJl
+TfzEAAAAHAEAAFBLAQIUABQACAgIAAAAIQDSZU38xAAAABwBAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29u
+dGVudFBLBQYAAAAAAQABADYAAAD6AAAAAAA=
+------=_contents/org.test.yang.example/target/classes/META-INF/maven/org.test.yang/org.test.yang.example/pom.properties-1973e0a4-0d43-314a-b7e9-eb1f5d0a8948--
+------=_contents/org.test.yang.example/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/Login.java-149c88b5-d662-364c-bcea-1230f4865ef3
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/Login.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStk91qwjAUx+8LfYfQKxVNu10oTifI
+2J1uDNkDxHoas+WjNMeijL378tGx4c0cmMJJcpKT8+v/JDUr3xkHYhpOTQ16x05S8D3SE9OcctC0vaF7
+xJqyUgGFI1O1BFoaRe3JIijaQFtMinEx7RyzNBGqNg2SN9YyekAh6UpY/PFfLxeVhgtNXy00fxyPxkgb
+E22F3gnXP+yF3D1X1+XanGlwKczywBVoZFsJlwc7AmU0fXliykf5Lx8M0mQwyNOkPmylKInQCE3FSiAr
+r1WaENfgiO5UGyedDvOIvhhG7y+g+RULFiAWafIRcWOuDtUiQ9dVQjNJwk85u1w/kvt/KUHLBhhCL/Nk
+d3l+zpZHlGyY3RbFZFSMR8XUTcJVyvqRaPaNFvQkoa3BWv9UuGhBE4ae1xepIiGUWLcuTKdwKIEfbLBx
+9SUcsIvv9WdxJVr/NOb+Ai/8Hj8IG9Lk05svUEsHCCyF/iddAQAAnwMAAFBLAQIUABQACAgIAAAAIQAs
+hf4nXQEAAJ8DAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAACTAQAAAAA=
+
+------=_contents/org.test.yang.example/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/Login.java-149c88b5-d662-364c-bcea-1230f4865ef3--
+------=_contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/$YangModuleInfoImpl.class-294aabd9-0b31-3782-97da-bd133acd2c34
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/$YangModuleInfoImpl.class
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSlVVtPG0cYPWMbdllMAuaaNAlOSlvb
+1F5DUhMupaUUWrfGSDGi4nFZJmbTvVjeNQr/pe99TXoJVSM1j5X6m6q038wutrFWeSCW7Nn95rudM+cb
+//P2z78APMS+ggTDD167qXst7p4Y57bVPA30c8Nt6k3u6mdL+mkQtHTDdLjOnxtOy+a66Tm6f+4H3NHb
+/Ky8Uq6UV/WFI4rZ8046Nq+6T70qeSpIMYw/M84M3RYJ94+fcTNQMMxQiS0ZeJ7th8WPLffEovVqVga1
+Wm8cbNW3dxge166XZJ3hpuW0vHbAT0KrT5aa7LMTWLbe4AH5jDSspmsEnTZnqF7d3bhu5U3Kq26YtuVa
+wSZDMpc/ZEhteydcA8NEGhncYBjekPsjZJpKQ4Eq2rNcXu84x7x9YBzb1FKm5pmGfWi0LfEeGUebPKi6
+fmC4Jr2t5fLXbVRDEhMaPsBdBXcYpnvwtz3bplO0PNdP4x7mCRB3WsE50UIIqOJVHgWI+2mMQFPxIcO9
+vZ2DrWK1vhtWF7IqhlIqCYOGj/CJgo8JcE8227bhU60c8gyTBPAJ971O2+RbfiNoc8NhyOdqPXcyEqD1
+qBHL06tuqxOErusKFhnme85VAtM07EZgBHznuclbApiKIsPyZZnsu1vOWn7WsXzfEt0XoIszLBNjcS0d
+aljGIwUPCUhMd2l8Jo5/yLQ9nytY6ffa73ZHgglOLZLsUfzhvv/ckkiH/Yja6VgaGcaIMvPHPaMVKU+h
+g6kbDj1NXWqgH7qKL0mdfdyFWn3CzyxfMr7NoC2XyyvFcqVYXmVIR/n8lmFyFbskHQFoTZeQShGkUg8S
+tUohIZCGPLhLdczm4rVAFbuk+hoq0GmqxAAN3g3fD6r6veZfC7vbtQRtczH0l0QtLNHgJOk7hARui0uA
+LuyMmCOyjdJzAmmyqRjDDbLcJItONvEZfQ12dIHxXzH5UjpO068mN9O0apiRVlCyWcxFwQu0ik/qF0y+
+6EYNS+tENyIhLqgo4idqL0lroXCBW4U/cPt3ZDMs8+AVFmqLf2PsNQpHmU8vUHqz+ApLPyO191LcBTTh
+OeI6KfM/kLCmkKK3UepmkvqZxS3yukNed5FHVtaekdULeIxVWifJZw3rlG1DRif/o4CEAqbQeGFXofS0
+9zk2o06LtAocycwXg9AWZPp0uB2lZ9iKCf1qMDQfG/p1TOjOYGgpNvQbfEteVXEI9FaRSZ7SvoA+d5XZ
+imT2uzeLL2SGaamNlPxLV/EI4iKZwUofdXNRFRXjfdSpYP9iRrBGIsc8eYbKqkV6CgEMFX5DdhDCRh+E
+oS6EPelV/x9QSwcIZD2UNd4DAABgCAAAUEsBAhQAFAAICAgAAAAhAGQ9lDXeAwAAYAgAAAgAAAAAAAAA
+AAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAABQEAAAAAA==
+------=_contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/$YangModuleInfoImpl.class-294aabd9-0b31-3782-97da-bd133acd2c34--
+------=_contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/SystemBuilder$SystemImpl.class-2714d454-8c11-3476-be27-fec9e6343e28
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/SystemBuilder$SystemImpl.class
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTNV/tzG9UZPVeSLUXZJI7yAupg4YZg
+S04kCigQ26FOCMRUzkvGwUAwK3kjrbPaVVYrNy4UGsqz5VEKtAzttNNpw6NNWzqDHUJmWn6CGf4mBjh3
+d/V2hpmOM4NntLv3u/d7ne+7515/+fWn/wVwB94JIyDwmGUXU1ZFM+fVJUMvlpzUkmoWU0XNTC3enio5
+TiWlFspaSjuvliuGlipY5VR1qepo5ZStLab3pTPpe1I5V3Cwphvzmr3LG01yeRghgb4FdVFNGdLqsfyC
+VnDC6BV4cO38CmyYm7fKqm7mNNUulOgy6/qsObqRyupVZ1RgXU4vmqpTszWBXR3TY9lmiDnH1s3i6AGp
+Mleyqs5RtUyVWPcSgd45wyrqpsDJ7Fpk4wuy0iatK2qtWNZMR3V0iz42tQQ9pVZGhdjTLmnN4pChVqtj
+ydXDcizLqHoB5nVznrmkJlpcja1JMl5piOOB0e9HFAI7ipoju1KTTrT5ST7sM2qB1d0yNNwJHter3dI1
+jkogdMia12RxdVM7WivnNXtazRtuw1kF1ZhRbV2OfWHIKelVgcfXMIruTSsbe0w3deeAwMzQ2rsaHZ6J
+IoidCm7CzQLBoeGZMOICm5vdfEStltjRUQxg5zoI/FDBJvRFcStuC2O3wIk1D0rBEIZZB7bIfW1UEqs3
+QZNMZERJBWFEZER7FOxFSmA9VY80+GJrW+/4jCEVb1ewHopUvEPBnbhLIELFrMcj09RacyaRXvcp2ICN
+0us9CvaDJY6ohYJWre5KC8xflyJ30NV6jOPeMNhTG9omFPwYE+y4Ss2ZMAyJd4fi8IxAOO9ZFchdh1AF
+dncV+RpHguyPiTZanhzqYo5r1PA7CI/W/zZ2eP/+7wVbdiU1Nn2Y8mE+w5gUGGxOTxqGVlSNCbtYk+Ec
+Pl/QKjKkCH7CbdIaZHx6qaLFbe2MZmtmQYsXVNO0nHheix99KJu9JYojmJKkcFRg21A3/sMzsoeOKziB
+k6QNVkIWLtt5uxgd7haFMS1w5/8DLO8SrcewzIBMtcphsb2dr7nO5+ztq0PJfZBz1MJZtri/MFIi63nH
+ATlxcj1OYy6MxwU2tremgkfwaBSqnM23Xa88oCS5zkmo5gR6KrYu6UiwZr22Vq0ZBK1XO1dTjWoHynX0
+HpH6ZxUY2OJxkxu0jMZUUIIuPZtyjSl9EKCglV9ovyD5pujeckpy10Ycy4stjJ/yHO6M2N+IUSxiZwQ/
+I2ZeJ8YfbbvXjcsFTyn4OZ5mEmpFllJgz2qt0iWq73Vp4hfSxIUOzVWap10zgl/yTjYSb1wKxyN4npdE
+StxbIIcvkiBG4q39Mi4xelnBr/BrhryoGjWNuN/QRjeHLO6ggksBEbzKWp2WQb6uoCaPlRuvGZDAx9eD
+uK/v3UKe/QJvym3+A4FozqrZBe1+3b3xtCntlWkT8EnT1Gy3BSVy0aYppGkoyF8PQojJ05jf6/ifTQBR
+jnnI8jsmjz1XxvtDY34zZBAxbOG3J9mKbXzvoVTwHYz1fOSKt/PZ64oewA4+FW8aN+BGd55JUCJVL1Aa
+4PuuxGX0J65iYPYyblnGYCK5gl3LSMj3yDLS8v2jZWQSH2Mw+QnuvoKxAP7TcHYz8wCOMaMpRnycTk/w
+DnQStyHHy8K0G8R2z5EfhPw6iENu5LzCNDK6zw0r5WfUQ3+Jzpwebsmpxzcn5GXGz6lVOd2pfHpVZV5o
+VlHOdCrnV1U+jPsb4T/gGqn6qPYnv8CGqzgyG3vwMrL/c8G7gmMBfIactB1ybW/kapCiQtD5fbYFrP4G
+WP14CDP0darhX0oe5tesW1mxkZ/kVy8LsZXq0ujZvoGx0HjfQH9JAvkFwsH3ocjPK3hM4In6TNqbicrP
+FTzRkGea8swKCg35YNPS4BXMS0v9l9w4ms1Q4egcUbLZCFXsg8P2qDHDRTe/uBeen1+Q2Ws4426KMyjy
+F3DzmkLkG/Z4MAwhWBbxDTeLPwgIcZzj3u8Yt66neZ4DPkJFH6GLieR76AldYqV6gpcSK1hgpy9clIPk
+ZxBTHm7KCF+fYwdX8GPEBbAcwLuujoufXJH+HNu88YgLpFWfz3jzmfp8ZsQFtFKfH/TmB+seBkdcYM/5
+HkJNbG3WHXiSOD1FlJ8mXTxDqrhAHJ/lrn6OWD+P3XiBlPAiW/ll3EsKn8ArvKK8Svxf47b8DebwBs/C
+NwnGW7DwNqv0e1p5h1bexUv4A17HH7niT/gL/oy/8tms18VGP15kJFVCOUBfDmVevUhf4R7lK2wl5ps3
+yb/NXFNr7MxlrpN9PXsViySa89lkbGkFT55KSlRX8MypZOzZ+jjtfsSeq48z3vwL9THxeUnAE77iClfw
+WnPD7iU0wHtsgPfJSB8w8A8Z7N/JNf9gOJdwN/5JcP7FFvs3+emjlk036ycZIVgHCZfoA6F9w09ht983
+vYnkZfy2yYAeQRxz7QTc31vu8238ju+oyyq3EuibvgVQSwcIFn83aj4HAADIEgAAUEsBAhQAFAAICAgA
+AAAhABZ/N2o+BwAAyBIAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAHQH
+AAAAAA==
+------=_contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/SystemBuilder$SystemImpl.class-2714d454-8c11-3476-be27-fec9e6343e28--
+------=_contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/LoginBuilder$LoginImpl.class-ba5a67f1-1fa6-356b-a9eb-6cb09519d050
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/LoginBuilder$LoginImpl.class
+
+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
+------=_contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/LoginBuilder$LoginImpl.class-ba5a67f1-1fa6-356b-a9eb-6cb09519d050--
+------=_contents/org.test.yang.example/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/login/User.java-a4b5211c-8b0f-3026-98e2-03126304d708
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/login/User.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS1Ul1rwjAUfS/0P4Q+qWja7UFxOkFk
+gzH3vcH2GNvbGpaPkqRiGfvvS9oKImNbYSaQm6Q5955zbnMSv5MMkFQZljmIhJSMZmuDSyIynIHAmxO8
+NibHJOaAYUt4zgDHkmNdagMcK9hEo2gYjXcXTGZUTHyP8lwq8++Z8YsGdQ3lLxWMlEzXtVZUJNTGxZqy
+5C49CrXlH0R/Q2leZByEISsG7cFXiYXSlLZDWxVcCvxwS7hDuRn2er7X64W+lxcrRmNEhQGVkhiQM9v3
+kB2wNTaprg+NldNK9qxfX+6JmR6l67tC+8Knze8w872PWk39plGiDTE2pFQQhirNdp3fXKDzVkbhWAEx
+0Akc9bMwPCQf1lyDfnAaRaNBNBxEY3soLLegWxOa7JhVbrtN5bjbPBll+4kyMK+cLRjRutOd1J9+h1wW
+jDmKLSA/PUfoEUyhhEb3inKiSmTNRTJFb9YTtKTaoOcyh4PcTRNcchuq3L736ZYvUEsHCLXkvPFyAQAA
+YQQAAFBLAQIUABQACAgIAAAAIQC15LzxcgEAAGEEAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBL
+BQYAAAAAAQABADYAAACoAQAAAAA=
+------=_contents/org.test.yang.example/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/login/User.java-a4b5211c-8b0f-3026-98e2-03126304d708--
+------=_contents/org.test.yang.example/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/LoginBuilder.java-a32e95a0-c7a2-394d-8415-d81b270b0db9
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/LoginBuilder.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTlV1tv2zYUfh/Q/8D4SW4DIsGAFZ2d
+NFlgYAHS9aEr9jAUBS0dy0xoSiMpN8GQ/15eZIuUGClp7AJFZcA2yMPv3L7Dc1SS9IbkgAqR46IEnpE7
+RvOlwneE5zgHjtfHeKlUiUm6Agy3ZFUywGmxwvJOKlhhAeuj10e/Hb2pFyYvfqGrshAKXZM1wZWiDF9R
+qZr13enCrMgpxx8liJjad6Qc0KqKgkmnf055RvXveZWvgCuiaMFjoH8SuXTA7lNWc0ZTlDIiJboy9vxR
+UZaBQP+bbaSfUtA1UYA+KKE1oM8rkFIHfRLumiBNjSun6HPlPPK3tc7phVEyfYvgVmlHJPJtne4wrNaN
+09PDfStAxMNHJ4jDF1THd3qajCfbALoY+9FNxia+ZvMeuUR4gnWgc1DvXKgbafMIUJXg7Tzcu59QY5MT
+DWb+xJG8fAUwZx+qshRazT9EcG2STEYVT5eQ3kA2GgeqprPvlVY0M874ShJHrFmYkL/vSgi8pQuUtAXQ
+iU5bxVggaB61FMUXm9FLxiAn7FzklTk6u02htFpHvg3IoglYgACeAkoJ54VCc0B/fby6OhiNJw3+fScD
+yWwc2K4DpDq2jpsUPcgrJBvS1DRaE1Y1gWhUqyWVeEMizV4rN+mYZsT6KNZSbknm8a5fuyHeblSTLItQ
+4rvdNR3m7fvyCRQG7LWRDchUVl0yHYYAQ8HvBh7NTeSj94mpGitzqZ1JDFCXunVbkEZ/ihaUE+Y3IXMS
+URMLY2O92LQkzxiX6N3HV1fg5UY/ZJf6SyxI2rqKPad3bQG20QhvDc/5On4ucPHO3JV7oEf7gj9zn/bj
+0PA3uGbm7jfSLsLLtJbDfg+fxI7UN6An79p0TLhd1OeMJZuDD1VzwJqz92sQgmbQqaKBkcPjeYRkXj97
+jK6hqcRX1mJpXNMjppR+i36A4cU8TxpgHGv2N8S00uEl7UnDTA3zmCxRrtBSl+1FkUXo6W44I6NLeGVq
+8NfjlrlmU/OkYkrvtje3G+74y83CK5QkTWFvgv0WHaHft7WAG7PaIeqFdcXfwjSL3wgY3nMhbpCRPnib
+Qwf69BzN9RspEI7gv4owmdj3TmaK5v38GlL9Gju/jtLa3G/G4ti+Z5YSwZxYG9YG0yC9ZVGDLbSFj0DT
+7LUlqil3YA3Ezcoz4ZtRp1BL2weS7dLYqGoTWJvT5WLEBBsFA9n0pIMe8QGrI5bfI9ByWk9ysC2COueh
+3ueGyLoc1km/v1Z2f87a6gw9NUu7cDNevb3eBkf25nRwdQS+B1PHM0MQL/Enzhb1HKMK96fbJtx6a5yr
+Z8JgrzOCbSet0kwEyci9kvy7IfpJpzu2DmwrYgD30LWAYTzLu0EwP0WDmEGm7Vu57LaIto5PHdQ6lRvB
+JhvdxNq+or++AlBLBwh0v2VcHAQAAMoVAABQSwECFAAUAAgICAAAACEAdL9lXBwEAADKFQAACAAAAAAA
+AAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAAUgQAAAAA
+------=_contents/org.test.yang.example/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/LoginBuilder.java-a32e95a0-c7a2-394d-8415-d81b270b0db9--
+------=_contents/org.test.yang.example/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/AcmeSystemData.java-f10b953f-7203-3731-b4d0-aa1f52b2e200
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/AcmeSystemData.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStjj0OwjAMhfdIuUNG6OCWBYSYkDgB
+nMAEEyKaHzWmaoW4OwkRMwu2FNux3vccUd/RkAqDgRDJX3DurbkxzOgNGPIwruDGHAG1I6AJXewJdHCQ
+5sTkYKCx23TrbruTwroYBv4HDE6fjx9MDqFPlX62/mJzPSDjMQTOypJt00jRNK0U8XHurVbWMw1X1KT2
++YbqUjRSqBw0cbZIdfiipHhWWMmyqCpliGu3WH7cXuV5A1BLBwiCDtH6sAAAAFEBAABQSwECFAAUAAgI
+CAAAACEAgg7R+rAAAABRAQAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAA
+5gAAAAAA
+------=_contents/org.test.yang.example/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/AcmeSystemData.java-f10b953f-7203-3731-b4d0-aa1f52b2e200--
+------=_contents/org.test.yang.example/target/classes/META-INF/maven/org.test.yang/org.test.yang.example/pom.xml-29aa283a-27df-3605-932c-30128d929eeb
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/target/classes/META-INF/maven/org.test.yang/org.test.yang.example/pom.xml
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTVVk1v1DAQvSPxH1a9x94FBFJlIkEr
+oFJLq7ZCXN1kmjVy7Mh2urv/Hn8kqZN4u6XiAMe8eTOeNxPPmDRK/oLCLLY1F/rj0dqY5hjjmj6AQLSh
+xRqQVBW+urzA79ASLY8C83ir2cDebDZo89bz3iyXK/zz4vzGOtY0Y0IbKgqwXpodaw+ey4IaJsUzDlvs
+Y2x1GcDM85D9Pspfv1osSC1L4D9AaXtC7o0EjzDPqpRsm7Myt7GQAW3QjoqK4B72HKoMu6eFmdIQbGnd
+cCA4YniPh+4Il9Equ/n+6erm2+UtwQ/x0bbgDVhH0P7bpezVFbJuGAeFtGxVAfkKfSA4bUr7GaoqMEm/
+zuTPx5MESAkNiBJEEaU0YLsOmdRMOjPdcVatQ1GMlFyPC+idohI5WnbHRMlcqSe18+TH+r1Hq3HZXOKT
+pCJg0KKgkZoZqSItAxZpYVZGJCFTwIFq21IWpSNoDXto3jQQW8Xz7k8VsG31uDzufy2kMCAMjvPDI1YX
+GhPsovWSZ7k/S40WtNFraQ7JeeT9fT197KcFETzrGGl4WzFxnejkxPIf9nOPgj9Q9g/3NiliBg99vmsZ
+L8cF0I95BmD4fuH8SUygsDZC+OQYOjSIPAO2ULRui+kIjfERHPpYgQBFDWRhjOtRC3uRknI9ATs44e/h
+SQScCkFsU+9Z1SqayM2aXWW+2FWhr6U0p0zlWhV2iTCBw2Kc2WcRCrtjv4YEpZorcBp6a8I4DXDCqdZP
+dBqFBacpt68ChmxoFDqKTuIwZ3ZPE5yInMxAtqZpzWd7a53CsDNxX/Syrzq2hxI85ibU4v1yJxkl2m1v
+QmMfZafxfru3XXUDLWGa/gH7m01w6geN0DhY6mUwtexmP/CLbql3je5iuKS20pltb1YdurDe/eClTbwh
+ZnCstB9dkwHXjS/czy//onJv6Pw3UEsHCJvtFWS/AgAATQsAAFBLAQIUABQACAgIAAAAIQCb7RVkvwIA
+AE0LAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAAD1AgAAAAA=
+------=_contents/org.test.yang.example/target/classes/META-INF/maven/org.test.yang/org.test.yang.example/pom.xml-29aa283a-27df-3605-932c-30128d929eeb--
+------=_contents/org.test.yang.example/.settings/org.eclipse.m2e.core.prefs-a9bda14e-d2ed-355a-ba96-d7bfb69ffa8c
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/.settings/org.eclipse.m2e.core.prefs
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnRNyzEKwCAQBMBe8CuCD/AP6VLLscIl
+4sme8f0hXfqZKks3DlrTDi8xQLpOR5pEAzEEnjboaqPkGAi3vnEab59VvnlBlpfFBzH85AtQSwcIVoDB
+00sAAABaAAAAUEsBAhQAFAAICAgAAAAhAFaAwdNLAAAAWgAAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250
+ZW50UEsFBgAAAAABAAEANgAAAIEAAAAAAA==
+------=_contents/org.test.yang.example/.settings/org.eclipse.m2e.core.prefs-a9bda14e-d2ed-355a-ba96-d7bfb69ffa8c--
+------=_contents/org.test.yang.example/target/yang/acme-system.yang-50ff91cc-203e-3e18-a369-bcba24d018fd
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/target/yang/acme-system.yang
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSlUktPwzAMvu9XWLn3IQ4g2AU0ITGJ
+3fgDUea2gTSp4mzaQPvvJGm3tV1BPHyo1Nr+XnWWwcJoh9oRmAIYFzUmtCeHdbrnumSz2qw3CqHXgI8Z
++NK8Rmq4QGCVc81dloWZFHe8bhSmwtRZO8/mcb6xWMhdS9F9ig9jS67lO3fSaGAPi9UjLLVIuxHh1XHh
+gL0avB8T9GHWSMLKJqDE91DspULoDBTGgrcpnUQCGRDq8KpLcH4o0na++6gWt5KCsKs8v0ny6yS/7eyP
+OIEttcfm6rRyxDmc0aIZqdHCIMlQCnkBlSGXhFx7jVBu3yCQs17tfNAYCHjy23E5WHWVJBjkP9JyJE2U
+JAdrU3thCSG3ovoT+3OA8SfUIrXXAc5AC/m1hnMmypR+ccgdY/FIxMtxKN9KG8m76IViqw63lFvUwJ1H
+4jaaaKWQ7/tlNoQe6Y8qg/cNeQ+XEt9wDyykwS4VRncT//tH9iZ0nDCLjVJTh/QL4H5NkwjFif5PcBhd
+xmF2+ARQSwcIYawtT4MBAACWBAAAUEsBAhQAFAAICAgAAAAhAGGsLU+DAQAAlgQAAAgAAAAAAAAAAAAA
+AAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAALkBAAAAAA==
+------=_contents/org.test.yang.example/target/yang/acme-system.yang-50ff91cc-203e-3e18-a369-bcba24d018fd--
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf
+Content-Type: q7/binary
+Entry-Name: .q7.content
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTtWF1v2jAUfZ+0/xBFfSWhnbQPBKva
+FTS0UU2i0z5eJi9c0nSJHdkGwr+fHQht4sQOOJX2sDdsn3vu9b2O78HDyyyJnTVQFhE8cs+9vusADsgi
+wuHIXfFl7617+f7liyGhoQdBHKUMPBqknHsBz7wNoX9YigIYfCt+fSCYQ8adLIkGB94LySs8YTYQ8yP3
+nvN04PubzcYjSegJcv/7bFpADL4O5gVGmuc4X+D8A851MEoE+gfC4fRmfJifR0kaF3G6TrQYub/oq48X
+7PrLzzHMUfY5m/SWOOKhK3buOMNAQjHPB2KYUvIAAWd7ehktB8a9rfDjQYYku7sHC/gyiqHAekGMmAiC
+34s0ZxCsOPodi3lOV+D6DTZ7f+0tUpJ4IpMGAxIvRHkKJww4FzVnj4FXSJ8W5WEhSkIoiNBgybR+NCzJ
+BbRlGfr7cJviZzQoR15aTVCEny4rgAe0RqWgFQQFRlY0AKaHyTNQ9lRJAAoS6LEt45DkB8aQvLqtN8yV
+A5En8lm2XFMKU3E4oiFwTX3yrwJYNV6rtJU9zMZ3V73p7URbm9nV7XQynt95s4mRv+aMrQFX6RVU6bJQ
+0Xq8erk0bkVeAeLeSIHyCExfqIbDdI08Ma05k/qV+vmGWSUtaiXLiBTwAm3jKLznxqq0LEZYV+Aa3Pq8
+HqYAZR9rgipg+Qk0gxW49qw02AQk0ePVezf/JE1GNVfLuv+m/7r/zmxZOZRnspvPyGIVwxQvyVTscddU
+W59xDfmVSPE839EN4qg73h1n13zXq0jm9Gw36jYTJQ+WtCcdGCWizySMsFUkdYRFDvOBdQo1Hqx5S1mM
+JXO7JFZi+sqsY6lhLNIof3eQxWYP3RN/gq1tbRo7nw22LbIdrg3KjDEh9Ou61edUDy3UsujsQBGHRa+Q
+vDr1wVBsUh+qPjlSobTWKO1VyhE65UilcrRWOU2tnKJXLBqQjWZpoVryP2Cd9JmKbOmOeK9buiYs7nJL
+3pN1Ra2ysApG1/itiU/v/HW93zIcTWvunln2Ztv0HdGc/7fytuv/cCuXryW94kHJb8ap/dTmwcn8Kjb0
+i3fj3aOy//iqPPSPfV0XRn8BUEsHCOZc/wA0AwAAuhcAAFBLAQIUABQACAgIAAAAIQDmXP8ANAMAALoX
+AAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAABqAwAAAAA=
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf--
+------=_contents/org.test.yang.example/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/$YangModuleInfoImpl.java-dea82318-dee7-333b-b93b-e45c1c8cd583
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/$YangModuleInfoImpl.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTVVEFr2zAYvQfyHz7MDi4ssrdDS5d1
+LJQMfGgCTS87KvYXR6ssGUl2Gkr++yTbSWzHG1thh4mAHUt633t6T19O42eaIkiVEpmjSOies3RryJ6K
+lKQoSPmBbI3JCY0zJPhCs5wjiWVG9F4bzIjCMrwJr8NbmI5H4xHLcqnMMJ6Rkusaec1Ewuzzu/3zIJOC
+YyQ2cnra/4OWlBSGcXIvOcfYMCl0b5pJEom8MCujkGYDk8v5S4y52zoEvEJTMR6P8mLNWQwbJiiHmFOt
+4V2XWGRVA3PSMxRGQ3cWXh0K2JErVlKDoA01J8Te4mixepot7udwBwJ3Q5X8q2kfsEaylD93l3+BWhcm
+9Td93lmLapj0OKRoImGnRIz+laMPzVBoCiVOHKf1zKFPZ5B0G6fHympt+Ugwy83eiqmEuuXnjS1HLffq
+cTdUjlQ+2YSaR9SyUDHOdL3N9x7mT7NJtPgWuKgFLriTJqzug3csWvHcgH8sY/0oOO/IcMNsldxVVkVW
+QUr5yh4pnqLle0cC8Pu6wDRkTGvWo3A4vxq171evyVm1UqPf2QYxNfEW/FbMAS/YBwGc+HGkz+9hXRir
+CRU6QkKarSUEO7RwAhJ5wevQdujrskSlWIKdjNlzdxjWiwXNhgPltU7Dm74B+RFLpt1xD6J/DMObSXg9
+CW/fBO5o65z+4jJ4rv99CoJ+Bwz+Wk473LZsnehVZU6T3as6bhrarr7+J9dj+U8uReOCPnb5P3V3oFe6
+ttdtTIOGX7bUpqb9/QRQSwcItBHJ5kACAAAxBwAAUEsBAhQAFAAICAgAAAAhALQRyeZAAgAAMQcAAAgA
+AAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAHYCAAAAAA==
+------=_contents/org.test.yang.example/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/$YangModuleInfoImpl.java-dea82318-dee7-333b-b93b-e45c1c8cd583--
+------=_contents/org.test.yang.example/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/login/UserKey.java-24e9d981-5860-3954-a921-80ef89923158
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/login/UserKey.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSlVVFv2jAQfkfiPxy8NLDNhXYDNsZW
+lb1Um9aHqnuZpsmEI7hz7Mx22NDEf58dJyUJoZ06eDDyfffdd/edRULDHzRCkCoiMkGxpFvOorUhWyoi
+EqEgmyFZG5MQGsZI8DeNE44klDHRW20wJgo3g/FgNHhdXHAZMTFtt1icSGWamY2UXPsaCyaWzJ5XSxSG
+rRiqR3L/QxW51Rm9+572++1Wv3/abiXpgrMQQk61Bof4iNt2C5jjjK0oDXttb138HfyxcftJFNtQg6AN
+NZZhxQTlwKWIwKIY5V9QaSbF7dUHmMGL4eTl+XgwHg4m49Hk1fjsbDT6NAXP5FMLvhuj7Ejgu6AxZnKz
+Yl5mLjAoY3qFIPcxa6ZJdm2LFhQusPNH1niG7MNcoa2ngUIoky2slIzhRqYqRLhe3GFoSAG9T7lIqKIx
+aI/KwTIDF5jTRsH5mWcel+zjpEF5bRL5BCI0ny00qDAqNKkS9fb9j4vrDSrFllhhY8LAmur1XC5rXN4b
+F7f+ZBLPh9N92AUU6pQbGykH7i99Wr+4eAZBkDc7A5Fy3oP3MIA3Xi3Zi+hNDxryFP/W0cI+MqQC8GdK
+uQ7u6IYS7h6Qt9aZVumTrSBwTjhZ9VhJglEploTtqgQ2cd9WM8HKqnmAwfo5d0/RmtDJhJD9zRMoi7WT
+Zo3KmlHsYc9RT6ula67UamXtOZZ8VTtHcA/oqmnbAdq4JQ463vvcqlKVp7R8aNQjm5K/JCP9j+r6+7vL
+lPGlHeAiP23v+KsaC7rFrL92y6tb7OGKKe2eQ0lX0/iPjdUhMorGgRfkjRP3Y27IyrshNHH/MkH3OVSU
+1+balJFpnh1k1WDeyjLm0K5aysm3kx7ZO1I2st2yx19QSwcI9JUJXo4CAAC6BwAAUEsBAhQAFAAICAgA
+AAAhAPSVCV6OAgAAugcAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAMQC
+AAAAAA==
+------=_contents/org.test.yang.example/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/login/UserKey.java-24e9d981-5860-3954-a921-80ef89923158--
+------=_contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/Login.class-609b8ba9-efb9-3694-83c0-4c7137497f76
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/Login.class
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStVNtO20AQPRsudtxQqJteoC0tvSZS
+yZoigWgQEkLtkwlFKbxvnMVZ6ktkr6Pms6q+VH3oB/Sjqo5NEBUgESos2btzPDtz5uzs/v7z8xeAVbwx
+UGL4FCc+j/sy6ophoPye5kMR+dyXER+s8J7WfS68UHL5VYT9QHIvDnk6TLUMeSIHzrqz5mycAm7sq8jA
+JMPcsRgIHuSR9jrH0tMGphn4pbl0HAfpSdaOirqKxp2eCrp7RwZMhtVxF21nfigjLTqBZJjab23vfmBo
+uFctp4LCOOL7LRHKJoO56QUqUnqLYaJWP2SY3Im70sQsw2Kuxnte6NEY6dE408PEHQbrneOsLztry86G
+ibvEI8g1sXAPDwzcZ3h7HToVPMQ8w7SXSKGpqKOae6ZrWydUdXMcpH49EcpgeFRBGRbDrKsi2crCjkw+
+nyhru7EngkORqNwegZYv9a5MU+GTUa3VL3JgMMjnIJUJhTh1yLQKuKtSTb/LbeVHQmcJRfhywWHz8hL+
+r0+LPeE5l+YWZbbacZZ48qMqKimauJFnZ2zBPd/HzSulPNfDN0O8XQDEduz0/5yGG9WukIeI0HGmE4IS
+pmDQbD5vF7pWJmDiFiqEzJC1Qnb+zNi37Tnb/oHqdyx8I6CEx/S1aASq5F7BkwLN745FPC3GZ1iiMM8L
+/AW9L4vZqxHy+i9QSwcIKPupMQECAADIBAAAUEsBAhQAFAAICAgAAAAhACj7qTEBAgAAyAQAAAgAAAAA
+AAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAADcCAAAAAA==
+------=_contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/Login.class-609b8ba9-efb9-3694-83c0-4c7137497f76--
+------=_contents/org.test.yang.example/src/main/yang/acme-system.yang-a1b7d764-1003-3c53-aba0-7adca49a3522
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/src/main/yang/acme-system.yang
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSlUktPwzAMvu9XWLn3IQ4g2AU0ITGJ
+3fgDUea2gTSp4mzaQPvvJGm3tV1BPHyo1Nr+XnWWwcJoh9oRmAIYFzUmtCeHdbrnumSz2qw3CqHXgI8Z
++NK8Rmq4QGCVc81dloWZFHe8bhSmwtRZO8/mcb6xWMhdS9F9ig9jS67lO3fSaGAPi9UjLLVIuxHh1XHh
+gL0avB8T9GHWSMLKJqDE91DspULoDBTGgrcpnUQCGRDq8KpLcH4o0na++6gWt5KCsKs8v0ny6yS/7eyP
+OIEttcfm6rRyxDmc0aIZqdHCIMlQCnkBlSGXhFx7jVBu3yCQs17tfNAYCHjy23E5WHWVJBjkP9JyJE2U
+JAdrU3thCSG3ovoT+3OA8SfUIrXXAc5AC/m1hnMmypR+ccgdY/FIxMtxKN9KG8m76IViqw63lFvUwJ1H
+4jaaaKWQ7/tlNoQe6Y8qg/cNeQ+XEt9wDyykwS4VRncT//tH9iZ0nDCLjVJTh/QL4H5NkwjFif5PcBhd
+xmF2+ARQSwcIYawtT4MBAACWBAAAUEsBAhQAFAAICAgAAAAhAGGsLU+DAQAAlgQAAAgAAAAAAAAAAAAA
+AAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAALkBAAAAAA==
+------=_contents/org.test.yang.example/src/main/yang/acme-system.yang-a1b7d764-1003-3c53-aba0-7adca49a3522--
+------=_contents/org.test.yang.example/.classpath-87c92b57-8990-3b62-9eea-fcfe1a41e5ee
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/.classpath
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTdlF1rwjAUhq8d7D+UXApNpjfbRTsp
+0rHJdMN23kpsDjWuTUs+iv77pX7gBzrcYKC7PCfvOXmfnCReZ55nTgVS8UL4qIXvkAMiKRgXqY8+4if3
+AXUeb2+8JKNKlVRPbdDYRiC0XDifXDAfKZkgpzC6NNpHmsoUNFkKQSGnFi8lJKdckBmtKKpbNTyqteQT
+o0Et452EI2gOPipKbc3RDDkVzYxNaGkAkRPqnFYgcFnkDCSvgB2r8sj+ph7ZBzrGCPMkM6tjaTbRL5Al
+qMLIxK6cyf1XJKet2ybaPeK/zv/nkX3LfWFzSwqxsVjIFEOS8VIBztuA+8EoHLTH3dcgit6D+HncfRvE
+wcsgHF609RnTOKNGJFM7Ktwbhlvf5FDHhQZpLxZmMDEpNnxdCRJHmgpGJRv140UJpGevaxS6LXx/GfA/
++SoWVKTX9dTOZlxnUxAgqQbmrh8XURbhCpFXtAd0G+a6+U4rG30BUEsHCHaZJ3NpAQAAcAcAAFBLAQIU
+ABQACAgIAAAAIQB2mSdzaQEAAHAHAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQAB
+ADYAAACfAQAAAAA=
+------=_contents/org.test.yang.example/.classpath-87c92b57-8990-3b62-9eea-fcfe1a41e5ee--
+------=_contents/org.test.yang.example/pom.xml-24d84354-b735-3d6f-aaba-baec8fdb0e2f
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/pom.xml
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTVVk1v1DAQvSPxH1a9x94FBFJlIkEr
+oFJLq7ZCXN1kmjVy7Mh2urv/Hn8kqZN4u6XiAMe8eTOeNxPPmDRK/oLCLLY1F/rj0dqY5hjjmj6AQLSh
+xRqQVBW+urzA79ASLY8C83ir2cDebDZo89bz3iyXK/zz4vzGOtY0Y0IbKgqwXpodaw+ey4IaJsUzDlvs
+Y2x1GcDM85D9Pspfv1osSC1L4D9AaXtC7o0EjzDPqpRsm7Myt7GQAW3QjoqK4B72HKoMu6eFmdIQbGnd
+cCA4YniPh+4Il9Equ/n+6erm2+UtwQ/x0bbgDVhH0P7bpezVFbJuGAeFtGxVAfkKfSA4bUr7GaoqMEm/
+zuTPx5MESAkNiBJEEaU0YLsOmdRMOjPdcVatQ1GMlFyPC+idohI5WnbHRMlcqSe18+TH+r1Hq3HZXOKT
+pCJg0KKgkZoZqSItAxZpYVZGJCFTwIFq21IWpSNoDXto3jQQW8Xz7k8VsG31uDzufy2kMCAMjvPDI1YX
+GhPsovWSZ7k/S40WtNFraQ7JeeT9fT197KcFETzrGGl4WzFxnejkxPIf9nOPgj9Q9g/3NiliBg99vmsZ
+L8cF0I95BmD4fuH8SUygsDZC+OQYOjSIPAO2ULRui+kIjfERHPpYgQBFDWRhjOtRC3uRknI9ATs44e/h
+SQScCkFsU+9Z1SqayM2aXWW+2FWhr6U0p0zlWhV2iTCBw2Kc2WcRCrtjv4YEpZorcBp6a8I4DXDCqdZP
+dBqFBacpt68ChmxoFDqKTuIwZ3ZPE5yInMxAtqZpzWd7a53CsDNxX/Syrzq2hxI85ibU4v1yJxkl2m1v
+QmMfZafxfru3XXUDLWGa/gH7m01w6geN0DhY6mUwtexmP/CLbql3je5iuKS20pltb1YdurDe/eClTbwh
+ZnCstB9dkwHXjS/czy//onJv6Pw3UEsHCJvtFWS/AgAATQsAAFBLAQIUABQACAgIAAAAIQCb7RVkvwIA
+AE0LAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAAD1AgAAAAA=
+------=_contents/org.test.yang.example/pom.xml-24d84354-b735-3d6f-aaba-baec8fdb0e2f--
+------=_contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/login/User.class-db662dae-40fc-3f0b-bc17-e44156ff5543
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/login/User.class
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS1VF1v0zAUPR5rk3UdG2UDxsf4hhax
+OmNo0+hUaZqYhAidprKJB17c1E09OUmVuBX9WYgHEA/8AH4Uwk6LOg3QWjESyde+usf33ONrf//x9RuA
+dTyxMEVwGMU+jTo8bLK+FH5b0T4LferzkPbWaFupDmVewCn/wIKO5NSLApr0E8UDGvOes+lsOFu/HDLy
+RUgPEx5bmCZYOGY9RqXZbr9xzD1lIUtA/5hQRZFMBqkbImwKbXfbQjb3WxZsgvVxQTtdP+ChYg3JLeQI
+no8LfNXUMNESBkmQOajtvHlJUHbPwms9giikBzUW8AqBve1JEQpVJbhQLB0RTO9GTW7jEsGKEfMFTeUs
+D+Usj+S0cZkg98xxNledjVVny8aSRne1mDlcxbKFawRPJ2GTx3XcIMh6MWdK19QquqMDqatYV10Zx1Oa
+TIMZENzKYxZ5gnlXhLzWDRo8fjsQtuBGHpNHLE6FHjpnfa7eBXJXsiQhWCyWficxCNrrSmmSEFh6NZhl
+9ew17xO8L/6F6b82s95d58/Vo27s8T1hGM8Yf9mw1PO68EOmujEn5LN7uucrZ6p3qt+3z7MI1xRRqY5P
+4sT9OVciIzUnYXPyUv4nOuZwqxX9LukLq/8MLJgOXjYNrJ/JDGzM4aL2zOvVmo4w31xhoVAoLH7BlU+4
++VE7prCix5y2wJIG5nE79Zpn8A7upvbe0N4f2gd4mMY8SsfHKKa29BNQSwcI09d8Mx8CAACgBQAAUEsB
+AhQAFAAICAgAAAAhANPXfDMfAgAAoAUAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAAB
+AAEANgAAAFUCAAAAAA==
+------=_contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/login/User.class-db662dae-40fc-3f0b-bc17-e44156ff5543--
+------=_contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/login/UserBuilder.class-8b0ee2b1-f3ca-3790-8039-846ab0e52b36
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/login/UserBuilder.class
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTtV21P21YUfm4gOITwWgob69rAYM1L
+h9OV0pZkZcCgZVC6jZeWjpU5yW1w69iR7SD4FZP2F/ZhH7dJrVCLtO3bpv2oaec6JpjEFROSJSZNUXyv
+zz3nOefc83Kv//r7za8AbuBbCSGGLcMsyUaF60VlX1NLO7a8r+glucR1efe6vGPbFVkplLnM95RyReNy
+wSjL1r5l87Js8t3Mrcxk5s4RQTNKqi6vW9ycrapakZsSWhl6niu7iqwJ1If557xgM7Rv75W1OU2xLIa+
+5eP1VdtU9VJWMDyratqKUuYM4W3dGVu3X/B9hifLgVi8xPdJb0yplspctxVbNXSG7pptVVvV5AdKRRi2
+qpZ0xa6anLG5k6s5jyOOb7m0v6m2YWhWzei8qhfJY3nGozYXjIPZu/Q7dwYxtOVUXbXvMrQkkhsU5Tmj
+yKNowYUYutEj4SJD7/E+31esHdrrKPpxoR0M78TQgZiIlKrzlWo5z801Ja9xkVdGQdE2FFMV7y6x1d5R
+KeeeBuORm/XkVEeJ24/rKd6fSDYnubA+HkMYbTX2BTfhBf2DGCRBl4h+RPswhoigtRFtSRTCFqEGVgpC
+YyqGdkRpb0njzIm6WEw05nr2Lbacklq0VT/l5qemzlteNvmXW5snepKeEmSGkePlRU3jJUWbMUtVYdn8
+XoFXhHURXGdIe+2Nr+1XeNzkz7jJ9QKPFxRdN+x4nsdX1peXh6MYxw2R9BMMFxPNCZPc6MAkbku4xdB5
+ovPEcAdTVEAUJ8oTr2it4WaTzSQJOYaJs2w7dXRvlxROUYk2JQTDwMkKJD63Cgf8d5fcWrWVwgvyyGXs
+sLxlZPptStCVHN5VtKprykL9TJKsWmFSOVpuOb5JBFeNgXvZrRSLJ2P8Y3OJn63Cg7adfd9crP8fvKcY
+FHBQRKN6EMMKHlJXqlSpK9326Ur/qk8xTJ71ZPnhP5AXDN+dM5uo5eVFGBk2g7pg0OFDNz0eZAqOivki
+yUWxjsfiVN1k+DOgFn2U9oGi1z3KimtyRCkUuGWNZhiMgL1KNn0ERVeNqlngC6o4o3s8vOOCk76iFnWd
+m07JcTq3I0eWY5hulS308RlGSFx8aRYSF11njLgjXTmdka71xN3pzLtoZOJzgJ69RJklFEZjT+oAfalD
+9G8eYOAVBn9xuN+lZ5ejpxetJNWNPgzRW6wmg/dwiUaG93HZxZNpFGvh1Etc+bkO0uYQBzzC4brwsK/w
+SKPwkK/wqK/wWKPwZV/hq0j4CCcbhUd8hdO4Rly1Xf3IAbFop0I0Xkr/gc5DjG/2ZQ7w8W8EOZh+jZsh
+/I6swG717OtVekvQPOXoGKjJuzrE7BPcJV3Tdf2C8inNZmhOkeui6SzmXC+mSVwASKn0K1xJHfsRdcgy
+WZ/x6JHqeiR85vjKMO8PNtIEdpPAJk8BW/AHG2sCyxJY7hSwe7jvB5ZsApshsNm3gkUdsEV8Xg/ekgOq
+0XaKgHQ54br2GssteORgt3iwFygM9xzseI27jt3lhkrMOvAFcU/XLRBrX9bXviIawyrWXHcmKAXEWvQQ
+65spdoBHjQm45EnAaE1jTwRP8LWLMObJ3sFG4W5HOOT8t5znN3jqADFq6AzbGPoHUEsHCHacrsC6BAAA
+yRIAAFBLAQIUABQACAgIAAAAIQB2nK7AugQAAMkSAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBL
+BQYAAAAAAQABADYAAADwBAAAAAA=
+------=_contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/login/UserBuilder.class-8b0ee2b1-f3ca-3790-8039-846ab0e52b36--
+------=_contents/org.test.yang.example/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/System.java-bd9cfa59-b5fc-3427-bfc7-0d79f32f517d
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/System.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStk8lOwzAQhu+R8g6jnmgFTuBABS2V
+KkDiwCLUJ5imk8QQ21E8rVoh3h0vLesBkOpIdjzLP5/HSYvFM1YEpquEaUkvcNPIqmaxQV2JirRYHYua
+uRVYKBK0RtU2JAqjhN1YJiU6WuXD/DQ/G6WJVK3pGJ5whWLJshG30vKHfQ9FdoZbU0n9izIb09hYYy71
+Qrr1spbN4qHcL9LURcyC8QoZ/w81XVaKNOO8ob8nOxJltHi8R+Wz/JMNBmkyGGRp0i7njSxAaqauxIIg
+4qUJuEFrdrI2brYNGX89w+Qwej+RjffRqVhhkiYvkThW2dJaRnZLKTU2EM7l5undNVz8qxmi6AiZDnqe
+6TzLvlNlkap32DvJ8+FRfnqUn7nN1tqPSKMdW+gphOG/ZTAlLIxCqUG7WhbYgCXsijpGhe7vgscz7tz9
+TqAivgpJsxB60B/FoB8lboxlrwul6YBracF+urh38ajrZX2CP/Q3yfB3eH94Cc40efXTG1BLBwjskn57
+dgEAAPADAABQSwECFAAUAAgICAAAACEA7JJ+e3YBAADwAwAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRl
+bnRQSwUGAAAAAAEAAQA2AAAArAEAAAAA
+------=_contents/org.test.yang.example/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/System.java-bd9cfa59-b5fc-3427-bfc7-0d79f32f517d--
+------=_contents/org.test.yang.example/.project-bfaaa8b8-efaf-3484-8f3f-da6e3534deed
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/.project
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStkU0OwiAQhdeaeAfTvaCuXGBN1Lh0
+ox4A6aTBlJ8AbfT2AqVqNSYu3M17M49vALK6imrcgLFcyWU2Q9NsDJKpgstymZ2Ou8kiW+WjIdFGXYC5
+LVhmuHZ+2rsDIqmAXJkSObAO3agsEVyp0BUQHHthiCkhQLqc4K4KbjrRRoF76lzzqjhoYEElufFRKovo
+vHCBVVxbQJfCIaaML2hDYwDMcwWfoKasA9smjfsGwR+Un7hiDi1X0AbkfP0PcnK6B/BQVxtI0634fve2
+HxaIc98yb3vvP1JdHbCP7+l//x1QSwcIsX6jqt4AAAA9AgAAUEsBAhQAFAAICAgAAAAhALF+o6reAAAA
+PQIAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAABQBAAAAAA==
+------=_contents/org.test.yang.example/.project-bfaaa8b8-efaf-3484-8f3f-da6e3534deed--
+------=_contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/LoginBuilder.class-0394db88-cb2a-3147-94de-6f94ea5dacba
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/LoginBuilder.class
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTtV1tPG0cU/gYDaxZjLgluk6bEJIT4
+QrKQUhKwSwuUNLSGNOVWnqK1PV0W1mtrd43Cc9/6I/rQxz61UiOUIjV9qFSpP6rqmbFZ1pdKFcISD33Y
+3Zkzc75zmW/OzP7196+/AfgAewq6GHbLjqGVK9wu6seWaex72rFuG5rBbe1oRtv3vIqmF0pc46/0UsXi
+WqFc0txj1+MlzeFH04+n56bnzwS5smHay1XTKnJHQTfD0IF+pGuWAHyeP+AFjyH8ssRdVzc4w0jufHjT
+c0zbyDD0vKy63CHV2mDVMy0tZ7oeDfVtmoate1WHdM2m4WzuEuOwRBzaNvmRWSS7Eb1qlLjt6Z5ZthkG
+A6bX9UqGsflGSTYQ14qlu2423d47r1y23JqfedMuUgK0pYCpS41Jrg2Fs5i5Sr4w9GZN2/QWGUKJ5A5D
+90q5yFWEMBJBFIMKrjMMn2f3me7uU4ZVXMNIHxjeiaAfEbEmps03qqU8d7b0vCXJVS7o1o7umKJfF3Z7
++6bLsHfpwdRJT/GoBvfWzxh+PZFs5bjw+3YEPehlUGj2tuT7yNnUIOMPW4Sd47lwayICBWFKJ7m11ED6
+tUQzqTPJCxGJovoxu7qwcIVY2BJadmuV5El6K0gy3DkfXrMsbujWkmNUhVOrrwq8IhwLI82QDroa3zqu
+8LjDv+EOtws8XtBtu+zF8zy+sZ3LjatI4IGg+EOG0UQrSZI7/ZjGIwUzDAMN1SVCpXuWtgstEcNkULVW
+YjPJVpGCOYbZi2ScCnGw+omgaEO2cIEh1rjfaF59z8XaZ5fC2vT0wiFFVJ+ouoGdU2qXkw5u254j3aqS
+XcU925CHieb92En7fzRb69xG72QYg3qx2EifH1oLx8XqRgfdZt+2loD/j+y2vnRuFUS9exrBZ3hGxa1S
+peL2pE1x+0/ljmHuomfT91ebCAzfXR13qGrmxeIxbCUunxd0aD1n0DtEtwnZWSMdFRt4IU7irxjeJjpG
+704BnweSEffnsF4o0Bk6Mc1w0Llgks2/QFA3y1WnwJ+alrwfBCY/FFPpJ2rNtrkjtxSnK3if7zbG6eIZ
+oj/SELrEpZhaXeIWStI+2VbpoUu+3x+AuKrSzwG9h0iyTJqMvkOpEwynTnFt7wSjrxH7Wc5+l95RiT+E
+bqk1jBvUi9R0cBPv0ZfhFt6v42n0FWM9qV8w9pMP0iuFowHlHl85TkF01d270wJytxnkRluQe5j0Qe5L
+EFfmBLiV/hMDp0jsjVCIU28JMpZ+A60Lv+NDgd0diHKMerepPS5txGr6dRui9RhPyNa8b19IFqiVkSvA
+otTM4qN6Kj4mdQGgpNKvMZY6j0OV4kny/n7AjuLbUbAoY2UE8Ykf1ZIEfREEvStBQwHQKQJ98K+g4Qbn
+hUSVZpax4pv5VJqxCFUkJCrTNfUGqyHstlibIaRH0lq8Ntu3Fq2nSrT6sUaz532fxNjn/tgXJGPIYb2e
+tVlaAjGmnmJjL8VO8GUzAeYCBFBrFofC2MRWHeFegD2xZuWoVO6Sz7Z872BXAjEqZQxf4+Y/UEsHCGnm
+iHiEBAAA5BEAAFBLAQIUABQACAgIAAAAIQBp5oh4hAQAAOQRAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29u
+dGVudFBLBQYAAAAAAQABADYAAAC6BAAAAAA=
+------=_contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/LoginBuilder.class-0394db88-cb2a-3147-94de-6f94ea5dacba--
+------=_contents/org.test.yang.example/target/classes/acme-system.yang-c0d89713-01fc-3da1-9e69-450c299e414b
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/target/classes/acme-system.yang
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSlUktPwzAMvu9XWLn3IQ4g2AU0ITGJ
+3fgDUea2gTSp4mzaQPvvJGm3tV1BPHyo1Nr+XnWWwcJoh9oRmAIYFzUmtCeHdbrnumSz2qw3CqHXgI8Z
++NK8Rmq4QGCVc81dloWZFHe8bhSmwtRZO8/mcb6xWMhdS9F9ig9jS67lO3fSaGAPi9UjLLVIuxHh1XHh
+gL0avB8T9GHWSMLKJqDE91DspULoDBTGgrcpnUQCGRDq8KpLcH4o0na++6gWt5KCsKs8v0ny6yS/7eyP
+OIEttcfm6rRyxDmc0aIZqdHCIMlQCnkBlSGXhFx7jVBu3yCQs17tfNAYCHjy23E5WHWVJBjkP9JyJE2U
+JAdrU3thCSG3ovoT+3OA8SfUIrXXAc5AC/m1hnMmypR+ccgdY/FIxMtxKN9KG8m76IViqw63lFvUwJ1H
+4jaaaKWQ7/tlNoQe6Y8qg/cNeQ+XEt9wDyykwS4VRncT//tH9iZ0nDCLjVJTh/QL4H5NkwjFif5PcBhd
+xmF2+ARQSwcIYawtT4MBAACWBAAAUEsBAhQAFAAICAgAAAAhAGGsLU+DAQAAlgQAAAgAAAAAAAAAAAAA
+AAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAALkBAAAAAA==
+------=_contents/org.test.yang.example/target/classes/acme-system.yang-c0d89713-01fc-3da1-9e69-450c299e414b--
+------=_contents/org.test.yang.example/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/login/UserBuilder.java-0ab8559d-d7e2-304f-b26a-bd2f49eabacc
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/login/UserBuilder.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTtWFtv2zYUfh+w/8D4Se4CIsWADZ2d
+tFnhYcF6eeiKFhiGgpZpWQlNaRTlxijy38ejK2+S7NgOMGAKYAfi4fedOw+dkvCORBQlIsJJSvmCbFkc
+rSTeEh7hiHK8eY5XUqaYhGuK6T1Zp4ziMFnjbJtJusaCbi5+vvjp4kX9giVRzCfffxev00TIoyPjjxkV
+f9Bty3BLNgTnMmb4LUkHiGWSsKxUYR7zRay+r/NoTbkkMk64D/R3kq1K4PIvzecsDlHISJYhUObXPGYL
+KtA3WEXqSUW8IZKiD1IoAvTlfs1eg/TEv7zMGXtH1rRjmbtLlQvQl7vCD/qS0nRakE1fInovlfkZ0i2c
+niQeV1fnT8KCiEaCLhGnX1EVn+lVMJ40EShjpEUnGEN8YO0BlXHU5CpXR1R+rkLVisMjqMwFdwL5UH51
+QP1WhdUPZQW9H6obhvdD1ImiMNSXH6LNIQPh1Yc8TQXNsk9EcKVHFoxyHq5oeEcXo7HBMp09aaqhGdij
+MwVlxs/M/Phzm1LD4niJAlsAXaosUrEwBOGRK5F8LRLshjEaEXYtohy2zu5DmhasI10HVKAJuqSC8pCi
+kHCeSDSn6N3HN2/ORuNJi//gRCGYjQ3dlZeko+u4jVNXmqNMy+EqgTaE5a0jWmq5ijPc5LSqpkJw4ugG
+cgM5prE3ab8Te10Gx2LfnZkfkRVqqy61flZVbEchJYuFpwCetuU7xfYkZ4DBalRt4WGjiNLcLaJzE2Ao
+Ck4E0BxC4G2l0CxA5EbZEwCMW7DVKZ0Be4iWMSdMmyRgI4rBG6Bg+a4dKzRFynCfyMGq9dzUOtDFjfoQ
+SxJaB5Bm9knUwKF20Bo+1P1YOrBjzuoWtA7fbkHeJ+SZwnSh/ycx2yNNbeidbF5+O8kFh3W1hpvxpeuw
+thtsXYmwy5WER4MupytXTO8NJkl1djgY1oYHRFlGh3S1jRxihW3dlPYQYx3xGlk76k58m7STWdvUDrW+
+TXbzvWasiWFX1zXq+tX7DRUiXlCn4w2N6PB0jOmWX/Zj80/xOpunmTyarZ+JH8TSdxfQWcxu5ifZ4W7Q
+r8x/5coAz17XBnhOeXWwYqIFbq8rRAWzS6hiLtFKdfbXycKTm+VRCDKqyxfd4sfnlrqwqJIlZ1Kt2ovN
+Qrn9Wf3iBxQEWuOqvf0SXaBf2grHrWK2k3qB2+ZmAdcLjwXmPlB+AGBxRlh4cAA8Ds48tE1YI3f64Its
+K0H3z6Z5kjBKOKL/5IRlQfEzG4Mafz+/paFEyfzWW4BwvoDGvnVNLSmMi1WlmA2mQHoLuAJbKg13QFN1
+Vh9IZ4WCuH1zIHxzKUjkSs1Klyio34yByC40pYynZjwaFE4ASG04OOuRH9Dao3k1+8TL4Kyt1iroFvOh
+TirMdiu63+xG/nRmN73ENLt+fRSz+R4m89Oay11T+bHMNLpgv5UgejojofWaNqo3xzDR35l7TTW2nMxk
+41gwTDcm+gNd4G/fj5ujZVL+4w4r5Xvr5lldF40153rT3GJSGE6DUfHLzF9NC7t0ZjRrQ9vsBoDP2xlk
+GLRpJcOgfCdAvhuYyvlhLCiMQSg9hwYhjVQsfkPN3PnE5vjbQa1yrRZs08XNvGKoUR//AlBLBwjgKG64
+vgQAACcdAABQSwECFAAUAAgICAAAACEA4ChuuL4EAAAnHQAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRl
+bnRQSwUGAAAAAAEAAQA2AAAA9AQAAAAA
+------=_contents/org.test.yang.example/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/login/UserBuilder.java-0ab8559d-d7e2-304f-b26a-bd2f49eabacc--
+------=_contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/login/UserKey.class-b5f6fda0-2d10-3364-9312-cb315ae7e2bb
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/login/UserKey.class
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS1VF1TG2UUft58k24Khi+hQShoyQew
+tCCIISDEUtNCe4FFxenoJmyTxWQ37m4Y+Q9eO6PjjFfqDRftjNIZnXH0xs74A/wJ/opqfd7NSqFQ77jY
+fc979pznPOdr//jnp18AzOBOFAGB9y27qlpN3dzR9utGteaq+5pZVau6qe5dVWuu21S1SkNX9c+0RrOu
+qxWroTr7jqs3VFvfm56fnpte+E9Rt6qGqd51dPuWvh9FSKBrV9vT1LpEvFPe1StuFBGBa2fGdC2r7rSj
+lw1zx+BZ2tFN17hv6DahCGto9S3ddgzLvFt6W0DcFEgULdNxNdPd0uotPfyX8ef4+JOvvxAIf2RqDV0g
+uf6Mw6ZrEzYvEFk0TMNdEuhNn/6c2RIIFa0dPY4gkgouolsgmM5sdYAOChQkBDrXDVO/3WqUdftdrVz3
+AlkV8tPIkndfGXJrhiOwvX5eZWYy99Lnhy5rEXGsll1hMtGq7t72itqTzpxV1lhNc2qycl69SnFcxlgU
+oyfmoG2s4BUMs0lN25B4osQwtu606i5buulqlU82tKZfw4j+aUurO881qz1P+cy27FJOwQQmSYAMi3XN
+oXH3CYqeMi8JqQrSyJCgVd49OR0+IllZbk2OXMy12myjeF2g//kcVltGfUe3Y5gX6PALNvJhHLNYkEPT
+GQOxAhMjUlNQsIRl5qI1ZZsEJs8avFMqP0Q+hhX6ehNdkHBFCccNSKWLL3aShmsKN32IrSu3lQIDL7Rn
+4vcN22EHxLZAfNPr+pohW6D46U1JX2a7aVRNzW3Z/PTN6QqePY7/u9+L5zPC+aU8W85m8wkjgEFEEaPc
+wT9gAHEk5TJTjlDHjvHdxdsavwV4xrOP8FI29yN6Hnr2fXxfJBboE6LUQY9+3vra1ngZA4AnSVThYQ76
+mCUfM9HG/AE9Z8D2EraPzv3HYBNHsAlcoiRhUxjyYVXvDoSzRHxwBBfxlJc8GKVt4MMIuXi+8+e0lmGH
+u4YXQ4Wu4VRNojxGNPg9c6d4iJGPC6kDmgQ92CT5ASO8XSbgKFmMeSFG2jB+iCD5vYrXvJIP4gqlAMap
+H0LgKXoQjEIIshZPSdO/BKRC7qXP7Def2Uo29x3CoYPcY4SDB9lDZHN8vpWX3K8QG22+ygSP39FLCwoT
+HvGpr6RR6Bn3Oa/RaXLKcAhyuMA/RgJT5KyS5VWyv0auM5jk1qi0LmAey1g4lt/KUSdWME0PQZ9Reg34
++SkIR8PKE/QwJzlKM0ddOqC/RCj8jNkPknOP8MZ6qJD1SI+lvkQsWGDBc8k3D7H4Xi75lne060+h694h
+Vg9x/cFRKle8+V3inC0z6Aq6sUqaRZb9OhtyA1m8w+A3j1Ev+NTj1N/gV240EyjRpk39AoJ/IxXFrIh0
+UnXLG6R1bHjn7X8BUEsHCE05euseBAAAMwgAAFBLAQIUABQACAgIAAAAIQBNOXrrHgQAADMIAAAIAAAA
+AAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAABUBAAAAAA=
+------=_contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/login/UserKey.class-b5f6fda0-2d10-3364-9312-cb315ae7e2bb--
+------=_contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/login/UserBuilder$UserImpl.class-f9f8fa6a-d371-304b-812d-c9b497ba7ea0
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/login/UserBuilder$UserImpl.class
+
+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
+------=_contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/system/login/UserBuilder$UserImpl.class-f9f8fa6a-d371-304b-812d-c9b497ba7ea0--
+------=_contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/System.class-735bbe5f-d234-3b7e-a709-a9dab82fd893
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/System.class
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStVGtPE0EUPYOF3T6wWOsDRXxjm0hn
+kQSCbUga0BiylpASvk+3w3bIPprttLE/y/jF+MEf4I8y3t2tgYCGNmE/zOycPffOuWfvzK/fP34C2ETV
+wBzDQRi5POzLoCvGnnJ7mo9F4HJXBny0wXta97lwfMnlF+H3Pcmd0OeD8UBLn0dyZG1bW9YObyeAgQzD
+0pkYCe7FOQ47Z9LRBhYY+D930WHoDdL9OiroKpr3esrrHp4aMBk2pw1qDl1fBlp0PMkwf9Rqfv7AULOv
+C6dS/DDgRy3hyzqD2XA8FSi9y3CrUj1hyOyFXWmiyLAa+/CeJ07UJk7Uzp0wcYch986yttetrXVrx8Rd
+hoX0Ww738MDAfYa3s+gp4CGWKYkTSaGpqtOKfW5sW0dUdn0apDqbC1kwPC4gixxD0VaBbA39joyOU2tL
+dugI70REKl5PwKIr9X7oCxW0pYicHtEq1VTIUCuP22qgyd1sW7mB0MOIQtauEBpXle9SUJ5yfwoHOtbG
+UP4bdpFG/41IduiqgOG48p96Z+znCZBkpR1y7XAYOfKjiuvNp81ei5UwtmJf7vf6tY5f6vXGjUhuEiNV
+ti+0IPemlnHh9NyMlFQGSaCDT2cJc5iHQW/LcV/R1ZOBiTwKhCzSaoMY8bNYul1aKpW+o/wNj74SMIcV
+GnM0A2WiF/AkQeNbZhVPKfxZsn5O6xd4meCv8DrB1pLxzYRR+QNQSwcIm2Ms3xwCAAD0BAAAUEsBAhQA
+FAAICAgAAAAhAJtjLN8cAgAA9AQAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEA
+NgAAAFICAAAAAA==
+------=_contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/System.class-735bbe5f-d234-3b7e-a709-a9dab82fd893--
+------=_contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/AcmeSystemData.class-b45bacbf-c149-3547-9d89-42af7a2aa82f
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/AcmeSystemData.class
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStkM1Kw1AQhc+0app2I/QldOOkFBRx
+JYirUqF9gtt0uE24yQ3JGJpXc+ED+FClN2ZVcOlifhiG78yZn9PXN4AlZhFGhI2vLftKyr3pXGYPyp0p
+LVspuV3wQbVikxbCcjRF5YRTX3DTNSoF19ImT8lj8syvYWP7O3wzaiJcEW5z0xp2Petjl0uqEW4IyZ9q
+6r1rBt1dVu6zUHvOxnslxFZ0YBPWd/er/7h34L0Qplv/WafynjkhzC9tPPQOws2EcYjr8DMKviJM+g5x
+yCNMz1BLBwiX7UdFzgAAAE4BAABQSwECFAAUAAgICAAAACEAl+1HRc4AAABOAQAACAAAAAAAAAAAAAAA
+AAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAABAEAAAAA
+------=_contents/org.test.yang.example/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/AcmeSystemData.class-b45bacbf-c149-3547-9d89-42af7a2aa82f--
+------=_contents/org.test.yang.example/.settings/org.eclipse.jdt.core.prefs-13c44267-3ac2-348c-831e-26f94d3a704b
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/.settings/org.eclipse.jdt.core.prefs
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSNjjEOwjAUQ3ckrvKlTky9A+IGaeJG
+HyX/R06A65OBzmWxPNh+RizaOqQROwiL6PIGu7qty/XizIJf5JmGRCem1KYFnCYhw2QEZox7CWN31nWR
+23mztqJh4v5JN/pWUGWub5oS7HGcXT+BppbPFrq/eLC+UEsHCOiKarVzAAAA8wAAAFBLAQIUABQACAgI
+AAAAIQDoimq1cwAAAPMAAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAACp
+AAAAAAA=
+------=_contents/org.test.yang.example/.settings/org.eclipse.jdt.core.prefs-13c44267-3ac2-348c-831e-26f94d3a704b--
+------=_contents/org.test.yang.example/target/classes/META-INF/MANIFEST.MF-f2fdadd8-c84d-3103-b379-526764727c77
+Content-Type: q7/binary
+Entry-Name: contents/org.test.yang.example/target/classes/META-INF/MANIFEST.MF
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTzTczLTEstLtENSy0qzszPs1Iw1DPg
+5XIqzcwp0XWqtFLIzi+GcFN0vVKyQdLmegbxZkA1zkWpiSWpKWBVvollqXkKnnklqelFiSVAcxTS8osU
+XJNzMguKU3m5eLkAUEsHCOMqZdFeAAAAaAAAAFBLAQIUABQACAgIAAAAIQDjKmXRXgAAAGgAAAAIAAAA
+AAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAACUAAAAAAA=
+------=_contents/org.test.yang.example/target/classes/META-INF/MANIFEST.MF-f2fdadd8-c84d-3103-b379-526764727c77--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/AllTests.suite b/tests/com.cisco.yangide.editor.test/TestCases/AllTests.suite
new file mode 100644 (file)
index 0000000..2fb9ef5
--- /dev/null
@@ -0,0 +1,20 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Element-Name: AllTests
+Element-Type: testsuite
+Element-Version: 2.0
+Id: _bntb4BYVEeSaxLxF-fnitg
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 1:17 PM
+
+------=_testcase-items-62c497da-4241-31f4-811a-6b453a3ecff8
+Content-Type: text/testcase
+Entry-Name: testcase-items
+
+_MoMCYBPBEeSaxLxF-fnitg        // kind: 'suite' name: 'Wizards' path: 'Wizards/Wizards.suite'
+_YDMzUBYVEeSaxLxF-fnitg        // kind: 'suite' name: 'Outline' path: 'OutlinePage/Outline.suite'
+_WQPEEBYZEeSaxLxF-fnitg        // kind: 'suite' name: 'AutoComplete' path: 'AutoCompletion/AutoComplete.suite'
+_Ktvw8BYcEeSaxLxF-fnitg        // kind: 'suite' name: 'AutoIndent' path: 'AutoIndenting/AutoIndent.suite'
+_-hQJcBYcEeSaxLxF-fnitg        // kind: 'suite' name: 'SyntaxColor' path: 'SyntaxColoring/SyntaxColor.suite'
+
+------=_testcase-items-62c497da-4241-31f4-811a-6b453a3ecff8--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/AutoCompletion/AutoComplete.suite b/tests/com.cisco.yangide.editor.test/TestCases/AutoCompletion/AutoComplete.suite
new file mode 100644 (file)
index 0000000..339b093
--- /dev/null
@@ -0,0 +1,17 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Element-Name: AutoComplete
+Element-Type: testsuite
+Element-Version: 2.0
+Id: _WQPEEBYZEeSaxLxF-fnitg
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 12:38 PM
+
+------=_testcase-items-62c497da-4241-31f4-811a-6b453a3ecff8
+Content-Type: text/testcase
+Entry-Name: testcase-items
+
+_M0ZOcA5HEeSKlfM72EMibA        // kind: 'test' name: 'AutoCompletionTestCase1' path: 'AutoCompletionTestCase1.test'
+_TwMTMA5YEeSKlfM72EMibA        // kind: 'test' name: 'AutoCompletionTestCase2' path: 'AutoCompletionTestCase2.test'
+
+------=_testcase-items-62c497da-4241-31f4-811a-6b453a3ecff8--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/AutoCompletion/AutoCompletionTestCase1.test b/tests/com.cisco.yangide.editor.test/TestCases/AutoCompletion/AutoCompletionTestCase1.test
new file mode 100644 (file)
index 0000000..39af7ce
--- /dev/null
@@ -0,0 +1,47 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Contexts: _CN8X4Av8EeSdascDp4ftXw,_aHkbQAwDEeSdascDp4ftXw
+Element-Name: AutoCompletionTestCase1
+Element-Type: testcase
+Element-Version: 3.0
+External-Reference: 
+Id: _M0ZOcA5HEeSKlfM72EMibA
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 12:46 PM
+Testcase-Type: ecl
+Verifications: _EwyH4A5IEeSKlfM72EMibA
+
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac
+Content-Type: text/ecl
+Entry-Name: .content
+
+with [get-editor "opendaylight-flow-statistics.yang" | get-text-viewer] {
+    set-caret-pos 3 21
+    key-type Enter
+    type-text i
+    key-type "M1+SPACE"
+}
+with [get-window -from "CompletionProposalPopup.createProposalSelector()" | get-table] {
+    get-property "getItems().TableItem[0].getText()" | equals identity | verify-true
+    get-property "getItems().TableItem[1].getText()" | equals "if-feature" | verify-true
+    get-property "getItems().TableItem[2].getText()" | equals import | verify-true
+    get-property "getItems().TableItem[4].getText()" | equals input | verify-true
+}
+get-window -from "CompletionProposalPopup.createProposalSelector()" | get-table | select import | click -default
+with [get-editor "opendaylight-flow-statistics.yang" | get-text-viewer] {
+    set-caret-pos 4 11
+    type-text " "
+    key-type "M1+SPACE" -times 2
+}
+with [get-window -from "CompletionProposalPopup.createProposalSelector()" | get-table] {
+    get-property "getItems().TableItem[0].getText()" | equals "flow-capable-transaction (2013-11-03)" | verify-true
+    get-property "getItems().TableItem[1].getText()" | equals "flow-errors (2013-11-16)" | verify-true
+    get-property "getItems().TableItem[2].getText()" | equals "flow-node-inventory (2013-08-19)" | verify-true
+    get-property "getItems().TableItem[32].getText()" | equals "yang-ext (2013-07-09)" | verify-true
+}
+
+get-window -from "CompletionProposalPopup.createProposalSelector()" | get-table 
+    | select "flow-errors \\(2013-11-16\\)" | click -default
+    
+    
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/AutoCompletion/AutoCompletionTestCase2.test b/tests/com.cisco.yangide.editor.test/TestCases/AutoCompletion/AutoCompletionTestCase2.test
new file mode 100644 (file)
index 0000000..37e11be
--- /dev/null
@@ -0,0 +1,77 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Contexts: _CN8X4Av8EeSdascDp4ftXw,_aHkbQAwDEeSdascDp4ftXw
+Element-Name: AutoCompletionTestCase2
+Element-Type: testcase
+Element-Version: 3.0
+External-Reference: 
+Id: _TwMTMA5YEeSKlfM72EMibA
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 12:56 PM
+Testcase-Type: ecl
+Verifications: _vUNrEA5nEeSKlfM72EMibA
+
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac
+Content-Type: text/ecl
+Entry-Name: .content
+
+with [get-editor "opendaylight-flow-statistics.yang" | get-text-viewer] {
+    set-caret-pos 15 28
+    key-type Enter
+    key-type "M1+SPACE"
+}
+with [get-window -from "CompletionProposalPopup.createProposalSelector()" | get-table] {
+    get-property "getItemCount()" | equals 11 | verify-true
+    get-property "getItems().TableItem[0].getText()" | equals description | verify-true
+    get-property "getItems().TableItem[1].getText()" | equals reference | verify-true
+    get-property "getItems().TableItem[2].getText()" | equals "container - new container declaration" | verify-true
+}
+with [get-editor "opendaylight-flow-statistics.yang" | get-text-viewer] {
+    set-caret-pos 36 14
+    key-type "M1+SPACE"
+}
+with [get-window -from "CompletionProposalPopup.createProposalSelector()" | get-table] {
+    get-property "getItems().TableItem[0].getText()" | equals binary | verify-true
+    get-property "getItems().TableItem[19].getText()" | equals "flow-node:flow-id" | verify-true
+    get-property "getItems().TableItem[20].getText()" | equals "flow-types:flow-cookie" | verify-true
+    get-property "getItems().TableItem[33].getText()" | equals "inet:ipv4-prefix" | verify-true
+}
+with [get-editor "opendaylight-flow-statistics.yang" | get-text-viewer] {
+    set-caret-pos 53 14
+    key-type "M1+SPACE"
+}
+with [get-window -from "CompletionProposalPopup.createProposalSelector()" | get-table] {
+    get-property "getItems().TableItem[0].getText()" | equals "aggregate-flow-statistics" | verify-true
+    get-property "getItems().TableItem[1].getText()" | equals "ext:rpc-context-ref" | verify-true
+    get-property "getItems().TableItem[28].getText()" | equals "tr:transaction-aware" | verify-true
+}
+with [get-editor "opendaylight-flow-statistics.yang" | get-text-viewer] {
+    set-caret-pos 62 9
+    key-type "M1+SPACE"
+}
+with [get-window -from "CompletionProposalPopup.createProposalSelector()" | get-table] {
+    get-property "getItems().TableItem[0].getText()" | equals description | verify-true
+    get-property "getItems().TableItem[1].getText()" | equals grouping | verify-true
+    get-property "getItems().TableItem[7].getText()" | equals typedef | verify-true
+    get-property "getItems().TableItem[8].getText()" | equals "container - new container declaration" | verify-true
+}
+with [get-editor "opendaylight-flow-statistics.yang" | get-text-viewer] {
+    set-caret-pos 36 2
+    key-type Enter
+    key-type "M1+SPACE"
+}
+with [get-window -from "CompletionProposalPopup.createProposalSelector()" | get-table] {
+    get-property "getItems().TableItem[0].getText()" | equals default | verify-true
+    get-property "getItems().TableItem[1].getText()" | equals description | verify-true
+    get-property "getItems().TableItem[5].getText()" | equals units | verify-true
+    get-property "getItems().TableItem[6].getText()" | equals "container - new container declaration" | verify-true
+}
+with [get-editor "opendaylight-flow-statistics.yang" | get-text-viewer] {
+    set-caret-pos 33 10
+    key-type Enter
+    type-text ty
+    key-type "M1+SPACE"
+    key-type Down
+    key-type Enter
+}
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/AutoCompletion/AutoCompletionValidation1.verification b/tests/com.cisco.yangide.editor.test/TestCases/AutoCompletion/AutoCompletionValidation1.verification
new file mode 100644 (file)
index 0000000..4b97f45
--- /dev/null
@@ -0,0 +1,143 @@
+--- RCPTT verification ---
+Format-Version: 1.0
+Element-Name: AutoCompletionValidation1
+Element-Type: verification
+Element-Version: 2.0
+Id: _EwyH4A5IEeSKlfM72EMibA
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 12:46 PM
+Verification-Type: org.eclipse.rcptt.verifications.text
+
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf
+Content-Type: q7/binary
+Entry-Name: .q7.content
+
+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
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/AutoCompletion/AutoCompletionValidation2.verification b/tests/com.cisco.yangide.editor.test/TestCases/AutoCompletion/AutoCompletionValidation2.verification
new file mode 100644 (file)
index 0000000..e13fed2
--- /dev/null
@@ -0,0 +1,130 @@
+--- RCPTT verification ---
+Format-Version: 1.0
+Element-Name: AutoCompletionValidation2
+Element-Type: verification
+Element-Version: 2.0
+Id: _vUNrEA5nEeSKlfM72EMibA
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 12:57 PM
+Verification-Type: org.eclipse.rcptt.verifications.text
+
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf
+Content-Type: q7/binary
+Entry-Name: .q7.content
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTVXW1vJMlt/m7A/2GgAP4USV0vXdWt
+uz1jcXAAI7nAsJ1DvgWzo5aukdHMZGa0L3Duv6d6tJLI0U7rIZe9uOjDeS1198MqskgWi2R9/8ePd8vZ
++26769erN2fuojqbdavF+rpf3b45u9/fnDdnf/zh97/7fr29vegWy36z6y62i81+f1Fe6m/6xXxf3txd
+7LuP+6u/l//8TH49+3jXXz193A8fL3Cr3VX5/ZuzX/b7zdXl5YcPHy7Wd7cXBeHyP3/68+MjCODTNx4f
+HL5xePiSPXw5PHw2W83vujdnb+/36x/Xd5tlN/zt5/myvz485c9m/fWbs/96/x//vv3T23r1p+5v/7q8
++Sn7P/3Uv3t7Ntt1y26xX2/fnN12+/Puui//nv3hf+7X++/Wm251Pf+07G9/2Z/fLNcfznf78s3dvl/s
+Lj7NV7cPj83+dza8OhBz/r7vPnTbs9nDMO7W1/fLbjb2ndk//vBPH99+Nys/wzh2m/mi+wx/v11d0Vev
+hlevnl99eOq7p/c32+6m/zgbnhoeevjD01/7u816u58NZJ8X4mb/+Px4+fd3s233vh+4eV7m7BHeVy6c
+V/m8aj8D/Xr8LTaufvW+W5W5+/T05fKb705/uDl32IcPE7b/tOl2T19+/tVpAFed+wQBPM/oEczwh9dg
+qvbc1xDMfv5u2R0hkN8pR3KYitX6uvsCA57+pmTD4f3FfPNA5Ha+2s0Xh/X/RP725Ut9V7RLv+r2R0Md
+fnVS0KrDPEZGCBffxxdPEE+WUflH+/ze8HPd7RbbfrN/fv3Pq37fz5fPX13fHEY7Iwtz123f94vueJX9
+yum6vHx7f3tXJv7F+2WE89l+Pdv/0vGZPHDrhwfW/zD85elj88+fesC8LBy9Gh7ePf3r8omlV4f3yf8/
+fOh4LoafQYN//vB5f13+WxRo96jijrTRwJb58YiHn/tdYeXRwyfn5Ha7vt8US3P8whFhi/VqPy9isX3l
+uYdpLk/f9LePZM+XuxeceUnrQQIPM3PiqecVfnXbFUr6xRfH9zzG49E+/XL4yHV38/l/HuD766ORvBTE
+g9D012wo7JXhg4e1c3W/7cEZn6+uKU/v5pvzZfn3q8T82/DQ40ooH6HSXD7ypfk+fFcAOvz8d/eJSt/R
+6MnPspufmkk2PZ8fefmBX0dk4yW9CL+BuX5tln+abw6vv+v2H7pu9Tzb/X43O23dMcmWSPULTTb7619+
+nC3my+Vu0Fs33X7xy7FWe9bHm8XB6ylPHyz0js7CzXZ99/SXB8N3vKhfzsu/HPCIyBVJLN940p+Df7Mb
+tGO/4r///P3y+PCr3Ye+fOdLs9evNvdfksfDnD1q2PNBKw2eXLFapwRi+Fnf70e+NrYiTqii/faKmNjz
++Yf5tvsSAafYd8yQF/x45oUpKw5zvukWg1tO+DE5O4afg4J4MKTjGoL4WVePz7+mLn4j/B5h9RRsfsnO
+3wivX9d9v12Grdb7583zC215vzk4w69ya3iPO6iFK+8+jUz7YX3crbfdX7vNsn+hg4efw/J4t16XR1dj
+08k4dcoqQRMKTOYLy/RTAS1W6aZszee3t9vudpiwY4d7sV4OW/nyPb1DLfegn+h5sRxHfemTr73u4518
+9aR/jb7xMNlCT5t4G8CgRtfJl12Qkxx/aftO8uJINZ4XSXp2XUBF+UwHmcCDSBLTuPut6MvfjG2Uy8fT
+q3KVq5eG2/59tyoqa+C0oTzMDl/sdo+RgAPMwy9nAxnkl/9fbek3ZfCXbeppVoPG9e1Jq3Jg6ANv/hkw
+ua/ZSflkPU7U3f1y32/m2/35q5bz4b9ns/52VYz/3/afloe4/35735398PvfzWbf78rvymeX3ep2/8ub
+s3RWxrnaD092b87KS3fz5cOT5dkyA91gfFbXP66XZTbeLe/LQ843Z5ePjxTat/u/rMsHi70pfzsbjPH9
+3XD08Pmh7y8fIBn84bUD+iMhboyQ0ygZQMnPKIV0fLzAIBsAPtRfPcqQEBx0NuXDDMg0BzLPtXKcyHxG
+/4zT2oqvfyalBiipnY6zBMZFBIeMOETJkIue6VbwmB0y6MZYzAh+bBF8pZhR3lYATksm3VhLBpmYtY1O
+zAiMQ7Rx2+oWFjBM5wF8VzXglJ8G8shAXVl1U/G2lvHW+UrH3FrIXOeJsrKwgrWUu7796pF6ZOG6gE6p
+fKSYeAX3LcTLQ7NOrbJ21hGr7AJZvBIbhYwUsQuO+gXKkYYAAQUCFCbjb0BcA1crfWgCFBHvztVUkLyx
+E0KpgaQtEWUiIQYgIEFKJjudG0KBoAWc02TKJAltVaNcYUlqqxqywrwFe5PQWPlKuWlLwvXrK2N3mhKA
+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
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/AutoIndenting/AutoIndent.suite b/tests/com.cisco.yangide.editor.test/TestCases/AutoIndenting/AutoIndent.suite
new file mode 100644 (file)
index 0000000..24d841b
--- /dev/null
@@ -0,0 +1,18 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Element-Name: AutoIndent
+Element-Type: testsuite
+Element-Version: 2.0
+Id: _Ktvw8BYcEeSaxLxF-fnitg
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 12:58 PM
+
+------=_testcase-items-62c497da-4241-31f4-811a-6b453a3ecff8
+Content-Type: text/testcase
+Entry-Name: testcase-items
+
+_LA_SIAwNEeSdascDp4ftXw        // kind: 'test' name: 'AutoIndentingTestCase' path: 'AutoIndentingTestCase.test'
+__1C5kA46EeS2F7KvdfPBCg        // kind: 'test' name: 'SmartPasteTestCase1' path: 'SmartPasteTestCase1.test'
+_eiE1UA5AEeSmmuXdoHAkcQ        // kind: 'test' name: 'SmartPasteTestCase2' path: 'SmartPasteTestCase2.test'
+
+------=_testcase-items-62c497da-4241-31f4-811a-6b453a3ecff8--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/AutoIndenting/AutoIndentingTestCase.test b/tests/com.cisco.yangide.editor.test/TestCases/AutoIndenting/AutoIndentingTestCase.test
new file mode 100644 (file)
index 0000000..8f836d4
--- /dev/null
@@ -0,0 +1,65 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Contexts: _CN8X4Av8EeSdascDp4ftXw,_aHkbQAwDEeSdascDp4ftXw
+Element-Name: AutoIndentingTestCase
+Element-Type: testcase
+Element-Version: 3.0
+External-Reference: 
+Id: _LA_SIAwNEeSdascDp4ftXw
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 12:59 PM
+Testcase-Type: ecl
+Verifications: _ox3R0A46EeS2F7KvdfPBCg
+
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac
+Content-Type: text/ecl
+Entry-Name: .content
+
+with [get-editor "opendaylight-flow-statistics.yang" | get-text-viewer] {
+    set-caret-pos 1 38
+    key-type Enter
+    key-type Down
+    key-type Right
+    key-type "M1+ARROW_RIGHT"
+    key-type Enter
+    key-type Down -times 4
+    key-type End
+    key-type Enter
+    key-type Down -times 9
+    key-type End
+    key-type Enter
+    key-type Down
+    key-type End
+    key-type Enter
+    key-type Up
+    key-type Right -times 8
+    key-type Enter
+    set-caret-pos 28 67
+    key-type Enter
+    key-type Down -times 2
+    key-type Right -times 5
+    key-type Enter
+    key-type Down
+    key-type "M2+HOME"
+    select-range 33 6 33 5
+    key-type "M2+HOME"
+    select-range 33 6 33 1
+    key-type Del
+    key-type Down
+    type-text "}"
+    key-type Enter
+    key-type Down -times 2
+    key-type End
+    key-type Left
+    key-type "M2+ARROW_DOWN" -times 4
+    key-type Del
+    type-text "{"
+    key-type Enter
+    type-text ";"
+    key-type Enter
+    key-type Down -times 15
+    key-type Up
+    key-type Home
+    key-type Enter
+}
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/AutoIndenting/AutoIndentingValidation.verification b/tests/com.cisco.yangide.editor.test/TestCases/AutoIndenting/AutoIndentingValidation.verification
new file mode 100644 (file)
index 0000000..bcb4634
--- /dev/null
@@ -0,0 +1,130 @@
+--- RCPTT verification ---
+Format-Version: 1.0
+Element-Name: AutoIndentingValidation
+Element-Type: verification
+Element-Version: 2.0
+Id: _ox3R0A46EeS2F7KvdfPBCg
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 1:02 PM
+Verification-Type: org.eclipse.rcptt.verifications.text
+
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf
+Content-Type: q7/binary
+Entry-Name: .q7.content
+
+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
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/AutoIndenting/SmartPasteTestCase1.test b/tests/com.cisco.yangide.editor.test/TestCases/AutoIndenting/SmartPasteTestCase1.test
new file mode 100644 (file)
index 0000000..2e90202
--- /dev/null
@@ -0,0 +1,33 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Contexts: _CN8X4Av8EeSdascDp4ftXw,_aHkbQAwDEeSdascDp4ftXw
+Element-Name: SmartPasteTestCase1
+Element-Type: testcase
+Element-Version: 3.0
+External-Reference: 
+Id: __1C5kA46EeS2F7KvdfPBCg
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 12:59 PM
+Testcase-Type: ecl
+Verifications: _kj7cUA47EeS2F7KvdfPBCg
+
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac
+Content-Type: text/ecl
+Entry-Name: .content
+
+with [get-editor "opendaylight-flow-statistics.yang" | get-text-viewer] {
+    set-caret-pos 16 2
+    select-range 19 6 15 1
+    key-type "M1+c"
+    set-caret-pos 19 6
+    key-type Enter -times 2
+    key-type Home
+    key-type "M1+v"
+    set-caret-pos 38 8
+    select-range 39 6 33 1
+    key-type "M1+c"
+    set-caret-pos 51 30
+    key-type Enter
+    key-type "M1+v"
+}
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/AutoIndenting/SmartPasteTestCase2.test b/tests/com.cisco.yangide.editor.test/TestCases/AutoIndenting/SmartPasteTestCase2.test
new file mode 100644 (file)
index 0000000..f9daa1a
--- /dev/null
@@ -0,0 +1,41 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Contexts: _CN8X4Av8EeSdascDp4ftXw,_aHkbQAwDEeSdascDp4ftXw
+Element-Name: SmartPasteTestCase2
+Element-Type: testcase
+Element-Version: 3.0
+External-Reference: 
+Id: _eiE1UA5AEeSmmuXdoHAkcQ
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 12:59 PM
+Testcase-Type: ecl
+Verifications: _rsvf0A5AEeSmmuXdoHAkcQ
+
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac
+Content-Type: text/ecl
+Entry-Name: .content
+
+get-preferences-menu | click
+with [get-window Preferences] {
+    get-tree | select "YANG/Syntax Coloring"
+    get-link "Default colors and font can be configured on the <a href=\"org.eclipse.ui.preferencePages.GeneralTextEditor\">\'Text Editors\'</a> and on the <a href=\"org.eclipse.ui.preferencePages.ColorsAndFonts\">\'Colors and Fonts\'</a> preference page." 
+        | click-link "org.eclipse.ui.preferencePages.GeneralTextEditor"
+    get-button "Insert spaces for tabs" | check
+    get-button OK | click
+}
+with [get-editor "opendaylight-flow-statistics.yang" | get-text-viewer] {
+    set-caret-pos 16 2
+    select-range 19 6 15 1
+    key-type "M1+c"
+    set-caret-pos 19 6
+    key-type Enter -times 2
+    key-type Home
+    key-type "M1+v"
+    set-caret-pos 38 8
+    select-range 39 6 33 1
+    key-type "M1+c"
+    set-caret-pos 51 30
+    key-type Enter
+    key-type "M1+v"
+}
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/AutoIndenting/SmartPasteValidation1.verification b/tests/com.cisco.yangide.editor.test/TestCases/AutoIndenting/SmartPasteValidation1.verification
new file mode 100644 (file)
index 0000000..ee83fa4
--- /dev/null
@@ -0,0 +1,136 @@
+--- RCPTT verification ---
+Format-Version: 1.0
+Element-Name: SmartPasteValidation1
+Element-Type: verification
+Element-Version: 2.0
+Id: _kj7cUA47EeS2F7KvdfPBCg
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 1:02 PM
+Verification-Type: org.eclipse.rcptt.verifications.text
+
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf
+Content-Type: q7/binary
+Entry-Name: .q7.content
+
+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
+AAAAAQABADYAAADlGwAAAAA=
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/AutoIndenting/SmartPasteValidation2.verification b/tests/com.cisco.yangide.editor.test/TestCases/AutoIndenting/SmartPasteValidation2.verification
new file mode 100644 (file)
index 0000000..023e3f5
--- /dev/null
@@ -0,0 +1,136 @@
+--- RCPTT verification ---
+Format-Version: 1.0
+Element-Name: SmartPasteValidation2
+Element-Type: verification
+Element-Version: 2.0
+Id: _rsvf0A5AEeSmmuXdoHAkcQ
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 1:02 PM
+Verification-Type: org.eclipse.rcptt.verifications.text
+
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf
+Content-Type: q7/binary
+Entry-Name: .q7.content
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTVXW1vJMlt/m7A/2GgAP4USV3v3brb
+MxZGghjIARefcfC3YHbU0g08mlFmRvsC5/57qkcridRL6yGXvVnrw+JO6u6HVWSRLBbJ+v6PH69Ws/f9
+drfcrN8cuZPmaNavF5vz5fryzdHN/uK4PfrjD7//3feb7eVJv1gtr3f9yXZxvd+f1JeWF8vFfF/f3J3s
++4/7s7/Wf34hv559vFqe3X/cDx+vcOvdWf39m6Nf9/vrs9PTDx8+nGyuLk8qwunffvzz3SMI4P037h4c
+vnF4+JQ9fDo8fDRbz6/6N0c/X823+5/mu33/y3y1PD884Y9my/M3R/+93b2/aN6mt//W/3x1dfO3881/
+vP374r+OZrt+1S/2m+2bo8t+f9yfL+t/z/7wPzeb/Xeb6359Pv+0Wl7+uj++WG0+HO/29Zu7/XKxO/k0
+X1/ePjb739nw6kDI8ftl/6HfHs1uh3C1Ob9Z9bOx78z+8Yd/+fj2u1n9Gcawu54v+s/wN9v1GX31bHj1
+7OHV26e+u3//ettfLD/OhqeGh27/cP/X5dX1ZrufDWQfV+Jm//j8eP3v72bb/v1y4ORxnbM7eN+4cNyU
+46b7DPTb42+xcS3X7/t1nbtP91+uv/nu5Q+3xw778GHC9p+u+939lx9+9TKAa459hgAeZvQRzPCH12Ca
+7tgnCGY/f7fqHyGQ3ylHcpiK9ea8f4YB939TsuHw/mJ+fUvkdr7ezReHtX9P/vbpS8u+apblut8/Gurw
+qxcFrTnMY2SEcPG9e/EF4skyGn7O+91iu7zeP7zw5/Vyv5yvHr6zuTiMb0aW4q7fvl8u+sfr6jdOyen9
+f32LxB3+eXtzeVVl4ck36qTPZ/vNbP9rz5l7EKAfbqXxh+Ev9x+cf/7ULe5pFbKz4eHd/X+d3kvZ2eF9
+8v+HDz03A4NB+fzh4+V5/bfq8/5O6z5SkIOkzB+Pevi52VXpevTwi/Nyud3cXFfD9/iFR4QtNuv9vErq
+9pXnDrN8Wp++WF7ekT1f7Z5w5ymth0VxmJkXnnpQOmeXfaVkuXh2fA9jfGa0w+vn/a0M1Ql+Vf4OcrI8
+f4764VOHtXt2s12C0ztfn1MGXs2vj1f1v18l4z+Hh+5Ev36Eim79yHPkHb4rAB1+/t5/oqL2/LgPH+/n
+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
+AAAAAQABADYAAADlGwAAAAA=
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/OutlinePage/Outline.suite b/tests/com.cisco.yangide.editor.test/TestCases/OutlinePage/Outline.suite
new file mode 100644 (file)
index 0000000..1e219bd
--- /dev/null
@@ -0,0 +1,16 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Element-Name: Outline
+Element-Type: testsuite
+Element-Version: 2.0
+Id: _YDMzUBYVEeSaxLxF-fnitg
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 12:09 PM
+
+------=_testcase-items-62c497da-4241-31f4-811a-6b453a3ecff8
+Content-Type: text/testcase
+Entry-Name: testcase-items
+
+_Q2aGsBJKEeSuB9srVCSsAA        // kind: 'test' name: 'OutlineViewTestCase' path: 'OutlineViewTestCase.test'
+
+------=_testcase-items-62c497da-4241-31f4-811a-6b453a3ecff8--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/OutlinePage/OutlineViewTestCase.test b/tests/com.cisco.yangide.editor.test/TestCases/OutlinePage/OutlineViewTestCase.test
new file mode 100644 (file)
index 0000000..5b6de65
--- /dev/null
@@ -0,0 +1,42 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Contexts: _CN8X4Av8EeSdascDp4ftXw,_aHkbQAwDEeSdascDp4ftXw
+Element-Name: OutlineViewTestCase
+Element-Type: testcase
+Element-Version: 3.0
+External-Reference: 
+Id: _Q2aGsBJKEeSuB9srVCSsAA
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 11:40 AM
+Testcase-Type: ecl
+
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac
+Content-Type: text/ecl
+Entry-Name: .content
+
+// select text in the editor and verify the corresponding element was selected in the outline
+with [get-editor "opendaylight-flow-statistics.yang" | get-text-viewer] {
+    set-caret-pos 10 14
+    select-range 10 12 10 31
+}
+get-view Outline | get-tree | get-item "flow-node-inventory" | get-property selected 
+    | equals true | verify-true
+
+with [get-editor "opendaylight-flow-statistics.yang" | get-text-viewer] {
+    set-caret-pos 28 32
+    select-range 28 34 28 19
+}
+with [get-view Outline | get-tree] {
+    get-view Outline | get-tree | get-item "flow-statistics/flow-statistics" 
+    | get-property selected | equals true | verify-true
+}
+
+
+// select element in the outline and verify the text (element name) was selected in the editor
+get-view Outline | get-tree | select "flow-node-inventory"
+get-editor "opendaylight-flow-statistics.yang" | get-text-viewer | get-property "getSelectionText()" | equals "flow-node-inventory" | verify-true
+get-view Outline | get-tree | select "get-aggregate-flow-statistics-from-flow-table-for-all-flows"
+get-editor "opendaylight-flow-statistics.yang" | get-text-viewer | get-property "getSelectionText()" | equals "get-aggregate-flow-statistics-from-flow-table-for-all-flows" | verify-true
+
+
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/InvalidFileSyntaxColoringTestCase1.test b/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/InvalidFileSyntaxColoringTestCase1.test
new file mode 100644 (file)
index 0000000..025533e
--- /dev/null
@@ -0,0 +1,23 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Contexts: _CN8X4Av8EeSdascDp4ftXw,_aHkbQAwDEeSdascDp4ftXw
+Element-Name: InvalidFileSyntaxColoringTestCase1
+Element-Type: testcase
+Element-Version: 3.0
+External-Reference: 
+Id: _iv06cAwXEeSdascDp4ftXw
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 1:25 PM
+Testcase-Type: ecl
+Verifications: _7pWjUAwYEeSdascDp4ftXw
+
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac
+Content-Type: text/ecl
+Entry-Name: .content
+
+with [get-editor "opendaylight-flow-statistics.yang" | get-text-viewer] {
+    set-caret-pos 2 48
+    key-type Del
+}
+wait 5000
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/InvalidFileSyntaxColoringTestCase2.test b/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/InvalidFileSyntaxColoringTestCase2.test
new file mode 100644 (file)
index 0000000..307b94c
--- /dev/null
@@ -0,0 +1,22 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Contexts: _CN8X4Av8EeSdascDp4ftXw,_aHkbQAwDEeSdascDp4ftXw
+Element-Name: InvalidFileSyntaxColoringTestCase2
+Element-Type: testcase
+Element-Version: 3.0
+External-Reference: 
+Id: _VzGTYAwZEeSdascDp4ftXw
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 1:04 PM
+Testcase-Type: ecl
+Verifications: _qpxK0AwaEeSdascDp4ftXw
+
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac
+Content-Type: text/ecl
+Entry-Name: .content
+
+with [get-editor "opendaylight-flow-statistics.yang" | get-text-viewer] {
+    set-caret-pos 2 9
+    type-text " "
+}
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/InvalidFileSyntaxColoringTestCase3.test b/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/InvalidFileSyntaxColoringTestCase3.test
new file mode 100644 (file)
index 0000000..30567ab
--- /dev/null
@@ -0,0 +1,22 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Contexts: _CN8X4Av8EeSdascDp4ftXw,_aHkbQAwDEeSdascDp4ftXw
+Element-Name: InvalidFileSyntaxColoringTestCase3
+Element-Type: testcase
+Element-Version: 3.0
+External-Reference: 
+Id: _Zz-5cAwaEeSdascDp4ftXw
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 1:05 PM
+Testcase-Type: ecl
+Verifications: _twNz0AwZEeSdascDp4ftXw
+
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac
+Content-Type: text/ecl
+Entry-Name: .content
+
+with [get-editor "opendaylight-flow-statistics.yang" | get-text-viewer] {
+    set-caret-pos 5 7
+    key-type BackSpace
+}
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/InvalidFileSyntaxColoringTestCase4.test b/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/InvalidFileSyntaxColoringTestCase4.test
new file mode 100644 (file)
index 0000000..bdf4cff
--- /dev/null
@@ -0,0 +1,22 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Contexts: _CN8X4Av8EeSdascDp4ftXw,_aHkbQAwDEeSdascDp4ftXw
+Element-Name: InvalidFileSyntaxColoringTestCase4
+Element-Type: testcase
+Element-Version: 3.0
+External-Reference: 
+Id: _5ayIEAwaEeSdascDp4ftXw
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 1:05 PM
+Testcase-Type: ecl
+Verifications: _KdSm0AwbEeSdascDp4ftXw
+
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac
+Content-Type: text/ecl
+Entry-Name: .content
+
+with [get-editor "opendaylight-flow-statistics.yang" | get-text-viewer] {
+    set-caret-pos 4 1
+    type-text "/*"
+}
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/InvalidFileSyntaxColoringTestCase5.test b/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/InvalidFileSyntaxColoringTestCase5.test
new file mode 100644 (file)
index 0000000..3579eda
--- /dev/null
@@ -0,0 +1,22 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Contexts: _CN8X4Av8EeSdascDp4ftXw,_aHkbQAwDEeSdascDp4ftXw
+Element-Name: InvalidFileSyntaxColoringTestCase5
+Element-Type: testcase
+Element-Version: 3.0
+External-Reference: 
+Id: _tWer4AweEeSdascDp4ftXw
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 1:07 PM
+Testcase-Type: ecl
+Verifications: _tVaKUAwdEeSdascDp4ftXw
+
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac
+Content-Type: text/ecl
+Entry-Name: .content
+
+with [get-editor "opendaylight-statistics-types.yang" | get-text-viewer] {
+    set-caret-pos 5 6
+    key-type BackSpace
+}
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/InvalidFileSyntaxColoringTestCase6.test b/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/InvalidFileSyntaxColoringTestCase6.test
new file mode 100644 (file)
index 0000000..a502cb0
--- /dev/null
@@ -0,0 +1,22 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Contexts: _CN8X4Av8EeSdascDp4ftXw,_aHkbQAwDEeSdascDp4ftXw
+Element-Name: InvalidFileSyntaxColoringTestCase6
+Element-Type: testcase
+Element-Version: 3.0
+External-Reference: 
+Id: _R7EVEAwdEeSdascDp4ftXw
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 1:06 PM
+Testcase-Type: ecl
+Verifications: _wR2Q0AweEeSdascDp4ftXw
+
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac
+Content-Type: text/ecl
+Entry-Name: .content
+
+with [get-editor "opendaylight-statistics-types.yang" | get-text-viewer] {
+    set-caret-pos 9 30
+    key-type Enter
+}
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/SyntaxColor.suite b/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/SyntaxColor.suite
new file mode 100644 (file)
index 0000000..ea05165
--- /dev/null
@@ -0,0 +1,16 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Element-Name: SyntaxColor
+Element-Type: testsuite
+Element-Version: 2.0
+Id: _-hQJcBYcEeSaxLxF-fnitg
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 1:27 PM
+
+------=_testcase-items-62c497da-4241-31f4-811a-6b453a3ecff8
+Content-Type: text/testcase
+Entry-Name: testcase-items
+
+_JFpV4AwEEeSdascDp4ftXw        // kind: 'test' name: 'ValidFileSyntaxColoringTestCase' path: 'ValidFileSyntaxColoringTestCase.test'
+
+------=_testcase-items-62c497da-4241-31f4-811a-6b453a3ecff8--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/SyntaxValidations/InvalidFileSyntaxValidation1.verification b/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/SyntaxValidations/InvalidFileSyntaxValidation1.verification
new file mode 100644 (file)
index 0000000..b5bb049
--- /dev/null
@@ -0,0 +1,87 @@
+--- RCPTT verification ---
+Format-Version: 1.0
+Element-Name: InvalidFileSyntaxValidation1
+Element-Type: verification
+Element-Version: 2.0
+Id: _7pWjUAwYEeSdascDp4ftXw
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 1:25 PM
+Verification-Type: org.eclipse.rcptt.verifications.text
+
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf
+Content-Type: q7/binary
+Entry-Name: .q7.content
+
+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
+EAAAAAA=
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/SyntaxValidations/InvalidFileSyntaxValidation2.verification b/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/SyntaxValidations/InvalidFileSyntaxValidation2.verification
new file mode 100644 (file)
index 0000000..9f6333f
--- /dev/null
@@ -0,0 +1,132 @@
+--- RCPTT verification ---
+Format-Version: 1.0
+Element-Name: InvalidFileSyntaxValidation2
+Element-Type: verification
+Element-Version: 2.0
+Id: _qpxK0AwaEeSdascDp4ftXw
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 1:10 PM
+Verification-Type: org.eclipse.rcptt.verifications.text
+
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf
+Content-Type: q7/binary
+Entry-Name: .q7.content
+
+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
+AAAAAA==
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/SyntaxValidations/InvalidFileSyntaxValidation3.verification b/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/SyntaxValidations/InvalidFileSyntaxValidation3.verification
new file mode 100644 (file)
index 0000000..f394e63
--- /dev/null
@@ -0,0 +1,128 @@
+--- RCPTT verification ---
+Format-Version: 1.0
+Element-Name: InvalidFileSyntaxValidation3
+Element-Type: verification
+Element-Version: 2.0
+Id: _twNz0AwZEeSdascDp4ftXw
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 1:11 PM
+Verification-Type: org.eclipse.rcptt.verifications.text
+
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf
+Content-Type: q7/binary
+Entry-Name: .q7.content
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTVXd9vI0lufj/g/gfBAe4ptrt+dFW1
+d2cPi0sOWCAbHG4Pi0NeAo3c9gqRJUWSxzO57P+eanlsk7bV/sihBhs/DHbt7v5YRRbJYpGsb//48WYx
++dBvtvPV8t2JO2tOJv1ytrqcL6/fndzurk7LyR+/+/3vvl1trs/62WK+3vZnm9l6tzurL82v5rPprr65
+Pdv1H3cXf6v//Ex+Pfl4M794/LgfPl7hltuL+vt3J7/sduuL8/O7u7uz1c31WUU4//uPPzw8ggA+fuPh
+weEb+4fP2cPnw8Mnk+X0pn938sPyw3Qxv/zzfNH/9Gm5m378efjf/YPhZDK/fHfyn7u7f/+f5vu7//jX
+/qfL6Xb2L+t4tfv73clk2y/62W61eXdy3e9O+8t5/e/JH/77drX7ZrXul5fTT4v59S+706vF6u50u6vf
+3O7ms+3Zp+ny+v6xyf9OhlcHek4/zPu7fnMyuR/JzerydtFPxr4z+ccf/unj999M6s8wlO16Ous/w99u
+lhf01Yvh1YunV++f+ubx/fWmv5p/nAxPDQ/d/+Hxr/P1arObDFSfVtom//j8dP3vbyab/sN84OdpnbIH
+dN+4cNrk06b7jPPr06du9t9iw5ovP/TLOnWfHr9cf/PN4Q+XU4d9eD9fu0/rfvv45adfHQZwzalPEMDT
+hD6DGf7wFkzTnfoWgtlN3y/6Zwjkd8qR7KdiubrsX2HA49+UbNi/P5uu74ncTJfb6WyvAR7J37x8ad5X
+/TJf9rtnQx1+dVDQmv08RkYIl96HFw8QT1bR8HPZb2eb+Xr39MIPy/luPl08fWd1tR/fhKzEbb/5MJ/1
+z5fVr5yS8/Pvb69v6lS/eL+OaTrZrSa7X3o+d3v+fHfP7O+Gvzx+bPr5U/eY55WHF8PD28f/On9k4sX+
+ffL/+w+9NvpBa3/+8On8sv5blWb/oNOeqZ+BEdPnIx5+breVec8ePjgn15vV7bpal+cvPCNstqqquQrC
+5o3n7qe5Pn01v34ge7rYvuDMS1r3MrefmQNPPa3pi+u+UjKfvTq+pzG+Mtrh9cv+Xn7qBL8pe3s5mV++
+Rv3wqf3SuLjdzMHpnS4vKQNvpuvTRf3vN8n4t+GhB7GvH6GiWz/yGnn77wpAh5//6j9RUXt93PuP99ND
+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
+NgAAAP4ZAAAAAA==
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/SyntaxValidations/InvalidFileSyntaxValidation4.verification b/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/SyntaxValidations/InvalidFileSyntaxValidation4.verification
new file mode 100644 (file)
index 0000000..9b85fa1
--- /dev/null
@@ -0,0 +1,42 @@
+--- RCPTT verification ---
+Format-Version: 1.0
+Element-Name: InvalidFileSyntaxValidation4
+Element-Type: verification
+Element-Version: 2.0
+Id: _KdSm0AwbEeSdascDp4ftXw
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 1:12 PM
+Verification-Type: org.eclipse.rcptt.verifications.text
+
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf
+Content-Type: q7/binary
+Entry-Name: .q7.content
+
+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
+0gUAAAAA
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/SyntaxValidations/InvalidFileSyntaxValidation5.verification b/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/SyntaxValidations/InvalidFileSyntaxValidation5.verification
new file mode 100644 (file)
index 0000000..e6a92be
--- /dev/null
@@ -0,0 +1,101 @@
+--- RCPTT verification ---
+Format-Version: 1.0
+Element-Name: InvalidFileSyntaxValidation5
+Element-Type: verification
+Element-Version: 2.0
+Id: _tVaKUAwdEeSdascDp4ftXw
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 1:12 PM
+Verification-Type: org.eclipse.rcptt.verifications.text
+
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf
+Content-Type: q7/binary
+Entry-Name: .q7.content
+
+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
+AQA2AAAArBMAAAAA
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/SyntaxValidations/InvalidFileSyntaxValidation6.verification b/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/SyntaxValidations/InvalidFileSyntaxValidation6.verification
new file mode 100644 (file)
index 0000000..8066725
--- /dev/null
@@ -0,0 +1,107 @@
+--- RCPTT verification ---
+Format-Version: 1.0
+Element-Name: InvalidFileSyntaxValidation6
+Element-Type: verification
+Element-Version: 2.0
+Id: _wR2Q0AweEeSdascDp4ftXw
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 1:14 PM
+Verification-Type: org.eclipse.rcptt.verifications.text
+
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf
+Content-Type: q7/binary
+Entry-Name: .q7.content
+
+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
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/SyntaxValidations/ValidFileSyntaxValidation1.verification b/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/SyntaxValidations/ValidFileSyntaxValidation1.verification
new file mode 100644 (file)
index 0000000..8964a44
--- /dev/null
@@ -0,0 +1,141 @@
+--- RCPTT verification ---
+Format-Version: 1.0
+Element-Name: ValidFileSyntaxValidation1
+Element-Type: verification
+Element-Version: 2.0
+Id: _A11zIAwVEeSdascDp4ftXw
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 1:16 PM
+Verification-Type: org.eclipse.rcptt.verifications.text
+
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf
+Content-Type: q7/binary
+Entry-Name: .q7.content
+
+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
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/SyntaxValidations/ValidFileSyntaxValidation2.verification b/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/SyntaxValidations/ValidFileSyntaxValidation2.verification
new file mode 100644 (file)
index 0000000..d265b10
--- /dev/null
@@ -0,0 +1,107 @@
+--- RCPTT verification ---
+Format-Version: 1.0
+Element-Name: ValidFileSyntaxValidation2
+Element-Type: verification
+Element-Version: 2.0
+Id: _KIccYAwUEeSdascDp4ftXw
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 1:16 PM
+Verification-Type: org.eclipse.rcptt.verifications.text
+
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf
+Content-Type: q7/binary
+Entry-Name: .q7.content
+
+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
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/ValidFileSyntaxColoringTestCase.test b/tests/com.cisco.yangide.editor.test/TestCases/SyntaxColoring/ValidFileSyntaxColoringTestCase.test
new file mode 100644 (file)
index 0000000..bd0477f
--- /dev/null
@@ -0,0 +1,59 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Contexts: _CN8X4Av8EeSdascDp4ftXw,_aHkbQAwDEeSdascDp4ftXw
+Element-Name: ValidFileSyntaxColoringTestCase
+Element-Type: testcase
+Element-Version: 3.0
+External-Reference: 
+Id: _JFpV4AwEEeSdascDp4ftXw
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 1:16 PM
+Testcase-Type: ecl
+Verifications: _A11zIAwVEeSdascDp4ftXw,_KIccYAwUEeSdascDp4ftXw
+
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac
+Content-Type: text/ecl
+Entry-Name: .content
+
+//with [get-editor "opendaylight-flow-statistics.yang" | get-editbox] {
+//    get-property "styles[0].foregroundColor" | equals "#000080" | verify-true //keyword: module - blue
+//    get-property "styles[2].foregroundColor" | equals "#000000" | verify-true //identifier - black
+//    get-property "styles[8].foregroundColor" | equals "#008000" | verify-true //single-line string - green
+//     get-property "styles[125].foregroundColor" | equals "#008000" | verify-true //multi-line string - green
+//}
+//with [get-editor "opendaylight-statistics-types.yang" | get-editbox] {
+//     get-property "styles[15].foregroundColor" | equals "#802020" | verify-true //multi-line comment - red
+//     get-property "styles[104].foregroundColor" | equals "#008080" | verify-true //type - bluegreen
+//    get-property "styles[109].foregroundColor" | equals "#800080" | verify-true //number - violete
+//    get-property "styles[112].foregroundColor" | equals "#802020" | verify-true       //single-line comment - red
+//}
+//with [get-editor "opendaylight-statistics-types.yang" | get-text-viewer] {
+//    set-caret-pos 29 26
+//    key-type "M1+BS"
+//}
+//get-editor "opendaylight-statistics-types.yang" | get-text-viewer | set-caret-pos 31 35
+//
+//get-editor "opendaylight-statistics-types.yang" | get-text-viewer | get-property "styles[94].foregroundColor" 
+//    | equals "#800080" | verify-true
+//get-eclipse-window | key-type "M1+z"
+//with [get-editor "opendaylight-statistics-types.yang" | get-text-viewer] {
+//    set-caret-pos 30 29
+//    type-text x
+//}
+//get-editor "opendaylight-statistics-types.yang" | get-text-viewer | get-property "styles[99].foregroundColor" 
+//    | equals "#000000" | verify-true
+//get-eclipse-window | key-type "M1+z"
+//get-eclipse-window | key-type "M1+s"
+//with [get-editor "opendaylight-statistics-types.yang" | get-text-viewer] {
+//    set-caret-pos 5 9
+//    key-type Enter -times 3
+//    set-caret-pos 6 5
+//    type-text x
+//    set-caret-pos 15 39
+//    key-type Enter -times 3
+//    key-type Up -times 2
+//    key-type Enter
+//    type-text x
+//}
+
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/Wizards/ImportYangProjectTest.test b/tests/com.cisco.yangide.editor.test/TestCases/Wizards/ImportYangProjectTest.test
new file mode 100644 (file)
index 0000000..deb7160
--- /dev/null
@@ -0,0 +1,32 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Contexts: _kWZHoBPCEeSaxLxF-fnitg,_JCn2oBPREeSaxLxF-fnitg
+Element-Name: ImportYangProjectTest
+Element-Type: testcase
+Element-Version: 3.0
+External-Reference: 
+Id: _QkzsIBPFEeSaxLxF-fnitg
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/25/14 4:20 PM
+Testcase-Type: ecl
+
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac
+Content-Type: text/ecl
+Entry-Name: .content
+
+get-view "Package Explorer" | get-tree | get-menu "Import..." | click
+get-window Import | get-tree | select "Maven/Existing Maven Projects" | double-click
+set-dialog-result Folder "platform:/resource/model-flow-statistics"
+get-window "Import Maven Projects" | get-button "Browse..." | click
+get-window "Import Maven Projects" | get-button Finish | click
+
+get-view Problems | get-tree | get-property "getItemCount()" | equals 0 | verify-true
+get-view "Package Explorer" | get-tree | select "model-flow-statistics/src\\/main\\/yang"
+
+with [get-view "Package Explorer" | get-tree] {
+    get-item "model-flow-statistics/src\\/main\\/yang/opendaylight-flow-statistics.yang" | get-property "image.path" 
+        | equals "com.cisco.yangide.editor/icons/yang_file.png" | verify-true
+    get-item "model-flow-statistics/src\\/main\\/yang" | get-property childCount | equals 7 | verify-true
+}    
+
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/Wizards/NewYangFileTest.test b/tests/com.cisco.yangide.editor.test/TestCases/Wizards/NewYangFileTest.test
new file mode 100644 (file)
index 0000000..1548b79
--- /dev/null
@@ -0,0 +1,63 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Contexts: _r3H2sBPZEeSaxLxF-fnitg
+Element-Name: NewYangFileTest
+Element-Type: testcase
+Element-Version: 3.0
+External-Reference: 
+Id: _OhLngBPFEeSaxLxF-fnitg
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/28/14 12:34 PM
+Testcase-Type: ecl
+
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac
+Content-Type: text/ecl
+Entry-Name: .content
+
+get-view "Package Explorer" | get-tree | select "org.test.yang.example/src\\/main\\/yang" | get-menu "New/Other..." 
+    | click
+with [get-window New] {
+    get-tree | select "YANG/YANG File"
+    get-button "Next >" | click
+}
+with [get-window "New YANG File"] {
+    get-editbox -after [get-label "File name:"] | set-text "module1.yang"
+    get-button "Next >" | click
+}
+with [get-window "New YANG File"] {
+    get-editbox -after [get-label "Module Name:"] | get-property text | equals module1 | verify-true
+    get-editbox -after [get-label "Namespace:"] | get-property text | equals "urn:opendaylight:module1" | verify-true
+    get-editbox -after [get-label "Prefix:"] | get-property text | equals module1 | verify-true
+    get-editbox -after [get-label "Revision:"] | get-property "getCharCount()" | equals 10 | verify-true
+    get-editbox -after [get-label "Revision Description:"] | get-property text | equals "Initial revision" | verify-true
+    get-editbox -after [get-label "Revision:"] | set-text "2014-07-25"
+}
+get-window "New YANG File" | get-button Finish | click
+get-editor "module1.yang" | get-text-viewer | get-property text | equals "// Contents of \"module1\"\n"
+    + "module module1 {\n"
+    + "    namespace \"urn:opendaylight:module1\";\n"
+    + "    prefix \"module1\";\n\n"
+    + "    revision 2014-07-25 {\n"
+    + "        description \"Initial revision\";\n"
+    + "    }\n\n"
+    + "}" | verify-true
+get-view "Package Explorer" | get-tree | select "org.test.yang.example/src\\/main\\/yang/module1.yang" 
+    | get-menu "New/Other..." | click
+with [get-window New] {
+    get-tree | select "YANG/YANG File"
+    get-button "Next >" | click
+}
+with [get-window "New YANG File"] {
+    get-editbox -after [get-label "File name:"] | set-text "module2.yang"
+    get-button Finish | click
+}
+get-editor "module2.yang" | get-text-viewer | get-property text | assert-non-empty
+//get-editor "module2.yang" | get-text-viewer | get-property text | equals "// Contents of \"module2\"\n"
+//    + "module module2 {\n"
+//    + "    namespace \"urn:opendaylight:module2\";\n"
+//    + "    prefix \"module2\";\n\n"
+//    + "    revision 2014-07-25 {\n"
+//    + "        description \"Initial revision\";\n"
+//    + "    }\n\n"
+//    + "}" | verify-true
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/Wizards/NewYangProjectTest.test b/tests/com.cisco.yangide.editor.test/TestCases/Wizards/NewYangProjectTest.test
new file mode 100644 (file)
index 0000000..e26ecda
--- /dev/null
@@ -0,0 +1,183 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Contexts: _kWZHoBPCEeSaxLxF-fnitg
+Element-Name: NewYangProjectTest
+Element-Type: testcase
+Element-Version: 3.0
+External-Reference: 
+Id: _WbcsMBPBEeSaxLxF-fnitg
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/25/14 4:01 PM
+Testcase-Type: ecl
+Verifications: _WQzF8BPCEeSaxLxF-fnitg
+
+------=_.description-216f885c-d591-38ce-8ea2-e4f8cb4d6ffa
+Content-Type: text/plain
+Entry-Name: .description
+
+Test creation new Yang project
+------=_.description-216f885c-d591-38ce-8ea2-e4f8cb4d6ffa--
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac
+Content-Type: text/ecl
+Entry-Name: .content
+
+get-view "Package Explorer" | get-tree | get-menu "New/Project..." | click
+with [get-window "New Project"] {
+    get-tree | select "YANG/YANG Project"
+    get-button "Next >" | click
+}
+with [get-window "New YANG Project"] {
+    get-combo -after [get-label "YANG Tools Version:"] | select "0.6.1"
+    get-table | select "org.opendaylight.yangtools" | double-click
+    get-button "Edit..." | click
+    with [get-window "Code Generator Configuration"] {
+        with [get-editbox -after [get-label "Maven Artifact Version:"]] {
+            click-text 4
+            key-type Right
+            set-text "0.6.1"
+        }
+        get-button OK | click
+    }
+    get-button "Next >" | click
+    get-button "Create a simple project (skip archetype selection)" | check
+    get-button "Next >" | click
+    with [get-group Artifact] {
+        with [get-combo -after [get-label "Group Id:"]] {
+            set-text "org.test.yang.example"
+            key-type "TRAVERSE_TAB_NEXT"
+        }
+        get-combo -after [get-label "Artifact Id:"] | set-text "org.test.yang.example"
+        get-combo -after [get-label "Group Id:"] | set-text "org.test.yang"
+    }
+    get-button Finish | click
+}
+get-view "Package Explorer" | get-tree | select "org.test.yang.example/pom.xml" | double-click
+get-editor "org.test.yang.example/pom.xml" | get-tab-folder | get-tab-item "pom.xml" | click
+get-editor "org.test.yang.example/pom.xml" | get-text-viewer | get-property text 
+    | equals "<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\">\n"
+    + "  <modelVersion>4.0.0</modelVersion>\n"
+    + "  <groupId>org.test.yang</groupId>\n"
+    + "  <artifactId>org.test.yang.example</artifactId>\n"
+    + "  <version>0.0.1-SNAPSHOT</version>\n"
+    + "  <properties>\n"
+    + "    <maven.compiler.source>1.7</maven.compiler.source>\n"
+    + "    <maven.compiler.target>1.7</maven.compiler.target>\n"
+    + "  </properties>\n"
+    + "  <dependencies>\n"
+    + "    <dependency>\n"
+    + "      <groupId>org.opendaylight.yangtools</groupId>\n"
+    + "      <artifactId>yang-binding</artifactId>\n"
+    + "      <version>0.6.1</version>\n"
+    + "    </dependency>\n"
+    + "  </dependencies>\n"
+    + "  <repositories>\n"
+    + "    <repository>\n"
+    + "      <id>opendaylight-release</id>\n"
+    + "      <name>opendaylight-release</name>\n"
+    + "      <url>http://nexus.opendaylight.org/content/repositories/opendaylight.release/</url>\n"
+    + "    </repository>\n"
+    + "    <repository>\n"
+    + "      <id>opendaylight-snapshot</id>\n"
+    + "      <name>opendaylight-snapshot</name>\n"
+    + "      <url>http://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/</url>\n"
+    + "    </repository>\n"
+    + "  </repositories>\n"
+    + "  <pluginRepositories>\n"
+    + "    <pluginRepository>\n"
+    + "      <id>opendaylight-release</id>\n"
+    + "      <name>opendaylight-release</name>\n"
+    + "      <url>http://nexus.opendaylight.org/content/repositories/opendaylight.release/</url>\n"
+    + "    </pluginRepository>\n"
+    + "    <pluginRepository>\n"
+    + "      <id>opendaylight-snapshot</id>\n"
+    + "      <name>opendaylight-snapshot</name>\n"
+    + "      <url>http://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/</url>\n"
+    + "    </pluginRepository>\n"
+    + "  </pluginRepositories>\n"
+    + "  <build>\n"
+    + "    <plugins>\n"
+    + "      <plugin>\n"
+    + "        <groupId>org.opendaylight.yangtools</groupId>\n"
+    + "        <artifactId>yang-maven-plugin</artifactId>\n"
+    + "        <version>0.6.1</version>\n"
+    + "        <executions>\n"
+    + "          <execution>\n"
+    + "            <id>generate-sources</id>\n"
+    + "            <goals>\n"
+    + "              <goal>generate-sources</goal>\n"
+    + "            </goals>\n"
+    + "            <configuration>\n"
+    + "              <yangFilesRootDir>src/main/yang</yangFilesRootDir>\n"
+    + "              <codeGenerators>\n"
+    + "                <generator>\n"
+    + "                  <codeGeneratorClass>org.opendaylight.yangtools.maven.sal.api.gen.plugin.CodeGeneratorImpl</codeGeneratorClass>\n"
+    + "                  <outputBaseDir>target/generated-sources/sal</outputBaseDir>\n"
+    + "                </generator>\n"
+    + "              </codeGenerators>\n"
+    + "              <inspectDependencies>false</inspectDependencies>\n"
+    + "            </configuration>\n"
+    + "          </execution>\n"
+    + "        </executions>\n"
+    + "        <dependencies>\n"
+    + "          <dependency>\n"
+    + "            <groupId>org.opendaylight.yangtools</groupId>\n"
+    + "            <artifactId>maven-sal-api-gen-plugin</artifactId>\n"
+    + "            <version>0.6.1</version>\n"
+    + "          </dependency>\n"
+    + "        </dependencies>\n"
+    + "      </plugin>\n"
+    + "    </plugins>\n"
+    + "  </build>\n"
+    + "</project>" | verify-true
+get-view "Package Explorer" | get-tree | select "org.test.yang.example/src\\/main\\/yang/acme-system.yang" | double-click
+get-editor "acme-system.yang" | get-text-viewer | get-property text | equals "// Contents of \"acme-system.yang\"\n"
+    + "module acme-system {\n"
+    + "    namespace \"http://acme.example.com/system\";\n"
+    + "    prefix \"acme\";\n"
+    + "    \n"
+    + "    organization \"ACME Inc.\";\n"
+    + "    contact \"joe@acme.example.com\";\n"
+    + "    \n"
+    + "    description\n"
+    + "        \"The module for entities implementing the ACME system.\";\n"
+    + "    \n"
+    + "    revision 2007-06-09 {\n"
+    + "        description \"Initial revision.\";\n"
+    + "    }\n"
+    + "    \n"
+    + "    container system {\n"
+    + "        leaf host-name {\n"
+    + "            type string;\n"
+    + "            description \"Hostname for this system\";\n"
+    + "        }\n"
+    + "    \n"
+    + "        leaf-list domain-search {\n"
+    + "            type string;\n"
+    + "            description \"List of domain names to search\";\n"
+    + "        }\n"
+    + "    \n"
+    + "        container login {\n"
+    + "            leaf message {\n"
+    + "                type string;\n"
+    + "                description\n"
+    + "                    \"Message given at start of login session\";\n"
+    + "            }\n"
+    + "    \n"
+    + "            list user {\n"
+    + "                key \"name\";\n"
+    + "                leaf name {\n"
+    + "                    type string;\n"
+    + "                }\n"
+    + "    \n"
+    + "                leaf full-name {\n"
+    + "                    type string;\n"
+    + "                }\n"
+    + "                \n"
+    + "                leaf class {\n"
+    + "                    type string;\n"
+    + "                }\n"
+    + "            }\n"
+    + "        }\n"
+    + "    }\n"
+    + "}" | verify-true
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/Wizards/Wizards.suite b/tests/com.cisco.yangide.editor.test/TestCases/Wizards/Wizards.suite
new file mode 100644 (file)
index 0000000..69385f9
--- /dev/null
@@ -0,0 +1,18 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Element-Name: Wizards
+Element-Type: testsuite
+Element-Version: 2.0
+Id: _MoMCYBPBEeSaxLxF-fnitg
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/25/14 4:15 PM
+
+------=_testcase-items-62c497da-4241-31f4-811a-6b453a3ecff8
+Content-Type: text/testcase
+Entry-Name: testcase-items
+
+_WbcsMBPBEeSaxLxF-fnitg        // kind: 'test' name: 'NewYangProjectTest' path: 'NewYangProjectTest.test'
+_OhLngBPFEeSaxLxF-fnitg        // kind: 'test' name: 'NewYangFileTest' path: 'NewYangFileTest.test'
+_QkzsIBPFEeSaxLxF-fnitg        // kind: 'test' name: 'ImportYangProjectTest' path: 'ImportYangProjectTest.test'
+
+------=_testcase-items-62c497da-4241-31f4-811a-6b453a3ecff8--
diff --git a/tests/com.cisco.yangide.editor.test/TestCases/Wizards/asserts/NewProjectExist.verification b/tests/com.cisco.yangide.editor.test/TestCases/Wizards/asserts/NewProjectExist.verification
new file mode 100644 (file)
index 0000000..d7b54c8
--- /dev/null
@@ -0,0 +1,68 @@
+--- RCPTT verification ---
+Format-Version: 1.0
+Element-Name: NewProjectExist
+Element-Type: verification
+Element-Version: 2.0
+Id: _WQzF8BPCEeSaxLxF-fnitg
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/25/14 4:17 PM
+Verification-Type: org.eclipse.rcptt.verifications.tree
+
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf
+Content-Type: q7/binary
+Entry-Name: .q7.content
+
+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
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf--
diff --git a/tests/com.cisco.yangide.editor.test/pom.xml b/tests/com.cisco.yangide.editor.test/pom.xml
new file mode 100644 (file)
index 0000000..1873ceb
--- /dev/null
@@ -0,0 +1,100 @@
+<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">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>com.cisco.yangide.test</groupId>
+    <artifactId>com.cisco.yangide.test.parent</artifactId>
+    <version>1.1.0-SNAPSHOT</version>
+    <relativePath>..</relativePath>
+  </parent> 
+
+  <groupId>com.cisco.yangide.test</groupId>
+  <artifactId>com.cisco.yangide.editor.test</artifactId>
+  
+  <packaging>rcpttTest</packaging>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.eclipse.rcptt</groupId>
+        <artifactId>rcptt-maven-plugin</artifactId>
+        <version>2.0.0</version>
+        <extensions>true</extensions>
+        <configuration>
+          <suites>
+            <suite>AllTests</suite>
+          </suites>
+
+          <aut>
+            <groupId>org.eclipse</groupId>
+            <artifactId>sdk</artifactId>
+            <version>${eclipse-version}</version>
+            
+            <vmArgs> 
+              <vmArg>-Xmx1024m</vmArg>  
+              <vmArg>-XX:MaxPermSize=256m</vmArg> 
+            </vmArgs>
+
+            <injections>
+              <injection>
+                <site>${update.site.url}</site>
+                <features>
+                  <feature>com.cisco.yangide.feature.feature.group</feature>
+                  <feature>com.cisco.yangide.m2e.yang.feature.feature.group</feature>
+                </features>
+              </injection>
+
+              <injection>
+                <site>http://download.eclipse.org/releases/indigo/</site>
+                <features>
+                  <feature>org.eclipse.emf.feature.group</feature>
+                  <feature>org.eclipse.emf.ecore.feature.group</feature>
+                  <feature>org.eclipse.xsd.feature.group</feature>
+                  <feature>org.eclipse.gef.feature.group</feature>
+                  <feature>org.eclipse.equinox.p2.discovery.feature.feature.group</feature>
+                  <feature>org.eclipse.wst.xml_core.feature.feature.group</feature>
+                  <feature>org.eclipse.wst.common_core.feature.feature.group</feature>
+                </features>
+              </injection>
+
+              <injection>
+                <site>http://download.eclipse.org/webtools/repository/indigo/</site>
+                <features>
+                  <feature>org.eclipse.wst.common.fproj.feature.group</feature>
+                </features>
+              </injection>
+
+              <injection>
+                <site>http://download.eclipse.org/technology/m2e/releases/1.4/1.4.1.20140328-1905</site>
+                <features>
+                  <feature>org.eclipse.m2e.feature.feature.group</feature>
+                  <feature>org.eclipse.m2e.logback.feature.feature.group</feature>
+                </features>      
+              </injection>
+
+              <injection>
+                <site>https://repository.sonatype.org/content/repositories/forge-sites/m2e-extras/0.15.0/N/0.15.0.201206251206/</site>
+                <features>
+                  <feature>org.sonatype.m2e.buildhelper.feature.feature.group</feature>
+                </features>      
+              </injection>
+
+              <injection>
+                <site>http://download.eclipse.org/tools/orbit/downloads/drops/R20140525021250/repository/</site>
+                <features>
+                  <feature>org.slf4j.api</feature>
+                  <feature>ch.qos.logback.classic</feature>
+                  <feature>ch.qos.logback.core</feature>
+                </features>      
+              </injection>
+            </injections>
+          </aut>
+          <runner>
+            <version>${rcptt-version}</version>
+          </runner>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/tests/com.cisco.yangide.editor.test/rcptt.properties b/tests/com.cisco.yangide.editor.test/rcptt.properties
new file mode 100644 (file)
index 0000000..09c0029
--- /dev/null
@@ -0,0 +1,10 @@
+--- RCPTT project settings ---
+Format-Version: 1.0
+Contexts: _zefAMAwDEeSdascDp4ftXw,_WP1mMBPOEeSaxLxF-fnitg
+Element-Name: Project Settings
+Element-Type: projectMetadata
+Element-Version: 2.0
+Id: _C9xu0Av7EeSdascDp4ftXw
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 7/25/14 4:21 PM
+
diff --git a/tests/com.cisco.yangide.ext.refactoring.test/.gitignore b/tests/com.cisco.yangide.ext.refactoring.test/.gitignore
new file mode 100644 (file)
index 0000000..b77461b
--- /dev/null
@@ -0,0 +1,3 @@
+/target/
+/.settings/
+.classpath
\ No newline at end of file
diff --git a/tests/com.cisco.yangide.ext.refactoring.test/.project b/tests/com.cisco.yangide.ext.refactoring.test/.project
new file mode 100644 (file)
index 0000000..686b28b
--- /dev/null
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>com.cisco.yangide.ext.refactoring.test</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.rcptt.core.builder.q7Builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.m2e.core.maven2Builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.m2e.core.maven2Nature</nature>
+               <nature>org.eclipse.rcptt.core.rcpttnature</nature>
+       </natures>
+</projectDescription>
diff --git a/tests/com.cisco.yangide.ext.refactoring.test/Contexts/DefaultPreferences.ctx b/tests/com.cisco.yangide.ext.refactoring.test/Contexts/DefaultPreferences.ctx
new file mode 100644 (file)
index 0000000..c088477
--- /dev/null
@@ -0,0 +1,319 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Context-Type: org.eclipse.rcptt.ctx.preferences
+Element-Name: DefaultPreferences
+Element-Type: context
+Element-Version: 2.0
+Id: _IOJPATHIEeSMKNSnFXk2YA
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 9/2/14 10:26 AM
+
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf
+Content-Type: q7/binary
+Entry-Name: .q7.content
+
+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
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf--
diff --git a/tests/com.cisco.yangide.ext.refactoring.test/Contexts/DefaultWorkbench.ctx b/tests/com.cisco.yangide.ext.refactoring.test/Contexts/DefaultWorkbench.ctx
new file mode 100644 (file)
index 0000000..71b6ea5
--- /dev/null
@@ -0,0 +1,24 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Context-Type: org.eclipse.rcptt.ctx.workbench
+Element-Name: DefaultWorkbench
+Element-Type: context
+Element-Version: 2.0
+Id: _OQXHUDJQEeSzJ-2otsp1aw
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 9/2/14 10:23 AM
+
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf
+Content-Type: q7/binary
+Entry-Name: .q7.content
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSVkk9vGjEQxe+R+h1WvmMDvVSrXXIo
+VAWlChFKmlvkeCeLG/+TPcuSfPoMm7KESrT06PHvvTczmuJya022gZi0dyUb8SHLwClfaVeXrMGnwRd2
+Ofl0UfhYc1BGhwQ8qoDIkwIno/b5Tx+fH0m0/uodwhazrdV5bzneWVKISznVS7ZGDLkQbdtyb2tOvuL+
+x7xH0jHSfu6I8XA4IuxqpdZg5UC7hNIp2KtON9eb7b93bh0irK/AiD1Ieh/J0EkLJZvCk2wM9pOxTFcl
+e7i+uf9+O13czGD1uhiMPaYwki3LAg0bQKHewJy4j+38qpA3mi/kRi4PFKOVZlkBlUYfU0ZT5/gS4Fj6
+x5q/aQOzTkCBEtclowkaAyORohJWaidepKvF7yrfPZh4D9poaNPkRF+VV3f0X4h36u+ClW+igvP5pVTP
+sobZNhjab/yHiARdkS+jfzRgz8gJFW2qcagt8Ctfn6HoQ7p7dXjdoNEODqpC/Me1E/8GUEsHCLPJ0N51
+AQAARQMAAFBLAQIUABQACAgIAAAAIQCzydDedQEAAEUDAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVu
+dFBLBQYAAAAAAQABADYAAACrAQAAAAA=
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf--
diff --git a/tests/com.cisco.yangide.ext.refactoring.test/Contexts/DefaultWorkspace.ctx b/tests/com.cisco.yangide.ext.refactoring.test/Contexts/DefaultWorkspace.ctx
new file mode 100644 (file)
index 0000000..41cb7ed
--- /dev/null
@@ -0,0 +1,1106 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Context-Type: org.eclipse.rcptt.ctx.workspace
+Element-Name: DefaultWorkspace
+Element-Type: context
+Element-Version: 2.0
+Id: _QEySUDJQEeSzJ-2otsp1aw
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 9/2/14 5:29 PM
+
+------=_contents/module2/src/main/yang/module2.yang-1aadb56f-92e7-3b09-a493-fa0b3101fcc0
+Content-Type: q7/binary
+Entry-Name: contents/module2/src/main/yang/module2.yang
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnRdkD0OwjAMhWc4hZWdtuoAAhYQYujA
+xgWi1IWgOokSg/gRd6cJLSA8xHrR8+eXkK3PLQKlVsJjDF0ZSRicVAjiyOwWeS4VYYZXSa7FTFnKwy0w
+klgmv/PY6CsIKvuLdFh/kEbfJWtrQKw3uy1URmW9RVnDUjGIk8XVP/4XU2NQXrtISTqW2B+HzNBYD2hY
+s8YAOhIoSnMA7kxp7Tts9kv1eNEhBiuLYjYpppNi3j/+byeIynRs2X5GBs7zS+Obwxqb1Gn4xVFUENh3
+WYaJ5wtQSwcInoj19M8AAABwAQAAUEsBAhQAFAAICAgAAAAhAJ6I9fTPAAAAcAEAAAgAAAAAAAAAAAAA
+AAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAAUBAAAAAA==
+------=_contents/module2/src/main/yang/module2.yang-1aadb56f-92e7-3b09-a493-fa0b3101fcc0--
+------=_contents/module2/target/classes/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/Gr1.class-6e0b1eed-970e-3b53-9c0c-5fc48eceb06d
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/classes/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/Gr1.class
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSVUsFOGzEQfUOBXZYE0i1Q2tLCMUgN
+3g25AFWlira5pEGICs7OxmwXbezIcSLxWRWXqod+QD8KMbsglUpFNJbs8TzbM/PG7/f1z18AdrHlYYbQ
+NjYVZqh0X17mWfrNiUupU5EqLSaxGFv992FqzXgonBq5prBqEreivagp2jb2MEuoXciJFHkR4Kh3oRLn
+YZ7Q/GcKZ0w+uk3Wy3Q/Y/tROnn7jjB33P3w5RNhp/PY68QMBkaL464cqAOC/y7JM52594Qn9e1Twuyh
+6SsfVcIG09m/H2q/pNMo6fhYJgTNKG41or1GxP5TjpDaOMAzrHpYIbydppQK1vCcMJ9YJZ0inNc7f7pz
+4iwTPvgfZHu6BiyA8KICDz5huZNp1R0Pesp+lb2ciwg7JpH5qbRZ4d+BS6lyh0Y7ybdt2xLO6g8knVIW
+3DxxLzB/TnBixjZRn7Mir8+y2Sn4ska41TzniuKL2lmgM7wuIGBkkb2Yz4tRDSvhUlj7gfAK69/Lay95
+DdgCK6igilclWshxA695T3hTIps3UEsHCLNJWXyTAQAA+gIAAFBLAQIUABQACAgIAAAAIQCzSVl8kwEA
+APoCAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAADJAQAAAAA=
+------=_contents/module2/target/classes/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/Gr1.class-6e0b1eed-970e-3b53-9c0c-5fc48eceb06d--
+------=_contents/module2/target/classes/module2.yang-5d633ff6-8bb4-3520-8d65-f295f0c3601d
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/classes/module2.yang
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnRdkD0OwjAMhWc4hZWdtuoAAhYQYujA
+xgWi1IWgOokSg/gRd6cJLSA8xHrR8+eXkK3PLQKlVsJjDF0ZSRicVAjiyOwWeS4VYYZXSa7FTFnKwy0w
+klgmv/PY6CsIKvuLdFh/kEbfJWtrQKw3uy1URmW9RVnDUjGIk8XVP/4XU2NQXrtISTqW2B+HzNBYD2hY
+s8YAOhIoSnMA7kxp7Tts9kv1eNEhBiuLYjYpppNi3j/+byeIynRs2X5GBs7zS+Obwxqb1Gn4xVFUENh3
+WYaJ5wtQSwcInoj19M8AAABwAQAAUEsBAhQAFAAICAgAAAAhAJ6I9fTPAAAAcAEAAAgAAAAAAAAAAAAA
+AAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAAUBAAAAAA==
+------=_contents/module2/target/classes/module2.yang-5d633ff6-8bb4-3520-8d65-f295f0c3601d--
+------=_contents/module2/target/classes/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/GroupTest2Service.class-29519a45-005d-3886-b741-8e8b2274af43
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/classes/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/GroupTest2Service.class
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS9Uk1LAzEQnawfa6uCJ3+DXky7epEt
+HiuFhUKr3rfZIaakmZBNFvq3PHrwB/ijxKQKKvYoEkLmTZh5k/fy+vb8AgCXcJxDxuCenORk0TT1Wiv5
+6Pm6NpJLNLwb8uDMz0vpKFjusfUFd9gNrwbXg4LfpuxdSs7RdUpgDrsMTpZ1V3Od2k0XSxQ+h30GxVZC
+T6TbD+qFMo2K58yKz24MMrIM9Fn1F8NO7cTY4MvzajNf8EpzQUYE59B4Pg4+OCwZ9OZKmjoBBk//SD3a
+TvVNIUGrFZkk0AzboP2o+lL6gVRT3sTFoD+n4ASOlY4vOP3l0UUqioYw2Il7L/4JFk3L4SCiXkQZ9GN0
+uImO3gFQSwcIaSHTFgsBAAA2AgAAUEsBAhQAFAAICAgAAAAhAGkh0xYLAQAANgIAAAgAAAAAAAAAAAAA
+AAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAEEBAAAAAA==
+------=_contents/module2/target/classes/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/GroupTest2Service.class-29519a45-005d-3886-b741-8e8b2274af43--
+------=_contents/module2/target/classes/META-INF/services/org.opendaylight.yangtools.yang.binding.YangModelBindingProvider-0c8c7f39-6a77-31d1-871c-8e0642a4fe38
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/classes/META-INF/services/org.opendaylight.yangtools.yang.binding.YangModelBindingProvider
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnR9zLEKAjEQRdHe77B+ZBdRtrUXbC3D
+ZpgNJJkwmQ3m79XSQuvLPaIMqVSCHynyZhi+MJgK+oRdy3dklb3CqNkMpT6d3OJmHB/v5yaB0jWWEAvf
+VXoMpAf5p29mFX7NBHr6XBNhlYw2mlH+6O7izm75rb8AUEsHCA4yxZFzAAAAuwAAAFBLAQIUABQACAgI
+AAAAIQAOMsWRcwAAALsAAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAACp
+AAAAAAA=
+------=_contents/module2/target/classes/META-INF/services/org.opendaylight.yangtools.yang.binding.YangModelBindingProvider-0c8c7f39-6a77-31d1-871c-8e0642a4fe38--
+------=_contents/module3/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/$YangModelBindingProvider.class-7664fc1e-18be-392a-a605-ef5f7e3ec2d0
+Content-Type: q7/binary
+Entry-Name: contents/module3/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/$YangModelBindingProvider.class
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS1UslKA0EQfW3GjGZRE/eLJw+JBzsi
+KC6IKAiBuICieBDpTNpJy0x3mOkE81d6Ujz4AX6UWEkGETE3PXQVtbxX1VX1/vH6BmAdiy5GGG5M5HPT
+krohuoHym5Z3hfa5LzXvrPGmtS0uvFBy+SDCViC5Z0Ied2MrQx7JTmWzslHZ4svXhDk2DRkcKN1Q2j+L
+TEc1ZOTCYZi6Fx3Bgx7taf1eetZFmmH/18LWmCAetFAfUPFh3AzpXaWV3WNIlcqXDM4hZWWQQjYHF2MM
+kzWl5Uk7rMvoQtQDyVCsGU8ElyJSPTtxOrapYobb2r+OYoch70tLoXYgq/rOMGyXyr/XHD6FBLuTwTRm
+XcwwXP1l1wl9lTJzmEOBIUs9V3VshfZoVJlz0448eaR6c1sa+tfV3saxBtoMvVE6txHStBOS42Rx0oz0
+6MozMk/9cI5kuu9MIU8yN0jABCZJ0xGhkIBXE7DzguLjD2z6G9b5ws73sxY+AVBLBwj1ghTpcAEAAPoC
+AABQSwECFAAUAAgICAAAACEA9YIU6XABAAD6AgAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUG
+AAAAAAEAAQA2AAAApgEAAAAA
+------=_contents/module3/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/$YangModelBindingProvider.class-7664fc1e-18be-392a-a605-ef5f7e3ec2d0--
+------=_contents/module3/target/generated-sources/spi/META-INF/services/org.opendaylight.yangtools.yang.binding.YangModelBindingProvider-554633eb-3c68-3f47-86a3-4c1db563553b
+Content-Type: q7/binary
+Entry-Name: contents/module3/target/generated-sources/spi/META-INF/services/org.opendaylight.yangtools.yang.binding.YangModelBindingProvider
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnQNyzEKAyEQBdDLbP1xm4Rt0we2TSn6
+GQWdERWJt09e/6wLrFGj3yVLmtheBULFOpHmbPChEvz62goRrGLsMVnRudzTPdyF4/M/b4ssr6wxq9zd
+Vo7sP1BLBwjK0iVMVgAAAF0AAABQSwECFAAUAAgICAAAACEAytIlTFYAAABdAAAACAAAAAAAAAAAAAAA
+AAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAAjAAAAAAA
+------=_contents/module3/target/generated-sources/spi/META-INF/services/org.opendaylight.yangtools.yang.binding.YangModelBindingProvider-554633eb-3c68-3f47-86a3-4c1db563553b--
+------=_contents/module3/pom.xml-c7ec0499-927c-3da6-945a-0e4cf1b02400
+Content-Type: q7/binary
+Entry-Name: contents/module3/pom.xml
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTVVk1v3CAQvVfqf1jlbtgkVStF1FKb
+qG2kpImSqOqV2BMvFQYEOLv77wv4I9hmk23UQ3vkzZth3gwMEKXlLyjsYlNzYT4erKxVJxjX9BEEoooW
+K0BSV/j66hK/Q0u0PGiZJxvDBvZ6vUbr48A7Wi4P8c/Li1vnWNOMCWOpKMB5GXZiAnghC2qZFHtsttjF
+2JiyBbPAQ259kL99s1iQWpbAf4A2boc8GAkeYYFVadmo8zJ3lobDMcE9EKxUW/ZACxsTIixwHrtwfvfD
+7Pb7p+vbb1d3BD/G27jiKnCOYMLapxeUFLJWjINGRja6gPwQfSA4bUr7WaorsEm/zhT2x5MESAkKRAmi
+iFIasG2HRPVxtUbSm+mWs2pl0ZaKykrJzbhkwSkqkadl90yUTFSz2gXyU/3eo6Md9fMKJtlFwCBKg5KG
+WakjUQMWiWJOT6Ql08CBGiCYRXkJWsMOWjANxEbzvDueAjaNGdfJH9JCCgvC4jg/PGJ1oTHBPloveZb7
+XmqMoMqspH1JzhPv7+vpYz8viOBZx4jiTcXETaKTE8t/2M8dCv5A2T/c26SIGTz0+b5hvBwXwDzl2QLD
++pWDKDGK2reiDZ+cR3tPpECFDRSNf8NMhMb4CG4bWoEATS1k7WA3o172aiXlZgJ2cMI/wJMIOBWCuO4+
+sKrRNJGbM/sSfXGPh7mR0p4xnRtduGeFCewtBM/sswiFe2G/tglKPVfgNfTWhHEa4JRTY55pOWqfPEO5
++xMw5EKjtrXoNA5zXitOcCJyMgPZWNXYz+76eoXtK4r7opd91bHblOAxN6EW75Y7ySjRbncllPuSncUP
+3YPrqp9sCdP0BOxuNsGpAxqhcbDUX2Fq2c4O8Kuua3CNP13htrpKZ669WfXSzQ3u+9/exK9iBseS+2E2
+GXndQMP9RAufLf+Vzn8DUEsHCN2D28W5AgAAVAsAAFBLAQIUABQACAgIAAAAIQDdg9vFuQIAAFQLAAAI
+AAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAADvAgAAAAA=
+------=_contents/module3/pom.xml-c7ec0499-927c-3da6-945a-0e4cf1b02400--
+------=_contents/module2/src/main/yang/group-test2.yang-7c682d2b-cbbc-38eb-a430-3dd14091dc83
+Content-Type: q7/binary
+Entry-Name: contents/module2/src/main/yang/group-test2.yang
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnRlj8FugzAMhs8g9R0s7qi02qXl2FMf
+IwLDLIFjJc40NPHuS9qSMs2XWP/vfL99PMLNsiKrBztANTobpFb0eq4O5Wz7MCHsRPg5lBCLzYxeTIdQ
+BcdXK8i9WSYaP/W6Z7TPcXE40PdffLSepsMv8mQZzs3po24udZNjUvXoO0eiaaK6MymZKf/ZAtYN9kgg
+HmNz2ihFF080xOggd/Xosl1MaAZIW72lQhdB8Ooiq93E9dWsOTQ9ryukAysZQCxhhwsefVqp/UdYfwFQ
+SwcIm8eyXckAAACDAQAAUEsBAhQAFAAICAgAAAAhAJvHsl3JAAAAgwEAAAgAAAAAAAAAAAAAAAAAAAAA
+AC5jb250ZW50UEsFBgAAAAABAAEANgAAAP8AAAAAAA==
+------=_contents/module2/src/main/yang/group-test2.yang-7c682d2b-cbbc-38eb-a430-3dd14091dc83--
+------=_contents/module2/target/generated-sources/yang/META-INF/yang/module2.yang-1639b778-c81c-3f9f-a5d2-190c82f97fc0
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/generated-sources/yang/META-INF/yang/module2.yang
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnRdkD0OwjAMhWc4hZWdtuoAAhYQYujA
+xgWi1IWgOokSg/gRd6cJLSA8xHrR8+eXkK3PLQKlVsJjDF0ZSRicVAjiyOwWeS4VYYZXSa7FTFnKwy0w
+klgmv/PY6CsIKvuLdFh/kEbfJWtrQKw3uy1URmW9RVnDUjGIk8XVP/4XU2NQXrtISTqW2B+HzNBYD2hY
+s8YAOhIoSnMA7kxp7Tts9kv1eNEhBiuLYjYpppNi3j/+byeIynRs2X5GBs7zS+Obwxqb1Gn4xVFUENh3
+WYaJ5wtQSwcInoj19M8AAABwAQAAUEsBAhQAFAAICAgAAAAhAJ6I9fTPAAAAcAEAAAgAAAAAAAAAAAAA
+AAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAAUBAAAAAA==
+------=_contents/module2/target/generated-sources/yang/META-INF/yang/module2.yang-1639b778-c81c-3f9f-a5d2-190c82f97fc0--
+------=_contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/$YangModelBindingProvider.java-b8bb0097-1362-3d30-af01-22db7696cd31
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/$YangModelBindingProvider.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSVkDGLwzAMhfdA/oOHDu0i0qWldLst
+Q+HWGxVHdc3ZsrGV0FD63+uQcLfcDX1oEUif3lNE/Y2GVEgGQiTucXLW3AQmZAOGGMY93EQioPYEdEcf
+HYEOHvKUhTwkGptjc2hO57qqqzh0zmp1tYxOaYc5q81XQV1CT+7Dcm/ZfKYw2p6SsjPLE0v++76E4PLi
+pFtW4V/WY76uilYHbwIHRy1fgzIkv912N2PVqkQyJP6Js860JUP5k7ScBVnTdndeVp51VeoFUEsHCHe6
+NsXEAAAAYAEAAFBLAQIUABQACAgIAAAAIQB3ujbFxAAAAGABAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29u
+dGVudFBLBQYAAAAAAQABADYAAAD6AAAAAAA=
+------=_contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/$YangModelBindingProvider.java-b8bb0097-1362-3d30-af01-22db7696cd31--
+------=_contents/module2/target/classes/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/gr1/ContainerGrBuilder.class-9d6c0e83-afaa-33bf-8b3a-ae4819f28f2c
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/classes/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/gr1/ContainerGrBuilder.class
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTtV91TG1UU/90EWEhDQoFCi7QGBJoP
+yvLVLxJBSmmLAlX5KrWOs0muYXHZzWw2jDz4H+gf4Js++OiMztjBykxbn5zR/0k992YNm4Q6Ds46PDiZ
+7N4993z9zjn33Ht//f2n5wCm8KGCAMNjyy6oVpGbee3A0As7jnqgmQW1wE11f0It22btZMG2ykXV4SVn
+UrX5/sT0+O3xSaJOqAuW6Wi6ye379p2ybuS5raCJoWNX29dUQ+h8mN3lOYeh+SMhz9C5fDy35ti6WUgz
+hLVyYY+TKke3TIZohafs6Ia6ohWJoW1NL5iaU7Y5Y3O1sxmPwgVDK5UyqeUT4TmWZZQqQLO6mSfL6rzH
+bOZkqX8XlPQs/c6YOwwtGd3UnVmGYDyxydC0YOV5CEFEwziHsILzDOePY/xAK+1QnEPoQLQNDN1hKGgV
+WSKlq+W9LLfXtazBRW6tnGZsarYuvl1ik7Ojlxie+IHHrTmC9CjuS7wSm+fwGi4r6GdY88FAGFfwOoNS
+4M66XB7d8UTjAhFRHwijGS0K3mDY9S+SQx7S0l7RCGEQw2GM4CpDq5bL8VJpaJzhM1+i/Qof0om6diAq
+MSFKNUklF6+blAWd1UpUeRu+lIRoZTq5xWD8l0FgaF9ztNwnhNFdWFEqmvmavrkUr++FFLvTNB+y9m1m
+cWbmbHWuBnSZ9UWiJ+ipYJph8Hh6yTB4QTPm7UJZ+LX4aY4XhW+tuMGQ8nobWz8o8pjNP+Y2N3M8ltNM
+03JiWR5b3VheHgjRnnlL1NpthgvxxqUpGkQabyrIUIJqKjGMWcxRi6UsMYx4RStbYjrRSFIwzzB9mqDT
+nuvdQwUoauIN5cDQU9ujic8tp56To0vNqfRXcyqeFAB/+3rzvmaURbFr+Xwt3m8ai/10te4vAvZ5Y9n+
+f0D5G3d8TYdYrCthrOIhrcximWr61gkr8x+tVYYbp+2tX5/5imD44kx5RI0gK1LIsBX3pUDS4qSzKRr9
+FsNvfh5vXrHafDo60Wloz1c09YczhtCaVbZz/J4udpXeRpExIUB3viWTqLL8Od0PonWuY4AOvUG6swbo
+RydfOaJ7B1Hb5Dgkx3RfoWc7Ue4QN6N3R/IQkeQROrYP0fkUXd9L7gv0jEh93WhCJ6JE6aGvcEUGvbhI
+b6HvkqvvK+IT/Nfr9CVTz9DH8BSx1M8Y/BK9qZcYXJEMoz9i6BBx12hQGr1CToPUV4xeJPWXEEMfhule
+MY3L0olYxZDrhBilMEpuDJPENYyR+ypRo2B/kEhAAVNIWHhLlwfXW5XeAklz8gfEvqtCbpHEAQ/U5irU
+cUwQVyWYk1JJifwI0Ls/9QvajzC13Xn9EDdfkMouAj0TwEu8JXQ3ecI5Ql9XaZyQNnoq8lUk/ZSWBbJ1
+t2pfUBZppMoIsQgN7+G+i2JOZhtQkimKb/IYR0iSr5H3Yx47StWOggcSK52B8XYV1TtSqUF2hKcRiWP0
+GZaD2JK6gx7dk+TflCcbkaruiItBjBS8S9x3qx6Iufeqc+8Tje6JWHfhTFNsxFzoCIPbSXaIjfrM3PRk
+JlSx2NFKMX3kahj2pLWrXrhTCgfkf1s+H+MDqYjOwvR/gr4/AVBLBwg2tHXnrwQAAPgRAABQSwECFAAU
+AAgICAAAACEANrR1568EAAD4EQAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2
+AAAA5QQAAAAA
+------=_contents/module2/target/classes/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/gr1/ContainerGrBuilder.class-9d6c0e83-afaa-33bf-8b3a-ae4819f28f2c--
+------=_contents/module3/.project-883280c7-8336-32ce-9e5a-3131e4347cc5
+Content-Type: q7/binary
+Entry-Name: contents/module3/.project
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStkbEOwiAQhmdNfAfT3aJ1ccCaqHF0
+UR8A4dLQFGiANj6+QKmmNiYObvf/3M93cHj3ENW8BW24kttklS6TOUiqGJfFNrldT4tNsstnU1xrVQK1
+RzBU89q6budOsCQCcqFYU8Eao6C8TZUQIG2OUV95N95hgkADdW94xS41UK+iPLgokSw4kaR0kQKteG0g
+LZlNqdKuIC0JAdDvEVyC6KLxbBM1GhoYjSg/cUUGHVeQFmS2/wc5Ov0HOKhtNMTuTnx/e3fuBwh93zIf
+c59Hqb722Nd6hgt/AlBLBwhVBcjk1wAAAC8CAABQSwECFAAUAAgICAAAACEAVQXI5NcAAAAvAgAACAAA
+AAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAADQEAAAAA
+------=_contents/module3/.project-883280c7-8336-32ce-9e5a-3131e4347cc5--
+------=_contents/module3/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/Typem3.class-dfd6e23e-064a-3b9e-8ebd-1eae8cacf7fe
+Content-Type: q7/binary
+Entry-Name: contents/module3/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/Typem3.class
+
+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
+------=_contents/module3/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/Typem3.class-dfd6e23e-064a-3b9e-8ebd-1eae8cacf7fe--
+------=_contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/Gr1.java-9ff3af71-bd59-3eeb-bd7d-ae72860a60c0
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/Gr1.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSVUU1Lw0AQvQfyH5ac2mK3SeilKUVE
+pacq4lF6mG6n29VkN2wmxSL+dyeJ0giidpedYT7e481sCeoFNArntXQl2i0cc6P3JI9gtdRo5SGRtbff
+i9q7upSEFaXS4yGZxrM4nYeBKUrn6Wcyci6vOlrlisJZ+XAHBf4ftTF2a9jfAMH95hkV/YE9Tz5nE3nt
+LIGx6JeeyZs7GY3CQIzEym3rHIVlyVmbaE5LNG6J2tyj2mMBogTan5qeBiwg6wvIerhLFmAq4+wijZPp
+OJ6N43TIUib81g3HJAzKepMbJYwl9DtQKJY+4RIffCWmrbrgtJgweOvUd4VPfEVA7HbGQi7a5bO9Wt2K
+xVk/JpVHIBxEv40VXUSneTjgaaLhfP6lqLdnoZF64WDYNr035gNQSwcIAb0OTCwBAACdAgAAUEsBAhQA
+FAAICAgAAAAhAAG9DkwsAQAAnQIAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEA
+NgAAAGIBAAAAAA==
+------=_contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/Gr1.java-9ff3af71-bd59-3eeb-bd7d-ae72860a60c0--
+------=_contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/gr1/ContainerGr.java-346d571e-fa84-3a80-b0a8-dfcf98d01075
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/gr1/ContainerGr.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStUl1rgzAUfRf8D8GnttRUpS/9HKWM
+PnVjdG9jD1FvY7aYSIxlZey/76otdTC2FRYxITf33HPP4RYseWUciDac6gJUyo5S8MzSI1OcclD0ENLK
+qK+P3OiqoBZKG1EDh3AcTIIIo+HMdUReaGO/L2i1lmVbOtF5rhV9uGM5/B0VC5UKPNeZkOn9/nrgquI5
+KMti+RvrleI3jfj6Gw0GrkMGZKvTSgJRKHDaBOrVgP0G3MR2SQY5IwWz2SXpqYek0y7ptIO7QVJRCq0W
+URCO/WDiB1EfvR/Vf6JRnFBgfG6e64Ij1ymqWIqECGXB7FkCZH1O2hhMwQVvFrnK9nLydo6KlsM21HFt
+/k+TQjtNLF3nvfWupTs1XFpm8dgLxSRpBgX31faWLK6aLpoYYBZ63k+mekPv4iZeuj56/dns3NoLOzAq
+a4qdNThQhIN9xAK9fpPyUW+fUEsHCHqj/FxUAQAAVAMAAFBLAQIUABQACAgIAAAAIQB6o/xcVAEAAFQD
+AAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAACKAQAAAAA=
+------=_contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/gr1/ContainerGr.java-346d571e-fa84-3a80-b0a8-dfcf98d01075--
+------=_contents/module1/.settings/org.eclipse.jdt.core.prefs-29fe8f5e-ccab-3483-a69a-edc1b315656d
+Content-Type: q7/binary
+Entry-Name: contents/module1/.settings/org.eclipse.jdt.core.prefs
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSNjjEOwjAUQ3ckrvKlTky9A+IGaeJG
+HyX/R06A65OBzmWxPNh+RizaOqQROwiL6PIGu7qty/XizIJf5JmGRCem1KYFnCYhw2QEZox7CWN31nWR
+23mztqJh4v5JN/pWUGWub5oS7HGcXT+BppbPFrq/eLC+UEsHCOiKarVzAAAA8wAAAFBLAQIUABQACAgI
+AAAAIQDoimq1cwAAAPMAAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAACp
+AAAAAAA=
+------=_contents/module1/.settings/org.eclipse.jdt.core.prefs-29fe8f5e-ccab-3483-a69a-edc1b315656d--
+------=_contents/module1/src/main/yang/group-test.yang-a4e5fd15-2c03-303e-a0c9-99c3f32abc75
+Content-Type: q7/binary
+Entry-Name: contents/module1/src/main/yang/group-test.yang
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnRVUEGOwjAMPBeJP1i9R7RoL8CRE8+I
+WrdrKXWixEUg1L+vUQnN+hJrZjx25nCAq2dBlgR+gHqMfg5GMEm9302+nx3ChsFrvwMtthOmYDuEeo58
+9gG5t09H46+cC4fLqg4RB3r881amWkmago9S7DjCK08U4AUi3imRZ9NbQTg27Y9pTqZRZvmaZU1B55Pf
+1WPqIgV5K+obk5B135l8rbqtTae5WGKMW9dmt8qhHYwjjWROqshwJc+AkCQSjx+/avm8KkxQ/kmjarel
+yx9QSwcI3YxlKMwAAACLAQAAUEsBAhQAFAAICAgAAAAhAN2MZSjMAAAAiwEAAAgAAAAAAAAAAAAAAAAA
+AAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAAIBAAAAAA==
+------=_contents/module1/src/main/yang/group-test.yang-a4e5fd15-2c03-303e-a0c9-99c3f32abc75--
+------=_contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/$YangModelBindingProvider.java-b4e56699-ad85-358c-826b-80a53051055b
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/$YangModelBindingProvider.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSVkLEKgzAQhnfBd8jQQZeg0qW4dXMo
+dO0Y9UxD4yUkF0FK370RpaXQDj1uOe7uu/9+K7qbkMCMk9xYwF7MWskr8Vmg5BKQTyUPDj+b0plgOYGn
+ijuYyn1xKKo6TdLEhlarjg0KhWadFt6z3SWiTqYHfVTYK5RnZybVg2NqtBpGQPLf75Mx2q9K2nWV/2Td
+l+ssxqbgT2DQ0OBgmAR6V1m+YNkWDiga8Xpnm2niD9EnatCTwA6yvF5XHmkS8wlQSwcIBnvzt70AAABg
+AQAAUEsBAhQAFAAICAgAAAAhAAZ787e9AAAAYAEAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsF
+BgAAAAABAAEANgAAAPMAAAAAAA==
+------=_contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/$YangModelBindingProvider.java-b4e56699-ad85-358c-826b-80a53051055b--
+------=_contents/module3/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/Typem3.java-8494e334-815d-3a2f-b06a-0958c3f59bdc
+Content-Type: q7/binary
+Entry-Name: contents/module3/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/Typem3.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSlVltv2zYUfg+Q/8AYGCpnCe04SBwn
+dS9J92AgQ4Zly0tRBLREy+woUSMpN+6Q/77DiyKJUpquowFL4rnwO1eegsR/kZQiIVMsCponZMtZutZ4
+S/IUpzTHmyO81rrAJM4opg8kKzjFsciw2ipNMyzpZjwdn45nF7s7LCuE1MhQUyFSx5iJHB6c01jj30Er
+rRk/kw3BTOBbKhnh7CtZcvo9ahZZVmrDfM2UDtRlRK/xJUsXuaYplQG11IzjHqklJbnCVyJXWpaxFvI3
+Ce6QmlEFnOY32t/f3UH76FeRlJyinGT03G6YldnNY/t9G69pRlABOGqGj5Fx4vloFLpx5Nz4FtzIFBP5
+fDIeTw/Hp4fj2VBvC5odj9zjk9E12t0pyiVnMYo5UQr9YUlAYUZfRnOtUNOZ6B+gwSok2xBNkdJEg/CK
+5YQjLvIUKct9R6U5/M/FBzRHk5Pp5Hh2Oj2Znsxmp2eTs/H4+gL1KjKefG2D+rp2+Zs36F76QBsZd1ol
+ad3NTXZdbuHzfkN4Sa2PDe+73hBEA8s1GHoQzgXO+KhX4bCy3Cy2QpHbRntzlJect8hm1ejRfWwhEJZr
+cEZNwFbDzcqrGl60NSyF4JBEiKk78H5inQLyK8IVDVhXQqKo4zUk0TmyfouGHXyVGRJyJteATUUNnP38
+VqaNBjwbgjHrsb0VfJpz95qKek/Taym+oJx+QQso0pTw9zItTUb+8hDTQkN2RbdaMggTmA9FGg0W+cao
+dDafo5/UAaIPBdQ3TcwXHhz4YB48uSV0egNp41WvmcI+4PM6wxpcrpjN2kdXkkJeKkSg4RRbtJIiQ7ei
+lDFFN8vPpt1UrE8i7woiSYaU4/LMwjJXPKO+VHUPL9fyYhuyY8B9yFtqfRV6tSnVH+iKlFwvIDFIHlPv
+cZS47btOZUiqS5nbqHmI5rVdUVFLeljDaUEJqhCwWP6o77jQLl/6NxsqJUtoS6+pwjVR6yuRBMpcWzF0
+aC2ZcdvxUSM9DEFSBcCB0iQ8bTqx/WrjZxRVXWJedYm3aAxF6XZxDWN40bHJKfk+m6pWQf8uoTs0GpjL
+N5NJnf5lEsTgCmkNCEFxP7YVgGBtV7+CsFcFGiCmV+bWgTDsWSC43vkBlT5rhV5D050jXxxDo/iifXAY
+leAoa53Rgl9o8t/AFWB7RBTooDna88H3sWqe8yNGd0P1Qq7UyeFrWQv30i6GkO2yZDwBvy79c47ahd3i
+igY+Fh8Hzcyu0nTFpNLty+M/3a2GxeroDUilvTciLgw9Ut4uTAoztEZwVQy+cTf0STjQ845YwNdz2XfD
+Gci8+vRqiOs4NQPd176fG6L8pdeZZKS7zJ/xttrmMVzFOftKE6iL/z/XY5cc2E6czw4mL6CqVmtyxz7/
++oyvE7ct4vejMGyd8CWJG7EAt1A0iXoGucOjydn18KBvxjuaTK+740a1KmOfTrPPXkzPj1bdNGpNzTZd
+4O9fUEsHCNmEwbBRBAAAog0AAFBLAQIUABQACAgIAAAAIQDZhMGwUQQAAKINAAAIAAAAAAAAAAAAAAAA
+AAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAACHBAAAAAA=
+------=_contents/module3/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/Typem3.java-8494e334-815d-3a2f-b06a-0958c3f59bdc--
+------=_contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/gr1/ContainerGrBuilder.java-ea378b27-5fb2-3795-9753-2efda6d09043
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/gr1/ContainerGrBuilder.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTtWN9T20YQfmeG/+HwS2QKwiZ5CcaQ
+lPG0TJPmgbR9yGQyZ+lsC+STcjqZuBn+9+6eZHy/JOyhMNNMj8EG3d7ut7vf7q2d0+iGThnJxDTMcsZj
+ukyT6UyGS8qn4ZTxcNEPS8HNzanIyjyUrJDHoWCL/qve694xPO0PdneSeZ4JSa7pgoalTNLwIktTFskk
+44Vv+z3NfY9/pcXM2PIilFmWFhXWccLjBN7fltM545KiQTiNP0f7+7s7ZJ+8z+IyZYTTOTtRD3ApXw6V
+L+rZVTRjc0pyKmdroU8BxOBEN3+inTuHGCQF2Bse9/qvDnuvD3vHXYjGEf5GGYBJOBOHU/EZFR7t7uTl
+OE0iEqW0KMjFSuAX8XOZpDET5DuiRru5SBZUsiouKbp5JQV4Sb6g4YEtBgE7XYteoPrTc8K+ScBdED0y
+p/9SwkMN/dnZwTPYIFQzQYaEs1tSk+X0LOiuY1LF2I1u0MX4osgdeVhYe0TGtGD3h3HJWVKEKhUABHfB
+OfkR/lU4VlLJhAS4SRJeSMojlk10S5fzPDW04rL2yZcEX4ckcA6i5oF5WMFqDZNSZ4jogO/q8FTVo8XH
+oeG9uzp+wSQk956imsbq9c1VmeeCFcVfVHDQUgSdkkPVRTcs7nQNg6ejZ2QvGaE/up3ALqaRSb+Py9wk
+BKbaFiBDiH6ZujmWM5HdqsRcQoec0vStmJZ4dPQtYrmy39HREKVNsAkTDFhEIsp5JsmYkd//ePdur+NJ
+oZaOYNQ1sCNVHazdgZb61sIgRZ16hxMLmpYtZaK2Bw48lPGRpRkAjePWXD1n43NY8Qyd0LDpxtvIdV66
+uT4gTfXvTUlTOsgY8+HtAEhtq18FqNRlWX1/FYglIpOE09S9HVUjxMbFELWxtb4xvd2qIsSTJAGq6HIF
+icWX8CImNGKBU+11TJ4ARKgiZRa/Fow6tlVQHxgk9AP/DxNdb1xsRntakzMoOF2wcVhYreI2kdGsGhzM
+Wi6Sv4FejnpcEU4ZvRN3w9sVAIY2m4dsnsslOO6Fg2ssGL1p2FOW+w2WcVX0A/XhiEux/PGZxVZZNpLH
+0PkruHm7YQKtgsoM5tGQg++NYd8kdz98OAvoVSmTGUeCqsr5jS2D7gFRf/+JMwXUxKAO13b8jdmElqkk
+W9SN2SecNPtSedfQn998WDAhkpi13F9t0zYuz8RtmdTsbTB9t+P6rw3luLYazKusP91wbuVGy+BWQ/oW
+VEq4JDPg60UWe0aTqjejDNxxc2xcL/sWXNwE0mCZDIm9eb9RHd9fPfiJBEF94a0ifU565KQiargGZAen
+TaFZiaZeI3Rt6lWwK6XbB3OcZSmjnLCvJU0LjY4fxtfQkEk2vvbyDxsJIvbta7CkKO0P9HeuMlDSyt9a
+2QQQbqANaKZqCbixpwCG6yePVG8P8JmcwYTk+yYDzNqsA2gWgTxYVDhQaz1d7bXIPoDdg/+OsBS/u5kE
+exVt67RrFh8bIrs5beitceTJnDbHF91348Z7ZAj83PdfYJtfmDKr/nBbni16P7nX79UV3yQVdPTPnp+c
+5r7qEJNEqGnfcquJ5G05RCmlrjHDK2ONKa5y2nC6djykOV7SQeeAOF4pJe4j+6TyZeg9bYlWxWPLeYqj
+2fE2p5sd3sBZC4V9Que+66slbZSQ+v6raLyUrKMvPr/ohmsaN3xJCy//AFBLBwhtWIdn8QQAAMkZAABQ
+SwECFAAUAAgICAAAACEAbViHZ/EEAADJGQAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAA
+AAEAAQA2AAAAJwUAAAAA
+------=_contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/gr1/ContainerGrBuilder.java-ea378b27-5fb2-3795-9753-2efda6d09043--
+------=_contents/module1/src/main/yang/module1.yang-dce208f2-80b4-3116-966b-3325b35670c8
+Content-Type: q7/binary
+Entry-Name: contents/module1/src/main/yang/module1.yang
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSlUstu4zAMvOcrCN0d5wFssc1li6JA
+C7S3/QFCoW1t9TAkpWi2yL9Xku2s7HiLFuVBhixyODNkWcKt0Z60d2AqYMgVFe7oPKnlEXXNFsrsD5Kg
++6zhbQEhNCpyLXIC1njfXpdlLFzSK6pW0pIbVXYgbJfyW0uVeAWm1v2PdAjVGut76A28DWlqs4PTZcY2
+y9jOZqwxS1njkJMOY2vU4i96YTSwm9unO3jQfNnz4cEE5B7YH0O/plpyznty3Io2oqR7DPa7GQyCylgI
+bgovyEVyklS86hp8SEpte3tzVEsvwkVim9Xqqlj9KFY/e6cnPYE96ICN8lwy4GRSkxihyfatMihJWEFj
+nC/iCLOHGP7YBh2b6/gNMxi9jTjcB4BUH9X6RjgYTXtCZ+hbSOE87I0K3ApHaHkzS2DbEdh+QOAxIoV9
+7cC6dQRvoEP9P41/zkhTh8Jx+2ROQHJYT605s3PehmHuLh7n9iIP9tTj1uKFNKAPSGiTiI6KC++hmI2h
+J/wTy6j94IKGS4rPdAQW3WCXDJO6mal/St4MjzNmdZBybp2+AJzHfBMu0bnvNzhNNuO0OL0DUEsHCJWr
+qi60AQAAAwUAAFBLAQIUABQACAgIAAAAIQCVq6outAEAAAMFAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29u
+dGVudFBLBQYAAAAAAQABADYAAADqAQAAAAA=
+------=_contents/module1/src/main/yang/module1.yang-dce208f2-80b4-3116-966b-3325b35670c8--
+------=_contents/module2/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/$YangModuleInfoImpl.class-749492be-aa57-3813-bfc3-f091efe49885
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/$YangModuleInfoImpl.class
+
+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
+------=_contents/module2/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/$YangModuleInfoImpl.class-749492be-aa57-3813-bfc3-f091efe49885--
+------=_contents/module3/.settings/org.eclipse.m2e.core.prefs-b8f1733b-fed2-3198-8b9d-fd9beb06ef25
+Content-Type: q7/binary
+Entry-Name: contents/module3/.settings/org.eclipse.m2e.core.prefs
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnRNyzEKwCAQBMBe8CuCD/AP6VLLscIl
+4sme8f0hXfqZKks3DlrTDi8xQLpOR5pEAzEEnjboaqPkGAi3vnEab59VvnlBlpfFBzH85AtQSwcIVoDB
+00sAAABaAAAAUEsBAhQAFAAICAgAAAAhAFaAwdNLAAAAWgAAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250
+ZW50UEsFBgAAAAABAAEANgAAAIEAAAAAAA==
+------=_contents/module3/.settings/org.eclipse.m2e.core.prefs-b8f1733b-fed2-3198-8b9d-fd9beb06ef25--
+------=_contents/module2/target/classes/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/$YangModelBindingProvider.class-f1f3fde2-1547-375d-89ce-2f40db054beb
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/classes/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/$YangModelBindingProvider.class
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS1UslOAkEQfQ0DowgiuF88eRAPtKAX
+lxijiQkJLokG48GYAdqhzdBNmh4S/0pPGg9+gB9lLGBi1MBND12VWt6r6qp6/3h9A7CJZRcxhhttfK47
+QjW9h0D6LcsfPOVzXyjeK/HQqJ9B3+iww63o2jI3olfa2tjeKPPVa8Kc6KYIDqVqSuWfG92TTWFcOAwz
+917P40Gf9qx+LxrWRZLhYGRhq3XQHbZQH1LxcdwMyT2ppN1niK8VagzOEWWlEMdUGi4mGLJVqcRp2K4L
+c+nVA8GQr+qGF9Q8I/t25HRsS3YZbqv/OopdhowvLIXCQFTUnWbYWSuMrjl+ChF2N4VZzLuYY7j6y64j
++kq7E6SxgBzDFPVcUV3rqQaNKnWhQ9MQx7I/t5Wxfy32N44SaDP0EnRuMdK0E5KTZHHSjHRi/Rmpp0E4
+TTI5cMaRIZkeJmAaWdJ0RMhF4GIEdl6Qf/yFTX7DOl/YxUHW0idQSwcIXk395WgBAAD6AgAAUEsBAhQA
+FAAICAgAAAAhAF5N/eVoAQAA+gIAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEA
+NgAAAJ4BAAAAAA==
+------=_contents/module2/target/classes/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/$YangModelBindingProvider.class-f1f3fde2-1547-375d-89ce-2f40db054beb--
+------=_contents/module1/.settings/org.eclipse.m2e.core.prefs-eb73e600-852d-3641-a5f6-9ac78f9581dc
+Content-Type: q7/binary
+Entry-Name: contents/module1/.settings/org.eclipse.m2e.core.prefs
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnRNyzEKwCAQBMBe8CuCD/AP6VLLscIl
+4sme8f0hXfqZKks3DlrTDi8xQLpOR5pEAzEEnjboaqPkGAi3vnEab59VvnlBlpfFBzH85AtQSwcIVoDB
+00sAAABaAAAAUEsBAhQAFAAICAgAAAAhAFaAwdNLAAAAWgAAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250
+ZW50UEsFBgAAAAABAAEANgAAAIEAAAAAAA==
+------=_contents/module1/.settings/org.eclipse.m2e.core.prefs-eb73e600-852d-3641-a5f6-9ac78f9581dc--
+------=_contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/Typem2.java-9e09cbd1-e7ed-3fd4-9dd4-56ff4d758630
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/Typem2.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSdVVFv2jAQfq/U/3DlpYGtJsBKRxFq
+tfal0qZOYutLVU0mHODOiTPbYWNT//vs2ClJCN3U8BDq++677+4705RG3+kSQcglESkmc7rhbLnSZEOT
+JVliQtY9stI6JTSKkeAvGqccSSRiojZKY0wkrsOzcBiOxocHLE6F1PBI15QwQaYoGeXsN51xrEVnSBNF
+rkSitMwiLeRnacpLzVAZpP10O53DA+jAJzHPOEJCYzzPD+wT54f9/O9ptMKYQkr1agu4D6zo8263Lrvr
+ZF8Y2UwxkUz6YXh2Eg5PwlFbb1KM+133erBc3cODNJtxFkHEqVLwJQ+ZCLN8MSZaQblL+GNi5kklW1ON
+oDTVJnnBEsqBi2QJKkffobTFv95cwwTeD4ejwenp2bveIOyNhoN+7/TjGByRyyzo8tFx68xUS2bYvq0p
+zzCfmEVfNg40aOWoVttrcw25VoI9lO2iE/voFVPEnRu5zzVt6Mm9nFn26cCVRKNVAYVIpBtYSBHDVGQy
+QridPWKkSQF9TrlMqaQxKIfyYJGDC0y3Sbx7+bwXJDsAaVJeofV2edol6mtc0IzrGzNVmkQY+BnN3fHd
+zqQk6kwmkODPQmIFui1dKbvjgamcJwRN5PUuvPW3a5SSzbHCzBINK6pWV2JeI3OLZeNmuWI7pEFvvA3b
+gERllJtIOfB86NI6xcEbCIJi3hNIMs7bcAEhnHu9ZCujPd7pyZH8X08zIbj59QD8kVGuSgvstsvuTaVT
+toDAroPVVY+VJJhrgyVhT1UCk7jtq5lgYdS8wGA8vbK/IcaGo1wI2Z68gtLvqNArlMYNfxXalnhcLVx3
+pVYq786yFNflaA/wBV01bU+AJm6YgyNvvveqXOc1Te9a9Y9d2blZWrgv1ctQh33IGJ+buc78e5Lf6D2o
+oOW9uG+VN7tY0wWTyt6XkuhGf/aN3UJyjkZDCvZGR5wNDVm+L0JT+y8/aL2FivTa1JsynOjJTloN560u
+g3btrOUcPxy3ydanstH2Y778BVBLBwjSSnbg+QIAALUIAABQSwECFAAUAAgICAAAACEA0kp24PkCAAC1
+CAAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAALwMAAAAA
+------=_contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/Typem2.java-9e09cbd1-e7ed-3fd4-9dd4-56ff4d758630--
+------=_contents/module3/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/$YangModelBindingProvider.java-f74aea97-e899-361a-bb3c-14dd321c2f3a
+Content-Type: q7/binary
+Entry-Name: contents/module3/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/$YangModelBindingProvider.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSVkDGLwzAMhfdA/oOHDu0i0qWldLst
+Q+HWGxVHdc3ZsrGV0FD63+uQcLfcDX1oEUif3lNE/Y2GVEgGQiTucXLW3AQmZAOGGMY93EQioPYEdEcf
+HYEOHvKUhTwkGptjc2hO57qqqzh0zmp1tYxOaYc5q81XQV1CT+7Dcm/ZfKYw2p6SsjPLE0v++76E4PLi
+pFtW4V/WY76uilYHbwIHRy1fgzIkv912N2PVqkQyJP6Js860JUP5k7ScBVnTdndeVp51VeoFUEsHCHe6
+NsXEAAAAYAEAAFBLAQIUABQACAgIAAAAIQB3ujbFxAAAAGABAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29u
+dGVudFBLBQYAAAAAAQABADYAAAD6AAAAAAA=
+------=_contents/module3/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/$YangModelBindingProvider.java-f74aea97-e899-361a-bb3c-14dd321c2f3a--
+------=_contents/module1/src/main/yang/module1a.yang-1a9d2f3f-0ac7-382c-91c2-3bdb13b8b5f3
+Content-Type: q7/binary
+Entry-Name: contents/module1/src/main/yang/module1a.yang
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnRdUclOwzAQvecrRr5naQ4g2gsVQqIH
+bvzAyJ00RvEie0AtVf6d2Imh6Rxszfj5Lba2x6+BQKdtg3AtYCqDmoJDSSB6Zreta5SaKjqjdgNV0uo6
+XAKTFruEd546dQahNzhN0khpZz0vxC1cM2YZ7GBMMOtPaNQPsrIGxP7l/RUORlYLr7SGUTKIT0vP9xay
+0pGC9MpFhtTHEh99DgWd9UCGFSsK0dZAOrbmBDyBkuQcpsqMnr5ViIbapnksm4eyeVoe5k4PxMFMvDj8
+XcnOx+I/gDLkF4kbmoGwg94GLuNr3xzE4ovL/tttbHS7WwFWJt4mlkQSo3KvAqx+Z/Yzr2PxC1BLBwie
+K2nPAQEAAPIBAABQSwECFAAUAAgICAAAACEAnitpzwEBAADyAQAACAAAAAAAAAAAAAAAAAAAAAAALmNv
+bnRlbnRQSwUGAAAAAAEAAQA2AAAANwEAAAAA
+------=_contents/module1/src/main/yang/module1a.yang-1a9d2f3f-0ac7-382c-91c2-3bdb13b8b5f3--
+------=_contents/module1/.project-25c85afd-17f7-3dd5-a7e1-2f7b05216761
+Content-Type: q7/binary
+Entry-Name: contents/module1/.project
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStkbEOwiAQhmdNfIemu8V2csCaqHF0
+UR8A4dJgCjRAGx9foFRTGxMHt/t/7uc7OLx9iDrpQBuu5CbNs1WagKSKcVlt0uvluFyn23Ixx41Wd6D2
+AIZq3ljX7dwZlkRAKRRra8gxCsrbVAkB0pYYDZV34x0mCDRSt5bX7NwA9SrKvYsSyYITSUpXGdCaNway
+O7MZVdoVpCMhAPo9gksQXbWebaJGYwOjCeUnriig5wrSgSx2/yBHZ/gAB7Wthtjdi+9v78/9AKHvW+Zj
+7tMkNdQe+1rPeOFPUEsHCAe0qTXWAAAALwIAAFBLAQIUABQACAgIAAAAIQAHtKk11gAAAC8CAAAIAAAA
+AAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAAAMAQAAAAA=
+------=_contents/module1/.project-25c85afd-17f7-3dd5-a7e1-2f7b05216761--
+------=_contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/GroupTest2Service.java-a94f44c0-bbad-3117-b7ac-17755597ae04
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/GroupTest2Service.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSVUU1LBDEMvQ/Mf+hR55D9wIu67FHx
+IMIq3rudbK12mtJJBxfxv9vMLC7CgmwCKW3y8vLSqM2HtqgoWaCIodV77+wbw14HCxYDDAvIKfxN2kQ5
+AmPPS0g4LK7m1/PlbV25LlJi9a4HDZmdB0PB5JQwMNxlzgmPRScZmcj3E/fWhdaVcxPNM6bBmTOwhrqO
+gkA32GfP/yDP0wlP8SHELE3FZ01TV6pRj9RmjyroDm/GB7F7afAi+IMGyczqKuatd0a5wJh22uDJwmL4
+yWWcfrocN1FXXxO5uKSm5a5+Ba/GL/Ci7ZVcu14riheHuQtriZfj+N8SfgBQSwcIQ1o75/YAAAAEAgAA
+UEsBAhQAFAAICAgAAAAhAENaO+f2AAAABAIAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAA
+AAABAAEANgAAACwBAAAAAA==
+------=_contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/GroupTest2Service.java-a94f44c0-bbad-3117-b7ac-17755597ae04--
+------=_contents/module1/.classpath-dcf497a6-16c3-3637-96f5-01f0a4f34118
+Content-Type: q7/binary
+Entry-Name: contents/module1/.classpath
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTdlF1rwjAUhq8d7D+UXApNpjfbRTsp
+0rHJdMN23kpsDjWuTUs+iv77pX7gBzrcYKC7PCfvOXmfnCReZ55nTgVS8UL4qIXvkAMiKRgXqY8+4if3
+AXUeb2+8JKNKlVRPbdDYRiC0XDifXDAfKZkgpzC6NNpHmsoUNFkKQSGnFi8lJKdckBmtKKpbNTyqteQT
+o0Et452EI2gOPipKbc3RDDkVzYxNaGkAkRPqnFYgcFnkDCSvgB2r8sj+ph7ZBzrGCPMkM6tjaTbRL5Al
+qMLIxK6cyf1XJKet2ybaPeK/zv/nkX3LfWFzSwqxsVjIFEOS8VIBztuA+8EoHLTH3dcgit6D+HncfRvE
+wcsgHF609RnTOKNGJFM7Ktwbhlvf5FDHhQZpLxZmMDEpNnxdCRJHmgpGJRv140UJpGevaxS6LXx/GfA/
++SoWVKTX9dTOZlxnUxAgqQbmrh8XURbhCpFXtAd0G+a6+U4rG30BUEsHCHaZJ3NpAQAAcAcAAFBLAQIU
+ABQACAgIAAAAIQB2mSdzaQEAAHAHAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQAB
+ADYAAACfAQAAAAA=
+------=_contents/module1/.classpath-dcf497a6-16c3-3637-96f5-01f0a4f34118--
+------=_contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/$YangModuleInfoImpl.java-c2aa86af-88ee-3e42-8191-7c54dfe22b2c
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/$YangModuleInfoImpl.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTNVV1P2zAUfUfiP1xFk0gFTQviBTqm
+McSkPtBOlJdp2oObXFIPx45sp6xC/e+7+WrjkI6Op0WV6uT6Hl+fc66dsvCJxQhKx4FKUUZsJXi8sMGK
+yTiIUQbL0yDT0g3GWmVpYNHYs0Dj8vR8eDE8g9HhAU9SpW03mlVKmBJ3zmXE6f87vdypKBM4lo9qm/+L
+LVmQWS6CGdquzzdKCAwtV9K0wlwFY5lmdmY1sqQjOL39HWKap1IwzeaCh/DIJRMQCmYMfHCLGiepAMIQ
+mKC0BtwovBweHB4APanmS2YRjGV2g9iaPJ7MHq4nN7dwBRKfu1bye6M2YIlE2yHCQLIEKdsrBOgXAnij
+N+ablIVFEsl42VTlcl8UkpgbIiwHORuenveHF/3hWylGZTrEb8wu8rTB3e3DdX88+TrIDTBorFw4osbq
+RET70WXqE5SiYlR+M1vSSj0rEVr0x2jHkkIyRL+XKwfVo9ESNxt5qlrWbSU69WritKqifTd8GmCS2hVt
+ptC4Tml4laou/q66FgoKc1JD2vuK2WtTpvlNqpvQ/BH8GpIMlwnhFJs/dqHVc+HFMdUZMzEj4nDTIL5X
+LwZHHhy7oh6DdwTcQMKNIcW95tLr7dDqVXvVsijakTLokLGGkNlwAX6jSQGdqgcD2NQkkD2dwDyztA/U
+mBcjlV3k9ntGgpIQqVc1rZtG+zxdotY8Qsc9lYWJ6wm1T6dV8r4avQPwvuqkTtC6zd4DPKkbfWe5RXR/
+6KYxCb9046wgvvJdr7SPgaZaL/+htaddhu7y8x52rgg19e2yr1AdZ1h+HLkHRqd2r4+6fzOHVeXABS+/
+fcm4iFCDmVdXkvPZp14qdLnJBfJ7xZBJJXnIRNkaTZbMPGBpfr343g9vR6C+v4jtfLhj1ol7b1WTi/ed
+Gc07qpC2fP3LfPeCatlhZ14ph6lSWuLsyPrp0FFbaB5spdmqSr8/UEsHCBQIOKfRAgAAlAkAAFBLAQIU
+ABQACAgIAAAAIQAUCDin0QIAAJQJAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQAB
+ADYAAAAHAwAAAAA=
+------=_contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/$YangModuleInfoImpl.java-c2aa86af-88ee-3e42-8191-7c54dfe22b2c--
+------=_contents/module1/target/classes/module1a.yang-c69cfd2d-f752-3147-b6d1-db2edca7f2b7
+Content-Type: q7/binary
+Entry-Name: contents/module1/target/classes/module1a.yang
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnRdUclOwzAQvecrRr5naQ4g2gsVQqIH
+bvzAyJ00RvEie0AtVf6d2Imh6Rxszfj5Lba2x6+BQKdtg3AtYCqDmoJDSSB6Zreta5SaKjqjdgNV0uo6
+XAKTFruEd546dQahNzhN0khpZz0vxC1cM2YZ7GBMMOtPaNQPsrIGxP7l/RUORlYLr7SGUTKIT0vP9xay
+0pGC9MpFhtTHEh99DgWd9UCGFSsK0dZAOrbmBDyBkuQcpsqMnr5ViIbapnksm4eyeVoe5k4PxMFMvDj8
+XcnOx+I/gDLkF4kbmoGwg94GLuNr3xzE4ovL/tttbHS7WwFWJt4mlkQSo3KvAqx+Z/Yzr2PxC1BLBwie
+K2nPAQEAAPIBAABQSwECFAAUAAgICAAAACEAnitpzwEBAADyAQAACAAAAAAAAAAAAAAAAAAAAAAALmNv
+bnRlbnRQSwUGAAAAAAEAAQA2AAAANwEAAAAA
+------=_contents/module1/target/classes/module1a.yang-c69cfd2d-f752-3147-b6d1-db2edca7f2b7--
+------=_contents/module2/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/Typem2.class-4a91ec10-1ccf-3522-8c6a-6ed43d19e710
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/Typem2.class
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStVN9zE1UU/m5+NGm6hRoKhRJsaQXT
+pLAtVSqmAUtrMSWltcU6wDiyTS/N1mQ37m461L/Bf0Df1Zc+wIyWGRkdfZEZffDvcUbF797dKQXLG5PZ
+3XvPPec73/nOufn93x9/BjCBmynEBOZdb8N0W9JZt7Yb9kY9MLctZ8PckI65NW7Wg6BlWrWmNOV9q9lq
+SLPmNk1/2w9k0/Tk1tjk2MWxS+bN7ZZsXkghIdCzaW1ZZkNhLK5tylqQQodAr7barrkiPdtq2F9Yaw1J
+Z19vV6Xn267zUWVWQMwLdM+4jh9YTrBqNdoyeX/xp1OLf/z1p0DHp1vKIpCtPkuzEni2s1Hi6ZTt2MFl
+gaP5/x+PrAqcWG47gd2Uq7ZvM/+047iBFTCzLzAUhqxJy/FNnd9r1wLXW/IojhfY0meGZJQ+MeOuywzi
+OGrgEI4JxPMjq50QOG7AQLfA4artyBvt5pr0boalZqtujZVarJf7yJgI6jZzV6uvrglkuZh/lXhKuA7f
+bXs1VcWGDGblPavdCCq6Rcp49yC5XyWFDJUdUkofFjDWw/SrYSfSJBQte/MjB01Fum75ddUv3aVKBiMo
+plB4blJDZwNn8Sab3PI4I5zECgv3pM9kHMmVwKp9tmC1os51yM/bVsN/YdbCiS+N3FazMWHgLbwdUpxp
+WD6djzxHURtLitCkgTGMk6C7tvn8cEeIZOUGdekRLXBDtimUBfperOFq226sSy+NK3QN5Ru8k8EUhtK4
+KhAbHVSbWQPvY45VWC3VIYFzB7bwJeClND4QSIV3sazw5hXedYFcfublUcpxwUAJZxi8Fhp5J1/qz5rv
+2Z5P8cVtgcyKHsE5W6nfFVZ2XoXiNKcjzieJGPqRQprrTv7DxZBBVl1HrlO0cXxo6+HuEHev8cnegfDp
+c4S2OZ7F+M0UHqG3UPwBfQ81xgntH+c7iwQ9O9HLLMCx0BsnkQP0SmUSOs8pvhVmJcLsDjG/R98BsP2E
+Pcng3D7Y7j3YbrzOlSpoAIMR7IQuF+h8DHGL0Kcf7EF26IMBDWWEThjWCgi8gTMRgKl5AskCKb0YPLwv
+OBnxEOpmRMFf0lvxHugZmEqUewZydYXyBKn4dxSPy13k75ZzO3SJa1ilG5DnboSABapT1CkGQ5goRZzv
+UZzTfezHea5i5Al6x55S8jg7KMhaPCXNaBNTBnVxIma/RsymC8VvkUzsFJ8gGd8p7OJCkc83alP8BWIh
+5GuM8vMbjtKDi1FN/OLXyinxjPtFrd0YOY1zhibQxSvdTetxTJLlJbJ/l9KUyHaKbC+jjCv8Te+rb3qv
+ldN4hxGCMUOMykX1GUimksbf6GVNh3la2uvSDuMVQvkxpm5lLz/Ce9VEuaBJD+e+QjpepuDF7PQuZj4u
+Zq/pT6g/Fz2f7KKyi+qDvVLO6ksxx0G9xqQVpphHH66TyAJ7vsjGLLHA5X3UyxH1DO036ME/X8qwhA8j
+6l2I/4NcClOiQzFf1oO08h9QSwcIJ0BNel8EAABgCAAAUEsBAhQAFAAICAgAAAAhACdATXpfBAAAYAgA
+AAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAJUEAAAAAA==
+------=_contents/module2/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/Typem2.class-4a91ec10-1ccf-3522-8c6a-6ed43d19e710--
+------=_contents/module3/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/$YangModuleInfoImpl.class-78bbefd6-eabe-3d1b-aac9-c00a83b4a919
+Content-Type: q7/binary
+Entry-Name: contents/module3/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/$YangModuleInfoImpl.class
+
+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
+------=_contents/module3/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/$YangModuleInfoImpl.class-78bbefd6-eabe-3d1b-aac9-c00a83b4a919--
+------=_contents/module2/target/classes/group-test2.yang-ff370062-5014-33f8-a00c-1e8da07e81aa
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/classes/group-test2.yang
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnRlj8FugzAMhs8g9R0s7qi02qXl2FMf
+IwLDLIFjJc40NPHuS9qSMs2XWP/vfL99PMLNsiKrBztANTobpFb0eq4O5Wz7MCHsRPg5lBCLzYxeTIdQ
+BcdXK8i9WSYaP/W6Z7TPcXE40PdffLSepsMv8mQZzs3po24udZNjUvXoO0eiaaK6MymZKf/ZAtYN9kgg
+HmNz2ihFF080xOggd/Xosl1MaAZIW72lQhdB8Ooiq93E9dWsOTQ9ryukAysZQCxhhwsefVqp/UdYfwFQ
+SwcIm8eyXckAAACDAQAAUEsBAhQAFAAICAgAAAAhAJvHsl3JAAAAgwEAAAgAAAAAAAAAAAAAAAAAAAAA
+AC5jb250ZW50UEsFBgAAAAABAAEANgAAAP8AAAAAAA==
+------=_contents/module2/target/classes/group-test2.yang-ff370062-5014-33f8-a00c-1e8da07e81aa--
+------=_contents/module2/.settings/org.eclipse.m2e.core.prefs-ac393939-d6b6-3dd2-9b01-7565709ab64e
+Content-Type: q7/binary
+Entry-Name: contents/module2/.settings/org.eclipse.m2e.core.prefs
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnRNyzEKwCAQBMBe8CuCD/AP6VLLscIl
+4sme8f0hXfqZKks3DlrTDi8xQLpOR5pEAzEEnjboaqPkGAi3vnEab59VvnlBlpfFBzH85AtQSwcIVoDB
+00sAAABaAAAAUEsBAhQAFAAICAgAAAAhAFaAwdNLAAAAWgAAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250
+ZW50UEsFBgAAAAABAAEANgAAAIEAAAAAAA==
+------=_contents/module2/.settings/org.eclipse.m2e.core.prefs-ac393939-d6b6-3dd2-9b01-7565709ab64e--
+------=_contents/module2/target/generated-sources/yang/META-INF/yang/group-test2.yang-a1360194-72ea-3197-b121-95a4e18c6860
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/generated-sources/yang/META-INF/yang/group-test2.yang
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnRlj8FugzAMhs8g9R0s7qi02qXl2FMf
+IwLDLIFjJc40NPHuS9qSMs2XWP/vfL99PMLNsiKrBztANTobpFb0eq4O5Wz7MCHsRPg5lBCLzYxeTIdQ
+BcdXK8i9WSYaP/W6Z7TPcXE40PdffLSepsMv8mQZzs3po24udZNjUvXoO0eiaaK6MymZKf/ZAtYN9kgg
+HmNz2ihFF080xOggd/Xosl1MaAZIW72lQhdB8Ooiq93E9dWsOTQ9ryukAysZQCxhhwsefVqp/UdYfwFQ
+SwcIm8eyXckAAACDAQAAUEsBAhQAFAAICAgAAAAhAJvHsl3JAAAAgwEAAAgAAAAAAAAAAAAAAAAAAAAA
+AC5jb250ZW50UEsFBgAAAAABAAEANgAAAP8AAAAAAA==
+------=_contents/module2/target/generated-sources/yang/META-INF/yang/group-test2.yang-a1360194-72ea-3197-b121-95a4e18c6860--
+------=_contents/module1/pom.xml-12f269e6-127d-3796-b63a-4cfa9efeab6d
+Content-Type: q7/binary
+Entry-Name: contents/module1/pom.xml
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTVV11P2zAUfWbS/kPFe+y2TJtUeZE2
+0DYkGAimaa8muaSeHDuyHdr++9nOB07iQod42B577ofvuSe+viWVkr8hM7NtyYX+eLw2plphXNIHEIhW
+NFsDkqrA11eX+B2ao/lx47naatZ7bzYbtDnxfsv5fIF/XV7c2sCSJkxoQ0UGNkqzlfbghcyoYVIccNhs
+n8dW5w2YeD9kfx+nb9/MZqSUOfCfoLQ9IfVGggeY9yqUrKvzPLWWmsOC4A7wVqoMu6eZCR0CzPs8tOnc
+6Yvk9vun69tvVz8IfgiPsc2twAaC9r9deZ5JJsuKcVBIy1plkC7QB4LjpnicoaoAE41rTf58PCqA5FCB
+yEFkQUk9tmuRoD+210g6M91xVqwN2lFRGCm5HrbMBwUtcm7JHRM5E8Wkd975sX/v0XJP/xyDSXXTeo9G
+ci7HtR1NFV1Gqjo6SNQXFnVyQFEnr1lUAPTyK6ikZkaqQP4eC+RnVvlA9UQBB6qBYBYoKGgJe9y8qXes
+FU/biyxgW+vhF+WucyaFAWFwWB8eeLWpMcEuW0d5UvtBbLSglV5L8xydR7/X59PlfpoQwRPFSMXrgomb
+iJIjy3+o5x4Gf8HsH9Y2SmIC9zrf1YznwwboxzoboP/9wpEdGdrNq9qkj07ug2e3d4UtZLV77XWAhvgA
+bgQtQICiBpLmCdQDLTu2knI9Als4Eu/hUQYcS0GsuvesqBWN1GbNrkVf7DOrb6Q0Z0ylWmX2AWYCOwvB
+E/skQ2Z3ka9NgVJNGTgOnTViHCc45VTrJyRHzXKgKbfbE0M2NWqkRadhmvOy4gRHMkcrkLWpavPZXl/H
+sNk3cNf0vOs6tocSPPSNsMX76Y4qishtr0Rll9ez8KG7t6q6yRYxjb+A/WITHPtAAzRMFtuqxpbd5AN+
+0XX1oeHe4G+r7XRi5U2K526uDz/89kZXnREcUu6G2WjktQMNdxPNr6XuT0f6B1BLBwjxgLot2AIAAH4M
+AABQSwECFAAUAAgICAAAACEA8YC6LdgCAAB+DAAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUG
+AAAAAAEAAQA2AAAADgMAAAAA
+------=_contents/module1/pom.xml-12f269e6-127d-3796-b63a-4cfa9efeab6d--
+------=_contents/module2/target/classes/META-INF/yang/module2.yang-9a9e7b94-ff30-3336-b476-ead84ca33ec1
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/classes/META-INF/yang/module2.yang
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnRdkD0OwjAMhWc4hZWdtuoAAhYQYujA
+xgWi1IWgOokSg/gRd6cJLSA8xHrR8+eXkK3PLQKlVsJjDF0ZSRicVAjiyOwWeS4VYYZXSa7FTFnKwy0w
+klgmv/PY6CsIKvuLdFh/kEbfJWtrQKw3uy1URmW9RVnDUjGIk8XVP/4XU2NQXrtISTqW2B+HzNBYD2hY
+s8YAOhIoSnMA7kxp7Tts9kv1eNEhBiuLYjYpppNi3j/+byeIynRs2X5GBs7zS+Obwxqb1Gn4xVFUENh3
+WYaJ5wtQSwcInoj19M8AAABwAQAAUEsBAhQAFAAICAgAAAAhAJ6I9fTPAAAAcAEAAAgAAAAAAAAAAAAA
+AAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAAUBAAAAAA==
+------=_contents/module2/target/classes/META-INF/yang/module2.yang-9a9e7b94-ff30-3336-b476-ead84ca33ec1--
+------=_contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/OpInputBuilder.java-906fb0d2-d82d-3a6f-b0ad-b937b14a4722
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/OpInputBuilder.java
+
+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
+------=_contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/OpInputBuilder.java-906fb0d2-d82d-3a6f-b0ad-b937b14a4722--
+------=_contents/module2/target/classes/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/$YangModuleInfoImpl.class-b3a99180-fedc-39f7-9f74-3901511acb0c
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/classes/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/$YangModuleInfoImpl.class
+
+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
+ZW50UEsFBgAAAAABAAEANgAAAKkFAAAAAA==
+------=_contents/module2/target/classes/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/$YangModuleInfoImpl.class-b3a99180-fedc-39f7-9f74-3901511acb0c--
+------=_contents/module2/.settings/org.eclipse.jdt.core.prefs-51366dca-f9bd-34bf-8507-fdc29e05dba0
+Content-Type: q7/binary
+Entry-Name: contents/module2/.settings/org.eclipse.jdt.core.prefs
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSNjjEOwjAUQ3ckrvKlTky9A+IGaeJG
+HyX/R06A65OBzmWxPNh+RizaOqQROwiL6PIGu7qty/XizIJf5JmGRCem1KYFnCYhw2QEZox7CWN31nWR
+23mztqJh4v5JN/pWUGWub5oS7HGcXT+BppbPFrq/eLC+UEsHCOiKarVzAAAA8wAAAFBLAQIUABQACAgI
+AAAAIQDoimq1cwAAAPMAAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAACp
+AAAAAAA=
+------=_contents/module2/.settings/org.eclipse.jdt.core.prefs-51366dca-f9bd-34bf-8507-fdc29e05dba0--
+------=_contents/module1/target/classes/group-test.yang-ed9ec809-112d-372f-9b63-e1e905b8e26f
+Content-Type: q7/binary
+Entry-Name: contents/module1/target/classes/group-test.yang
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnRVUEGOwjAMPBeJP1i9R7RoL8CRE8+I
+WrdrKXWixEUg1L+vUQnN+hJrZjx25nCAq2dBlgR+gHqMfg5GMEm9302+nx3ChsFrvwMtthOmYDuEeo58
+9gG5t09H46+cC4fLqg4RB3r881amWkmago9S7DjCK08U4AUi3imRZ9NbQTg27Y9pTqZRZvmaZU1B55Pf
+1WPqIgV5K+obk5B135l8rbqtTae5WGKMW9dmt8qhHYwjjWROqshwJc+AkCQSjx+/avm8KkxQ/kmjarel
+yx9QSwcI3YxlKMwAAACLAQAAUEsBAhQAFAAICAgAAAAhAN2MZSjMAAAAiwEAAAgAAAAAAAAAAAAAAAAA
+AAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAAIBAAAAAA==
+------=_contents/module1/target/classes/group-test.yang-ed9ec809-112d-372f-9b63-e1e905b8e26f--
+------=_contents/module2/pom.xml-5640a1b4-8647-3136-9636-b0f902e87d4d
+Content-Type: q7/binary
+Entry-Name: contents/module2/pom.xml
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTVVk1v3CAQvVfqf1jlbtikVStF1FKb
+qG2kpImyVdUrsSdeKgwIcHb33xfwR7DNJtuoh/bImzfDvBkYIErLX1DYxbbmwnw4WlurTjGu6QMIRBUt
+1oCkrvDN9RV+i5ZoedQyT7eGDezNZoM2bwLvZLk8xj+vLlfOsaYZE8ZSUYDzMuzUBPBSFtQyKQ7YbLGP
+sTVlC2aBh9z6KH/9arEgtSyB/wBt3A55MBI8wgKr0rJRF2XuLA2HE4J7IFiptuyeFjYmRFjgPHTh/O7H
+2erbx5vV1+vvBD/E27jiKnCOYMLapxeUFLJWjINGRja6gPwYvSc4bUr7WaorsEm/zhT2x5MESAkKRAmi
+iFIasF2HRPVxtUbSm+mOs2pt0Y6KykrJzbhkwSkqkadld0yUTFSz2gXyY/3eoZM99fMKJtlFwCBKg5KG
+WakjUQMWiWJOT6Ql08CBGiCYRXkJWsMeWjANxEbzvDueAraNGdfJH9JCCgvC4jg/PGJ1oTHBPloveZb7
+QWqMoMqspX1OziPv7+vpYz8tiOBZx4jiTcXEbaKTE8t/2M89Cv5A2T/c26SIGTz0+a5hvBwXwDzm2QLD
++oWDKDGK2reiDZ+cRwdPpECFLRSNf8NMhMb4CG4bWoEATS1k7WA3o172aiXlZgJ2cMI/wJMIOBWCuO7e
+s6rRNJGbM/sSfXaPh7mV0p4znRtduGeFCewtBM/sswiFe2G/tAlKPVfgNfTWhHEa4IxTY55oOWqfPEO5
++xMw5EKjtrXoLA5zUStOcCJyMgPZWNXYT+76eoXtK4r7opd91bHblOAxN6EW75c7ySjRbncllPuSnccP
+3b3rqp9sCdP0BOxvNsGpAxqhcbDUX2Fq2c0O8Iuua3CNP13htrpKZ669WfXczQ3uh9/exK9iBseS+2E2
+GXndQMP9RAufLf+Vzn8DUEsHCMA7az+5AgAAVAsAAFBLAQIUABQACAgIAAAAIQDAO2s/uQIAAFQLAAAI
+AAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAADvAgAAAAA=
+------=_contents/module2/pom.xml-5640a1b4-8647-3136-9636-b0f902e87d4d--
+------=_contents/module2/.classpath-99624f28-a185-30a3-b0e9-1b3dec090292
+Content-Type: q7/binary
+Entry-Name: contents/module2/.classpath
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTdlF1rwjAUhq8d7D+UXApNpjfbRTsp
+0rHJdMN23kpsDjWuTUs+iv77pX7gBzrcYKC7PCfvOXmfnCReZ55nTgVS8UL4qIXvkAMiKRgXqY8+4if3
+AXUeb2+8JKNKlVRPbdDYRiC0XDifXDAfKZkgpzC6NNpHmsoUNFkKQSGnFi8lJKdckBmtKKpbNTyqteQT
+o0Et452EI2gOPipKbc3RDDkVzYxNaGkAkRPqnFYgcFnkDCSvgB2r8sj+ph7ZBzrGCPMkM6tjaTbRL5Al
+qMLIxK6cyf1XJKet2ybaPeK/zv/nkX3LfWFzSwqxsVjIFEOS8VIBztuA+8EoHLTH3dcgit6D+HncfRvE
+wcsgHF609RnTOKNGJFM7Ktwbhlvf5FDHhQZpLxZmMDEpNnxdCRJHmgpGJRv140UJpGevaxS6LXx/GfA/
++SoWVKTX9dTOZlxnUxAgqQbmrh8XURbhCpFXtAd0G+a6+U4rG30BUEsHCHaZJ3NpAQAAcAcAAFBLAQIU
+ABQACAgIAAAAIQB2mSdzaQEAAHAHAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQAB
+ADYAAACfAQAAAAA=
+------=_contents/module2/.classpath-99624f28-a185-30a3-b0e9-1b3dec090292--
+------=_contents/module3/.settings/org.eclipse.jdt.core.prefs-ed88f581-e7e7-3dd9-92d7-98375dca4d18
+Content-Type: q7/binary
+Entry-Name: contents/module3/.settings/org.eclipse.jdt.core.prefs
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSNjjEOwjAUQ3ckrvKlTky9A+IGaeJG
+HyX/R06A65OBzmWxPNh+RizaOqQROwiL6PIGu7qty/XizIJf5JmGRCem1KYFnCYhw2QEZox7CWN31nWR
+23mztqJh4v5JN/pWUGWub5oS7HGcXT+BppbPFrq/eLC+UEsHCOiKarVzAAAA8wAAAFBLAQIUABQACAgI
+AAAAIQDoimq1cwAAAPMAAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAACp
+AAAAAAA=
+------=_contents/module3/.settings/org.eclipse.jdt.core.prefs-ed88f581-e7e7-3dd9-92d7-98375dca4d18--
+------=_contents/module2/target/classes/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/OpInputBuilder.class-3045a364-ba24-364c-94ae-f39de016ac10
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/classes/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/OpInputBuilder.class
+
+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
+------=_contents/module2/target/classes/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/OpInputBuilder.class-3045a364-ba24-364c-94ae-f39de016ac10--
+------=_contents/module2/target/classes/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/OpInput.class-027f53f0-2702-34b7-8311-252564b73647
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/classes/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/OpInput.class
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU11P1EAUPYNAl1oEi18oiooPkLhM
+u/ACJSTED2KsS8ga3me7Qy1pZzbDdBN+lvHF+OAP8EcZb8sa0aDuJrTp3Nzb3tNzz5z59v3LVwAbeOZg
+guGtNinXfal64izP0g+WnwmV8lQqPgh5adTvL1Ojyz638tS2uJGDcDPYClr8oP9G9UvrYJJh/kQMBM8r
+kIPuiUyoOs2wfxW/2TehgwZD61Iwq3V+eg7bzVQvo/hSWPGThMuwMWrfXpkWUlnRzSXD1GF7790rhvX4
+f+2JLgqt+GFbFDJiaOwkeaYyu8twbXXtiGHyhe7JBm4yLNHE2xehtuuJm/XEDSwwuK0g3GwGW82A8tvE
+IqsUdnEXiw7uMTwfh4yH+3jAMJ0YKSyNdLwa/9qljjU0czRKZW08CWbA8NDDdXgMc3GmZLssutK8P9fV
+j3Ui8iNhsiofFt2OLk0iX2dV4g19tV4RYZjpZKkStjSSsYX4T5tFl3Mb32J/AfqnvUbvuWCtnSthPNQo
+2o3omJHT6J6Cg0r7xUp6OutkRcziBsU5ykL6orpm/Xnf9299xp1PWPpIhQk8otWlCLKZRw3LdbV6Htfr
+Ezyt48oPUEsHCNnjx7vAAQAARQQAAFBLAQIUABQACAgIAAAAIQDZ48e7wAEAAEUEAAAIAAAAAAAAAAAA
+AAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAAD2AQAAAAA=
+------=_contents/module2/target/classes/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/OpInput.class-027f53f0-2702-34b7-8311-252564b73647--
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf
+Content-Type: q7/binary
+Entry-Name: .q7.content
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTtW21v0zAQ/o7Ef6iifW3SdghY1TIx
+NqYiDZg2NPiEvOTaZSRxZDt94dfjpMnW1HHivLSikG+N/dz5fL47P7bV0enSdTpzINTG3ljr6z2tA56J
+LdubjbWATbtvtdN3L1+MMJnpYDq2T0Enps+YbrKlvsDkF/WRCcO75NcH7DFYss7StYdPegehXj6SR4e8
+faw9MOYPDWOxWOjYnelcufH9apJACsZ6Ek8woXiEMzjOeMJpHQ+5HH0OUxQ47O653bbG2s/ri9XNt/NP
+1xdw8/tTd4AZ9ftoofHJdjojM5yFx6IP/ukT/Agmo7FGF1uBA30t7uaAqe1A0qubDqJ8JPbAfbkEM2Do
+3uHtjASgGRKZeAR1CR+7OndXgQB2LL4GySAUGOMLS58N31K66flHi/sdE+CmwZTmjpOjxR2AqpaREZsr
+s58SM215qtdFtrfZLQAe0RyljBYQBCgOiAk0H7ZC3iw90pYDZgQHfpcBZXqEzfedIB6HVx1ZpCYsulzS
+lnZAOLOduDojBIqCgiEyA5YTF1E2At22t8ZyVV+sykuluCjdZLLyrBoZSTHLLW6Dtri1xa0gWwY1KpSi
+bFugKrm8hsPTtl1d3L7vTj5/FCMiHbxA5ra5PQfBkjB3sA+ehVaOPXtYl1uGsUOjX/q97YXEU//BP66w
+Bc7ZuuErwXObD6cSahnBkWFwVpTXj/M6jpeZLmlNT4c7tmCFNt2eNXEF7wiwGXhZKAE372fDBGDI62VQ
+AYxMF+RgAQ5L5PpOroSYmdjNx4uJsKIMCoUyis2896b3undSLLkVY0eyXFlv1EpBqzgEj+WJN8UT7sbm
+lN+ufHAHNfTJEr4aTgVVjClCFPanoyMgkjzLwObnuVQsKnalciMqjCWzg4d5/1XvpFcot4cg32GIp1Rf
+kn5zqvgi3YZ+v1nvt00p/uJPPD9gDas7C+xw8Y/izyadmh6hltatNJBuVVJbwgsvzs6BXDZYczeUJm7c
+aGq2BItjteVYsVfeJ+WhyiRP4ZjDCRgQxMDqJmeVPJJIkVNEEkUaWXqDUaSS6mSyBJ0sSShLU8pqpLIK
+raxMLOtRS+V9Nzo/V6s9Cltvc9pjellDoWpBO8zSV45rVmabVfhmNcZZh3PuI/p3GfsC72xO1zbxbEpz
+wjwb1pfwmFpqqzDDHG7YXFHLIGxtgTsobidu775dwM1kN7El7mL3fxu7E19lv1BUc5b8prPuTXC9u+A9
+HSCafTM8bt8Mi7X8l2+GcXy0b37qb37lXNY+B7XPQf/Mc9Bxe/+o2NveP7b3j+39499+/3jcHs8Pq/S1
+x/NDOp6XYsrNTHpnR+uR8fzPg5FR9k8XXOgPUEsHCGX+rJrxAwAA0TEAAFBLAQIUABQACAgIAAAAIQBl
+/qya8QMAANExAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAAAnBAAAAAA=
+
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf--
+------=_contents/module2/target/classes/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/OpInputBuilder$OpInputImpl.class-261cc306-a54d-34a7-8eb3-8ba16853103f
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/classes/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/OpInputBuilder$OpInputImpl.class
+
+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
+BQYAAAAAAQABADYAAAD8BwAAAAA=
+------=_contents/module2/target/classes/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/OpInputBuilder$OpInputImpl.class-261cc306-a54d-34a7-8eb3-8ba16853103f--
+------=_contents/module3/.classpath-66f5efb6-a02f-30ed-8406-3e8c6ec2351a
+Content-Type: q7/binary
+Entry-Name: contents/module3/.classpath
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTdlF1rwjAUhq8d7D+UXApNpjfbRTsp
+0rHJdMN23kpsDjWuTUs+iv77pX7gBzrcYKC7PCfvOXmfnCReZ55nTgVS8UL4qIXvkAMiKRgXqY8+4if3
+AXUeb2+8JKNKlVRPbdDYRiC0XDifXDAfKZkgpzC6NNpHmsoUNFkKQSGnFi8lJKdckBmtKKpbNTyqteQT
+o0Et452EI2gOPipKbc3RDDkVzYxNaGkAkRPqnFYgcFnkDCSvgB2r8sj+ph7ZBzrGCPMkM6tjaTbRL5Al
+qMLIxK6cyf1XJKet2ybaPeK/zv/nkX3LfWFzSwqxsVjIFEOS8VIBztuA+8EoHLTH3dcgit6D+HncfRvE
+wcsgHF609RnTOKNGJFM7Ktwbhlvf5FDHhQZpLxZmMDEpNnxdCRJHmgpGJRv140UJpGevaxS6LXx/GfA/
++SoWVKTX9dTOZlxnUxAgqQbmrh8XURbhCpFXtAd0G+a6+U4rG30BUEsHCHaZJ3NpAQAAcAcAAFBLAQIU
+ABQACAgIAAAAIQB2mSdzaQEAAHAHAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQAB
+ADYAAACfAQAAAAA=
+------=_contents/module3/.classpath-66f5efb6-a02f-30ed-8406-3e8c6ec2351a--
+------=_contents/module2/target/classes/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/gr1/ContainerGrBuilder$ContainerGrImpl.class-99124884-4e06-3e81-a80a-5b9b4d427108
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/classes/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/gr1/ContainerGrBuilder$ContainerGrImpl.class
+
+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
+ADYAAADzBwAAAAA=
+------=_contents/module2/target/classes/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/gr1/ContainerGrBuilder$ContainerGrImpl.class-99124884-4e06-3e81-a80a-5b9b4d427108--
+------=_contents/module1/target/classes/module1.yang-79114daf-65dc-385e-8669-fc974a7602b2
+Content-Type: q7/binary
+Entry-Name: contents/module1/target/classes/module1.yang
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnSlUstu4zAMvOcrCN0d5wFssc1li6JA
+C7S3/QFCoW1t9TAkpWi2yL9Xku2s7HiLFuVBhixyODNkWcKt0Z60d2AqYMgVFe7oPKnlEXXNFsrsD5Kg
++6zhbQEhNCpyLXIC1njfXpdlLFzSK6pW0pIbVXYgbJfyW0uVeAWm1v2PdAjVGut76A28DWlqs4PTZcY2
+y9jOZqwxS1njkJMOY2vU4i96YTSwm9unO3jQfNnz4cEE5B7YH0O/plpyznty3Io2oqR7DPa7GQyCylgI
+bgovyEVyklS86hp8SEpte3tzVEsvwkVim9Xqqlj9KFY/e6cnPYE96ICN8lwy4GRSkxihyfatMihJWEFj
+nC/iCLOHGP7YBh2b6/gNMxi9jTjcB4BUH9X6RjgYTXtCZ+hbSOE87I0K3ApHaHkzS2DbEdh+QOAxIoV9
+7cC6dQRvoEP9P41/zkhTh8Jx+2ROQHJYT605s3PehmHuLh7n9iIP9tTj1uKFNKAPSGiTiI6KC++hmI2h
+J/wTy6j94IKGS4rPdAQW3WCXDJO6mal/St4MjzNmdZBybp2+AJzHfBMu0bnvNzhNNuO0OL0DUEsHCJWr
+qi60AQAAAwUAAFBLAQIUABQACAgIAAAAIQCVq6outAEAAAMFAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29u
+dGVudFBLBQYAAAAAAQABADYAAADqAQAAAAA=
+------=_contents/module1/target/classes/module1.yang-79114daf-65dc-385e-8669-fc974a7602b2--
+------=_contents/module2/target/classes/META-INF/yang/group-test2.yang-1d4c409b-ee61-3203-af51-ee3bdcb3df11
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/classes/META-INF/yang/group-test2.yang
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnRlj8FugzAMhs8g9R0s7qi02qXl2FMf
+IwLDLIFjJc40NPHuS9qSMs2XWP/vfL99PMLNsiKrBztANTobpFb0eq4O5Wz7MCHsRPg5lBCLzYxeTIdQ
+BcdXK8i9WSYaP/W6Z7TPcXE40PdffLSepsMv8mQZzs3po24udZNjUvXoO0eiaaK6MymZKf/ZAtYN9kgg
+HmNz2ihFF080xOggd/Xosl1MaAZIW72lQhdB8Ooiq93E9dWsOTQ9ryukAysZQCxhhwsefVqp/UdYfwFQ
+SwcIm8eyXckAAACDAQAAUEsBAhQAFAAICAgAAAAhAJvHsl3JAAAAgwEAAAgAAAAAAAAAAAAAAAAAAAAA
+AC5jb250ZW50UEsFBgAAAAABAAEANgAAAP8AAAAAAA==
+------=_contents/module2/target/classes/META-INF/yang/group-test2.yang-1d4c409b-ee61-3203-af51-ee3bdcb3df11--
+------=_contents/module3/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/$YangModuleInfoImpl.java-069e638c-1b13-3b93-ac3f-f971bde75b2a
+Content-Type: q7/binary
+Entry-Name: contents/module3/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/$YangModuleInfoImpl.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTNVdFO2zAUfUfiH66iSaQCnGyTQKxj
+GkNMygNlorxM0x7c5JJ6OHYUO4UK9d9nx0mbhBQYT4sixbF9j6/POdfOaXxHUwRZpETmKBK65Cyda7Kk
+IiUpCrJ4T+Za54TGGRJ8oFnOkcQyI2qpNGakwEV4HB6FJzDe3WFZLgs9jKal5MrhzphImPn+ND+XMik5
+RuJWbuL/0AUlpWacTFEPdZ9LzjHWTArVG2aSRCIv9VQXSLOBwauLhxhzG2oG83LGWQy3TFAOMadKwbtu
+UpHZLzC76QyFVtAdhcfdnd0dME9esAXVCEpTvUbsTY4m05uzyfkFnILA+6GV/NG4D+iQzHYMYSBohiba
+y6qoj974hbkqp3EVYCX8FAR9EQMn4rM4RmCmDF0W5kMYHh+GR4fhyQshSpZFjD+ontuw4PLi5uwwmnwP
+rPxBnX3lhQZnEA315y5HX8DJiYnrUxu6nJI1/T3iU9SRMEMiRn9kNYP6KVCXhVgLU+ey6mswqFQbp5eV
+2XPLoQSzXC/NZip1m5CWS03W1ed0aCFS2dKUor6uWT1TLsxv09yGZrfgN5DGaiXnnWTto+eFvK9cGJk8
+U8qnhjhcl4bvNYvBngf7XUH3wdsDpiBjShm1vfbSq01TF8v+qi4psyOpsEPGCmKq4zn4rfIE7GQdBLDO
+iSO9O4BZqc0+sECbjJB6bq13jwZKQCKf5LRqG+3r1QKLgiXYcU9tX8P1xBTPoFVsVY3fAHhdV9EgaFNi
+bwGeNGW+Nd1q9PXQbWMafOfGaUV87buRs4+CtlqP/6G1r4YMPeTnV9i5JlQ198prhRo4w+xx1D0wBrV7
+etT9mzm0dI0uuOv7VjKeYAFqVl9GnW7f1FKly7kVyB9VTSqkYDHlrjTaLKkZobm97n3vl7dloLm5DNu2
+uWXWQffWqidX/1sj2vdTJa37fWZ+93Lq2WFrnJND1SE9cbZE/e7Q0VhoRjbSbFQ1719QSwcIcvByc9wC
+AACOCQAAUEsBAhQAFAAICAgAAAAhAHLwcnPcAgAAjgkAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50
+UEsFBgAAAAABAAEANgAAABIDAAAAAA==
+------=_contents/module3/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/$YangModuleInfoImpl.java-069e638c-1b13-3b93-ac3f-f971bde75b2a--
+------=_contents/module3/target/classes/module3.yang-e1ff0274-8ad3-3602-a435-8cb650b6f475
+Content-Type: q7/binary
+Entry-Name: contents/module3/target/classes/module3.yang
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnRdkLtuwzAMRefmKwjtsY0G6HNJUHTI
+kK0/IMh0wsKkBIkN8kD+PZZqt0E4iLjC1eGl2Lc/PQKXtoDzDIYSy5iCdQhmpxre6to6xgoPlkOPlfNc
+p2NSZPNe/CFiRwcwvBgvyuHj1gqdrJIXMKuPzSesxVWjxXlR6xTMt8flPf4W02JykUKmFJ3LfO2mzND5
+CChKSpiAMoGzlC3oYCpjf8NWt9SIe0o52GPTPM+bp3nzOi5/NxPMWga27f+eTJzLP02PAVvsSufpFx+y
+AhJ9mfyXK1BLBwjQRR/60QAAAG4BAABQSwECFAAUAAgICAAAACEA0EUf+tEAAABuAQAACAAAAAAAAAAA
+AAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAABwEAAAAA
+------=_contents/module3/target/classes/module3.yang-e1ff0274-8ad3-3602-a435-8cb650b6f475--
+------=_contents/module2/.project-e297e666-1717-311f-a776-a7945bc79982
+Content-Type: q7/binary
+Entry-Name: contents/module2/.project
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStkbEOwiAQhmdNfAfT3aKdHLAmahxd
+1AdAuDQ0BRqgjY8vUKqpTRMHt/t/7uc7OLx/imrZgjZcyV2ySdfJEiRVjMtil9xv59U22eeLOa61KoHa
+ExiqeW1dt3NnWBIBuVCsqSDDKChvUyUESJtj1FfejXeYINBAPRpesWsN1Ksojy5KJAtOJCldpEArXhtI
+S2ZTqrQrSEtCAPRnBJcgumg820SNhgZGI8pPXJFBxxWkBZkd/kGOTv8BDmobDbG7E9Nv7879AKFvKvM1
+92WU6muPfa9nuPAXUEsHCPzdeIzWAAAALwIAAFBLAQIUABQACAgIAAAAIQD83XiM1gAAAC8CAAAIAAAA
+AAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAAAMAQAAAAA=
+------=_contents/module2/.project-e297e666-1717-311f-a776-a7945bc79982--
+------=_contents/module2/target/classes/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/gr1/ContainerGr.class-f42f8d7b-8ca4-3e77-bce2-f64ec14ac149
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/classes/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/gr1/ContainerGr.class
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStU01PGzEQfU6B3aQB0i2lhdLvHhKp
+wbuBCwQhoajlkgahIO7OxixGu2tkvJH4WVUvVQ/9Af1RVWeXVk1TJBKpPng84xnPzPOb7z++fgOwhbcO
+Sgx9bSKuL2U6FNexis4tvxZpxCOZ8lHAM5P+fRkZnV1yK69sixs5Crb9Hb9F1oB3dGqFSqU5NA7mGGoX
+YiR4nD92NLiQoXWwwMBvTWe1jq9uEg9UOlQkO+cqHh6dOXAZtqYNOsiiRFIZg1gyzB/3Dj6+Z9js3hUe
+6iTRKT/uiUS2Gdy9MFapsvsM9+qNU4a5jh5KF8sMGwTI7vhTuwUgzQIQFw8YKi0/2G76O02f9IcM1fA3
+Ls3IVPAIjx2sMrybpaYqnmCNYSE0Uljq7Kze/QNu3xpqvT2NpTEbEmUwPK2ijArDcpda6GXJQJqTG3i9
+rg5FfCqMyvVfRieS9oSwYFipN/4tgODp68yE8oPKvWtjnNnMnRnKfRWlwmZGMrbenaRQ+84GJuizd3vA
+jPQ+NEF7f/rcYyz8P/knxotqoUkicqKEeTh0Wss/iYa6BBf3USXLImkBeeRr0Vvyap73BSufsf6pcNug
+vUISWCX3JTwrrPnYPseL4vyy2F/hdSHf/ARQSwcI2jZaBdQBAAA2BAAAUEsBAhQAFAAICAgAAAAhANo2
+WgXUAQAANgQAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAAoCAAAAAA==
+
+------=_contents/module2/target/classes/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/gr1/ContainerGr.class-f42f8d7b-8ca4-3e77-bce2-f64ec14ac149--
+------=_contents/module3/src/main/yang/module3.yang-b16aa1d8-b776-3570-9da8-5476c4a270c4
+Content-Type: q7/binary
+Entry-Name: contents/module3/src/main/yang/module3.yang
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnRdkLtuwzAMRefmKwjtsY0G6HNJUHTI
+kK0/IMh0wsKkBIkN8kD+PZZqt0E4iLjC1eGl2Lc/PQKXtoDzDIYSy5iCdQhmpxre6to6xgoPlkOPlfNc
+p2NSZPNe/CFiRwcwvBgvyuHj1gqdrJIXMKuPzSesxVWjxXlR6xTMt8flPf4W02JykUKmFJ3LfO2mzND5
+CChKSpiAMoGzlC3oYCpjf8NWt9SIe0o52GPTPM+bp3nzOi5/NxPMWga27f+eTJzLP02PAVvsSufpFx+y
+AhJ9mfyXK1BLBwjQRR/60QAAAG4BAABQSwECFAAUAAgICAAAACEA0EUf+tEAAABuAQAACAAAAAAAAAAA
+AAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAABwEAAAAA
+------=_contents/module3/src/main/yang/module3.yang-b16aa1d8-b776-3570-9da8-5476c4a270c4--
+------=_contents/module2/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/$YangModelBindingProvider.class-0500050b-3190-3ad3-8851-38e0ec72f6b1
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/$YangModelBindingProvider.class
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnS1UslKA0EQfW3GjGZRE/eLJw+JBzsi
+KC6IKAiBuICieBDpTNpJy0x3mOkE81d6Ujz4AX6UWEkGETE3PXQVtbxX1VX1/vH6BmAdiy5GGG5M5HPT
+krohuoHym5Z3hfa5LzXvrPGmtS0uvFBy+SDCViC5Z0Ied2MrQx7JTmWzslHZ4svXhDk2DRkcKN1Q2j+L
+TEc1ZOTCYZi6Fx3Bgx7taf1eetZFmmH/18LWmCAetFAfUPFh3AzpXaWV3WNIlcqXDM4hZWWQQjYHF2MM
+kzWl5Uk7rMvoQtQDyVCsGU8ElyJSPTtxOrapYobb2r+OYoch70tLoXYgq/rOMGyXyr/XHD6FBLuTwTRm
+XcwwXP1l1wl9lTJzmEOBIUs9V3VshfZoVJlz0448eaR6c1sa+tfV3saxBtoMvVE6txHStBOS42Rx0oz0
+6MozMk/9cI5kuu9MIU8yN0jABCZJ0xGhkIBXE7DzguLjD2z6G9b5ws73sxY+AVBLBwj1ghTpcAEAAPoC
+AABQSwECFAAUAAgICAAAACEA9YIU6XABAAD6AgAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUG
+AAAAAAEAAQA2AAAApgEAAAAA
+------=_contents/module2/target/classes/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/$YangModelBindingProvider.class-0500050b-3190-3ad3-8851-38e0ec72f6b1--
+------=_contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/OpInput.java-99180020-e5d0-3182-9164-60a2a78ab585
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/OpInput.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnStUl1LwzAUfS/0P4Q+bWPL2rKXbU4Z
+KOLDHOKj+HCb3WXRNgnp7XCI/930AzZB1IFpyMe9PefcnMSCeAWJzDjJjUW9gUOu5I74AbTkEjXfJ7xy
++mtSOlNZTlhSyh3uk0k8jdN5GKjCGkffk5ExednSClMURvOHeyjw76hM6Y3y8zUQrLMXFHQ+dlnJAjVB
+lv8mfN7Z+a1LPGH9jQeDMGADtjKbKkem/RlnTaBuDXjUgJvYo9hhAcwC7Y4/PfW86OxUdHaCu/KiqlRG
+L9I4mYzi6ShO+8aOfVfaVvRc84zDwFZZrgRTmtBtQSBb27s679O+4Rt5+rLd+OKH7erobRc4MeziP3zq
+irgMg/fWrlamK7YkID9tlYacNc/Dj8vVDVuc9aa4cAiEvegnH6NhdDTQbxrzov68u8aPevgEUEsHCLJ3
+2Eo8AQAAHgMAAFBLAQIUABQACAgIAAAAIQCyd9hKPAEAAB4DAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29u
+dGVudFBLBQYAAAAAAQABADYAAAByAQAAAAA=
+------=_contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/urn/opendaylight/group/test2/rev140902/OpInput.java-99180020-e5d0-3182-9164-60a2a78ab585--
+------=_contents/module2/target/generated-sources/spi/META-INF/services/org.opendaylight.yangtools.yang.binding.YangModelBindingProvider-287592f5-e1d9-397b-bcc6-8b51576fa1ad
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/generated-sources/spi/META-INF/services/org.opendaylight.yangtools.yang.binding.YangModelBindingProvider
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnR9zLEKAjEQRdHe77B+ZBdRtrUXbC3D
+ZpgNJJkwmQ3m79XSQuvLPaIMqVSCHynyZhi+MJgK+oRdy3dklb3CqNkMpT6d3OJmHB/v5yaB0jWWEAvf
+VXoMpAf5p29mFX7NBHr6XBNhlYw2mlH+6O7izm75rb8AUEsHCA4yxZFzAAAAuwAAAFBLAQIUABQACAgI
+AAAAIQAOMsWRcwAAALsAAAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAACp
+AAAAAAA=
+------=_contents/module2/target/generated-sources/spi/META-INF/services/org.opendaylight.yangtools.yang.binding.YangModelBindingProvider-287592f5-e1d9-397b-bcc6-8b51576fa1ad--
+------=_contents/module3/target/generated-sources/yang/META-INF/yang/module3.yang-ae5da295-ccfb-3781-85ad-38e8a399fe3f
+Content-Type: q7/binary
+Entry-Name: contents/module3/target/generated-sources/yang/META-INF/yang/module3.yang
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnRdkLtuwzAMRefmKwjtsY0G6HNJUHTI
+kK0/IMh0wsKkBIkN8kD+PZZqt0E4iLjC1eGl2Lc/PQKXtoDzDIYSy5iCdQhmpxre6to6xgoPlkOPlfNc
+p2NSZPNe/CFiRwcwvBgvyuHj1gqdrJIXMKuPzSesxVWjxXlR6xTMt8flPf4W02JykUKmFJ3LfO2mzND5
+CChKSpiAMoGzlC3oYCpjf8NWt9SIe0o52GPTPM+bp3nzOi5/NxPMWga27f+eTJzLP02PAVvsSufpFx+y
+AhJ9mfyXK1BLBwjQRR/60QAAAG4BAABQSwECFAAUAAgICAAAACEA0EUf+tEAAABuAQAACAAAAAAAAAAA
+AAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAABwEAAAAA
+------=_contents/module3/target/generated-sources/yang/META-INF/yang/module3.yang-ae5da295-ccfb-3781-85ad-38e8a399fe3f--
+------=_contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/$YangModuleInfoImpl.java-eff42eed-ef59-3879-a724-67ab09ef11a0
+Content-Type: q7/binary
+Entry-Name: contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/$YangModuleInfoImpl.java
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTNVdFO2zAUfUfiH66iSaQCnIwHEOuY
+xhCT8kCZKC/TtAc3uaQejh3FTqFC/ffZcdImIQXG06JIcWzf4+tzzrVzGt/TFEEWKZE5ioQuOUvnmiyp
+SEmKgiw+krnWOaFxhgQfaZZzJLHMiFoqjRkpcBGehMfhKYx3d1iWy0IPo2kpuXK4MyYSZr4/zc+VTEqO
+kbiTm/g/dEFJqRknU9RD3ReSc4w1k0L1hpkkkchLPdUF0mxg8PryMcbchprBvJxxFsMdE5RDzKlS8KGb
+VGT2C8xuOkOhFXRH4Wl3Z3cHzJMXbEE1gtJUrxF7k6PJ9PZ8cnEJZyDwYWglfzTuAzoksx1DGAiaoYn2
+sirqyBu/MlflNK4CrISfgqAvYuBEfBHHCMyUocvCHIXhyWF4fBievhKiZFnE+IPquQ0Lri5vzw+jyffA
+yh/U2VdeaHAG0VB/7nL0BZycmLg+taHLKVnT3yM+RR0JMyRi9EdWM6ifAnVZiLUwdS6rvgaDSrVxelmZ
+PbccSjDL9dJsplK3CWm51GRdfc6GFiKVLU0p6pua1XPlwvw2zW1odgd+A2msVnLeSdY+el7Ih8qFkckz
+pXxqiMN1afhesxjsebDfFXQfvD1gCjKmlFHbay+92jR1seyv6pIyO5IKO2SsIKY6noPfKk/ATtZBAOuc
+ONL7A5iV2uwDC7TJCKnn1noPaKAEJPJZTqu20b5eL7AoWIId99T2NVxPTPEMWsVW1fgdgDd1FQ2CNiX2
+HuBJU+Zb061G3w7dNqbBd26cVsTXvhs5+yhoq/X0H1r7esjQQ35+g51rQlVzr7xVqIEzzB5H3QNjULvn
+R92/mUNL1+iCu75vJeMJFqBm9WXU6fZNLVW6XFiB/FHVpEIKFlPuSqPNkpoRmtvr3vd+eVsGmpvLsG2b
+W2YddG+tenL1vzWifT9V0rrfF+Z3L6eeHbbGOTlUHdITZ0vU7w4djYVmZCPNRlXz/gVQSwcIuIofQNwC
+AACOCQAAUEsBAhQAFAAICAgAAAAhALiKH0DcAgAAjgkAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50
+UEsFBgAAAAABAAEANgAAABIDAAAAAA==
+------=_contents/module2/target/generated-sources/sal/org/opendaylight/yang/gen/v1/http/acme/example/com/system/rev070609/$YangModuleInfoImpl.java-eff42eed-ef59-3879-a724-67ab09ef11a0--
diff --git a/tests/com.cisco.yangide.ext.refactoring.test/Contexts/UpdateMavenProjects.ctx b/tests/com.cisco.yangide.ext.refactoring.test/Contexts/UpdateMavenProjects.ctx
new file mode 100644 (file)
index 0000000..26d81f6
--- /dev/null
@@ -0,0 +1,21 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Context-Type: org.eclipse.rcptt.ctx.ecl
+Element-Name: UpdateMavenProjects
+Element-Type: context
+Element-Version: 2.0
+Id: _e7HegDJ-EeSzJ-2otsp1aw
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 9/2/14 4:16 PM
+
+------=_.ecl.context-718f04b4-ed39-33e3-af62-0995e4561998
+Content-Type: text/ecl
+Entry-Name: .ecl.context
+
+get-view "Package Explorer" | get-tree | select module1 | get-menu "Maven/Update Project..." | click
+with [get-window "Update Maven Project"] {
+    get-tree | select module1
+    get-button "Select All" | click
+    get-button OK | click
+}
+------=_.ecl.context-718f04b4-ed39-33e3-af62-0995e4561998--
diff --git a/tests/com.cisco.yangide.ext.refactoring.test/TestCases/AllTests.suite b/tests/com.cisco.yangide.ext.refactoring.test/TestCases/AllTests.suite
new file mode 100644 (file)
index 0000000..5d158d2
--- /dev/null
@@ -0,0 +1,22 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Element-Name: AllTests
+Element-Type: testsuite
+Element-Version: 2.0
+Id: _M6mk0DHNEeSMKNSnFXk2YA
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 9/3/14 12:51 PM
+
+------=_testcase-items-62c497da-4241-31f4-811a-6b453a3ecff8
+Content-Type: text/testcase
+Entry-Name: testcase-items
+
+_5BvP0DKDEeSzJ-2otsp1aw        // kind: 'test' name: 'ExtractGrouping' path: 'ExtractGrouping/ExtractGrouping.test'
+_VFRu4DKLEeSzJ-2otsp1aw        // kind: 'test' name: 'InlineGroupingIndirect' path: 'InlineGrouping/InlineGroupingIndirect.test'
+_4-KvsDKJEeSzJ-2otsp1aw        // kind: 'test' name: 'InlineGroupingDirect' path: 'InlineGrouping/InlineGroupingDirect.test'
+_MDlZEDHUEeSMKNSnFXk2YA        // kind: 'test' name: 'RenameType' path: 'Rename/RenameType.test'
+_7S3O0DKMEeSzJ-2otsp1aw        // kind: 'test' name: 'RenameGrouping' path: 'Rename/RenameGrouping.test'
+_IWCmsDKMEeSzJ-2otsp1aw        // kind: 'test' name: 'RenameModule' path: 'Rename/RenameModule.test'
+_YnEIsDKNEeSzJ-2otsp1aw        // kind: 'test' name: 'ChangeRevision' path: 'ChangeRevision/ChangeRevision.test'
+
+------=_testcase-items-62c497da-4241-31f4-811a-6b453a3ecff8--
diff --git a/tests/com.cisco.yangide.ext.refactoring.test/TestCases/ChangeRevision/ChangeRevision.test b/tests/com.cisco.yangide.ext.refactoring.test/TestCases/ChangeRevision/ChangeRevision.test
new file mode 100644 (file)
index 0000000..03905d7
--- /dev/null
@@ -0,0 +1,154 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Element-Name: ChangeRevision
+Element-Type: testcase
+Element-Version: 3.0
+External-Reference: 
+Id: _YnEIsDKNEeSzJ-2otsp1aw
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 9/2/14 5:49 PM
+Testcase-Type: ecl
+
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac
+Content-Type: text/ecl
+Entry-Name: .content
+
+get-view "Package Explorer" | get-tree | select "module2/src\\/main\\/yang/module2.yang" | double-click
+with [get-editor "module2.yang" | get-text-viewer] {
+    set-caret-pos 12 29
+    get-menu "Refactor/Change Revision..." | click
+}
+with [get-window Refactoring] {
+    get-editbox -after [get-label "Revision:"] | get-property text | is-empty | verify-false
+    get-button | get-property enablement | equals true | verify-true
+    get-editbox -after [get-label "Description:"] | get-property text | equals "" | verify-true
+    get-button "Create a new file" | get-property selected | equals true | verify-true
+    with [get-table] {
+        get-property itemCount | equals 2 | verify-true
+        get-item "module1.yang" | get-property caption | equals "module1.yang" | verify-true
+        get-item "module1a.yang" | get-property caption | equals "module1a.yang" | verify-true
+    }
+}
+with [get-window Refactoring] {
+    get-button | click
+    with [get-window "Select date for revision"] {
+        get-date-time | set-value "2016/1/1 0:0:0"
+        get-button OK | click
+    }
+    get-editbox -after [get-label "Description:"] | set-text "The next version"
+    get-button "Create a new file" | uncheck
+    get-button "Select All" | click
+    get-button "Preview >" | click
+}
+with [get-window Refactoring | get-tree] {
+    get-property itemCount | equals 2 | verify-true
+    get-item "module2.yang - module2\\/src\\/main\\/yang" | get-property caption 
+        | equals "module2.yang - module2/src/main/yang" | verify-true
+}
+get-window Refactoring | get-tree | select "Update References"
+with [get-window Refactoring | get-tree] {
+    get-item "Update References" | get-property childCount | equals 2 | verify-true
+    get-item "Update References/module1.yang - module1\\/src\\/main\\/yang" | get-property caption 
+        | equals "module1.yang - module1/src/main/yang" | verify-true
+    get-item "Update References/module1a.yang - module1\\/src\\/main\\/yang" | get-property caption 
+        | equals "module1a.yang - module1/src/main/yang" | verify-true
+}
+get-window Refactoring | get-tree | select "module2.yang - module2\\/src\\/main\\/yang"
+with [get-window Refactoring] {
+    get-text-viewer -after [get-label "Refactored Source"] -index 1 | get-property text | equals "module module2 {\n"
+        + "    namespace \"http://acme.example.com/system\";\n"
+        + "    prefix \"m2\";\n"
+        + "    \n"
+        + "    organization \"ACME Inc.\";\n"
+        + "    contact \"joe@acme.example.com\";\n"
+        + "    \n"
+        + "    description\n"
+        + "        \"The module for entities implementing the ACME system.\";\n"
+        + "    \n"
+        + "    revision \"2016-01-01\" {\n"
+        + "        description \"The next version\";\n"
+        + "    }\n"
+        + "    \n"
+        + "    typedef typem2 {\n"
+        + "            type string;\n"
+        + "    }\n"
+        + "}" | verify-true
+}
+get-window Refactoring | get-tree | select "Update References/module1.yang - module1\\/src\\/main\\/yang"
+get-window Refactoring | get-text-viewer -after [get-label "Refactored Source"] -index 1 | get-property text 
+    | equals "// Contents of \"acme-system.yang\"\n"
+    + "module module1 {\n"
+    + "    namespace \"http://acme.example.com/system\";\n"
+    + "    prefix \"m1\";\n"
+    + "    \n"
+    + "    import module2 { prefix m2; revision-date \"2016-01-01\"; }\n"
+    + "    import module3 { prefix m3; }\n"
+    + "    import module1a { prefix m1a; }\n"
+    + "    \n"
+    + "    organization \"ACME Inc.\";\n"
+    + "    contact \"joe@acme.example.com\";\n"
+    + "    \n"
+    + "    description\n"
+    + "        \"The module for entities implementing the ACME system.\";\n"
+    + "    \n"
+    + "    revision 2007-06-09 {\n"
+    + "        description \"Initial revision.\";\n"
+    + "    }\n"
+    + "    \n"
+    + "    container system {\n"
+    + "        leaf host-name {\n"
+    + "            type m2:typem2;\n"
+    + "            description \"Hostname for this system\";\n"
+    + "        }\n"
+    + "    \n"
+    + "        leaf-list domain-search {\n"
+    + "            type m3:typem3;\n"
+    + "            description \"List of domain names to search\";\n"
+    + "        }\n"
+    + "    \n"
+    + "        container login {\n"
+    + "            leaf message {\n"
+    + "                type string;\n"
+    + "                description\n"
+    + "                    \"Message given at start of login session\";\n"
+    + "            }\n"
+    + "    \n"
+    + "            list user {\n"
+    + "                key \"name\";\n"
+    + "                leaf name {\n"
+    + "                    type string;\n"
+    + "                }\n"
+    + "    \n"
+    + "                leaf full-name {\n"
+    + "                    type string;\n"
+    + "                }\n"
+    + "                \n"
+    + "                leaf class {\n"
+    + "                    type string;\n"
+    + "                }\n"
+    + "            }\n"
+    + "        }\n"
+    + "    }\n"
+    + "}" | verify-true
+get-window Refactoring | get-tree | select "Update References/module1a.yang - module1\\/src\\/main\\/yang"
+get-window Refactoring | get-text-viewer -after [get-label "Refactored Source"] -index 1 | get-property text 
+    | equals "module module1a {\n"
+    + "    namespace \"http://acme.example.com/system\";\n"
+    + "    prefix \"m1a\";\n\n"
+    + "    import module2 { prefix module2; revision-date \"2016-01-01\"; }\n"
+    + "    organization \"ACME Inc.\";\n"
+    + "    contact \"joe@acme.example.com\";\n\n"
+    + "    description\n"
+    + "        \"The module for entities implementing the ACME system.\";\n\n"
+    + "    revision 2007-06-09 {\n"
+    + "        description \"Initial revision.\";\n"
+    + "    }\n\n"
+    + "    container system {\n"
+    + "        leaf host-name {\n"
+    + "            type module2:typem2;\n"
+    + "            description \"Hostname for this system\";\n"
+    + "        }\n"
+    + "    }\n"
+    + "}" | verify-true
+get-window Refactoring | get-button Cancel | click
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac--
diff --git a/tests/com.cisco.yangide.ext.refactoring.test/TestCases/ExtractGrouping/ExtractGrouping.test b/tests/com.cisco.yangide.ext.refactoring.test/TestCases/ExtractGrouping/ExtractGrouping.test
new file mode 100644 (file)
index 0000000..85bb65b
--- /dev/null
@@ -0,0 +1,169 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Element-Name: ExtractGrouping
+Element-Type: testcase
+Element-Version: 3.0
+External-Reference: 
+Id: _5BvP0DKDEeSzJ-2otsp1aw
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 9/2/14 4:49 PM
+Testcase-Type: ecl
+
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac
+Content-Type: text/ecl
+Entry-Name: .content
+
+with [get-editor "module1.yang" | get-text-viewer] {
+    set-caret-pos 33 8
+    select-range 33 7 35 25
+       
+       verify-error {get-menu "Refactor/Extract Grouping..."}
+}
+
+with [get-editor "module1.yang" | get-text-viewer] {
+    set-caret-pos 35 10
+    select-range 34 9 45 14
+
+       verify-error {get-menu "Refactor/Extract Grouping..."}
+}
+
+with [get-editor "module1.yang" | get-text-viewer] {
+    set-caret-pos 33 13
+    select-range 32 13 37 5
+
+       get-menu "Refactor/Extract Grouping..." | get-property enablement | equals true | verify-true
+}
+
+with [get-editor "module1.yang" | get-text-viewer] {
+    set-caret-pos 32 10
+    select-range 32 9 51 14
+
+       get-menu "Refactor/Extract Grouping..." | get-property enablement | equals true | verify-true
+       
+       get-menu "Refactor/Extract Grouping..." | click
+}
+
+get-window Refactoring | get-editbox -after [get-label "Grouping name:"] | get-property text | equals extracted 
+    | verify-true
+    
+with [get-window Refactoring] {
+    get-editbox -after [get-label "Grouping name:"] | set-text "new-group"
+    get-button "Preview >" | click
+
+    with [get-tree] {
+        get-item "module1.yang - module1\\/src\\/main\\/yang" | get-property caption 
+            | equals "module1.yang - module1/src/main/yang" | verify-true
+        get-property itemCount | equals 1 | verify-true
+    }
+
+    get-text-viewer | get-property text | equals "// Contents of \"acme-system.yang\"\n"
+        + "module module1 {\n"
+        + "    namespace \"http://acme.example.com/system\";\n"
+        + "    prefix \"m1\";\n"
+        + "    \n"
+        + "    import module2 { prefix m2; }\n"
+        + "    import module3 { prefix m3; }\n"
+        + "    import module1a { prefix m1a; }\n"
+        + "    \n"
+        + "    organization \"ACME Inc.\";\n"
+        + "    contact \"joe@acme.example.com\";\n"
+        + "    \n"
+        + "    description\n"
+        + "        \"The module for entities implementing the ACME system.\";\n"
+        + "    \n"
+        + "    revision 2007-06-09 {\n"
+        + "        description \"Initial revision.\";\n"
+        + "    }\n"
+        + "    \n"
+        + "    container system {\n"
+        + "        leaf host-name {\n"
+        + "            type m2:typem2;\n"
+        + "            description \"Hostname for this system\";\n"
+        + "        }\n"
+        + "    \n"
+        + "        leaf-list domain-search {\n"
+        + "            type m3:typem3;\n"
+        + "            description \"List of domain names to search\";\n"
+        + "        }\n"
+        + "    \n"
+        + "        container login {\n"
+        + "            leaf message {\n"
+        + "                type string;\n"
+        + "                description\n"
+        + "                    \"Message given at start of login session\";\n"
+        + "            }\n"
+        + "    \n"
+        + "            list user {\n"
+        + "                key \"name\";\n"
+        + "                leaf name {\n"
+        + "                    type string;\n"
+        + "                }\n"
+        + "    \n"
+        + "                leaf full-name {\n"
+        + "                    type string;\n"
+        + "                }\n"
+        + "                \n"
+        + "                leaf class {\n"
+        + "                    type string;\n"
+        + "                }\n"
+        + "            }\n"
+        + "        }\n"
+        + "    }\n"
+        + "}" | verify-true
+    get-text-viewer -after [get-label "Refactored Source"] -index 1 | get-property text 
+        | equals "// Contents of \"acme-system.yang\"\n"
+        + "module module1 {\n"
+        + "    namespace \"http://acme.example.com/system\";\n"
+        + "    prefix \"m1\";\n"
+        + "    \n"
+        + "    import module2 { prefix m2; }\n"
+        + "    import module3 { prefix m3; }\n"
+        + "    import module1a { prefix m1a; }\n"
+        + "    \n"
+        + "    organization \"ACME Inc.\";\n"
+        + "    contact \"joe@acme.example.com\";\n"
+        + "    \n"
+        + "    description\n"
+        + "        \"The module for entities implementing the ACME system.\";\n"
+        + "    \n"
+        + "    revision 2007-06-09 {\n"
+        + "        description \"Initial revision.\";\n"
+        + "    }\n"
+        + "    \n"
+        + "    container system {\n"
+        + "        leaf host-name {\n"
+        + "            type m2:typem2;\n"
+        + "            description \"Hostname for this system\";\n"
+        + "        }\n"
+        + "    \n"
+        + "        leaf-list domain-search {\n"
+        + "            type m3:typem3;\n"
+        + "            description \"List of domain names to search\";\n"
+        + "        }\n"
+        + "    \n"
+        + "        container login {\n"
+        + "            uses new-group;\n\n"
+        + "        }\n"
+        + "    }\n"
+        + "    grouping new-group {\n"
+        + "        leaf message {\n"
+        + "            type string;\n"
+        + "            description\n"
+        + "                        \"Message given at start of login session\";\n"
+        + "        }\n\n"
+        + "        list user {\n"
+        + "            key \"name\";\n"
+        + "            leaf name {\n"
+        + "                type string;\n"
+        + "            }\n\n"
+        + "            leaf full-name {\n"
+        + "                type string;\n"
+        + "            }\n\n"
+        + "            leaf class {\n"
+        + "                type string;\n"
+        + "            }\n"
+        + "        }\n"
+        + "    }\n"
+        + "}" | verify-true
+}
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac--
diff --git a/tests/com.cisco.yangide.ext.refactoring.test/TestCases/InlineGrouping/InlineGroupingDirect.test b/tests/com.cisco.yangide.ext.refactoring.test/TestCases/InlineGrouping/InlineGroupingDirect.test
new file mode 100644 (file)
index 0000000..51b613c
--- /dev/null
@@ -0,0 +1,125 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Element-Name: InlineGroupingDirect
+Element-Type: testcase
+Element-Version: 3.0
+External-Reference: 
+Id: _4-KvsDKJEeSzJ-2otsp1aw
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 9/2/14 5:24 PM
+Testcase-Type: ecl
+
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac
+Content-Type: text/ecl
+Entry-Name: .content
+
+get-view "Package Explorer" | get-tree | select "module2/src\\/main\\/yang/group-test2.yang" | double-click
+with [get-editor "group-test2.yang" | get-text-viewer] {
+    set-caret-pos 10 15
+    get-menu "Refactor/Inline Grouping..." | click
+}
+with [get-window Refactoring] {
+    get-button "All references" | get-property selected | equals true | verify-true
+    get-button "Only the selected reference" | get-property enablement | equals false | verify-true
+    get-button "Delete grouping declaration" | get-property selected | equals false | verify-true
+}
+with [get-window Refactoring] {
+    get-button "Delete grouping declaration" | check
+    get-button "Preview >" | click
+}
+with [get-window Refactoring] {
+    with [get-tree] {
+        get-property itemCount | equals 2 | verify-true
+        get-item "group-test2.yang - module2\\/src\\/main\\/yang" | get-property caption 
+            | equals "group-test2.yang - module2/src/main/yang" | verify-true
+        get-item "group-test.yang - module1\\/src\\/main\\/yang" | get-property caption 
+            | equals "group-test.yang - module1/src/main/yang" | verify-true
+    }
+    get-text-viewer | get-property text | equals "// Contents of \"group-test2\"\n"
+        + "module group-test2 {\n"
+        + "    namespace \"urn:opendaylight:group-test2\";\n"
+        + "    prefix \"group-test2\";\n\n"
+        + "    revision 2014-09-02 {\n"
+        + "        description \"Initial revision\";\n"
+        + "    }\n\n"
+        + "    grouping gr1 {\n"
+        + "    \tcontainer container-gr {\n"
+        + "    \t\tleaf test {\n"
+        + "    \t\t\ttype string;\n"
+        + "    \t\t}\n"
+        + "    \t}\n"
+        + "    }\n"
+        + "    \n"
+        + "    rpc op {\n"
+        + "    \tinput {\n"
+        + "    \t\tuses gr1;\n"
+        + "    \t}\n"
+        + "    }\n"
+        + "}" | verify-true
+    get-text-viewer -after [get-label "Refactored Source"] -index 1 | get-property text 
+        | equals "// Contents of \"group-test2\"\n"
+        + "module group-test2 {\n"
+        + "    namespace \"urn:opendaylight:group-test2\";\n"
+        + "    prefix \"group-test2\";\n\n"
+        + "    revision 2014-09-02 {\n"
+        + "        description \"Initial revision\";\n"
+        + "    }\n\n"
+        + "    \n"
+        + "    \n"
+        + "    rpc op {\n"
+        + "    \tinput {\n"
+        + "    \t\t\n"
+        + "            container container-gr {\n"
+        + "                leaf test {\n"
+        + "                    type string;\n"
+        + "                }\n"
+        + "            }\n\n"
+        + "    \t}\n"
+        + "    }\n"
+        + "}" | verify-true
+}
+get-window Refactoring | get-tree | select "group-test.yang - module1\\/src\\/main\\/yang"
+with [get-window Refactoring] {
+    get-text-viewer | get-property text | equals "// Contents of \"group-test\"\n"
+        + "module group-test {\n"
+        + "    namespace \"urn:opendaylight:group-test\";\n"
+        + "    prefix \"group-test\";\n"
+        + "\t\n"
+        + "    import group-test2 { prefix group-test2; revision-date 2014-09-02; }\n"
+        + "\t\n"
+        + "    revision 2014-09-02 {\n"
+        + "        description \"Initial revision\";\n"
+        + "    }\n\n"
+        + "    container container1 {\n"
+        + "    \tleaf-list user {\n"
+        + "    \t\ttype string;\n"
+        + "    \t}\n"
+        + "    \tuses  group-test2:gr1;\n"
+        + "    }\n"
+        + "}" | verify-true
+    get-text-viewer -after [get-label "Refactored Source"] -index 1 | get-property text 
+        | equals "// Contents of \"group-test\"\n"
+        + "module group-test {\n"
+        + "    namespace \"urn:opendaylight:group-test\";\n"
+        + "    prefix \"group-test\";\n"
+        + "\t\n"
+        + "    import group-test2 { prefix group-test2; revision-date 2014-09-02; }\n"
+        + "\t\n"
+        + "    revision 2014-09-02 {\n"
+        + "        description \"Initial revision\";\n"
+        + "    }\n\n"
+        + "    container container1 {\n"
+        + "    \tleaf-list user {\n"
+        + "    \t\ttype string;\n"
+        + "    \t}\n"
+        + "    \t\n"
+        + "        container container-gr {\n"
+        + "            leaf test {\n"
+        + "                type string;\n"
+        + "            }\n"
+        + "        }\n\n"
+        + "    }\n"
+        + "}" | verify-true
+}
+get-window Refactoring | get-button Cancel | click
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac--
diff --git a/tests/com.cisco.yangide.ext.refactoring.test/TestCases/InlineGrouping/InlineGroupingIndirect.test b/tests/com.cisco.yangide.ext.refactoring.test/TestCases/InlineGrouping/InlineGroupingIndirect.test
new file mode 100644 (file)
index 0000000..4a502f1
--- /dev/null
@@ -0,0 +1,74 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Element-Name: InlineGroupingIndirect
+Element-Type: testcase
+Element-Version: 3.0
+External-Reference: 
+Id: _VFRu4DKLEeSzJ-2otsp1aw
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 9/2/14 5:26 PM
+Testcase-Type: ecl
+
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac
+Content-Type: text/ecl
+Entry-Name: .content
+
+get-view "Package Explorer" | get-tree | select "module1/src\\/main\\/yang/group-test.yang" | double-click
+with [get-editor "group-test.yang" | get-text-viewer] {
+    set-caret-pos 16 25
+    get-menu "Refactor/Inline Grouping..." | click
+}
+with [get-window Refactoring] {
+    get-button "Only the selected reference" | get-property selected | equals true | verify-true
+    get-button "Delete grouping declaration" | get-property enablement | equals false | verify-true
+}
+get-window Refactoring | get-button "Preview >" | click
+with [get-window Refactoring] {
+    with [get-tree] {
+        get-property itemCount | equals 1 | verify-true
+        get-item "group-test.yang - module1\\/src\\/main\\/yang" | get-property caption 
+            | equals "group-test.yang - module1/src/main/yang" | verify-true
+    }
+    get-text-viewer | get-property text | equals "// Contents of \"group-test\"\n"
+        + "module group-test {\n"
+        + "    namespace \"urn:opendaylight:group-test\";\n"
+        + "    prefix \"group-test\";\n"
+        + "\t\n"
+        + "    import group-test2 { prefix group-test2; revision-date 2014-09-02; }\n"
+        + "\t\n"
+        + "    revision 2014-09-02 {\n"
+        + "        description \"Initial revision\";\n"
+        + "    }\n\n"
+        + "    container container1 {\n"
+        + "    \tleaf-list user {\n"
+        + "    \t\ttype string;\n"
+        + "    \t}\n"
+        + "    \tuses  group-test2:gr1;\n"
+        + "    }\n"
+        + "}" | verify-true
+    get-text-viewer -after [get-label "Refactored Source"] -index 1 | get-property text 
+        | equals "// Contents of \"group-test\"\n"
+        + "module group-test {\n"
+        + "    namespace \"urn:opendaylight:group-test\";\n"
+        + "    prefix \"group-test\";\n"
+        + "\t\n"
+        + "    import group-test2 { prefix group-test2; revision-date 2014-09-02; }\n"
+        + "\t\n"
+        + "    revision 2014-09-02 {\n"
+        + "        description \"Initial revision\";\n"
+        + "    }\n\n"
+        + "    container container1 {\n"
+        + "    \tleaf-list user {\n"
+        + "    \t\ttype string;\n"
+        + "    \t}\n"
+        + "    \t\n"
+        + "        container container-gr {\n"
+        + "            leaf test {\n"
+        + "                type string;\n"
+        + "            }\n"
+        + "        }\n\n"
+        + "    }\n"
+        + "}" | verify-true
+}
+get-window Refactoring | get-button Cancel | click
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac--
diff --git a/tests/com.cisco.yangide.ext.refactoring.test/TestCases/Rename/RenameGrouping.test b/tests/com.cisco.yangide.ext.refactoring.test/TestCases/Rename/RenameGrouping.test
new file mode 100644 (file)
index 0000000..ae3cb21
--- /dev/null
@@ -0,0 +1,124 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Element-Name: RenameGrouping
+Element-Type: testcase
+Element-Version: 3.0
+External-Reference: 
+Id: _7S3O0DKMEeSzJ-2otsp1aw
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 9/2/14 5:38 PM
+Testcase-Type: ecl
+
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac
+Content-Type: text/ecl
+Entry-Name: .content
+
+get-view "Package Explorer" | get-tree | select "module2/src\\/main\\/yang/group-test2.yang" | double-click
+with [get-editor "group-test2.yang" | get-text-viewer] {
+    set-caret-pos 10 16
+    get-menu "Refactor/Rename..." | click
+    get-menu "Refactor/Rename..." | click
+}
+with [get-window Refactoring] {
+    get-editbox -after [get-label "New name:"] | get-property text | equals gr1 | verify-true
+    get-button "Preview >" | get-property enablement | equals false | verify-true
+}
+with [get-window Refactoring] {
+    get-editbox -after [get-label "New name:"] | set-text group2
+    get-button "Preview >" | click
+}
+with [get-window Refactoring] {
+    with [get-tree] {
+        get-property itemCount | equals 2 | verify-true
+        get-item "group-test2.yang - module2\\/src\\/main\\/yang" | get-property caption 
+            | equals "group-test2.yang - module2/src/main/yang" | verify-true
+        get-item "group-test.yang - module1\\/src\\/main\\/yang" | get-property caption 
+            | equals "group-test.yang - module1/src/main/yang" | verify-true
+    }
+    get-text-viewer | get-property text | equals "// Contents of \"group-test2\"\n"
+        + "module group-test2 {\n"
+        + "    namespace \"urn:opendaylight:group-test2\";\n"
+        + "    prefix \"group-test2\";\n\n"
+        + "    revision 2014-09-02 {\n"
+        + "        description \"Initial revision\";\n"
+        + "    }\n\n"
+        + "    grouping gr1 {\n"
+        + "    \tcontainer container-gr {\n"
+        + "    \t\tleaf test {\n"
+        + "    \t\t\ttype string;\n"
+        + "    \t\t}\n"
+        + "    \t}\n"
+        + "    }\n"
+        + "    \n"
+        + "    rpc op {\n"
+        + "    \tinput {\n"
+        + "    \t\tuses gr1;\n"
+        + "    \t}\n"
+        + "    }\n"
+        + "}" | verify-true
+    get-text-viewer -after [get-label "Refactored Source"] -index 1 | get-property text 
+        | equals "// Contents of \"group-test2\"\n"
+        + "module group-test2 {\n"
+        + "    namespace \"urn:opendaylight:group-test2\";\n"
+        + "    prefix \"group-test2\";\n\n"
+        + "    revision 2014-09-02 {\n"
+        + "        description \"Initial revision\";\n"
+        + "    }\n\n"
+        + "    grouping group2 {\n"
+        + "    \tcontainer container-gr {\n"
+        + "    \t\tleaf test {\n"
+        + "    \t\t\ttype string;\n"
+        + "    \t\t}\n"
+        + "    \t}\n"
+        + "    }\n"
+        + "    \n"
+        + "    rpc op {\n"
+        + "    \tinput {\n"
+        + "    \t\tuses group2;\n"
+        + "    \t}\n"
+        + "    }\n"
+        + "}" | verify-true
+}
+get-window Refactoring | get-tree | select "group-test.yang - module1\\/src\\/main\\/yang"
+with [get-window Refactoring] {
+    get-text-viewer | get-property text | equals "// Contents of \"group-test\"\n"
+        + "module group-test {\n"
+        + "    namespace \"urn:opendaylight:group-test\";\n"
+        + "    prefix \"group-test\";\n"
+        + "\t\n"
+        + "    import group-test2 { prefix group-test2; revision-date 2014-09-02; }\n"
+        + "\t\n"
+        + "    revision 2014-09-02 {\n"
+        + "        description \"Initial revision\";\n"
+        + "    }\n\n"
+        + "    container container1 {\n"
+        + "    \tleaf-list user {\n"
+        + "    \t\ttype string;\n"
+        + "    \t}\n"
+        + "    \tuses  group-test2:gr1;\n"
+        + "    }\n"
+        + "}" | verify-true
+    get-text-viewer -after [get-label "Refactored Source"] -index 1 | get-property text 
+        | equals "// Contents of \"group-test\"\n"
+        + "module group-test {\n"
+        + "    namespace \"urn:opendaylight:group-test\";\n"
+        + "    prefix \"group-test\";\n"
+        + "\t\n"
+        + "    import group-test2 { prefix group-test2; revision-date 2014-09-02; }\n"
+        + "\t\n"
+        + "    revision 2014-09-02 {\n"
+        + "        description \"Initial revision\";\n"
+        + "    }\n\n"
+        + "    container container1 {\n"
+        + "    \tleaf-list user {\n"
+        + "    \t\ttype string;\n"
+        + "    \t}\n"
+        + "    \tuses  group-test2:group2;\n"
+        + "    }\n"
+        + "}" | verify-true
+}
+with [get-window Refactoring] {
+    get-tree | select "group-test2.yang - module2\\/src\\/main\\/yang"
+    get-button Cancel | click
+}
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac--
diff --git a/tests/com.cisco.yangide.ext.refactoring.test/TestCases/Rename/RenameModule.test b/tests/com.cisco.yangide.ext.refactoring.test/TestCases/Rename/RenameModule.test
new file mode 100644 (file)
index 0000000..01e6a04
--- /dev/null
@@ -0,0 +1,230 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Element-Name: RenameModule
+Element-Type: testcase
+Element-Version: 3.0
+External-Reference: 
+Id: _IWCmsDKMEeSzJ-2otsp1aw
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 9/2/14 5:38 PM
+Testcase-Type: ecl
+
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac
+Content-Type: text/ecl
+Entry-Name: .content
+
+with [get-editor "module1.yang" | get-text-viewer] {
+    set-caret-pos 6 15
+    get-menu "Refactor/Rename..." | click
+}
+with [get-editor "module1.yang" | get-text-viewer] {
+    get-menu "Refactor/Rename..." | click
+}
+with [get-window Refactoring] {
+    get-editbox -after [get-label "New name:"] | get-property text | equals module2 | verify-true
+    get-button "Preview >" | get-property enablement | equals false | verify-true
+}
+with [get-window Refactoring] {
+    get-editbox -after [get-label "New name:"] | set-text "new-module"
+    get-button "Preview >" | click
+}
+with [get-window Refactoring] {
+    with [get-tree] {
+        get-property itemCount | equals 3 | verify-true
+        get-item "module2.yang - module2\\/src\\/main\\/yang" | get-property caption 
+            | equals "module2.yang - module2/src/main/yang" | verify-true
+        get-item "module1.yang - module1\\/src\\/main\\/yang" | get-property caption 
+            | equals "module1.yang - module1/src/main/yang" | verify-true
+        get-item "module1a.yang - module1\\/src\\/main\\/yang" | get-property caption 
+            | equals "module1a.yang - module1/src/main/yang" | verify-true
+    }
+    get-text-viewer | get-property text | equals "module module2 {\n"
+        + "    namespace \"http://acme.example.com/system\";\n"
+        + "    prefix \"m2\";\n"
+        + "    \n"
+        + "    organization \"ACME Inc.\";\n"
+        + "    contact \"joe@acme.example.com\";\n"
+        + "    \n"
+        + "    description\n"
+        + "        \"The module for entities implementing the ACME system.\";\n"
+        + "    \n"
+        + "    revision 2007-06-09 {\n"
+        + "        description \"Initial revision.\";\n"
+        + "    }\n"
+        + "    \n"
+        + "    typedef typem2 {\n"
+        + "    \ttype string;\n"
+        + "    }\n"
+        + "}" | verify-true
+    get-text-viewer -after [get-label "Refactored Source"] -index 1 | get-property text | equals "module new-module {\n"
+        + "    namespace \"http://acme.example.com/system\";\n"
+        + "    prefix \"m2\";\n"
+        + "    \n"
+        + "    organization \"ACME Inc.\";\n"
+        + "    contact \"joe@acme.example.com\";\n"
+        + "    \n"
+        + "    description\n"
+        + "        \"The module for entities implementing the ACME system.\";\n"
+        + "    \n"
+        + "    revision 2007-06-09 {\n"
+        + "        description \"Initial revision.\";\n"
+        + "    }\n"
+        + "    \n"
+        + "    typedef typem2 {\n"
+        + "    \ttype string;\n"
+        + "    }\n"
+        + "}" | verify-true
+}
+get-window Refactoring | get-tree | select "module1.yang - module1\\/src\\/main\\/yang"
+with [get-window Refactoring] {
+    get-text-viewer | get-property text | equals "// Contents of \"acme-system.yang\"\n"
+        + "module module1 {\n"
+        + "    namespace \"http://acme.example.com/system\";\n"
+        + "    prefix \"m1\";\n"
+        + "    \n"
+        + "    import module2 { prefix m2; }\n"
+        + "    import module3 { prefix m3; }\n"
+        + "    import module1a { prefix m1a; }\n"
+        + "    \n"
+        + "    organization \"ACME Inc.\";\n"
+        + "    contact \"joe@acme.example.com\";\n"
+        + "    \n"
+        + "    description\n"
+        + "        \"The module for entities implementing the ACME system.\";\n"
+        + "    \n"
+        + "    revision 2007-06-09 {\n"
+        + "        description \"Initial revision.\";\n"
+        + "    }\n"
+        + "    \n"
+        + "    container system {\n"
+        + "        leaf host-name {\n"
+        + "            type m2:typem2;\n"
+        + "            description \"Hostname for this system\";\n"
+        + "        }\n"
+        + "    \n"
+        + "        leaf-list domain-search {\n"
+        + "            type m3:typem3;\n"
+        + "            description \"List of domain names to search\";\n"
+        + "        }\n"
+        + "    \n"
+        + "        container login {\n"
+        + "            leaf message {\n"
+        + "                type string;\n"
+        + "                description\n"
+        + "                    \"Message given at start of login session\";\n"
+        + "            }\n"
+        + "    \n"
+        + "            list user {\n"
+        + "                key \"name\";\n"
+        + "                leaf name {\n"
+        + "                    type string;\n"
+        + "                }\n"
+        + "    \n"
+        + "                leaf full-name {\n"
+        + "                    type string;\n"
+        + "                }\n"
+        + "                \n"
+        + "                leaf class {\n"
+        + "                    type string;\n"
+        + "                }\n"
+        + "            }\n"
+        + "        }\n"
+        + "    }\n"
+        + "}" | verify-true
+    get-text-viewer -after [get-label "Refactored Source"] -index 1 | get-property text 
+        | equals "// Contents of \"acme-system.yang\"\n"
+        + "module module1 {\n"
+        + "    namespace \"http://acme.example.com/system\";\n"
+        + "    prefix \"m1\";\n"
+        + "    \n"
+        + "    import new-module { prefix m2; }\n"
+        + "    import module3 { prefix m3; }\n"
+        + "    import module1a { prefix m1a; }\n"
+        + "    \n"
+        + "    organization \"ACME Inc.\";\n"
+        + "    contact \"joe@acme.example.com\";\n"
+        + "    \n"
+        + "    description\n"
+        + "        \"The module for entities implementing the ACME system.\";\n"
+        + "    \n"
+        + "    revision 2007-06-09 {\n"
+        + "        description \"Initial revision.\";\n"
+        + "    }\n"
+        + "    \n"
+        + "    container system {\n"
+        + "        leaf host-name {\n"
+        + "            type m2:typem2;\n"
+        + "            description \"Hostname for this system\";\n"
+        + "        }\n"
+        + "    \n"
+        + "        leaf-list domain-search {\n"
+        + "            type m3:typem3;\n"
+        + "            description \"List of domain names to search\";\n"
+        + "        }\n"
+        + "    \n"
+        + "        container login {\n"
+        + "            leaf message {\n"
+        + "                type string;\n"
+        + "                description\n"
+        + "                    \"Message given at start of login session\";\n"
+        + "            }\n"
+        + "    \n"
+        + "            list user {\n"
+        + "                key \"name\";\n"
+        + "                leaf name {\n"
+        + "                    type string;\n"
+        + "                }\n"
+        + "    \n"
+        + "                leaf full-name {\n"
+        + "                    type string;\n"
+        + "                }\n"
+        + "                \n"
+        + "                leaf class {\n"
+        + "                    type string;\n"
+        + "                }\n"
+        + "            }\n"
+        + "        }\n"
+        + "    }\n"
+        + "}" | verify-true
+}
+get-window Refactoring | get-tree | select "module1a.yang - module1\\/src\\/main\\/yang"
+with [get-window Refactoring] {
+    get-text-viewer | get-property text | equals "module module1a {\n"
+        + "    namespace \"http://acme.example.com/system\";\n"
+        + "    prefix \"m1a\";\n\n"
+        + "    import module2 { prefix module2; }\n"
+        + "    organization \"ACME Inc.\";\n"
+        + "    contact \"joe@acme.example.com\";\n\n"
+        + "    description\n"
+        + "        \"The module for entities implementing the ACME system.\";\n\n"
+        + "    revision 2007-06-09 {\n"
+        + "        description \"Initial revision.\";\n"
+        + "    }\n\n"
+        + "    container system {\n"
+        + "        leaf host-name {\n"
+        + "            type module2:typem2;\n"
+        + "            description \"Hostname for this system\";\n"
+        + "        }\n"
+        + "    }\n"
+        + "}" | verify-true
+    get-text-viewer -after [get-label "Refactored Source"] -index 1 | get-property text | equals "module module1a {\n"
+        + "    namespace \"http://acme.example.com/system\";\n"
+        + "    prefix \"m1a\";\n\n"
+        + "    import new-module { prefix module2; }\n"
+        + "    organization \"ACME Inc.\";\n"
+        + "    contact \"joe@acme.example.com\";\n\n"
+        + "    description\n"
+        + "        \"The module for entities implementing the ACME system.\";\n\n"
+        + "    revision 2007-06-09 {\n"
+        + "        description \"Initial revision.\";\n"
+        + "    }\n\n"
+        + "    container system {\n"
+        + "        leaf host-name {\n"
+        + "            type module2:typem2;\n"
+        + "            description \"Hostname for this system\";\n"
+        + "        }\n"
+        + "    }\n"
+        + "}" | verify-true
+}
+get-window Refactoring | get-button Cancel | click
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac--
diff --git a/tests/com.cisco.yangide.ext.refactoring.test/TestCases/Rename/RenameType.test b/tests/com.cisco.yangide.ext.refactoring.test/TestCases/Rename/RenameType.test
new file mode 100644 (file)
index 0000000..ff1a685
--- /dev/null
@@ -0,0 +1,237 @@
+--- RCPTT testcase ---
+Format-Version: 1.0
+Contexts: _e7HegDJ-EeSzJ-2otsp1aw
+Element-Name: RenameType
+Element-Type: testcase
+Element-Version: 3.0
+External-Reference: 
+Id: _MDlZEDHUEeSMKNSnFXk2YA
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 9/2/14 5:38 PM
+Testcase-Type: ecl
+
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac
+Content-Type: text/ecl
+Entry-Name: .content
+
+with [get-editor "module1.yang" | get-text-viewer] {
+    set-caret-pos 22 24
+    get-menu "Refactor/Rename..." | click
+    set-caret-pos 22 26
+    type-text 1
+}
+
+get-window -from "RenameInformationPopup.open()" | get-editbox | get-property text 
+    | equals "Enter new name, press Enter to refactor" | verify-true
+
+with [get-editor "module1.yang" | get-text-viewer] {
+    get-menu "Refactor/Rename..." | click
+}
+
+with [get-window Refactoring] {
+    get-editbox -after [get-label "New name:"] | set-text type22
+    get-button "Preview >" | click
+}
+
+get-window Refactoring | get-tree | select "module2.yang - module2\\/src\\/main\\/yang"
+with [get-window Refactoring | get-tree] {
+    get-property itemCount | equals 3 | verify-true
+    get-item "module2.yang - module2\\/src\\/main\\/yang" | get-property caption 
+        | equals "module2.yang - module2/src/main/yang" | verify-true
+    get-item "module1.yang - module1\\/src\\/main\\/yang" | get-property caption 
+        | equals "module1.yang - module1/src/main/yang" | verify-true
+    get-item "module1a.yang - module1\\/src\\/main\\/yang" | get-property caption 
+        | equals "module1a.yang - module1/src/main/yang" | verify-true
+}
+get-window Refactoring | get-tree | select "module2.yang - module2\\/src\\/main\\/yang"
+with [get-window Refactoring] {
+    get-text-viewer | get-property text | equals "module module2 {\n"
+        + "    namespace \"http://acme.example.com/system\";\n"
+        + "    prefix \"m2\";\n"
+        + "    \n"
+        + "    organization \"ACME Inc.\";\n"
+        + "    contact \"joe@acme.example.com\";\n"
+        + "    \n"
+        + "    description\n"
+        + "        \"The module for entities implementing the ACME system.\";\n"
+        + "    \n"
+        + "    revision 2007-06-09 {\n"
+        + "        description \"Initial revision.\";\n"
+        + "    }\n"
+        + "    \n"
+        + "    typedef typem2 {\n"
+        + "    \ttype string;\n"
+        + "    }\n"
+        + "}" | verify-true
+    get-text-viewer -after [get-label "Refactored Source"] -index 1 | get-property text | equals "module module2 {\n"
+        + "    namespace \"http://acme.example.com/system\";\n"
+        + "    prefix \"m2\";\n"
+        + "    \n"
+        + "    organization \"ACME Inc.\";\n"
+        + "    contact \"joe@acme.example.com\";\n"
+        + "    \n"
+        + "    description\n"
+        + "        \"The module for entities implementing the ACME system.\";\n"
+        + "    \n"
+        + "    revision 2007-06-09 {\n"
+        + "        description \"Initial revision.\";\n"
+        + "    }\n"
+        + "    \n"
+        + "    typedef type22 {\n"
+        + "    \ttype string;\n"
+        + "    }\n"
+        + "}" | verify-true
+}
+get-window Refactoring | get-tree | select "module1.yang - module1\\/src\\/main\\/yang"
+with [get-window Refactoring] {
+    get-text-viewer | get-property text | equals "// Contents of \"acme-system.yang\"\n"
+        + "module module1 {\n"
+        + "    namespace \"http://acme.example.com/system\";\n"
+        + "    prefix \"m1\";\n"
+        + "    \n"
+        + "    import module2 { prefix m2; }\n"
+        + "    import module3 { prefix m3; }\n"
+        + "    import module1a { prefix m1a; }\n"
+        + "    \n"
+        + "    organization \"ACME Inc.\";\n"
+        + "    contact \"joe@acme.example.com\";\n"
+        + "    \n"
+        + "    description\n"
+        + "        \"The module for entities implementing the ACME system.\";\n"
+        + "    \n"
+        + "    revision 2007-06-09 {\n"
+        + "        description \"Initial revision.\";\n"
+        + "    }\n"
+        + "    \n"
+        + "    container system {\n"
+        + "        leaf host-name {\n"
+        + "            type m2:typem2;\n"
+        + "            description \"Hostname for this system\";\n"
+        + "        }\n"
+        + "    \n"
+        + "        leaf-list domain-search {\n"
+        + "            type m3:typem3;\n"
+        + "            description \"List of domain names to search\";\n"
+        + "        }\n"
+        + "    \n"
+        + "        container login {\n"
+        + "            leaf message {\n"
+        + "                type string;\n"
+        + "                description\n"
+        + "                    \"Message given at start of login session\";\n"
+        + "            }\n"
+        + "    \n"
+        + "            list user {\n"
+        + "                key \"name\";\n"
+        + "                leaf name {\n"
+        + "                    type string;\n"
+        + "                }\n"
+        + "    \n"
+        + "                leaf full-name {\n"
+        + "                    type string;\n"
+        + "                }\n"
+        + "                \n"
+        + "                leaf class {\n"
+        + "                    type string;\n"
+        + "                }\n"
+        + "            }\n"
+        + "        }\n"
+        + "    }\n"
+        + "}" | verify-true
+    get-text-viewer -after [get-label "Refactored Source"] -index 1 | get-property text 
+        | equals "// Contents of \"acme-system.yang\"\n"
+        + "module module1 {\n"
+        + "    namespace \"http://acme.example.com/system\";\n"
+        + "    prefix \"m1\";\n"
+        + "    \n"
+        + "    import module2 { prefix m2; }\n"
+        + "    import module3 { prefix m3; }\n"
+        + "    import module1a { prefix m1a; }\n"
+        + "    \n"
+        + "    organization \"ACME Inc.\";\n"
+        + "    contact \"joe@acme.example.com\";\n"
+        + "    \n"
+        + "    description\n"
+        + "        \"The module for entities implementing the ACME system.\";\n"
+        + "    \n"
+        + "    revision 2007-06-09 {\n"
+        + "        description \"Initial revision.\";\n"
+        + "    }\n"
+        + "    \n"
+        + "    container system {\n"
+        + "        leaf host-name {\n"
+        + "            type m2:type22;\n"
+        + "            description \"Hostname for this system\";\n"
+        + "        }\n"
+        + "    \n"
+        + "        leaf-list domain-search {\n"
+        + "            type m3:typem3;\n"
+        + "            description \"List of domain names to search\";\n"
+        + "        }\n"
+        + "    \n"
+        + "        container login {\n"
+        + "            leaf message {\n"
+        + "                type string;\n"
+        + "                description\n"
+        + "                    \"Message given at start of login session\";\n"
+        + "            }\n"
+        + "    \n"
+        + "            list user {\n"
+        + "                key \"name\";\n"
+        + "                leaf name {\n"
+        + "                    type string;\n"
+        + "                }\n"
+        + "    \n"
+        + "                leaf full-name {\n"
+        + "                    type string;\n"
+        + "                }\n"
+        + "                \n"
+        + "                leaf class {\n"
+        + "                    type string;\n"
+        + "                }\n"
+        + "            }\n"
+        + "        }\n"
+        + "    }\n"
+        + "}" | verify-true
+}
+get-window Refactoring | get-tree | select "module1a.yang - module1\\/src\\/main\\/yang"
+with [get-window Refactoring] {
+    get-text-viewer | get-property text | equals "module module1a {\n"
+        + "    namespace \"http://acme.example.com/system\";\n"
+        + "    prefix \"m1a\";\n\n"
+        + "    import module2 { prefix module2; }\n"
+        + "    organization \"ACME Inc.\";\n"
+        + "    contact \"joe@acme.example.com\";\n\n"
+        + "    description\n"
+        + "        \"The module for entities implementing the ACME system.\";\n\n"
+        + "    revision 2007-06-09 {\n"
+        + "        description \"Initial revision.\";\n"
+        + "    }\n\n"
+        + "    container system {\n"
+        + "        leaf host-name {\n"
+        + "            type module2:typem2;\n"
+        + "            description \"Hostname for this system\";\n"
+        + "        }\n"
+        + "    }\n"
+        + "}" | verify-true
+    get-text-viewer -after [get-label "Refactored Source"] -index 1 | get-property text | equals "module module1a {\n"
+        + "    namespace \"http://acme.example.com/system\";\n"
+        + "    prefix \"m1a\";\n\n"
+        + "    import module2 { prefix module2; }\n"
+        + "    organization \"ACME Inc.\";\n"
+        + "    contact \"joe@acme.example.com\";\n\n"
+        + "    description\n"
+        + "        \"The module for entities implementing the ACME system.\";\n\n"
+        + "    revision 2007-06-09 {\n"
+        + "        description \"Initial revision.\";\n"
+        + "    }\n\n"
+        + "    container system {\n"
+        + "        leaf host-name {\n"
+        + "            type module2:type22;\n"
+        + "            description \"Hostname for this system\";\n"
+        + "        }\n"
+        + "    }\n"
+        + "}" | verify-true
+}
+get-window Refactoring | get-button Cancel | click
+------=_.content-0a7243a0-75d3-3d5f-9791-539de0e5b7ac--
diff --git a/tests/com.cisco.yangide.ext.refactoring.test/pom.xml b/tests/com.cisco.yangide.ext.refactoring.test/pom.xml
new file mode 100644 (file)
index 0000000..283243a
--- /dev/null
@@ -0,0 +1,102 @@
+<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">
+  <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+    <groupId>com.cisco.yangide.test</groupId>
+    <artifactId>com.cisco.yangide.test.parent</artifactId>
+    <version>1.1.0-SNAPSHOT</version>
+    <relativePath>..</relativePath>
+  </parent> 
+
+
+  <groupId>com.cisco.yangide.ext.test</groupId>
+  <artifactId>com.cisco.yangide.ext.refactoring.test</artifactId>
+  
+  <packaging>rcpttTest</packaging>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.eclipse.rcptt</groupId>
+        <artifactId>rcptt-maven-plugin</artifactId>
+        <version>2.0.0</version>
+        <extensions>true</extensions>
+        <configuration>
+          <suites>
+            <suite>AllTests</suite>
+          </suites>
+
+          <aut>
+            <groupId>org.eclipse</groupId>
+            <artifactId>sdk</artifactId>
+            <version>${eclipse-version}</version>
+            
+            <vmArgs> 
+              <vmArg>-Xmx1024m</vmArg>  
+              <vmArg>-XX:MaxPermSize=256m</vmArg> 
+            </vmArgs>
+
+            <injections>
+              <injection>
+                <site>${update.site.url}</site>
+                <features>
+                  <feature>com.cisco.yangide.feature.feature.group</feature>
+                  <feature>com.cisco.yangide.m2e.yang.feature.feature.group</feature>
+                  <feature>com.cisco.yangide.ext.feature.feature.group</feature>
+                </features>
+              </injection>
+
+              <injection>
+                <site>http://download.eclipse.org/releases/indigo/</site>
+                <features>
+                  <feature>org.eclipse.emf.feature.group</feature>
+                  <feature>org.eclipse.emf.ecore.feature.group</feature>
+                  <feature>org.eclipse.xsd.feature.group</feature>
+                  <feature>org.eclipse.gef.feature.group</feature>
+                  <feature>org.eclipse.equinox.p2.discovery.feature.feature.group</feature>
+                  <feature>org.eclipse.wst.xml_core.feature.feature.group</feature>
+                  <feature>org.eclipse.wst.common_core.feature.feature.group</feature>
+                </features>
+              </injection>
+
+              <injection>
+                <site>http://download.eclipse.org/webtools/repository/indigo/</site>
+                <features>
+                  <feature>org.eclipse.wst.common.fproj.feature.group</feature>
+                </features>
+              </injection>
+
+              <injection>
+                <site>http://download.eclipse.org/technology/m2e/releases/1.4/1.4.1.20140328-1905</site>
+                <features>
+                  <feature>org.eclipse.m2e.feature.feature.group</feature>
+                  <feature>org.eclipse.m2e.logback.feature.feature.group</feature>
+                </features>      
+              </injection>
+
+              <injection>
+                <site>https://repository.sonatype.org/content/repositories/forge-sites/m2e-extras/0.15.0/N/0.15.0.201206251206/</site>
+                <features>
+                  <feature>org.sonatype.m2e.buildhelper.feature.feature.group</feature>
+                </features>      
+              </injection>
+
+              <injection>
+                <site>http://download.eclipse.org/tools/orbit/downloads/drops/R20140525021250/repository/</site>
+                <features>
+                  <feature>org.slf4j.api</feature>
+                  <feature>ch.qos.logback.classic</feature>
+                  <feature>ch.qos.logback.core</feature>
+                </features>      
+              </injection>
+            </injections>
+          </aut>
+          <rcptt>
+            <version>${rcptt-version}</version>
+          </rcptt>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/tests/com.cisco.yangide.ext.refactoring.test/rcptt.properties b/tests/com.cisco.yangide.ext.refactoring.test/rcptt.properties
new file mode 100644 (file)
index 0000000..e8df0c6
--- /dev/null
@@ -0,0 +1,10 @@
+--- RCPTT project settings ---
+Format-Version: 1.0
+Contexts: _QEySUDJQEeSzJ-2otsp1aw,_OQXHUDJQEeSzJ-2otsp1aw,_IOJPATHIEeSMKNSnFXk2YA
+Element-Name: Project Settings
+Element-Type: projectMetadata
+Element-Version: 2.0
+Id: _C9xu0Av7EeSdascDp4ftXw
+Runtime-Version: 1.5.0.201406151150
+Save-Time: 9/2/14 4:16 PM
+
diff --git a/tests/pom.xml b/tests/pom.xml
new file mode 100644 (file)
index 0000000..cfd32cd
--- /dev/null
@@ -0,0 +1,38 @@
+<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">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>com.cisco.yangide.test</groupId>
+  <artifactId>com.cisco.yangide.test.parent</artifactId>
+  <version>1.1.0-SNAPSHOT</version>
+  <packaging>pom</packaging>
+  <properties>
+    <eclipse-version>3.7.2</eclipse-version>
+    <rcptt-version>2.0.0</rcptt-version>
+    <update.site.url>file://${project.basedir}/../../product/update-site/target/repository/</update.site.url>
+  </properties>
+  <modules>
+    <module>com.cisco.yangide.editor.test</module>
+    <module>com.cisco.yangide.ext.refactoring.test</module>
+  </modules>
+  <pluginRepositories>
+    <pluginRepository>
+      <id>rcptt-releases</id>
+      <name>RCPTT Maven repository</name>
+      <url>https://repo.eclipse.org/content/repositories/rcptt-releases/</url>
+    </pluginRepository>
+    <pluginRepository>
+      <id>rcptt-snapshots</id>
+      <name>RCPTT Maven Snapshots repository</name>
+      <snapshots>
+        <updatePolicy>always</updatePolicy>
+      </snapshots>
+      <url>https://repo.eclipse.org/content/repositories/rcptt-snapshots/</url>
+    </pluginRepository>
+  </pluginRepositories>
+  <repositories>
+    <repository>
+      <id>q7-releases</id>
+      <name>Xored Q7</name>
+      <url>http://maven.xored.com/nexus/content/repositories/q7-releases/</url>
+    </repository>
+  </repositories>
+</project>
\ No newline at end of file