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>
--- /dev/null
+**/target/
+/.settings/
+.classpath
+bin/
+libs/
+.options
\ No newline at end of file
--- /dev/null
+[gerrit]
+host=git.opendaylight.org
+port=29418
+project=yangide.git
+defaultbranch=master
--- /dev/null
+# 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)
--- /dev/null
+<?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 ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>"Contribution" 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>"Contributor" means any person or entity that distributes
+the Program.</p>
+
+<p>"Licensed Patents" 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>"Program" means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>"Recipient" 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
+("Commercial Contributor") hereby agrees to defend and
+indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses")
+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 "AS IS" 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>
--- /dev/null
+/target/
+/.settings/
+.classpath
--- /dev/null
+<?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>
--- /dev/null
+###############################################################################
+# Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# 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
--- /dev/null
+###############################################################################
+# Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# 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 ##########################################
--- /dev/null
+<?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>
--- /dev/null
+<?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 ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>"Contribution" 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>"Contributor" means any person or entity that distributes
+the Program.</p>
+
+<p>"Licensed Patents" 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>"Program" means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>"Recipient" 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
+("Commercial Contributor") hereby agrees to defend and
+indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses")
+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 "AS IS" 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>
--- /dev/null
+<?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>
--- /dev/null
+/target/
+/.settings/
+.classpath
\ No newline at end of file
--- /dev/null
+<?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>
--- /dev/null
+###############################################################################
+# Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# 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
--- /dev/null
+###############################################################################
+# Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# 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 ##########################################
--- /dev/null
+<?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>
--- /dev/null
+<?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 ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>"Contribution" 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>"Contributor" means any person or entity that distributes
+the Program.</p>
+
+<p>"Licensed Patents" 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>"Program" means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>"Recipient" 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
+("Commercial Contributor") hereby agrees to defend and
+indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses")
+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 "AS IS" 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>
--- /dev/null
+<?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>
--- /dev/null
+/bin/
+/target/
+/.settings/
+.classpath
\ No newline at end of file
--- /dev/null
+<?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>
--- /dev/null
+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.
--- /dev/null
+###############################################################################
+# Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# 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/
--- /dev/null
+<?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>
--- /dev/null
+<!--
+ Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+
+ This program and the accompanying materials are made available under the
+ 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>
--- /dev/null
+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]*";
+ }
+ }
+
+}
--- /dev/null
+<!--
+ Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+
+ This program and the accompanying materials are made available under the
+ 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>
--- /dev/null
+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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+}
--- /dev/null
+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
--- /dev/null
+// 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]*";
+ }
+ }
+
+}
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+// 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";
+ }
+}
--- /dev/null
+/target/
+/.settings/
+.classpath
\ No newline at end of file
--- /dev/null
+<?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>
--- /dev/null
+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
--- /dev/null
+###############################################################################
+# Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# 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
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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");
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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) {
+
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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 + "]";
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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$
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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));
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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";
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/bin/
+/target/
+/.settings/
+.classpath
\ No newline at end of file
--- /dev/null
+<?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>
--- /dev/null
+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
--- /dev/null
+###############################################################################
+# Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# 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 = .
--- /dev/null
+<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
+ <yang-version statement>
+ <namespace statement>
+ <prefix statement>
+
+ // linkage statements
+ <import statements>
+ <include statements>
+
+ // meta information
+ <organization statement>
+ <contact statement>
+ <description statement>
+ <reference statement>
+
+ // revision history
+ <revision statements>
+
+ // module definitions
+ <other statements>
+ }
+</pre>
\ No newline at end of file
--- /dev/null
+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
--- /dev/null
+Any binary data
--- /dev/null
+A set of bits or flags
--- /dev/null
+"true" or "false"
--- /dev/null
+64-bit signed decimal number
--- /dev/null
+A leaf that does not have any value
--- /dev/null
+Enumerated strings
--- /dev/null
+A reference to an abstract identity
--- /dev/null
+References a data tree node
--- /dev/null
+16-bit signed integer
--- /dev/null
+32-bit signed integer
--- /dev/null
+64-bit signed integer
--- /dev/null
+8-bit signed integer
--- /dev/null
+A reference to a leaf instance
--- /dev/null
+Human-readable string
--- /dev/null
+16-bit unsigned integer
--- /dev/null
+32-bit unsigned integer
--- /dev/null
+64-bit unsigned integer
--- /dev/null
+8-bit unsigned integer
--- /dev/null
+Choice of member types
--- /dev/null
+###############################################################################
+# Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# 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
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+/* 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
--- /dev/null
+/*
+ * 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
--- /dev/null
+/* 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;
+}
--- /dev/null
+<?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>
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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>/*</code> and <code>*/</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;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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$
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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$
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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";
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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() {
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+ }
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+ });
+ }
+
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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 == ':';
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+
+}
--- /dev/null
+###############################################################################
+# Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ // }
+ // };
+ // }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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');
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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 >=
+ * <code>position</code> and < <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 <=
+ * <code>position</code> and > <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> <= p < <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;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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()));
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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 });
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+
+}
--- /dev/null
+###############################################################################
+# Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+
+}
--- /dev/null
+<?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
--- /dev/null
+/target/
+/.settings/
+.classpath
\ No newline at end of file
--- /dev/null
+<?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>
--- /dev/null
+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
--- /dev/null
+###############################################################################
+# Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# 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/
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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 });
+ }
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
+ }
+ }
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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...";
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+ }
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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 });
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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";
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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";
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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";
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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";
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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()));
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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";
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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";
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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";
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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";
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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)));
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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));
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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 };
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+ }
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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$
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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 < 0 || index >= 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 < 0 || index >= 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: <index>: <highway.ToString()>
+ */
+ @Override
+ public String toString() {
+ return String.format("%d: %s", index, highway);
+ }
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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>
+ * line segment [point(-100, 100), point(100, 100)]<br>
+ * <b>createHorizontal(Integer.MIN_VALUE, 100, 200-Integer.MIN_VALUE)</b>:<br>
+ * line segment [point(-INFINITY, 200), point(100, 200)]<br>
+ * <b>createHorizontal(-200, 100, Integer.MAX_VALUE-(-200))</b>:<br>
+ * 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>
+ * line segment [point(-100, 100), point(-100, 300)]<br>
+ * <b>createVertical(100, Integer.MIN_VALUE, 200-Integer.MIN_VALUE)</b>:<br>
+ * line segment [point(100, -INFINITY), point(100, 200)]<br>
+ * <b>createVertical(-200, -100, Integer.MAX_VALUE-(-100))</b>:<br>
+ * 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);
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+ }
+
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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: "(<x>,<y>) <direction>"
+ */
+ @Override
+ public String toString() {
+ return String.format("(%d,%d) %s", point.x, point.y, direction);
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+
+}
--- /dev/null
+anyxml @name@;
\ No newline at end of file
--- /dev/null
+augment @name@ {
+ ext:augment-identifier "@name@";
+}
\ No newline at end of file
--- /dev/null
+case @name@ {
+}
\ No newline at end of file
--- /dev/null
+choice @name@ {
+ case case0 {
+ }
+}
\ No newline at end of file
--- /dev/null
+container @name@ {
+
+}
\ No newline at end of file
--- /dev/null
+deviation "/base:@name@" {
+ deviate not-supported;
+}
\ No newline at end of file
--- /dev/null
+extension @name@ {
+ description "";
+ argument "name";
+}
\ No newline at end of file
--- /dev/null
+feature @name@ {
+ description "";
+}
\ No newline at end of file
--- /dev/null
+grouping @name@ {
+
+}
\ No newline at end of file
--- /dev/null
+identity @name@ {
+ description "";
+}
\ No newline at end of file
--- /dev/null
+input {
+}
\ No newline at end of file
--- /dev/null
+leaf-list @name@ {
+ type string;
+}
\ No newline at end of file
--- /dev/null
+leaf @name@ {
+ type string;
+}
\ No newline at end of file
--- /dev/null
+list @name@ {
+ key "name";
+}
\ No newline at end of file
--- /dev/null
+notification @name@ {
+
+}
\ No newline at end of file
--- /dev/null
+output {
+}
\ No newline at end of file
--- /dev/null
+rpc @name@ {
+ input {
+ }
+
+ output {
+ }
+}
\ No newline at end of file
--- /dev/null
+submodule @name@ {
+
+}
\ No newline at end of file
--- /dev/null
+typedef @name@ {
+ type string;
+ description "Type description";
+}
\ No newline at end of file
--- /dev/null
+uses @name@;
\ No newline at end of file
--- /dev/null
+/target/
+/.settings/
+.classpath
\ No newline at end of file
--- /dev/null
+<?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>
--- /dev/null
+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
--- /dev/null
+###############################################################################
+# Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# 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/
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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.

This program and the accompanying materials are made available under the
terms of the Eclipse Public License v1.0 which accompanies this distribution,
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>
--- /dev/null
+<?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>
--- /dev/null
+###############################################################################
+# Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# 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
--- /dev/null
+<?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
--- /dev/null
+<?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>
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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();
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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();
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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);
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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();
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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();
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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();
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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);
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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();
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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();
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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();
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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();
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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();
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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);
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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);
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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();
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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();
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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();
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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();
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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);
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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();
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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);
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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);
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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();
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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);
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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();
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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);
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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();
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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);
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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);
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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);
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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);
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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();
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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();
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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);
+}
--- /dev/null
+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
--- /dev/null
+/target/
+/.settings/
+.classpath
\ No newline at end of file
--- /dev/null
+<?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>
--- /dev/null
+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
--- /dev/null
+###############################################################################
+# Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# 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/
+
--- /dev/null
+###############################################################################
+# Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# 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
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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));
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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
+ }
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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.");
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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.");
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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()]);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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));
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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));
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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() {
+ }
+}
--- /dev/null
+###############################################################################
+# Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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()));
+ }
+
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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) {
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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()));
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/target/
+/.settings/
+.classpath
\ No newline at end of file
--- /dev/null
+<?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>
--- /dev/null
+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.
--- /dev/null
+###############################################################################
+# Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# 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/,\
+ .
--- /dev/null
+org.eclipse.m2e.core/eclipse.m2.updateIndexes=false
--- /dev/null
+<?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>
--- /dev/null
+<!--
+ Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+
+ This program and the accompanying materials are made available under the
+ 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>
--- /dev/null
+ 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]*";
+ }
+ }
+
+}
--- /dev/null
+<!--
+ Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+
+ This program and the accompanying materials are made available under the
+ 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>
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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));
+ }
+}
--- /dev/null
+/bin/
+/target/
+/.settings/
+.classpath
\ No newline at end of file
--- /dev/null
+<?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>
--- /dev/null
+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
--- /dev/null
+###############################################################################
+# Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# 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
--- /dev/null
+<?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
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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());
+ }
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+ }
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/bin/
+/target/
+/.settings/
+.classpath
\ No newline at end of file
--- /dev/null
+<?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>
--- /dev/null
+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
--- /dev/null
+###############################################################################
+# Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# 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/
--- /dev/null
+###############################################################################
+# Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# 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
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+// 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
--- /dev/null
+// Contents of "%MODULE%"
+module %MODULE% {
+ namespace "%NAMESPACE%";
+ prefix "%PREFIX%";
+
+ revision %REVISION% {
+ description "%REVISION_DESC%";
+ }
+
+}
\ No newline at end of file
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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$
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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";
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+ });
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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() {
+ }
+}
--- /dev/null
+###############################################################################
+# Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+#
+# This program and the accompanying materials are made available under the
+# 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
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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";
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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";
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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"));
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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();
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2014, 2015 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse 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;
+ }
+}
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?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
--- /dev/null
+<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
--- /dev/null
+<?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>
--- /dev/null
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
--- /dev/null
+<?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>
--- /dev/null
+<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
--- /dev/null
+<?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>
--- /dev/null
+<?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>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>yang-ide</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ </buildSpec>
+ <natures>
+ </natures>
+</projectDescription>
--- /dev/null
+/target/
+/.settings/
+.classpath
\ No newline at end of file
--- /dev/null
+<?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>
--- /dev/null
+<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
--- /dev/null
+// 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
--- /dev/null
+/target/
+/.settings/
+.classpath
\ No newline at end of file
--- /dev/null
+<?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>
--- /dev/null
+<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
--- /dev/null
+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";
+ }
+}
--- /dev/null
+/target/
+/.settings/
+.classpath
\ No newline at end of file
--- /dev/null
+<?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>
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTtWntv1EYQ/x+J77A5qcIXgpNreB6X
+g0DTNioUiVAqlSK059u7M9hed71OSCu+e2fX9nlf9tnAgVqxoDzsndmZ3zx3LikO3uElQZQtfZqSZI4v
+o3C54v4lTpb+kiT++cjPWaK/jAknzM845mHGwyDzGTkfHY5g3b96JYxTynhPjouIXvic4STDAQ9pUnE8
+OPRf1E9P5zX/gMb+ktJlRHz4MQaSgEYRCbj/HA4i9ca3+Bz7OQ8j/3GxARhlrtdPcbpBfE5plBWKzMJk
+HsL3HzDHz2Zvga2L5c84W21muwFnfpmSEuKDe6O7LvTT6NJ/Kh6fwdOsC0incZxzPIvIE2BiiB5jvvIf
+hcvThJMlYS7FdKquYB3ny5gkQnCaALX4t7+7e/UK2kVP6TyPCEpwTMbygVgqzxtS7Ru12nLXWbAiMUYp
+SFyTvfIAybFKPJbE45r4AcAZZiDG0fcHo8MboxH8Hy4Jv4GjyDppv/EFzXma89fi5P2rV9J8FoUBCiKc
+Zegnwo+jaG2UguCZ3P8oD6M5YegfAYAQOGXhOeYEaa6O3nDD89WtUogACTtMpMNPaoNNpwbtG1aGhMpB
+ktZOAzSx6kH6ZnDiibR+JOz5WGg4eYDIew4YZ0i16+RzpRK/BcHpdO9rHIqwciY6Qgm5QGWIT6besEat
+cITNLuANhRMIkg+o+N6XwTbS7PEFZgRhtlxLJxZfhZmv+xVAALvgNK55rkRCKvUldHInSeOA5yJFNqhU
+u32tTx0XqjJ9FWnZgmY4Ix3wFduaAW5QoiJyaCFWuECe2ILCBGIgCQhdtGlzGqeRJqlYG/ajN6H4eoTa
+MCgYC0nu68ylSq2xJtlrW1QFPxgWK4qMWLtnhKNFSCLIWgtGY7QMz0mClozmKVQoYf5csPTRSxyF8/Xv
+KMzWaCGAiyby2wKqKb0QhNL/xtUpaJJH0/qXKJxuy6cn+8D8E07qkRGMo/YVFddPH6aY4VjAVmNKZXtU
+b+ErRi8ydAqNyBJHxyXCJ+8Dkkpbg3sWVlHBT0rEz6VZJDIFR1F4lag8p/C6MPCPYF+v7s+s6J9Bg0Iw
+nJdJW4Mg4GYLHGnuKGJFaKOEyrZMacWYI7K9rSXHoYCnJWlIMFSkOMuJHXOfBbMeTtkAmplG++LWR4IK
+uOYU3RO7nXqvQz0IHpkMm+LH0wkQGpD3Kfg/mZdZa4xebcuJ9rZn6Nfoz2SArlvKzaCWXuBsjOClCHF9
+Q1tVKDOG3nTbdlQtwAgHHdyduavZsXpsI75cvLUu3GL88CxPU0ay7HfMEsiumTfIE7gEBe/IfDDUDp+c
+fM0GHZ0IZdWDPfMCcaI31C/AwTREZB4xNqAjaAXyyG5IOgTGQJUGSW6MLAgjoqgHOEkotGUE/frbkyc7
+A4fnKFbyToaa7CL+LVk/vnNEmemGupdCFcxtrORTtNMAUH0/RG8CCqmZ4RBq61HBTCjwUvxgJS6jTMrL
+pqNQirWgDHnWbRQxNHZeSL2hJWSlCvNBRA4CZp4irHu/pNGFM/Krw46OX9XUKxk5T+vgZ2eciWkHoBFj
+7g1Ok6JpkTqP0XfZHqoysvjNH+wVJthzgjQ07fHB6Zfusif53re8V2zWk0vpmR8xVfAsN3Ttagzb7BKy
+F6NJ+DfUp7bLQhkZvpyuNPpNr7Orpc3C/PIgl/6zMjqPDJJZdZt3+JxY5Xsfz+dFeIAWNCNzr+bu/3Hy
+/Nme9Kv6oTcY3b158/admzcP7hzeObh369bo9ujWYGj5RLXc6q/Pl9+dUjZHhp37WmZLH3fhF9lOqYpW
+0bSznaMz7uzqfYUDo7VWsa86BrMK6NeYi2lC2HbS6iTst+rkHmq6yDuN2NWAqHR3R5MlwmzDYMITh9oV
+XB+/LsIER5sHvnIiIiYWRGjZurUeCitKmi73ZawKHcFpJTOZi5TEFjgwEr4C6peQqkj/emumwFVapzBL
+h2m6TdRpKq6SfZuM95mMq8htCsAOudkaotbFof8gtaGwbBimViu7CHmwKgaresrLoLdpaHUDMYU9GLuL
+uWsKqnyE6ZM45ZcAcHPbwQh+1/BOnjxqOFmsIhyAvX+ScHb5zceniFTeoJmXCHjO4Po39EOgw5xCI+gn
+gE6jYbpY9xvg0wxuURHhNBFOLmPwF3LpDeH6pNxWh/dLQPvFwJwscB5x1CP29JxmOcKGtlorVA+fnRPG
+wjmxSn2faZRYbRMpQ4Iux/cZWKnHW0Or5rM7DLDaZfzPz7XE6jXbEmub8y3DWIphe825SjZdbCgmTyuI
+pcd07mgoi9oj9kCvEIu0ezgyx+nwErxIhPARMl+uXxTku9WD68jzzMaggvwBOrDGVH4toglX6xFq/2Dw
+r199JHM9KencNUu1sZe2LZj2t101ECR/5TjKFO8vP2ejs7dOdxc5VUjseq+I5ZjdOQZ1wKQ1XEpmriml
+gxt4tQxdcMUdKaBfP/lE9puuhZSv5ERp8wflIJYZBNbEqxUTiZs4zuyOm0bGHbR1aPwBkUj8ccHC2zHC
+qfQYlwyfCrOEwhV37TgoFNsDQYl5HYH6xedQ350ZWvXXSLYGgN4uqwho/dMnQuBOHz37nzqZFUN8xGnx
+g12kzK3rO+l6SCyKddMub9A2BHpllecq6S5ClnH7E46NeaHNuGK75Nto+urURtsXxm6gXo+/U9GAeYM9
+ZKknmdiPTEpdqSMnG4PGSDMmwYY08j+BrdaoG2ZKYuoAWDMIbQA0K99BcUMKk0LNK7bGxm4tPcmPEbLG
+nskgvfb62tCvU0TDHxvAl38BUEsHCHrM7dEgCAAAaC8AAFBLAQIUABQACAgIAAAAIQB6zO3RIAgAAGgv
+AAAIAAAAAAAAAAAAAAAAAAAAAAAuY29udGVudFBLBQYAAAAAAQABADYAAABWCAAAAAA=
+------=_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
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTtHf1v2zb29wH9H9gAhzldosZtum5p
+krVNM1xw6zq0ux1wuyGQbdpRK0s+SU6bHfq/H0mJ4tejTNqSXWdRgaYR+fg++Pje4yP1OguHH8IJRmk2
+CdIZTkbhTRxNrorgJkwmwQQnwXU/mGeJ2jhLsyLIi7CI8iIa5kGGr/uP+4/6h0GSjnAwTJMED4s0k/uE
+yaiES+bTAc6CaTh7du+raErfoWE6DSZpOokp8HSaJuRHHJMxgreEDiw6boTO4GfS+4x3flf3fZGMfiE9
+f2YdX4ezf+AbQen78DoM5kUUB2clK1Ga5FDza1kQ4vXfw/zqtZuMLqbTeREOYvwToUsbaxoWV8HLaHKR
+FHiCs2UlGSXXOCHM35QyPPiu/70qlYvRskNPyTCxPAPFzQxXc3Xw/aMnwWiehVR6wavqHwswFWka5yXO
+QZSMIvLzVViEbwbvCaWdUWnXqF/IGsMFOPfqhK2Nopc3Bc79pfhiPpkSLeBzQP88fPDg3lfoAXqdjuYx
+Rkk4xUfsBX3kMfcppn1BA+v0bniFpyGaER0VUL/3CKtHMuwRhT0SsD8QHqOcEHHy6KD/eL//aL9/uEu5
+3a+5lTDtkxVdYi9X9D5Z0Q877P0H5eThva9m80EcDdEwDvMcOVqQl/MoHuEM/Y/KlgpjlkXXYYGRttbQ
+ZWIsPmv3RoOFLj8wqyVDVwqLLme15srNTHvQ5aBSIqWpNjToMsNDHF3jV1k607sxAQ4R1f5jZuCPBeDp
+qQp6mVUewIanIB3yaVQsg0iBXYipIus8y9JsSZZKWGeelkKlArty9WNG1i4DWY4zAe+K8c01zt7OkxVw
+yiO4Yj3Lhitg5NALsVHfzGzUWTpPCk9kKjCIi/tCdDkSXlHtQhb4MXM1MTXiZ9QOHf+A8KeCWNYcycb8
++IsOq05P97aKWhRKxKITlOCPqIrmjk97u2KeSgfh5xp6u9Q5UPDPqPy5ymAtRxwW7CjMJjXZ9Cmuojzg
+3oVIiLQTpEXld5iI1K7M14iOzAMB3WS/IXq/ld4CQIoPEFC/yq/tuEojayArXzdg0+F+Vd7b8Qkza+AU
+TXZw2WIaA8iN9iG4CTTAeQMAqho0AXmmvAcAuXETINzw1Z0/f3HLoLbNsN678bQKP47d0SDMsUJgNEY9
++pISRYJDYmxOiP2ax7HSS7BCYsfKwLlHnD11IPpwlFqU29tVu8rqIWjQImFCj3U4Cf4zwnGOm7hS5OCI
+mYIuxGy3gxzlYkPIezpaQt7d0xRyMF9bqKFzN4Y6Qi9rqGFdwhxqI3jbQw3exyByUB+LyGEM80EfvpRR
+lBBTlQxxOnZdpBfTmbngPWDRZUT/PkGuhqhESKmF1lljOMVQKV2AtVab0zJdQZ8H73CBxhGOSSg8ztIp
+mpAJS9AkS+ezKJlQyzynQwbotzCORvXvKMpriSIi0jRhP8Zk2tKPFJA5gyOOBR3P41PxSxydrifkOn5I
+UHWJl+uchuihxG799vksJGuRilDIN2XZONGluMrSjzm6iGM8CeMXlbTPPw3xjM07UedyhuSJSCrpX7Mp
+YiSWI9L8C/1Zuc/rlDSXk/0jmeueSAcaLnqQpjEOCb6czTshhKjcOIwV1aRri3IjLa31TKvFDQsP0ltT
+SL9L5WZzVYIw7q7WTpbpFw27zZ3c2mmzOmFBou6I106j3eMbcqyd96YECQQJpiQ3R2VDLGPIUolnNiVP
+S+BkEKsFT5si1xqlGQRLkdqmiAVDQkGoERaunc6G+JN5PtktFtkcwxub7h0kjz8sHlGKklsXYY2aywyM
+vz2ldV/0BVgisRGLe23hkbGn3sGfZmSK8agKUI/Q7+tRpL2uJvoP9J9kB31jMDqYF+hjmB8h0kijOXvK
+QN8MQLkVsouHtu/yjGS4IFzYTuBWyEbR07g67wIgFAd1EBJ+aCfHZNAo6pkeNFJ5vieCKGgU+fAPHEMc
+hRgRDzQecFi4eFgtSIHGhQ4HnenlHruBYOWAzp3ippHBsz9nmmXn3UC3cdrnjEB1tw0ogOM9ZyTCTTYg
+0E7yFg+u+zZobPDcDhq6TvIqDgAaUjqgMwZ7/m4+m2U4z/8VZgnZF+e9nXkyvMJkjY52dhWEx+dbeXaH
+zqmEZIp7+qHkuXpk9ivxAEZWWu/QkJhe6Cx3ZGoQGy3DY5xhmtMZhkmSFmiA0c///Omn+zuW1G01ub3z
+XYV2Gg4YtLaT1Ue56Zh033UdxnMMHDmYmWrW85nBD+3e2rkKpZh6Mw//Z2OgTMmvi2juQLlPtVEl8i7r
+oqx0yaWHtlHFky7roknx7pLFNemjC5m9Rfctq1e9QkF2D1kYsY2Qzgx9tFwdu0kBZOvoMya7vp5x1QJl
+6Ai6bdTbNQjj5GfURBaEqLwnEQj3ZzAqbdomgD+f1Vfar/L+gA0EYnMwfO+KjN7jI8KYhkVv5yIpE6eM
+5yP0NxK8820D/S3Y2SvFvgfJaFff7EhEG0dcWsrNWTMrnfS/L9Yz9A7oZPUh+Q3xwVmaRH+SDZSr+apW
+RMAu/Fn1x4cM/ij3e4MKDySIQbUoTzSQAb87Aqgefar2IByNykVCmEhzPJJWc/Dv87dv9ph6iZe9nf53
+h4ffPj08PHj6+OnB90+e9L/tP9nZNXSDPyD3NXr2EyTSvj5Ml2y/PdiOuVN3HVto74BLj3cGTzd4gJC8
+LJ6ewW/b5IGTaNg8oNdGjJ4PHfy5RVYPZL9ts2e/y9xqmFelLrbQ7gFXsO/sniXQk4W0TKRXH7d1FOqp
+k2iL9eRemwz2nOjgzy2yeyD7HYV7wNcO7cZ722v4oA9C7iyfLeJb2vQZVw26ivkWGD+o20ajvr+q+YP5
+7yru68wAmidLW2gDLV+p3ZlBSwCoC2qZIFC5zdRRIGhOqC0Y1HtuMiB0poU/t8gqWkXQUWBo+TC1Vduo
+HIpvr3U0v6e9s48W+2iKahkLqV2h7MhGQtNqs5Jm303aSQ9q+HP7LCUkhI5spfWD+latZX27Z3stpVoH
+4M5KWqykKqZlLKR0Z7sj66hPpc0yqv02aRUdKeHP7bOIugA6soZgsY92LKF2FXELDSFUo+TODup2EJKS
+lxk0vghp2wrC82gYQajbRmygFyH8uUUmEOa/bQvYUIGoHQNYX5mu71HbrjNKn/Ks5UYjmcLG28rbWULJ
+uGG9VTWVFOpNHVFuYM/m5g3sPWSrEACq0DLqg6qVB3wB4FEfhVZC6FFizDvjau2wcZSEsV9xQVaagZZL
+wFQSzmCiGKEkFH1RfOHqM8HFBWccj6jtzcbhUPNz0ox90eyUHvKZYr+lCar0pFQQx7qRCwCdK0ia41hq
+SZodgaqSQKfm+pLNANC3YE4olC+x3HB4gNi+yHKCAj6ycoLTvp1qhgG/iTJBGkoSyp3vyhJ+ARFAQ1lC
+ea58vJZnmGXUHqOPe/0x+rRag4w+jnXI6ANF2KvUI6MPXJNM57SpLlkTFS61yRgV6q8+NcpE/8V1ykRf
+31plAtK/XpmB1aNmmYnXp26ZgXmJ2mXGGEvWLzPG8axhJuCXqWMmoF1rmfEn/xgVw6vKRChBfx79acs+
+DWkRtIMjeMVDBcakev0Bns6KG2Iz7Bv/DIcfLG0Mc9+CmT6l36Qh3XlSZDd3bnETbhFz7VMUCtMJeYeJ
+5gYR2S2EBV0CQULmw6oKLvp0N8UboDaPkkmMizShC1n4zj3E/v0bTSoR2/GsmkK/dT7C43AeF8jDvqiB
+l6F6C3J3ymbvOTXxWTTCxgbdt6oJfZorm2h0eBPhX/hEpkndY3rSsag2iozI3Kd6ImsqnyIj0ne6vmgc
+K6zIKC1b5pUwNxRhkVHbNt9tcA1VUwHYNvbkrfC9CLk1I9AG57ZqLwD3YH6hDRrsBWEAKiz5ijbogGvG
+ADQAuY+V8DeVlZHRW9MontgXV56RsWrVZ+z4HCrRNNP11y1QQx+vIjX06bJQjTbLkj54FayphnGZfHrf
+4IoENWdE7KYylhsd2meWRVMacT/ua+TSRqJ+NJY6QXpj3VCCP+AvvkG9npnq4EL/AR3QmwpaeyDI1EXW
+iIZlX7ShaUplyeHqjIo2ZPV+2WGrxIs2KHu77JBqfkYbWW5cFoGWxtEwKK0r8sATNjATZeuqXFhwqM0r
+8iHnjmBeRI8VUakpJhiZ3GdFdCITBaPi7cui0RNWGha1eVkkIq+lDV//V4bLDaxuJNWxFaPeNDxzA+Wg
+/maeXx7D/52HcS45yqqcejp4D3pGug+mFEPtElnANS/gThcZpNGzVoNBN9qA0WgER7088Vr3GYGBeLPi
+8D4H82lxxe4d+f2fCYRc3Y/SS1JWl2i5VcWQm4cGtvuGDpIApFEdb0Tj3n3DJ1f6BNOx6jQwkSjuu1kM
+tGt3rNOYQWWXvGmFRSOkaGaTd++OVR7LqOxWb1thWQt3mhkuO3fHbhllqcyyd62wCodhzRwrMN0xrgSB
+Kv9yUytisASLzXJQgboThBqrqpJQ2trUCD3gdFKJCqhznajCXVApyrZWtcJPFhpU93oBSkNtbFMzoG2C
+k3ZIgJ1riLRTAbVEtLcpGnhb4yQcBbRz8Sh7K1BAco82RWRuxZzEU4N1Lpp6LwiKhbe2IhLbtrFZIhpU
+dwLRtq2qPNTGVsRhbnCbBVH3704E9dZaZZ6/boNtePvdyLkC0hnz6s0FmX/lYHlFEcB7dM/DC5ExKD+q
+QkVa/sNMGutd65uD9Tc6NHlu69Xbcb3f/ruROudZjnGU5YX59ZnDhrtpqikAG9mqCByvVROsFwUZ9fxb
+pBk9V+nt7CGDQTaI+UqH1Nk6AQfSoIzduw5i253fEpkRVtzkRLf9LrJx2advkXwqdtxkxHMFLnJavL3f
+IikxZtxkVKYYXCTknA7YIkHJPLnJS0lJuIjNPXuwRXJTmHITnJrB8FA4h/31FklOYcpL5aodvo/O3S7R
+qVz5aZ2H8PyyGFskP4MxL/WTMikeUnROd2yfHGXWvCSppFw8ZOmUG9k+OXK2vGRY52dc5OeRSdki8alc
+uUlPy+a4CM8p+7JFYuP8uAmszgA5iMougCbm7Yw7MK1RoUPICRyTX623kgdixTJy6w0QDfTrP77eDUQu
+xkzwsAsi5K//A1BLBwhPQDX+5A4AADKWAABQSwECFAAUAAgICAAAACEAT0A1/uQOAAAylgAACAAAAAAA
+AAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAAGg8AAAAA
+------=_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
+
+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
+------=_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
+
+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
+------=_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
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTtWnlv2zYU/79AvwNjYJicpkq89Jrr
+pNeyLli7AE3XAeuKgpZpW60sahSVNBvy3fdISRZP2UrrFlvHFjkk8h2/d/I5GY7e4xlBlM1CmpF0gi+S
+eDbn4QVOZ+GMpOHZICxYqr+cMVpkYc4xj3MeR3nIyNlgfwDr/vVr8SKjjHekOE3oecgZTnMc8ZimNcW9
+/fBl8/R40tCP6CKcUTpLSAg/LuBIRJOERDx8AYxIs/EdPsNhweMkfFJuAEK56/VznK0Qn1Oa5KUi4zid
+xPD9B8zxyfgdkHWR/Annc42sX+rjxaLgeJyQZ4CpQWuB+Tx8HM+OU05mhLk46aeuYk5+kZHaknuDey4j
+Z8lF+FQ8PoWneXewHhWzBUkFRZrCafFvd3v7+jW0jZ7TSZEQlOIFGcoHYqk0b0p5bjbyyF2n0ZwsMMoA
+oObY6wBUHKqHh/LwsDn8APSMcxDj4Lu9wf7NwQD+92fE5rLrfEgLnhX8jeC4e/1aVoyTOEJRgvMcPSV8
+CVG5+0RuflzEyYQw9LfQWkiZsfgMc4I0/0ZvueHu6lYpQYSErUfSy0eNUxweGmffsioOVAryaGNCODNT
+7alvBs8dSQ9LhBGfCPVGDxD5wAHYHKnGHH2q/BH64Ds83PnsHBFWGKIDlJJzVEX06DDoN3iV9l9h+aAv
+bC/2X6Lye6fTm8inj84xIwiz2VI0sfg8zkPdl0B52AXcuOatEgOp0cYVcucog8ELkaE8+jR+3ijTBIKq
+SSctfO/RGOdkDVjFNj+uHvHrQw75xYqnKBBbUJyCx6cRoVOvHseLLNHEFKttM3obi68HyKt6SVIIcF8n
+KzVpjSlJW9ui6nVpmKisHWJtnxKOpjFJIC9NGV2gWXxGUiRBg8Ij7F0IkiF6hZN4svwdxfkSJAQo0VR+
+m0JNpufioHS4Yc0FjYrksPkliQ835cSjXSD+EZw6xL/BaldRcfn0YYYZXgjYGkyp7HqaLXzO6HmOjqGd
+meHkUYXw0YeIZNLW4JWlVVTw0wrxM2kWiUxJUdRVJQzPKLwuDfwj2Ddo2i4r3MfQdxAM/HJpaxAE3GyK
+E80dRYgIbZQI2ZQprehyBHSwsWzYF/C05AoJhooUZwWxY+6TYNbBKT2gmdmzK25dJKiB82fmjthtNXsd
+6kHwyGToi59AP4BQj3zIwP/JpMpaQ/R6U060szlDv0F/pD10w1JuDCX0HOdDBC9FiOsb2qpClTH0ttq2
+o2oBRjjo4O69Xa2N1UUb8eWirfXZFuGHp0WWMZLnv2GWQnbNg16Rwt0mek8mvb7GfHT0xVpwdCQ0VbkG
+5v3gSO+aX4J3aXDIJGJsQAfQBxSJ3YesERU9VRokqTEyJYyIih7hNKXQihH0y6/Pnm31HG6jmCg46muy
+i+C3ZL1in4hy0wF1/4T6V9hAyadoy4NOc/dDbyMKSZnhGKrqQUlMSP9K/GClLKNAyouko0SKNaUMBdZN
+EzE0dF42g74lZK0KC0FEDgLmgSKse788owtnZFaHER2/qklXEnJyW8PJTjkT4wtAY4F50DtOy3ZF6jxE
+3+Q7qM7F4rewt1OaYMcJUt+0x6XTKd0FT9K9b7mu2KynlcotrzAxCCw3dO3yxmx+AXmL0TT+CyqT945Q
+hUUoZyZep+nEuF7aIC2sGLmUH1eheWAcGdf3dYfDiVW9D/FkUsYGaEFzMgka6uHvRy9OdqRTNQ+D3uDe
+rVt37t66tXd3/+7e97dvD+4Mbvf6lkPUy63+kr/87pTSHxZ21msZGl3hVi/ynFIJrUJp5zlHN7y2k3eS
+DMzVWrm+3GTLqpiffdSlSWCbR6uKsN+qijvId2d32m4tu6HKvx3NlIirtulDINjZlVqfok7jFCcrhrZy
+4CFmEkQo59/XTHUVxUwH+wxmhJp/XEtLJiLvsCmOjJSuALlxkcoEr7ddClCVRUpTrDEItw+tNdBWj/0/
+1F5vqK1i1hprq/KuNQhtsn73YainYqwYiNYrP495NC+Ho3pSy6Fd8XSvkZik7g3dJdo10lQ+ZgzJIuMX
+AK2/mWAEv/e8k5wHHs5ilSEA5MOjlLOLr9uvSe0HmmGJAOYULnL9MIZsiDmFxi5MARevSdax61cNdQ6X
+oYRwmgrHlnH3M7kI+nALUi6d/fsVlN38fkKmuEg46hBvegazXGBFg6wVpIcnZ4SxeEKsYt5lnCRW20jJ
+kGAd9l0mTip7a+rk573GBKpdxn/3YEqsTsMpsTY5oDIspVi106CqIrOOAcX0aA6B9IROHC1jWWzEHmgL
+FiLb7g/MYTi8BBcS8XuAzJfLF+Xx7frBDRQEZidQQ/4A7VmjprAR0YSrlYXaMBj0m1dXJK5nJJ26Zqk2
+8tK2JdHutquHeuTPAie54v3Vp2R0/M7p7iKhCold7xWxHPM3x7ANiLSGS0XMNWl0UAOvlqELrrglBQyb
+Jx9JvvW+R/lcToVWfMANApnub42sWtGQiAleZiPsG/iuoadD10tEEvG3ANNgywikyldcMnwswBIKV8S1
+46Cc2BwISrTrCDQvPoX67pzQqr92ZGMA6P2xioDWNn0kBO7E0bHtadJYOYJHnJY/2OXJ3Lq8fi6nvKJM
++3YFPe9o57VVletcO41Zzu0PJ1YmhTbLiu2SrtfuNVev4UtLe04vh9eZaLqC3g6y1JNE7EfmSV2pAycZ
+44yRY8wDK3LIfwS2RqP1MFOy0hqA+UFoA8Cv/BqKG1KYJ9SkYmts7NZyk/wcIPe2SsbRb9982w+b/OD5
+CwH48g9QSwcIuxTzKxMIAAD0LgAAUEsBAhQAFAAICAgAAAAhALsU8ysTCAAA9C4AAAgAAAAAAAAAAAAA
+AAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAEkIAAAAAA==
+------=_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
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTtWntv27YW/79AvwNj4GJy5ihxk66b
+46SvZbjB+hiabRe4vUVAy7TNVpY0iUqaO+S7j6Qki0+Z8iNZh6pAk0jkefzOg4c8TGDwCU4RiNOpHyco
+GsObEE9nxL+B0dSfosi/6vt5GskfkzglfkYgwRnBQean6Kp/2H/UPzp++ADP2deWBCdhfO2TFEYZDAiO
+o5Ji/+DQ/7V+ez5elT6OrlBE4vSmIHzwff8H/008RiLFIJ770ziehsinv86pEEEchigg/jtKGtUDP8Ir
+6OcEh/7LYgAVLTN9fg2TVQW2IuxHVGwqWRRRxnEqjoHRuJgX5fMRSv05TLiSL6vBF4uxz6PxL3TkGz5w
+uZgkjsOsEHiEozGmP3+EBL4dfaR0TZr/G2azNbQ3mYvrLanjYrrz+TwncBSiV1RxRdI5JDP/BZ6eRwRN
+UWrSQ57lis3zfDqn8kPmGHQ2+7e/u/vwAdgFr+NxHiIQwTka8BfsEWnuMU57tVX5oItghuYQJFTgetZ7
+j+I2EOcO2NxBPfcpRQ9nVIiTRwf9w73+o73+UZfhuLfwH4HTXp6MIUH7ywZ8YBLsP3yQ5KMQByAIYZYB
+i5/9xme8yHE4Rin4kyHBRE9SfEXfF0CHDLoXFEUEI3A5j1P0DiUhRiykxMFSIgCXRMkL4lAucwCY9YY8
+eIe1mU9PlbmXaRneIgU+1TF4KMHIOcxEJkUGApdYlV/nrvI4VqGk1Ic1nC+ZUYZPAfpMqHtkQPTI4aYy
+UaPNT09798IVQIEpOAERugZlNhqeet0at8J7XfzW6zLPZZNuQfGzPYmNLYev85DgBKZECIfn1zBFAKbT
+haDsITOc+WI8UTToGB9nr+t3HBF5hhQc5ZwpIlL4Labd3jsgjjj8HbVq7eRqPrHo6piNahQc2d01Praq
+zaI2FuwqGNOCi0V7Ucf2+jUOAiOYoaUhyga1jlE+yerOq3hGRbGtayjmqMg42cPIU5qHJ8BjowCOaNxE
+AYonzYY5nyehBDl7ls6gSzL7/wQ0G7QgzuQ5lhlw9RoXIs5AGiKqeau4YFE9smf3AhEwwSiki/okjedg
+immMgGka5wktPZlL54ykD36HIbVA9TfA2QIzQEGLI/5jQsvk+JpNJDcJygYVFzDMw9P6jxCfbiZyh/uU
+1Bp0186Y6wqwysq8RZ5LWO0LVly8fUZlhHPmGbXbxHwnVw8hszS+zsA53URNYfi8dKKzzwFKuDvTOCwc
+T/SvqHSqK+553KEKimy3IGTSq5h+Lnz4J+rCXr2V1BL7qNwW4Iy7MxWERtIEhlLEsaTAtBFywma8VUsc
+QmLzNrSWdZnKhgxpz5Ib52xPtxxdEXqS5kjPUxsxwtqhbbGW+5LXFtj1JTZawHGRvUvbrJL1LOaQi522
+kK8kCEfZXlH9TYB0xE+t/DaIoBm4xqqyJXY79ViDenTJ4VWSbdXx5AkAdNDnhIYMGpflzAC830xq7N11
+7mrLcJU42CAPlfQH8L+oA77V7DPKCbiG2QDQj2xtlwc0VbxlqaAfECpxLHpRighVwnSEaNqvyseJupeb
+KJvOHE20250etlkATFK1O3y07d0LEGya43bq6ko5iG7i8OwiT5IUZdl/YBrRSjXzOnkUzFDwCY07XUmK
+4dm9HneCM6azyNlTz2PP5NPJX2mFLKHClxdlADihW8c81DexDvmyI0oDOLUUTVCK2CYwgFEUEzBC4M1v
+r17tdAzRKFjKO+tKsrNlQZN1naMTkCEiRrYe+XRbkS8/PuGjjjX52dA1D6+YhHKOkFOILh+zJ38LdixG
+rNsS4DKIaVWRQkw3U6UaDOTf2S/amqvsi3iPw7AzYs+Ebho8rQkCUjAw9kG8riZkpUrK2o6ECph5grDm
+8XyOLJxSGhh8zfCnWDVwQkZuDrFwQVLWmqNozCHxOudRsUvlOg/Av7IeqIoJ9pff6RUm6BlB6qr2uDXG
+jrlic/bQ0jdXaGZ5mhuaRllTS3ZDU2waR/j/tLRqPgIrY8PnXUCr57TiXj1S69YvGZkQGJXxeaJMGVXt
+G4PXsaf87sPxuAgQqkWcobFXU/f/e/bubY97Vv3S6/S/Pzr67snR0cGTwycHPzx+3P+u/7jT1byieszq
+L/jzn0Yp7bGhZ+iGpuY6Gc+1MmlX8thyuftmfbt5nib3siaySYpbhfL60BsAdoRxu3LS4Gmsee63B63V
+W/fSlJak0M0l1VVJrtdVPWBrFBgN6W5EUKYeQ2nOUt7S5ofHGOtVn3wLY4IjGLpcE+GdF9YXQUzXJYPr
+yySCsqrz3ZF52b6pEhuN2SqRTmCgrMICtnciVrEky0W9AFhpo8I4Tvdw9GkON3L0SVu9WaOz0+7YuEhk
+vW0jTv5646bdjRsRu+WZxWnx0Rrq9RLYqqleT2vfWK/n3k1zvebX1GC3SOXUZK+e7BqTYFY03OVFKqM7
+A8tGMWDd+YOB/mEhkeIuwh1aH80TcmNSuHpGKYKfLN84576FM3uKaKfk/bOIpDdfg5cFL6pcQjIwYgBd
+IOJ1fUxXM8hdxI8oPlbTuNj3K+SUa4ajaYhIHDFH56H4M7rxuj0gnvd0j0tI28XBGE1gHhLQIv7kdK25
+wpJtqVRUPHt7hdIUj1FDYeZwjs8e+1m+IoAL9zZH/SJzW0HTkv3ddANEwdsXTS1VsjcMRDHwRkFb1lOw
+ArBUCIceQ7OwX37rgT2t2g/s2WYLQrGWYNxWrYiSjIsR2cH7jCbClxRs3bOK4oGNoTXsnK2ah321EU4/
+Ujdi+fcEqB8XH4rpu9WLb4HnycVqBfhTcMDO6IVvfi2eClUjeaWoVRhIX1dl4Vz7Kswd560qFtbVxZvR
+sVmTFVnIS7PMQHL5JvI8SAqi7YOgaiyhP3IYil248oJePPpozBussmASm74LYhl6QIaGDyXSmHdKYqZu
+l4EaTQ88B9KY3uEC+vWbNckvP86KyYx3JlwuElPR1IzCeifG5GBptHB28ubX1np00Nag8S1AIbt+PfF2
+pMxU+ovOf12I9faRKwjypO3BIOdPGQjp20agaJ1om0FyJbc9+FxXABlYx1kbgRw7uxzepp9h1bnwFjxq
+Jb+5K+9o8oFNQGFefhuBkKZsDQb5bEYEQdqqrwmBeY1uuW+rK4bixgUgcfGLXlKrQxenuot+Ptta2EZ5
+neb+0HttO1HVNhOcZkS/kLJk6W0yLhvMqVpNX/G02r4wtmX24qZCwvaLXqcHNOU4Ef2VOlNU6cRIRJkh
+reXq8OVr9T8ENUkpN9zkpd8FuU2sxV8Qpo7quqHtWg+42GHJKv4FQYwdfRWv4KD/FIwkpVZwNhfk7FA0
+wWCHwEF9RQp1hlg36Eoro6Xyg98lyqwHD8rUbz580/XrEkCvK/i5BP3vL1BLBwgPRN233QkAAIlIAABQ
+SwECFAAUAAgICAAAACEAD0Tdt90JAACJSAAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAA
+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
+
+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
+------=_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
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTtWm1z2zYS/p6Z/AdYM51SrkNb56Tp
+KbaTNHVTzyWXmbrXzjTNeCAKkphQJI8E7bg3/u+3AN8AcEGRshQn12MykkUu9uXZxWKBZUy9D3TOSJTM
+3Shm4ZReB/58wd1rGs7dOQvdy5GbJaH+cJ5EWeymnHI/5b6Xugm7HB2O4Hpy/56/jKOE9+Q4C6Irlyc0
+TKnH/SgsOR4cur/Ud8+mNX8vWrrzKJoHzIU/lzDEi4KAedz9GQSxmvA9vaRuxv3AfZETAKMUe/yaxivU
+51EUpLkhEz+c+vD9A+X0zeQ9sMVY/kTThcbWrvXZcplxOgnYK8DU4LWkfOF+78/PQs7mLMEk6aO6av88
+my9ZKPwYhTBa/Nvf3b1/j+yS19E0CxgJ6ZKN5Q1xqTwfyCh4UEeBpDr3FmxJSQwa18PeOuDwsTp4LAeP
+68FPweF+Cmoc/+1gdPhgNIL/wzkrpcwY5VnC0n3kVpTxOOPvhLT9+/fibBL4HvECmqbkJeMvBfGPBe0b
+Sfp95gdTlpD/CHuFfnHiX1LOiADxSGIaCJReCB5HTwn7yEHzdK1Jwq9jVs6Pg9F3rlTnF7h5ckIu5uWP
+9DyLheOYCPC70OgFjenED3x+XelV3fI7q/cqCucwfEk/SqZpJ2pazUiVVpv15IIbSUAllUHk5dzl3D+q
+p4qwRht7kRTZQecBk7QFZnWaHG0qVbp4cJ6c7H1ieYQq4sgxCdkVKRLX0YkzrLHKZ1brnHKGYlYJ6huS
+f6ufnThsLKZL9oQm80otcfGFn7rY5APjgRZk8ZfNhxIJhAU6TwxOKA3CsJo59fjX5S2EvJg6NfHz/EZF
+erNl9Lst28+vaMIsXtAmZ22INv1Vc3qYgj8lE5qyzuEgiDcUDxqrdQKiZNAtIkpqMyTs0JcjcOzF5c+I
+I6iIH0KGCT0WzSw+OFvGgQayuOyk5MIXn8fE4rScnRD9RGcpLWnNX5KzRqJadGMEVl79iGv3nHEy81kA
++X+WREsy9y9ZSKSLoXQSgZoJli75lQb+tPpN/LSChwA+USi/ZlDmRVdioMxV41IKOcqCk/pH4J9sPP8d
+7QPXW4joMckNUfuKbdXdZzFN6FLgVYMZyQq6JuGLJLpKyRmUxnMaPC+gPf3osVg6GQIxd4eKelhAfSn9
+ISHJOYqyUMkalxE8zj37IzjWqUv4Ro6aQMnMKMhLpZNBEYivGQ20OBSzQlijTIqN+7Axl9qSlrP5NXQo
+kOmSCDsmw62ruDrB4kl2m4rhiRtL3tvUAlsQZBirMc6TjDXT5EaivUc6sUS9uXD1RauPBiVq9kWxJ3Y7
+NS1iHqQ9uX7ZMp+jDyBkwD7GkLlgUuXZb0zebjx09rbn4Xfkj3BAvmlYNYFC7YqmYwIPRVbWCdpW8CLJ
+f+KtvC0zqh5OGKAZtu36sXL9Tk4AVmRRq1VtZwYdjMtPBPRMickyDxj6sK7SH8ZYP4vA2OrnEs3EgHHF
+Di803s8EVjDR0t9oEkI9lDqDLPQWzPvApoOhJv/o9I5OJcipRE+R6ZhReaofJYgQ1/CQS4dBQI6hYM+C
+5mahQy4cqNoQyS1hM5YwUXp7NAwj2O0x8s9/vXq1M0ByhuIj53So6S5SfkPXtbahJMVTwydOUFAUZ923
+vZL6SQMlMWTdk4UKBzyn3EmaawXFVrpuCZs65aGZy6aqWrtuSbMyY/bSq65lt6SVnnf1tNxUSqQeeZfs
+WPJNfWZMLjzQHJK2D/vKQn+RD34VfzRKP2OLKA+gkU2iuGZRQpzGCTVJyBg9pHaGDSVLUxIXVOSgYOoo
+yuL0coyunFGhlteNfsv4qRavkhEqrUPaPueJ6D0BGkvKncFZmG/Ypc1j8hWUm2VNK365g73cBXsoSEPT
+H4rWN2ZQmhuHzqFZBOUanQanEYYYlXUVTK+hDkii0P8Tco/lcKyYFK5seVlDppfY8tKakm4hCDN9UkzM
+Y2PIpGwLIOEmruK5S6fTfGaAFVEK60HN3f399Oc3ezKk6pvOYPTdw4ffPn748ODx4eODvz96NPp29Ggw
+bIRDeeHmV/LlN6qlfVI0qwhLq0kh7pHjAJLWauuu2lONGu8T96s0+c2VR6vigL5Rxe0R22EwOv07eIwU
+0YPU/iJq7UfajhDVrCr1vubMD2nQ2s+WJ+jimJsJs2xUdbtbMcgMqq07D9bRs1JTNhWzOZlRz0iTCoBb
+VihPmvrWQAGp8ETugs/n7YC7063newIrFbW8MdB1nL5fb45a8RZBc9j/3wNY/R6AildLbmtf3Rpd2CqB
+37ITa/DZUDe25tq9I1uP6daVren7d2bLK73yubfIu7T6UphCCWnZUXiipXswxgsnrMOqvEjnsmXMryFE
+7CVewugHyzMpeWSRLK58GgN79zTkyfVfd26yMgw0pzIByjnjztD1YSWlPIJS2w0BE6s7uvj0LwtzChvT
+gPEoFAEtp9w/2LUzhB2pcgAwfFLA2C/ep2xGs4CTHvNMz8AN96/YrmilzLM3lyxJ/ClrlICfYadEXKu7
+JYa5n5Ot6zZTGoavKq5uZ/+qfouqDlaibUg62pJRZTfLvJ6S+3RtVMFY58YuvkMXp13NL7m5I65eDR5x
+bbPJY/hJcWuvZk/Bpov7xHnxAtL1i2iKbGjzUkbQQPG8FOv54ch8jQAeglfEKnFMzIfVg3z4bnnjG+I4
+eM1cAv+UHIgjZoTGrdU1oVstzlJaY1JR0nWFKxW4Iat6si7rqlA3GBf312Vr1PMGc+3pmiL0wkEXoIV6
+G3s5OXKm/YO/7IOwf2c0SJX0UbxaF03eo/lC1D1CY+y5ohbSskD6E8CkNd8UzLDmDMIN0oLMfTCXd6SC
+bn3nluxbDvIivpAH6a2vwoIyZu4QZ/ytacDSGJDy8F23rVfWwV7E5hvCAvHu8MzZQXNRETl2fW4Leg3R
+itTVASmcw5YBw9MoghtKuBH4kOTbjlY9YHvg1Hlfx6K6vxHTG4tDu+El+fbMLlcl3eji7kZMtixc7Ybr
+g7Znvr5u6iBozzYBBb7AtgKhDdkaDPp5kAqCdlRwSwjwVbjnLqyuCfJXAAiP8j+axbJJWh0bV31msWmw
+UTkDSwvsbWOHUJYtMz9JefPViI5rbJt3xSDJ3er7UrbV+bm3LaOrFnosNoHOYI80jJRMmrfMkZhpxygz
+YyS6WJvDei7G/0uQohb2QBZfzrsA3G31/YLwrAzqBl9dAXRBq8uS/QVhVZjTDamybOiCU/cV/gtCSzOq
+G2Z6ldEBOTsUbTDYIehgvqGFOUItEppGG9RarSFfnkut5wjG0K/ffT106/W+WUTIYwb4+C9QSwcIaPUm
+76sJAACSRAAAUEsBAhQAFAAICAgAAAAhAGj1Ju+rCQAAkkQAAAgAAAAAAAAAAAAAAAAAAAAAAC5jb250
+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
+
+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
+------=_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
+
+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
+------=_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
+
+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
+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
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTtW3tv2zgS/79AvwNr4LByN1Xja7vt
+pkn6uuxecO0WaHf3gOsVBW3TDltZ8klU0twh3/1I6sXHUKYcKWluTy2cWBzO48eZ4fCRNZ59wUuCknQZ
+JmsSz/F5RJcnLDzH8TJckjg8nYR5GuuNyzTJ12HGMKMZo7MsTMnp5MGEP09v36KrdZKyjhwXUXIWshTH
+GZ4xmsQVx90H4a/N2+P5tvxpfEpilqTnBePdJ5Mfw1+SOVE5zpJVuEySZURC/uuKKzFLoojMWPiOsyYN
+4Wd8isOc0Sh8VRBw1TKo+Q1eb1CYJUmUFapPaTyn/OdfMMNvp585W4jlX3F2spltJxxijoME41USx1xs
+kvpgcrxa5QxPI/Ka+4Ch6Qqzk/AlXR7HjCxJCtmh9/LF5kW+XHH9sUCc9xb/7t+9e/sWuoveJPM8IijG
+K7InX4hH5XlPeu29xmsl1fvZCVlhtOYaN90+BBy4PbXznuy813R+xvGjGVfj4M+7kwf3JhP+f1xIWBDM
+8pRk9/L1HDMyvw+//ijE3b99a51PIzpDswhnGfpZkP5UUv5WEL7MaTQnKfqPMFeot07pKW9AAsN9CWkk
+QHolOOw/Q+Qr44pnW8U0O1+TKpx3J09Cqc+v/OXhIfq0rL5k7/O1GDciouc6NHqF13hKI8rOa73qV9Rb
+vddJvOTdV/irZJp5UeM63FXahuwl91qCY842Sck7so64PgaxltHQJ2YkOJVUOtysUEVmof0mrITpWt9P
+aZmnVA5FlkOfKAiGFvacX2ykAb0LTzwto6sG535fE0oIRcTh4c6VSkNYEYYOUEzOUJmI9w+DcYNTEcot
+QRyMRRgL2gtU/FQ/Pfr3FkIVf4TTZa2UeNgJzUIo1rnhnJbLYj/bjRIFgAUYlgYnkAZgWAdq0/9N9Qog
+LyO1IX5RvKhJLwbFvqWkeZNHjK5xypRM8OIMp8QxGEoqKa2h2ZvmHWC7lhcaBLTMc/04eJr/DRnjqiMd
+mlNF3WPIpbV829BqaVk1zdssqA1NcUa8Y10Q9xTsGqttor1i4BfuFbUZ766AkvRdI6oSAnuh4QIVsZcP
+VMSwE4iHLlAgqBCN+SwWz0iyAJ3heLWOtPEWj4uQlwji8wCBvlOwEkKf6uykDa3zo+Srkai2XBi+XdTz
+4rn7njC0oCTitcUiTVZoSXnwIelpfDEgYiUXLEP0O444zNV3RLMaGMSRSWL5Y8EXLsmZ6Cjnw71KCtrP
+o8PmS0QP+0kJ+/c5q0vw3Wb+uKxMj3phQLM2WHNfGaf67XMOA16JsW8cI5Gr54aEnaTJWYaO+cJ1iaMX
+pZscfZ2RtXRYHk6Fa6keFJducyp9S0JScBRrNiUJnya8ufDSn7iTBs3y3ZoTpuXSgGbSYbkiPFYWONJi
+SsS2sEYJ7X780UoESn4KepoGx8JkING5k13vkt1ZU6KrQs/SnNiZqJdB2CZ4HQOkz1Vd8dpKEYmle0K8
+SiA9MpIDN7iq6Yqfj/zK9TZVSoZurmppcBU3V2CK9ylV2JCKwZVdo0dT3Q2pBVQxfiNpwzNbmGVqj/kC
+ThOtJXBH7O40tIB5fBKXlaVrHg/0DgiNyNc1nwZ4UBVz+R760M9ks3MFs0FXGR5u3qPaprYf0T/jEfre
+GoFpztAZzvYQbxT1kE7Qtg4oy6sr3uN2ZXHVG1PC0YzbtsOhPYhr2RrfkPGdVrVtpnsYV2yV61kdkmXu
+vHdhXadqiLG+SQ+xtTfsjXoH1Nfa0odY69v7dn6EOENnABDvcje/rLAhTnTjOBl7/nbNDLE1DwYsCc+F
+n/Akk/0dpzFfhWXBKI9nJ2T2hcxHY02L/aNrOTNAR9JvFImBGY9H+la/CG4NDTnBGwTo4ADFeWRvtHjM
+WCNVGyS5pWRBUiK2LmY4jhOGpgT98tvr13dGQLZURig4Gmu6i4nZ0nWLnUSUwSnxihMzX4bn/nuXkvqp
+hZHost02cY0CnEmvJbm3QuJaXAyCTJPmwWztUlRdWwyiVzVHdNKqWWkMg5UyydiTkBMqbRNgEMX0WUqf
+xGy1RCaUb9EdR/prDqrRpxkHlE9xNGaV9iI9/S5+sdYLxi6ZPPUG9snEs0hSFFjH4ihFe+DJeDC2lKxM
+SUOuIuMKZoGiLEwv++jKGcua6rnQXxlf1RWPZARK85hF3rNUXI7haKwwC0bHcbFnKW3eQ3/idX+1EBLf
+wtFOMQQ7IEhjczwUrS9MtzRXm96OWbrkFtcbAssNISrnpJyd86IkTWL6b54OwZOOMiRCeSHH6TCdhFaP
+dmcqLAVBhk/LsDwwukyrWwSAs4mnbA/xfF7EBbciyfgE1XAP/3H07u2OdKjmZTCaPHn48IfHDx/uPn7w
+ePfHR48mP0wejcaWM1QPbH4tX/4EtXSHhF3StNxu2SK/8aRWVs+uJEsHmyD1Ahuqwl06mfvl/avHfaW1
+Jr6eCz5WHX6lN3406faoaHX2Orfr7B3kOu4Ex2vjWKEyoICVmQhk14FtIMTYNb9+t2xBYxy1XD+UZ8Pi
+CJcIg2Ca5m6iYojpSAMPmVgTV1pyrflHusAzY75QgBtUnWL20BdsCkDlCBTQfzvXOK9Pt44XOjcq6rja
+6dtP3z+ye3ld97S7eVz8tDtZFzgdRvhd5VQ7//86Z/t1ThUrZ4ptm1qt+1b1DHLJO1cGn57uXTVc/e9e
+NX387l8pMrrcwWq6db+H1fRtu4vVUHW/j1U92Rlls5PibpZeJGR8veFYfs7ERa7dPbuh1shwV+WPTkKy
+WrNz7rfuFUFK8BdHm5Q8cUgWT5FdOPvwKGbp+R8zWZDKBbQBJQKQ94QF45DySgNLlwhjjodzKHzG8w8J
+cUbjZURYEgtHlqH2N3IejHeQuks0flpC2M3P52SB84ihDvGlTwfW0G9Y1WqF3vO3pyRN6ZxYxfE3eK4p
+ns1nm4a535Kt2x59WoZvKj0vZ/+m01FVHaiA7Uk6eICqyraL4I6SO52xalaDtXRH6V2OYVXhrqq8o3j3
+Sa0qjF7WrTod5qqSoQNdtxIeh7vtyt7cM1/xdDr3Fc+QZ7/GKCmD2ukMuGTjM3ji3OaEz4ivuM/YHlVU
+iYKGL5ZWolx6MDHvgPFGPixiIj5AZmPdUHS/W734HgUBvE6qgH+GdsVRD0ATNuqa0G0W51hOQVJB0m2F
+K6suQ1bdsi3renFmMC7fb62xuoYzdW7atmVvrPUMAVrrtiKozZduzcxYORp8tdYtReilqi5Ai/w29jJX
+FEy754LqeJb8K8eReoRd/tFDMv0Mpk9RaQuNoXZFLeAkFTg25Uxa02/JDDozBrjxLCmnAp7a7kgFw+bN
+Jdk7N9QTdiLP91r+2IorYqZRcfDYmhEdp5VSGrzp5Dq+97AVsPcCkUj8XdoiuAOm5dJr3PpcFvAGog1Z
+3AMpmMPAgMEzCoAbSNgLfMA81I5W02E4cJopUMeift+L6dY82W54RT6c2dUErRtdvu1ntKE5fMN4K10G
+HHGlgDDGvGnpBQJHndEOgt5pOBj0MkcHQmvrBQrqbT8d0mhqWkr7Mc9RobVbqncazmi9QNTt19r6gAKu
+JFuB0LoMBoO+za6CoO3CXhICuNzceoOruIKHWFL8Yi+STdL6iLC+6SU2C1xUwQi8dfHB2heoqvMFTTNm
+X0z0LCfbxlZ0ktydI1/Jdg59MdaO3vUVtrXY+AlGO8gyUjKxX5k9IdMOQGZGT7AuNbt1rDv/lyAFLeyA
+LFy5+gDsV2jeIDxrg/zga4pdH7R8qtMbhFVpjh9SVYXs5VWe5ewNwkoxydOzlJLaBzP/6vcGoaYZ5Yeb
+XoH7ILehbr5BcFFPjKgfMP5l9g3CSDPKDy691PdAzg1FGwxuCDzMN7Qwe6iVum20Qa0V/PJ+e+bctTa6
+fvfxu3HYFN12JS83tfnHfwFQSwcIBqkNwWcLAADoWAAAUEsBAhQAFAAICAgAAAAhAAapDcFnCwAA6FgA
+AAgAAAAAAAAAAAAAAAAAAAAAAC5jb250ZW50UEsFBgAAAAABAAEANgAAAJ0LAAAAAA==
+------=_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
+
+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
+------=_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--
--- /dev/null
+--- 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
+
+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
+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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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
+
+UEsDBBQACAgIAAAAIQAAAAAAAAAAAAAAAAAIAAAALmNvbnRlbnTVWVtv2zYUfi/Q/0BoQB+GybJsp4mV
+OEXQrUCwBSiaoejbwEi0QkyiNJLyBW3++w4pS6Ily6bddMj0IMjUuX7f4TkUfPVulSZoQbigGZs5/mDo
+IMLCLKIsnjmFnLsXzrvr16+uMh4PSJjQXJABD3MpB6BE5zTEEjTFQJKVDP6E22djGa1SGtTGR8o4uGMi
+gPWZ8yhlHnjecrkcZGk8AA/el7vbSsTGYW2jElQ2tLC3JewpYQcxnJKZc8sWOKHRB5qQ+zWTePVZ/dSC
+EwfRaOb89Xt0nw5vlg+/kfsIi/DXfDKXX5YOEiQhocz4zImJdElE4Rm9+afI5GWWExbhdULjR+nOk2zp
+Cgk2haShGKwxi0sx9A0pVRWPu6BkSbiDykzSLCoSgvbZQV/f/LS6uURwqVREjkOycV9wFpiqgVINGtVS
+6rLWzzmZ0xVSUkqofOH9XL+naZ5xiVTgLoSHvm4U4PkScbKgilIXUKsCGA39sTs8d4fTjauntq2tzChb
+EAborWvLsHLZb/jC9e0Ma8jkOieittws9Tvwh+7orZWDBtOWG/XikJvh1B2dWbmR+CEhLQ/G2omZaChY
+FpEdBNTvTqRB64c4L4PkmAkc6iZQh8+7SpRAi6GMyFaqaqm30IYax8lWIM1NWa8Ue4I3NpK6IiJCTnPZ
+KNwyKilOGjvZXOeHjM0oCF/QkLR31tN2JJ53U8QpQN3Rh5wwkhmSj2QbO83PdUn2tXpTG8MbU6VPDzgM
+lLCon7yaxEDrG7+1oV3Zq8a9MezSCO7QN0nV1lodSBGB2xmrqxBAXku4F5OYZ0UOA6at0AoszKA7QyHw
+A3IlzCA9p3EVNk5Eh5lurLrmNDI9Us2eDmICkdBwZ35NjjuyVeoRKesHAD5Ye7pOaLQremVKb42g4NQS
+Xswik8AU524CzwfD+EMJVWUPRszSBSO7wtN2j3Cqrr/J2iy13Xlr4wT3YbgFz0aka+BpTyF047Uk9xDW
+h1C+w7lWfyBySQhr0KZSoP7xbVfGx5Rwp22hTx/foxAniVBNak5k+NhuYU27zUN9rAFpPYCFicKcZ2n9
+ppxr7R3cxeWD9meUHFQi2KibpTrACNUKKdte39gHcbUklhTs7EKPsrzYVY8as6qduqoFqaMaDKW+glBX
+Vsg91vbtiJ6+I3lgTFAXLzEnuwLoo69NSIePhotnpUJjnpNQHb0NPn44HerSDaKcmvs7hHGMCir5Q+3i
+hfC9h+ofQXOXzhfC9eHe93IJY5lsPpA73bLI9Vn3IFtKb/s0Cqw8rPfArvdHmnHyieQJ7fRgdent8ZBl
+IMr2wbnFVN9UsgLUAszOZLoDpzCV5vDtjeOYk1gB1j5dh1mivtXB3umn5+OPy3U8ne249+Dcq3b4jNer
+2nuYttUowT7yWG2cNiyS2rtPdh9Behnvzr5eLlqt0YVKao4ulo2yicMAUJekMRrFS+mXL2Y2Hl8fterx
+Lff0aojpgjBoWYrpZ6wHpC0SUX32azflIlJhGIv/11n6nxK8e6b2U205XG96p4omtOTmF4uRe2hOHg9W
+BVRaJJLmmEv34OQs787161cIXQm5Vp9HCWGxfJw5bx1Iicl7tTpzWMZTnJSSIAvJEjVnWPQ+SyDxh6QA
+IX904XiVCITJ5ccMDMJogXeOmrtFqv5J2AhdeaXLLfdaTXuvAvH3BdLv5dzCy3njBUK3z9ciyQsL9+Oz
+785y/NbGjy2ax6c5toF5bOB8dmKeNnhORo2f6fOW76gJ5cwikjP/NGYNN/7Exo+R8XhyTMrQUgizztm3
+SfrimcvM8D+Z2vg/scxMbocWfqYG6M/cJcfHldn04rQyM9z4Nt14Oj1tY1mk6Y8s/PvD7090ZJOoPzQy
+nZyr7WVPLydRyW61ucagXnI+HvVSPtk7GK+8k/5dB81/AVBLBwh2eIrNnAUAAL8fAABQSwECFAAUAAgI
+CAAAACEAdniKzZwFAAC/HwAACAAAAAAAAAAAAAAAAAAAAAAALmNvbnRlbnRQSwUGAAAAAAEAAQA2AAAA
+0gUAAAAA
+------=_.q7.content-3d2e0690-ce48-3609-83e0-c704d49f1eaf--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+<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>
--- /dev/null
+--- 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
+
--- /dev/null
+/target/
+/.settings/
+.classpath
\ No newline at end of file
--- /dev/null
+<?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>
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+--- 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--
--- /dev/null
+<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>
--- /dev/null
+--- 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
+
--- /dev/null
+<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